win7音訊 audio service調節單個程式音量控制
以下程式碼的作用是控制當前程式的聲音,並將其他程式的聲音關閉。
程式碼如下:
[cpp] view plain copy
- BOOL SetCurrentProcessVolume(DWORD dwVolume,BOOL IsMixer/*TRUE*/)
- {
- HRESULT hr <span style="white-space:pre"> </span>= S_OK;
- IMMDeviceCollection *pMultiDevice = NULL;
- IMMDevice *pDevice = NULL;
- IAudioSessionEnumerator *pSessionEnum = NULL;
- IAudioSessionManager2 *pASManager = NULL;
- IMMDeviceEnumerator *m_pEnumerator = NULL;
- const IID IID_ISimpleAudioVolume = __uuidof(ISimpleAudioVolume);
- const IID IID_IAudioSessionControl2 = __uuidof(IAudioSessionControl2);
- CoInitialize(NULL);
- hr = CoCreateGuid(&m_guidMyContext);
- if(FAILED(hr))
- return FALSE;
- // Get enumerator for audio endpoint devices.
- hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
- NULL, CLSCTX_ALL,
- __uuidof(IMMDeviceEnumerator),
- (void**)&m_pEnumerator);
- if(FAILED(hr))
- return FALSE;
- if (IsMixer)
- {
- hr = m_pEnumerator->EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE, &pMultiDevice);
- }
- else
- {
- hr = m_pEnumerator->EnumAudioEndpoints(eCapture,DEVICE_STATE_ACTIVE, &pMultiDevice);
- }
- if(FAILED(hr))
- return FALSE;
- UINT deviceCount = 0;
- hr = pMultiDevice->GetCount(&deviceCount);
- if(FAILED(hr))
- return FALSE;
- if((int)dwVolume < 0)
- dwVolume = 0;
- if((int)dwVolume > 100)
- dwVolume = 100;
- for (UINT ii=0; ii<deviceCount; ii++)
- {
- pDevice = NULL;
- hr = pMultiDevice->Item(ii,&pDevice);
- if(FAILED(hr))
- return FALSE;
- hr = pDevice->Activate(__uuidof(IAudioSessionManager),CLSCTX_ALL, NULL,(void**)&pASManager);
- if(FAILED(hr))
- return FALSE;
- hr = pASManager->GetSessionEnumerator(&pSessionEnum);
- if(FAILED(hr))
- return FALSE;
- int nCount;
- hr = pSessionEnum->GetCount(&nCount);
- for (int i = 0; i < nCount; i++)
- {
- IAudioSessionControl *pSessionCtrl;
- hr = pSessionEnum->GetSession(i, &pSessionCtrl);
- if (FAILED(hr))
- continue;
- IAudioSessionControl2 *pSessionCtrl2;
- hr = pSessionCtrl->QueryInterface(IID_IAudioSessionControl2, (void **)&pSessionCtrl2);
- if(FAILED(hr))
- continue;
- ULONG pid;
- hr = pSessionCtrl2->GetProcessId(&pid);
- if (FAILED(hr))
- continue;
- ISimpleAudioVolume *pSimplevol;
- hr = pSessionCtrl2->QueryInterface(IID_ISimpleAudioVolume, (void **)&pSimplevol);
- if (FAILED(hr))
- continue;
- if (pid == GetCurrentProcessId())
- {
- pSimplevol->SetMasterVolume((float)dwVolume/100, NULL);
- }
- else
- {
- pSimplevol->SetMasterVolume((float)0/100, NULL);
- }
- }
- }
- SAFE_RELEASE(m_pEnumerator);
- return TRUE;
- }
說明:
1.IMMDeviceEnumerator::EnumAudioEndpoints
EnumAudioEndpoints 方法用於生成符合指定標準的終端裝置的一個合集。
第一個引數為列舉值,包括以下三個:
eRender:音訊渲染流,從應用程式到裝置終端的流。設定為eRender,獲取播放裝置。
eCapture:音訊捕捉流,從裝置終端到應用程式的流。設定為eCapture,獲取錄音裝置。
eAll:獲取以上兩種。
第二個引數也是列舉值,包括以下幾個:
DEVICE_STATE_ACTIVE:當前啟用的裝置
DEVICE_STATE_DISABLED:當前禁用的裝置
DEVICE_STATE_NOTPRESENT:不存在的終端裝置,即已經中系統中刪除的裝置,或者在裝置管理器中禁用的裝置。
DEVICE_STATE_UNPLUGGED:未插電的裝置。
第三個引數,指向裝置集合物件的介面。
2.用GetCount函式獲取裝置總數量
3.用Item函式索引單個裝置。
4.用獲取到的裝置指標,啟用應用程式音量管理指標。
Activate函式
第一個引數:裝置標示符。是對GUID的一個引用,標示請求啟用的介面。呼叫者將使用這個介面與COM物件通訊。
第二個引數:用於管理將要執行的物件,可以將多個列舉值相或來設定,也可以使用CLSCTX_ALL,可以通過指定CLSCTX_ALL避免上下文的限制。
第三個引數:當用來啟用裝置的IAudioClient、IAudioEndpointVolume IAudioMeterInformation IAudioSessionManager或IDeviceTopology這些介面時,設定為NULL。
第四個引數:指向指定介面引數地址的指標。
5.用GetSessionEnumerator獲取IAudioSessionEnumerator指標。其中包含了所有應用程式音量的控制指標。同樣可以用GetCount來獲取到總數。
6.用GetSession獲取IAudioSessionControl指標。以上文的Item函式相似。
7.用QueryInterface通過IAudioSessionControl指標查詢到IAudioSessionControl2指標,根據第一個引數設定的IID的值去查詢相應的指標。
8.獲取到該應用程式的PID
9.用QueryInterface獲取音量控制指標
10.如果當前應用程式的PID與IAudioSessionControl2指標獲取到的PID相等,則裝置當前應用程式的音量。自然,也可以指定PID來控制特定應用程式的音量。
相關文章
- 微信audio音訊不能播放音訊
- Flutter Flame教程5 -- Audio 音訊Flutter音訊
- Core Audio音訊基礎概述音訊
- OpenHarmony 3.2 Beta Audio——音訊渲染音訊
- 「Premiere中文新手教程」音訊設定與調節REM音訊
- 調節聲音 工具
- Audio Unit採集音訊實戰音訊
- HTML5 Audio(音訊)簡介HTML音訊
- HTML5音訊audio屬性HTML音訊
- [SceneKit專題]17-Audio音訊音訊
- HTML5音訊audio詳解HTML音訊
- JS指定音訊audio在某個時間點進行播放,獲取當前音訊audio的長度,音訊時長格式轉化JS音訊
- Tuneskit Audio Capture for Mac 音訊錄製工具APTMac音訊
- Audio Hijack for Mac音訊錄製工具Mac音訊
- DVD音訊提取工具:DVD Audio Extractor for Mac音訊Mac
- Easy Audio Mixer Mac(音訊混音器)Mac音訊
- Audio API - 隨音訊跳動的CubeAPI音訊
- html5學習(二)音訊audioHTML音訊
- mac無損音訊錄音機:AudFree Audio Capture for MacMac音訊APT
- Web Audio API 第4章 音調與頻域WebAPI
- 無損音訊捕捉工具:DRmare Audio Capture for Mac音訊APTMac
- 移動端audio音訊播放相容方案薦音訊
- IOS音視訊(四十三)AVFoundation 之 Audio SessioniOSSession
- flash轉音訊軟體(thundersoft flash to audio converter)音訊
- Android音訊驅動學習(一) Audio HALAndroid音訊
- 音訊錄製軟體Audio Hijack-Macw音訊Mac
- 音訊轉換器:Bigasoft Audio Converter for Mac音訊Mac
- Mac音訊轉換器:Bigasoft Audio ConverterMac音訊
- DRmare Audio Converter Mac(DRM音訊轉換器)Mac音訊
- DRM音訊轉換工具:DRmare Audio Converter Mac音訊Mac
- 谷歌宣佈沉浸式VR音訊SDK Resonance Audio谷歌VR音訊NaN
- iOS: Audio File 音訊檔案錄製(支援VBR,CBR)iOS音訊
- Audio Queue 採集音訊實戰(支援不同格式)音訊
- Sauceware Audio Scorch for mac(說唱音訊製作外掛)Mac音訊
- iOS 實時音訊採集與播放Audio Unit使用iOS音訊
- Viwizard Audio Converter for Mac(音訊格式轉換軟體)Mac音訊
- 掌握HTML5中的多媒體–音訊(audio)HTML音訊
- 華為音訊編輯服務(Audio Editor Kit),快速構建應用音訊編輯能力音訊