1

编辑:我没有将适当的标志传递给初始化方法,我认为 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; }
4

0 回答 0