m_avgTimeWaiting(50),
m_sinkLatency(0.0),
m_pBuffer(NULL),
- m_bufferPtr(0)
+ m_bufferPtr(0),
+ m_hnsRequestedDuration(0)
{
m_channelLayout.Reset();
}
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 */
}
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;
+}
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);
uint8_t *m_pBuffer;
int m_bufferPtr;
+ REFERENCE_TIME m_hnsRequestedDuration;
};