[WIN32][WASAPI] created a drain method.
authorwsoltys <wiso@no.way>
Thu, 18 Jul 2013 16:13:02 +0000 (18:13 +0200)
committerRainer Hochecker <fernetmenta@online.de>
Thu, 1 Aug 2013 14:28:33 +0000 (16:28 +0200)
xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp
xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h

index 78db727..8c8bc1f 100644 (file)
@@ -193,7 +193,8 @@ CAESinkWASAPI::CAESinkWASAPI() :
   m_avgTimeWaiting(50),
   m_sinkLatency(0.0),
   m_pBuffer(NULL),
-  m_bufferPtr(0)
+  m_bufferPtr(0),
+  m_hnsRequestedDuration(0)
 {
   m_channelLayout.Reset();
 }
@@ -1161,6 +1162,8 @@ initialize:
   hr = m_pAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST,
                                     audioSinkBufferDurationMsec, audioSinkBufferDurationMsec, &wfxex.Format, NULL);
 
+  m_hnsRequestedDuration = audioSinkBufferDurationMsec;
+
   if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED)
   {
     /* WASAPI requires aligned buffer */
@@ -1290,3 +1293,25 @@ const char *CAESinkWASAPI::WASAPIErrToStr(HRESULT err)
   }
   return NULL;
 }
+
+void CAESinkWASAPI::Drain()
+{
+  if(!m_pAudioClient)
+    return;
+
+  Sleep( (DWORD)(m_hnsRequestedDuration / 10000));
+
+  if (m_running)
+  {
+    try
+    {
+      m_pAudioClient->Stop();  //stop the audio output
+      m_pAudioClient->Reset(); //flush buffer and reset audio clock stream position
+    }
+    catch (...)
+    {
+      CLog::Log(LOGDEBUG, __FUNCTION__, "Invalidated AudioClient - Releasing");
+    }
+  }
+  m_running = false;
+}
index 37cfd68..39d62d5 100644 (file)
@@ -45,6 +45,7 @@ public:
     virtual unsigned int AddPackets                  (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false);
     virtual bool         SoftSuspend                 ();
     virtual bool         SoftResume                  ();
+    virtual void         Drain                       ();
     static  void         EnumerateDevicesEx          (AEDeviceInfoList &deviceInfoList, bool force = false);
 private:
     bool         InitializeExclusive(AEAudioFormat &format);
@@ -81,4 +82,5 @@ private:
 
     uint8_t            *m_pBuffer;
     int                 m_bufferPtr;
+    REFERENCE_TIME      m_hnsRequestedDuration;
 };