WASAPI: Сессия не заканчивается
РЕДАКТИРОВАТЬ: я не передал соответствующие флаги в метод инициализации, я думаю, что страница Audio Sessions на 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; }