亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? audiorouting.cpp

?? AudioRouting.cpp : Defines the entry point for the DLL application. Audio Routing Service
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// AudioRouting.cpp : Defines the entry point for the DLL application.
// Audio Routing Service
//
#define DEBUG_TRACE 1
#include "stdafx.h"

typedef struct
{   
    CRITICAL_SECTION cs;
    ULONG           ServiceStatus;
    CAudioRouting   *AudioRouting;
    HANDLE          hThread;

    HANDLE          hThreadStopEvent;
    HANDLE          hSpkOnEvent;
    HANDLE          hSpkOffEvent;
    HANDLE          hPatchVoiceOnEvent;
    HANDLE          hPatchVoiceOffEvent;

    HREGNOTIFY      hRegEvSpeaker;
    HREGNOTIFY      hRegEvVoice;
    HMODULE         hDllCoredll;
    _KernelIoControl    pfnKernelIoControl;


} ARSCONTEXT;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}
static BOOL CloseEvents( ARSCONTEXT *pC )
{
    BOOL bRet = TRUE;

    if ( pC->hSpkOnEvent ) CloseHandle( pC->hSpkOnEvent );
    if ( pC->hSpkOffEvent ) CloseHandle( pC->hSpkOffEvent );
    if ( pC->hPatchVoiceOnEvent ) CloseHandle( pC->hPatchVoiceOnEvent );
    if ( pC->hPatchVoiceOffEvent ) CloseHandle( pC->hPatchVoiceOffEvent );
    if ( pC->hThreadStopEvent ) CloseHandle( pC->hThreadStopEvent );
    pC->hSpkOnEvent = NULL;
    pC->hSpkOffEvent = NULL;
    pC->hPatchVoiceOnEvent = NULL;
    pC->hPatchVoiceOffEvent = NULL;
    pC->hThreadStopEvent = NULL;
    
    return bRet;
}

static BOOL OpenEvents( ARSCONTEXT *pC )
{
    BOOL bRet = TRUE;

    pC->hSpkOnEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_AUDIO_SPKON);
    pC->hSpkOffEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_AUDIO_SPKOFF);
    pC->hPatchVoiceOnEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_AUDIO_ROUTINGON);
    pC->hPatchVoiceOffEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_AUDIO_ROUTINGOFF);
    pC->hThreadStopEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    if (    !pC->hThreadStopEvent || !pC->hSpkOnEvent || !pC->hSpkOffEvent 
        || !pC->hPatchVoiceOnEvent || !pC->hPatchVoiceOffEvent || !pC->hThreadStopEvent )
    {
        CloseEvents( pC );
        bRet = FALSE;
    }

    return bRet;
}

static ULONG AudioRoutingThread( ARSCONTEXT *pC )
{
    BOOL bNotDone = TRUE;
    HANDLE h[5];
    h[0] = pC->hSpkOnEvent;
    h[1] = pC->hSpkOffEvent;
    h[2] = pC->hPatchVoiceOnEvent;
    h[3] = pC->hPatchVoiceOffEvent;
    h[4] = pC->hThreadStopEvent;

    while ( bNotDone )
    {
        bool bSpk, bRecord;
        DebugMsg(L"AudioRoutingThread Waiting\r\n");
        ULONG WaitRet = WaitForMultipleObjects( sizeof( h )/sizeof( h[0]), h, FALSE, INFINITE );
        EnterCriticalSection( &pC->cs );

        if ( !pC->hThreadStopEvent )
        {
            bNotDone = false;
            LeaveCriticalSection( &pC->cs );
            continue;
        }
        switch ( WaitRet )
        {
        case WAIT_OBJECT_0+0:
            // Speaker on
            // If in VOIP call then do this
            DebugMsg(L"AudioRoutingThread 0\r\n");
            pC->AudioRouting->SetSpeakerState( true );

            break;
        case WAIT_OBJECT_0+1:
            DebugMsg(L"AudioRoutingThread 1\r\n");
            // Speaker Off
            // If in VOIP call then do this
            pC->AudioRouting->SetSpeakerState( false );

            break;
        case WAIT_OBJECT_0+2:
            DebugMsg(L"AudioRoutingThread 2\r\n");
            // Route phone to wav in if Cellular call
            pC->AudioRouting->SetRecordState( true );

            break;
        case WAIT_OBJECT_0+3:
            DebugMsg(L"AudioRoutingThread 3\r\n");
            // Route phone to wav in off if cellular call
            pC->AudioRouting->SetRecordState( false );

            break;
        case WAIT_OBJECT_0+4:
            DebugMsg(L"AudioRoutingThread 4\r\n");
            // Hmm this should not get triggered!
            // fall thru
        default:
            DebugMsg(L"Thread done\r\n");
            bNotDone = FALSE;
            break;
        }

        if ( bNotDone )
        {
            pC->AudioRouting->GetSpeakerState( bSpk );
            pC->AudioRouting->GetRecordState( bRecord );
            DebugMsg(L"Spk:%d Record:%d\r\n", bSpk, bRecord);
        }

        LeaveCriticalSection( &pC->cs );
    } 


    return 0;
}

