编辑:我没有将适当的标志传递给初始化方法,我认为 MSDN 上的音频会话页面在这方面有点误导,因为它似乎暗示它是默认行为,但是默认行为是会话与进程相关联,要允许它们在流被释放时终止,您需要通过:
AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED
http://msdn.microsoft.com/en-us/library/windows/desktop/dd370789(v=vs.85).aspx
好的,所以我一直在尝试让一些音频正常工作,基本上我想在播放音频和视频的同一进程下打开多个窗口(除了最上面的音频之外,所有的音频都被静音)。我在音频会话方面遇到问题,我为每个流创建了一个唯一的会话,但是当我认为我关闭了流时会话并没有关闭。
我的理解是 sndvol 将显示处于活动/非活动状态的会话,当您释放对流的所有引用时,会话将设置为过期并且不再出现在 sndvol 中,但是我发现对于我打开的每个流,一个新会话出现在 sndvol 但是在整个过程结束之前,它不会被删除,而不是在音频线程结束时(即当我关闭窗口/更改输入时)。
这是我的音频线程,我已经将它剥离到它的基本部分,该IAudioSessionControl
界面仅用于帮助我确定要调试的会话的状态,在“音频循环”中它是活动的,其他地方都是不活动的,但是我以为它会在我发布后过期我pAudioClient
在这里错了,我还应该发布什么?
WORD WINAPI
AudioThread (
LPVOID lpThreadParameter )
{
HRESULT hr;
PAUDIOPARMS pAudioParms = (PAUDIOPARMS)lpThreadParameter;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDevice *pDevice = NULL;
IAudioClient *pAudioClient = NULL;
IAudioSessionControl *pAudioSessionControl;
AudioSessionState audioSessionState;
GUID sessionGUID;
WAVEFORMATEXTENSIBLE *pwfx = NULL;
/* Initialise WASAPI interfaces and find audio endpoint. */
hr = CoCreateInstance ( &CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL,
&IID_IMMDeviceEnumerator, (void**)&pEnumerator);
EXIT_ON_ERROR(hr)
hr = pEnumerator->lpVtbl->GetDefaultAudioEndpoint(pEnumerator, eRender,
eConsole, &pDevice);
EXIT_ON_ERROR(hr)
SAFE_RELEASE ( pEnumerator );
hr = pDevice->lpVtbl->Activate(pDevice, &IID_IAudioClient, CLSCTX_ALL,
NULL, (void**)&pAudioClient);
EXIT_ON_ERROR(hr)
SAFE_RELEASE ( pDevice );
hr = pAudioClient->lpVtbl->GetMixFormat(pAudioClient,&pwfx);
CoCreateGuid ( &sessionGUID );
hr = pAudioClient->lpVtbl->Initialize ( pAudioClient, AUDCLNT_SHAREMODE_SHARED,
0, 853333, 0, pwfx, &sessionGUID );
if ( pwfx )
CoTaskMemFree ( pwfx );
hr = pAudioClient->lpVtbl->GetService ( pAudioClient, &IID_IAudioSessionControl, (void**)&pAudioSessionControl );
pAudioSessionControl->lpVtbl->GetState ( pAudioSessionControl, &audioSessionState );
hr = pAudioClient->lpVtbl->Start(pAudioClient);
EXIT_ON_ERROR(hr)
/* Allow OpenSharedAudio thread to continue. */
SetEvent ( pAudioParms->HStartEvent );
while (!pAudioParms->BClose)
{
/* Audio Loop. */
pAudioSessionControl->lpVtbl->GetState ( pAudioSessionControl, &audioSessionState );
}
hr = pAudioClient->lpVtbl->Stop(pAudioClient);
EXIT_ON_ERROR(hr)
Exit:
SAFE_RELEASE ( pAudioClient );
pAudioParms->Error = hr;
pAudioSessionControl->lpVtbl->GetState ( pAudioSessionControl, &audioSessionState );
SAFE_RELEASE ( pAudioSessionControl );
/* Allow OpenSharedAudio thread to continue. */
SetEvent ( pAudioParms->HStartEvent );
return 0;
}
我SAFE_RELEASE()
定义如下:
#define SAFE_RELEASE(pUnk) \
if ((pUnk) != NULL) \
{ (pUnk)->lpVtbl->Release(pUnk); (pUnk) = NULL; }