MFC根据进程名独立的进行音量控制——仅限于windows vista之后的版本
2014-10-28 09:52
417 查看
{
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的获取是关节点
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的获取是关节点
相关文章推荐
- 使用Subversion进行版本控制 针对 Subversion 1.4(根据r2866编译)-------<转载>这是重要的知识点
- Eclipse 使用 CVSNT进行版本控制。
- Windows下用subversion进行版本控制
- Eclipse结合SVN进行版本控制在执行更新时遇到的问题
- Eclipse中使用Subversion进行版本控制
- 求VC版本如何利用WMI获得磁盘信息 VC/MFC / 进程/线程/DLL - 社区 community.csdn.net
- 根据delphi版本进行编译
- 使用subvision进行版本控制 初阶
- 使用WinCVS进行版本控制
- 用SQl Navigator5.5进行数据库开发的版本控制
- [转]使用svn进行版本控制
- 通过直接控制DNS进程进行数据传输
- 使用subvision进行版本控制 初阶
- 使用 Override 和 New 关键字进行版本控制(C# 编程指南)
- 使用 Override 和 New 关键字进行版本控制(C# 编程指南)
- 如何在vs2005中利用vss6.0进行版本控制
- XylFTP改用git进行版本控制
- 使用Subversion进行版本控制书籍地址!!
- 使用版本控制的分支合并进行开发,模拟,运营环境的统一部署
- 【转】如何在项目管理中进行版本控制