void RegCallbackSpeaker(HREGNOTIFY hNotify, DWORD dwUserData, const PBYTE pData, const UINT cbData)
{
     ARSCONTEXT *pC = (ARSCONTEXT *)dwUserData;

     if (*pData)
     {
         SetEvent( pC->hSpkOnEvent );
     }
     else
     {
         SetEvent( pC->hSpkOffEvent );
     }
}

static BOOL StopService( ARSCONTEXT *pC )
{
    BOOL bRet=TRUE;
    FUNCTRACEIN();

    EnterCriticalSection( &pC->cs );
    if ( pC->hRegEvSpeaker  )
    {
        RegistryCloseNotification( pC->hRegEvSpeaker  );
        pC->hRegEvSpeaker  = NULL;
    }
    CloseEvents( pC  );
    LeaveCriticalSection( &pC->cs );

    FUNCTRACEOUT();
    return bRet;
}



static BOOL StartService( ARSCONTEXT *pC )
{
    BOOL bRet=FALSE;

    FUNCTRACEIN();

    bRet = OpenEvents( pC );
    if (!bRet)
    {
        DebugMsg(L"OpenEvents Failed\r\n");
        goto ErrorExit;
    }


    EnterCriticalSection( &pC->cs );
    // Setup notification broker 
    HRESULT hr = RegistryNotifyCallback(SN_SPEAKERPHONEACTIVE_ROOT, 
                     SN_SPEAKERPHONEACTIVE_PATH,
                     SN_SPEAKERPHONEACTIVE_VALUE,
                     RegCallbackSpeaker,
                     (ULONG)pC,
                     NULL,
                     &pC->hRegEvSpeaker );
    if ( FAILED(hr) )
    {
        DebugMsg(L"RegCallbackSpeaker callback failed\r\n");
        bRet = FALSE;
        goto ErrorExit;
    }

    ULONG SpkOnVal;
    hr = RegistryGetDWORD( SN_SPEAKERPHONEACTIVE_ROOT, SN_SPEAKERPHONEACTIVE_PATH, SN_SPEAKERPHONEACTIVE_VALUE, &SpkOnVal );
    if ( FAILED(hr) )
    {
        DebugMsg(L"RegistryGetDWORD spk failed\r\n");
        bRet = FALSE;
        goto ErrorExit;
    }

    if ( SpkOnVal )
    {
        SetEvent( pC->hSpkOnEvent );
    }
    else
    {
        SetEvent( pC->hSpkOffEvent );
    }
    LeaveCriticalSection( &pC->cs );

    ULONG ThreadId;    
    pC->hThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)AudioRoutingThread, (void*)pC, 0, &ThreadId );


ErrorExit:

    if ( !bRet )
    {
        StopService( pC );
    }
    FUNCTRACEOUT();
    return bRet;
}



