MFC根据进程名独立的进行音量控制——仅限于windows vista之后的版本

来源:互联网 发布:淘宝美工笨的人难学吗 编辑:程序博客网 时间:2024/05/20 18:20
{


HRESULT hr = S_OK;
IMMDevice* pDevice = NULL;
IMMDeviceEnumerator* pEnumerator = NULL;
IAudioSessionControl* pSessionControl = NULL;
IAudioSessionControl2* pSessionControl2 = NULL;
IAudioSessionManager* pSessionManager = NULL;
IAudioSessionManager2* pSessionManager2 = NULL;
IAudioSessionEnumerator* pSessionEnumerator = NULL;
AudioSessionState mAudiosessionState;
ISimpleAudioVolume* pSimpleAudioVolume = NULL;
int counts = 0;
WCHAR name2[512];
DWORD puid;
GUID pGuid;
float fVol;
wchar_t ProcessNamef[MAX_PATH] = L"unknown";




hr = CoInitialize(NULL);


// Create the device enumerator.
hr = CoCreateInstance(
__uuidof(MMDeviceEnumerator),
NULL, CLSCTX_ALL,
__uuidof(IMMDeviceEnumerator),
(void**)&pEnumerator);


// Get the default audio device.
hr = pEnumerator->GetDefaultAudioEndpoint(
eRender, eConsole, &pDevice);


// Get the audio client.
hr = pDevice->Activate(
__uuidof(IAudioSessionManager), CLSCTX_ALL,
NULL, (void**)&pSessionManager);


hr = pDevice->Activate(
__uuidof(IAudioSessionManager2), CLSCTX_ALL,
NULL, (void**)&pSessionManager2);


hr = pSessionManager2->GetSessionEnumerator(&pSessionEnumerator);


pSessionEnumerator->GetCount(&counts);

for (int i = 0; i < counts; i++)
{
pSessionEnumerator->GetSession(i, &pSessionControl);




hr = pSessionControl->QueryInterface(
__uuidof(IAudioSessionControl2), (void**)&pSessionControl2);


// Check whether this is a system sound.
hr = pSessionControl2->IsSystemSoundsSession();
if (hr)
{


hr = pSessionControl2->SetDuckingPreference(TRUE);


pSessionControl2->GetState(&mAudiosessionState);


if (mAudiosessionState == AudioSessionStateActive)
{
pSessionControl2->GetProcessId(&puid);
hr = pSessionControl->QueryInterface(
__uuidof(ISimpleAudioVolume), (void**)&pSimpleAudioVolume);
//pSimpleAudioVolume->GetMasterVolume(&fVol);
fVol = C_G_Balance / 100;
//index_Lync_updata();
// pSimpleAudioVolume->SetMasterVolume(0.1, &pGuid);
// PidToProcessName(puid, ProcessNamef);
bool findCPN = 0;
for (int j = 0; j < ChatProcessName_count; j++)
{
if (puid == AudioPID_Name_List[index_Lync[j]].puid)
{
pSimpleAudioVolume->SetMasterVolume(fVol, &pGuid);
findCPN = 1;
break;


}


}



if (findCPN == 0)
{
pSimpleAudioVolume->SetMasterVolume((1 - fVol), &pGuid);
}








//printf("puid=%d vol=%f\r\n", puid,fVol);


}








}


}








if (num_for_out)
pSimpleAudioVolume->Release();


pSessionEnumerator->Release();
pSessionControl2->Release();
pSessionControl->Release();
pSessionManager2->Release();
pSessionManager->Release();
pEnumerator->Release();
pDevice->Release();


return hr;

}

直接上代码,注意pSimpleAudioVolume的获取是关节点

0 0
原创粉丝点击