VC Vista/Win7下如何实现音量控制与获取终端设备音量改变事件的回调函数
最帅的小猪 2011-10-27 05:09:45 HRESULT hr = S_OK;
if(m_pEndptVolCtrl != NULL)
return FALSE;
if (m_pAudioEvents == NULL)
{
hr = E_POINTER;
return FALSE;
}
//g_EPVolEvents.SetCallback(fCallback); //set callback
CoInitialize(NULL);
hr = CoCreateGuid(&m_guidMyContext);
if(FAILED(hr))
return FALSE;
// Get enumerator for audio endpoint devices.
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IMMDeviceEnumerator),
(void**)&m_pEnumerator);
if(FAILED(hr))
return FALSE;
if(wdevid != NULL)
{
hr = m_pEnumerator->GetDevice(wdevid, &m_pDevice);
}
else // Get default audio-rendering or audio-capture device.
{
if(bCapture == FALSE)
{
hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_pDevice);
}
else
{
hr = m_pEnumerator->GetDefaultAudioEndpoint(eCapture, eConsole, &m_pDevice);
GetMicrophoneBoostVolumeLevel(m_pDevice);
}
}
if(FAILED(hr))
return FALSE;
hr = m_pDevice->Activate(__uuidof(IAudioEndpointVolume),
CLSCTX_ALL, NULL, (void**)&m_pEndptVolCtrl);
if(FAILED(hr))
return FALSE;
// Get the session manager for the endpoint device.
hr = m_pDevice->Activate(__uuidof(IAudioSessionManager),
CLSCTX_INPROC_SERVER, NULL,
(void**)&m_pManager);
if(FAILED(hr))
return FALSE;
// Get the control interface for the process-specific audio
// session with session GUID = GUID_NULL. This is the session
// that an audio stream for a DirectSound, DirectShow, waveOut,
// or PlaySound application stream belongs to by default.
hr = m_pManager->GetAudioSessionControl(NULL, 0, &m_pControl);
if(FAILED(hr))
return FALSE;
hr = m_pControl->RegisterAudioSessionNotification(m_pAudioEvents);//注册IAudioSessionEvents接口
if(FAILED(hr))
return FALSE;
/*if(g_pEndptVolCtrl)
hr = g_pEndptVolCtrl->RegisterControlChangeNotify(
(IAudioEndpointVolumeCallback*)&g_EPVolEvents);*/
/*if(FAILED(hr))
return FALSE;*/
注册IaudioSessionEvents接口后,应该怎么写回调来获取音频终端的音量改变事件呢?