//_____________________________________________________________________________
// The Stream interface follows below
extern "C" __declspec(dllexport) BOOL ARS_Deinit(
    ULONG Data
    )
{
    ARSCONTEXT *pC = (ARSCONTEXT*)Data;
    FUNCTRACEIN();

    if (pC)
    {
        
        if ( pC->AudioRouting )
        {
            pC->AudioRouting->Deinit();
            delete pC->AudioRouting;
            pC->AudioRouting = NULL;
        }

        FreeLibrary( pC->hDllCoredll );
        pC->hDllCoredll = NULL;
        pC->pfnKernelIoControl = NULL;

        
        if ( pC->hThreadStopEvent )
        {
            EnterCriticalSection( &pC->cs );
            // Closing this will exit the monitor thread too
            CloseHandle( pC->hThreadStopEvent );
            pC->hThreadStopEvent = NULL;
            LeaveCriticalSection( &pC->cs );

            // wait a while for the thread ot exit
            if ( pC->hThread )
            {
                WaitForSingleObject( pC->hThread, 10000);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99国产精品一区| 不卡高清视频专区| 日韩一区二区三区电影在线观看| 亚洲综合清纯丝袜自拍| 在线一区二区三区四区五区| 亚洲综合一区二区三区| 678五月天丁香亚洲综合网| 蜜臂av日日欢夜夜爽一区| 欧美精品一区二区久久婷婷 | 日韩欧美国产综合一区| 精品一二三四在线| 国产欧美日韩精品一区| 色综合欧美在线| 亚洲成人av福利| 欧美精品一区二区在线播放| 成人app在线观看| 亚洲综合视频在线| 欧美成人a∨高清免费观看| 国产一区二三区好的| 亚洲天堂精品在线观看| 欧美人狂配大交3d怪物一区| 国产一区二区三区四区五区美女 | 精品欧美乱码久久久久久 | 免费欧美高清视频| 国产精品高清亚洲| 在线电影院国产精品| 国产一区二区中文字幕| 亚洲激情五月婷婷| 日韩你懂的在线观看| 91理论电影在线观看| 久久国产人妖系列| 亚洲免费视频成人| 国产亚洲精品福利| 欧美日韩三级一区| 成人免费视频视频在线观看免费| 亚洲宅男天堂在线观看无病毒| 日韩欧美在线影院| 一本大道av伊人久久综合| 免费人成网站在线观看欧美高清| 自拍偷拍欧美精品| 亚洲精品在线一区二区| 精品视频色一区| av网站免费线看精品| 美美哒免费高清在线观看视频一区二区 | 亚洲嫩草精品久久| 久久久久久久综合| 4438成人网| 色综合久久久网| 韩国女主播成人在线观看| 亚洲精品菠萝久久久久久久| 久久久久久麻豆| 欧美一区二区精品在线| 日本高清成人免费播放| 成人午夜电影久久影院| 久久国产视频网| 午夜精品福利一区二区蜜股av | 欧美亚洲国产一区在线观看网站| 国产成人鲁色资源国产91色综| 亚洲精品伦理在线| 日韩一区中文字幕| 中文字幕免费一区| 久久久久国色av免费看影院| 欧美一级国产精品| 91精品国产欧美一区二区| 欧美亚洲一区二区在线观看| 国产91综合网| 国产一区二区日韩精品| 极品美女销魂一区二区三区免费| 日本vs亚洲vs韩国一区三区二区| 亚洲二区视频在线| 亚洲一二三四区| 一区二区三区在线影院| 亚洲天堂精品在线观看| 中文字幕综合网| 亚洲欧美自拍偷拍色图| 国产精品久久久久久久午夜片| 国产无一区二区| 日本一区二区久久| 综合在线观看色| 一区二区三区91| 性做久久久久久免费观看| 爽好久久久欧美精品| 日日夜夜精品免费视频| 奇米综合一区二区三区精品视频| 欧美aⅴ一区二区三区视频| 日韩和欧美一区二区| 视频一区在线视频| 极品少妇xxxx精品少妇| 国产成人日日夜夜| 91丨porny丨蝌蚪视频| 色综合久久中文字幕| 欧美色图在线观看| 欧美一区二区免费| 国产午夜精品理论片a级大结局 | 精品av久久707| 国产欧美日韩视频在线观看| 成人欧美一区二区三区小说| 亚洲福中文字幕伊人影院| 免费在线观看一区| 国产夫妻精品视频| 91视频观看免费| 7777精品伊人久久久大香线蕉的 | 国产精品乱人伦中文| 亚洲视频中文字幕| 无码av免费一区二区三区试看 | 国产91精品一区二区| av中文字幕一区| 国产成人午夜视频| 国产成a人无v码亚洲福利| 99精品在线免费| 欧美私模裸体表演在线观看| 精品国产一区久久| 自拍av一区二区三区| 日韩精品一区第一页| 国产乱色国产精品免费视频| 99久久精品国产毛片| 日韩一区二区在线看| 国产精品三级在线观看| 午夜亚洲国产au精品一区二区| 狠狠色丁香婷婷综合| 在线亚洲一区二区| 精品国产91乱码一区二区三区| 中文字幕一区二区三区在线观看| 久久女同精品一区二区| 亚洲精品免费在线| 国产一区二区在线观看视频| 色综合久久久久久久久久久| 精品久久久久久综合日本欧美 | 久久久91精品国产一区二区三区| 亚洲精品视频免费观看| 国产精品中文欧美| 制服丝袜成人动漫| 亚洲男人的天堂在线aⅴ视频| 另类小说色综合网站| 日本韩国一区二区| 国产精品护士白丝一区av| 老司机一区二区| 欧美日韩久久久| 亚洲欧美偷拍三级| 国产91在线观看| 精品国产亚洲在线| 日韩一区精品视频| 精品视频在线看| 亚洲日本va午夜在线影院| 国产精品69久久久久水密桃| 欧美一区二区三区喷汁尤物| 亚洲乱码国产乱码精品精98午夜 | 韩国理伦片一区二区三区在线播放| 色婷婷亚洲一区二区三区| 欧美激情自拍偷拍| 国产精品综合在线视频| 6080国产精品一区二区| 亚洲国产综合人成综合网站| 91天堂素人约啪| 成人欧美一区二区三区白人| 国产二区国产一区在线观看| 亚洲精品一线二线三线| 美腿丝袜一区二区三区| 欧美一区二区三区四区在线观看| 亚洲午夜私人影院| 欧美三级中文字幕| 亚洲成人资源网| 9191久久久久久久久久久| 亚洲成av人片观看| 欧美日韩一本到| 亚洲超碰精品一区二区| 69久久99精品久久久久婷婷 | 久久久久亚洲蜜桃| 国产精品一区二区在线观看不卡| 精品国产乱码久久久久久闺蜜| 老司机免费视频一区二区 | 欧美视频完全免费看| 午夜久久久影院| 欧美一区二区黄色| 国产一区在线精品| 国产欧美精品一区二区色综合| 国产91清纯白嫩初高中在线观看| 国产精品视频你懂的| 色婷婷综合久久久久中文一区二区| 亚洲精品一二三四区| 欧美嫩在线观看| 久久成人av少妇免费| 国产日产欧美一区二区视频| 成人免费黄色在线| 亚洲一区免费视频| 91精品久久久久久久99蜜桃 | 白白色 亚洲乱淫| 亚洲专区一二三| 91精品国产综合久久婷婷香蕉| 精品亚洲成a人在线观看| 中文av字幕一区| 欧美综合天天夜夜久久| 日韩国产精品91| 久久久夜色精品亚洲| 91免费视频观看| 日韩有码一区二区三区| 国产日韩精品一区二区浪潮av| 91丨九色丨尤物| 免费看欧美女人艹b| 国产精品高清亚洲|