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; }

0 ответов

Другие вопросы по тегам