{
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;
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的获取是关节点
本文介绍如何在Windows Vista及更高版本中使用MFC实现针对特定进程的独立音频控制。关键在于正确获取并使用pSimpleAudioVolume对象。
2911

被折叠的 条评论
为什么被折叠?



