我現在正在使用舊的良好混音器API,但在正常情況下,不是在XP兼容模式下,它在Windows Vista上無法正常工作。它只會靜音當前應用程序的聲音,但我需要全局(硬件)靜音。如何研究目標?有沒有什麼方法可以在純C/C++中編寫這個無線COM接口和奇怪的調用?如何在Vista和7中全局靜音和取消靜音,並獲得靜音狀態?
2
A
回答
3
音頻堆棧在Vista中進行了重大改寫。每應用程序音量和靜音控制確實是新功能之一。奇怪的電話將需要使用IAudioEndpointVolume interface。
0
我最近處理了這個問題。我們有一個使用聲音系統進行報警的Windows應用程序。我們無法遵守用戶無意中將音響系統靜音。以下是我如何使用上面提出的接口來解決此問題:
在初始化過程中,我添加了一個函數來初始化IAudioEndpointVolume類型的成員。這有點棘手,幫助並不像它可能的那樣有幫助。以下是如何做到這一點:
/****************************************************************************
** Initialize the Audio Endpoint (Only for post XP systems)
****************************************************************************/
void CMuteWatchdog::InitAudioEndPoint(void)
{
HRESULT hr;
IMMDeviceEnumerator * pDevEnum;
IMMDevice * pDev;
const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL,
CLSCTX_ALL, IID_IMMDeviceEnumerator,
(void**)&pDevEnum);
m_pIaudEndPt = NULL;
if(hr == S_OK)
{
hr = pDevEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pDev);
if(hr == S_OK)
{
DWORD dwClsCtx;
const IID iidAEV = __uuidof(IAudioEndpointVolume);
dwClsCtx = 0;
hr = pDev->Activate(iidAEV, dwClsCtx, NULL, (void**) &m_pIaudEndPt);
if(hr == S_OK)
{
// Everything is groovy.
}
else
{
m_pIaudEndPt = NULL; // Might mean it's running on XP or something. Don't use.
}
pDev->Release();
}
pDevEnum->Release();
}
}
...
約每秒一次我添加了一個簡單的調用如下:
////////////////////////////////////////////////////////////////////////
// Watchdog function for mute.
void CMuteWatchdog::GuardMute(void)
{
if(m_pIaudEndPt)
{
BOOL bMute;
HRESULT hr;
bMute = FALSE;
hr = m_pIaudEndPt->GetMute(&bMute);
if(hr == S_OK)
{
if(bMute)
{
m_pIaudEndPt->SetMute(FALSE, NULL);
}
}
}
}
最後,當程序退出時只記得釋放分配的資源。
////////////////////////////////////////////////////////////////////////
// De-initialize the watchdog
void CMuteWatchdog::OnClose(void)
{
if(m_pIaudEndPt)
{
m_pIaudEndPt->Release();
m_pIaudEndPt = NULL;
}
}
相關問題
- 1. Android MediaPlayer靜音和取消靜音
- 2. 如何在Angular2中靜音和取消靜音?
- 3. 如何靜音和取消靜音播放器按鈕?
- 4. 如何使PowerShell中的聲音靜音/取消靜音
- 5. 的Android靜音/取消靜音電話
- 6. Mediaplayers獲得靜音/取消靜音太晚
- 7. iOS上的Objective-C中的靜音和取消靜音
- 8. 如何使用聲音管理器2靜音和取消靜音?
- 9. Objective-C靜音和取消靜音的方法
- 10. 靜音和取消靜音斯威夫特Spritekit
- 11. 如何通過點擊按鈕在iPad中靜音和取消靜音
- 12. 背景音的靜音/取消靜音按鈕
- 13. 如何取消靜音HTML5視頻有一個靜音道具
- 14. 靜音音頻
- 15. Actionscript 3.0中的Flash靜音按鈕不會取消靜音
- 16. Windows XP - 以編程方式在Python中靜音/取消靜音音頻
- 17. 無法在Android USB主機模式下將設備靜音和取消靜音
- 18. 在socket.io的聊天室裏靜音,取消靜音和竊竊私語
- 19. C#靜音/取消靜音特定窗口/ s?
- 20. 使用jQuery滾動靜音取消靜音
- 21. 靜音
- 22. 靜音和取消靜音按鈕? (仍然需要一個答案)
- 23. IOBluetoothHandsFreeDevice音頻靜態
- 24. WPF C#靜音/取消靜音所有的I/O音頻設備
- 25. 靜音按鈕不會靜音AVAudioPlayer
- 26. 如何靜音VLCMediaPlayer
- 27. 如何靜音movieclip?
- 28. 嵌入IE瀏覽器中的音頻(7+)的JavaScript功能靜音或取消靜音
- 29. 如何用複選框將應用程序靜音/取消靜音
- 30. 什麼是在視頻列表中靜音/取消靜音的最佳方法
你能給出一個上述問題的工作示例嗎?有什麼辦法可以放棄COM,並用純C或C++編寫代碼? – 2010-02-27 23:02:53
如果你以前從未寫過任何COM代碼,那麼你過着幸福的生活。沒有辦法繞過它。您可以從設計界面的人那裏獲得代碼示例。鏈接:http://blogs.msdn.com/larryosterman/archive/2007/03/06/how-do-i-change-the-master-volume-in-windows-vista.aspx – 2010-02-27 23:37:53