diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2018-06-20 16:44:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-20 16:44:22 +0200 |
commit | 74542ae2871962185d25000a9b32fd583ab2846e (patch) | |
tree | 7001cccacc9fdc3c4bcdaddb0dc3f7110309b38e | |
parent | dfbe796fc86703b58da798c6a485ac0c2b7ee1f1 (diff) | |
parent | e5406b6f9a7fcd162c9caae40b286c4c41ee6a59 (diff) |
Merge pull request #14085 from FernetMenta/audiofin
AE: add a switch to signal that streaming will continue
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 25 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 8 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Interfaces/AE.h | 3 | ||||
-rw-r--r-- | xbmc/cores/RetroPlayer/streams/RetroPlayerAudio.cpp | 2 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/AudioSinkAE.cpp | 6 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/AudioSinkAE.h | 2 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp | 4 | ||||
-rw-r--r-- | xbmc/cores/paplayer/PAPlayer.cpp | 6 |
8 files changed, 36 insertions, 20 deletions
diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp index 227ce06398..e980dbc573 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp @@ -394,9 +394,9 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) } return; case CActiveAEDataProtocol::FREESTREAM: - CActiveAEStream *stream; - stream = *(CActiveAEStream**)msg->data; - DiscardStream(stream); + MsgStreamFree *msgStreamFree; + msgStreamFree = *(MsgStreamFree**)msg->data; + DiscardStream(msgStreamFree->stream); msg->Reply(CActiveAEDataProtocol::ACC); return; case CActiveAEDataProtocol::FREESOUND: @@ -404,6 +404,7 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) DiscardSound(sound); return; case CActiveAEDataProtocol::DRAINSTREAM: + CActiveAEStream *stream; stream = *(CActiveAEStream**)msg->data; stream->m_drain = true; stream->m_processingBuffers->SetDrain(true); @@ -775,8 +776,9 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) m_state = AE_TOP_CONFIGURED_PLAY; return; case CActiveAEDataProtocol::FREESTREAM: - stream = *(CActiveAEStream**)msg->data; - DiscardStream(stream); + MsgStreamFree *msgStreamFree; + msgStreamFree = reinterpret_cast<MsgStreamFree*>(msg->data); + DiscardStream(msgStreamFree->stream); msg->Reply(CActiveAEDataProtocol::ACC); if (m_streams.empty()) { @@ -786,7 +788,10 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) { AEDelayStatus status; m_stats.GetDelay(status); - m_extDrainTimer.Set(status.GetDelay() * 1000); + if (msgStreamFree->finish) + m_extDrainTimer.Set(status.GetDelay() * 1000); + else + m_extDrainTimer.Set(status.GetDelay() * 1000 + 1000); } m_extDrain = true; } @@ -3241,12 +3246,16 @@ IAEStream *CActiveAE::MakeStream(AEAudioFormat &audioFormat, unsigned int option return NULL; } -bool CActiveAE::FreeStream(IAEStream *stream) +bool CActiveAE::FreeStream(IAEStream *stream, bool finish) { + MsgStreamFree msg; + msg.stream = static_cast<CActiveAEStream*>(stream); + msg.finish = finish; + Message *reply; if (m_dataPort.SendOutMessageSync(CActiveAEDataProtocol::FREESTREAM, &reply,1000, - &stream, sizeof(IAEStream*))) + &msg, sizeof(MsgStreamFree))) { bool success = reply->signal == CActiveAEControlProtocol::ACC; reply->Release(); diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h index cc2576e1b7..468cfacc63 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h @@ -143,6 +143,12 @@ struct MsgStreamNew IAEClockCallback *clock; }; +struct MsgStreamFree +{ + CActiveAEStream *stream; + bool finish; // if true switch back to gui sound mode +}; + struct MsgStreamSample { CSampleBuffer *buffer; @@ -245,7 +251,7 @@ public: /* returns a new stream for data in the specified format */ IAEStream *MakeStream(AEAudioFormat &audioFormat, unsigned int options = 0, IAEClockCallback *clock = NULL) override; - bool FreeStream(IAEStream *stream) override; + bool FreeStream(IAEStream *stream, bool finish) override; /* returns a new sound object */ IAESound *MakeSound(const std::string& file) override; diff --git a/xbmc/cores/AudioEngine/Interfaces/AE.h b/xbmc/cores/AudioEngine/Interfaces/AE.h index e9118e8199..4e0b1d56b4 100644 --- a/xbmc/cores/AudioEngine/Interfaces/AE.h +++ b/xbmc/cores/AudioEngine/Interfaces/AE.h @@ -143,9 +143,10 @@ public: * This method will remove the specifyed stream from the engine. * For OSX/IOS this is essential to reconfigure the audio output. * @param stream The stream to be altered + * @param finish if true AE will switch back to gui sound mode (if this is last stream) * @return NULL */ - virtual bool FreeStream(IAEStream *stream) = 0; + virtual bool FreeStream(IAEStream *stream, bool finish) = 0; /** * Creates a new IAESound that is ready to play the specified file diff --git a/xbmc/cores/RetroPlayer/streams/RetroPlayerAudio.cpp b/xbmc/cores/RetroPlayer/streams/RetroPlayerAudio.cpp index 5e98f63dbf..1875bef3ca 100644 --- a/xbmc/cores/RetroPlayer/streams/RetroPlayerAudio.cpp +++ b/xbmc/cores/RetroPlayer/streams/RetroPlayerAudio.cpp @@ -147,7 +147,7 @@ void CRetroPlayerAudio::CloseStream() { CLog::Log(LOGDEBUG, "RetroPlayer[AUDIO]: Closing audio stream"); - CServiceBroker::GetActiveAE()->FreeStream(m_pAudioStream); + CServiceBroker::GetActiveAE()->FreeStream(m_pAudioStream, true); m_pAudioStream = nullptr; } } diff --git a/xbmc/cores/VideoPlayer/AudioSinkAE.cpp b/xbmc/cores/VideoPlayer/AudioSinkAE.cpp index 41f6390435..dbb99a6b59 100644 --- a/xbmc/cores/VideoPlayer/AudioSinkAE.cpp +++ b/xbmc/cores/VideoPlayer/AudioSinkAE.cpp @@ -48,7 +48,7 @@ CAudioSinkAE::~CAudioSinkAE() { CSingleLock lock (m_critSection); if (m_pAudioStream) - CServiceBroker::GetActiveAE()->FreeStream(m_pAudioStream); + CServiceBroker::GetActiveAE()->FreeStream(m_pAudioStream, true); } bool CAudioSinkAE::Create(const DVDAudioFrame &audioframe, AVCodecID codec, bool needresampler) @@ -84,12 +84,12 @@ bool CAudioSinkAE::Create(const DVDAudioFrame &audioframe, AVCodecID codec, bool return true; } -void CAudioSinkAE::Destroy() +void CAudioSinkAE::Destroy(bool finish) { CSingleLock lock (m_critSection); if (m_pAudioStream) - CServiceBroker::GetActiveAE()->FreeStream(m_pAudioStream); + CServiceBroker::GetActiveAE()->FreeStream(m_pAudioStream, finish); m_pAudioStream = NULL; m_sampleRate = 0; diff --git a/xbmc/cores/VideoPlayer/AudioSinkAE.h b/xbmc/cores/VideoPlayer/AudioSinkAE.h index 233772b919..0e3f379505 100644 --- a/xbmc/cores/VideoPlayer/AudioSinkAE.h +++ b/xbmc/cores/VideoPlayer/AudioSinkAE.h @@ -48,7 +48,7 @@ public: void Resume(); bool Create(const DVDAudioFrame &audioframe, AVCodecID codec, bool needresampler); bool IsValidFormat(const DVDAudioFrame &audioframe); - void Destroy(); + void Destroy(bool finish); unsigned int AddPackets(const DVDAudioFrame &audioframe); double GetPlayingPts(); double GetCacheTime(); diff --git a/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp b/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp index b8e3f3e9bf..b4c90fc6ac 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp @@ -188,7 +188,7 @@ void CVideoPlayerAudio::CloseStream(bool bWaitForBuffers) m_audioSink.Flush(); } - m_audioSink.Destroy(); + m_audioSink.Destroy(true); // uninit queue m_messageQueue.End(); @@ -474,7 +474,7 @@ bool CVideoPlayerAudio::ProcessDecoderOutput(DVDAudioFrame &audioframe) if(m_speed) m_audioSink.Drain(); - m_audioSink.Destroy(); + m_audioSink.Destroy(false); if (!m_audioSink.Create(audioframe, m_streaminfo.codec, m_setsynctype == SYNC_RESAMPLE)) CLog::Log(LOGERROR, "%s - failed to create audio renderer", __FUNCTION__); diff --git a/xbmc/cores/paplayer/PAPlayer.cpp b/xbmc/cores/paplayer/PAPlayer.cpp index 527147b395..31127bdda1 100644 --- a/xbmc/cores/paplayer/PAPlayer.cpp +++ b/xbmc/cores/paplayer/PAPlayer.cpp @@ -192,7 +192,7 @@ void PAPlayer::CloseAllStreams(bool fade/* = true */) if (si->m_stream) { CloseFileCB(*si); - CServiceBroker::GetActiveAE()->FreeStream(si->m_stream); + CServiceBroker::GetActiveAE()->FreeStream(si->m_stream, true); si->m_stream = NULL; } @@ -208,7 +208,7 @@ void PAPlayer::CloseAllStreams(bool fade/* = true */) if (si->m_stream) { CloseFileCB(*si); - CServiceBroker::GetActiveAE()->FreeStream(si->m_stream); + CServiceBroker::GetActiveAE()->FreeStream(si->m_stream, true); si->m_stream = nullptr; } @@ -605,7 +605,7 @@ inline void PAPlayer::ProcessStreams(double &freeBufferTime) { itt = m_finishing.erase(itt); CloseFileCB(*si); - CServiceBroker::GetActiveAE()->FreeStream(si->m_stream); + CServiceBroker::GetActiveAE()->FreeStream(si->m_stream, true); delete si; CLog::Log(LOGDEBUG, "PAPlayer::ProcessStreams - Stream Freed"); } |