aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2018-06-20 16:44:22 +0200
committerGitHub <noreply@github.com>2018-06-20 16:44:22 +0200
commit74542ae2871962185d25000a9b32fd583ab2846e (patch)
tree7001cccacc9fdc3c4bcdaddb0dc3f7110309b38e
parentdfbe796fc86703b58da798c6a485ac0c2b7ee1f1 (diff)
parente5406b6f9a7fcd162c9caae40b286c4c41ee6a59 (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.cpp25
-rw-r--r--xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h8
-rw-r--r--xbmc/cores/AudioEngine/Interfaces/AE.h3
-rw-r--r--xbmc/cores/RetroPlayer/streams/RetroPlayerAudio.cpp2
-rw-r--r--xbmc/cores/VideoPlayer/AudioSinkAE.cpp6
-rw-r--r--xbmc/cores/VideoPlayer/AudioSinkAE.h2
-rw-r--r--xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp4
-rw-r--r--xbmc/cores/paplayer/PAPlayer.cpp6
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");
}