From c7a9a93937d102f257992570dc30da57250a066a Mon Sep 17 00:00:00 2001 From: casey Date: Fri, 17 Jun 2016 22:17:55 -0700 Subject: [PATCH] Optimized prefetch of next track to happen way ahead of time to limit chance of gapless playback not working properly. --- src/core/audio/GaplessTransport.cpp | 5 ++--- src/musikbox/app/service/PlaybackService.cpp | 21 +++++++++++--------- src/musikbox/app/service/PlaybackService.h | 1 + 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/core/audio/GaplessTransport.cpp b/src/core/audio/GaplessTransport.cpp index 6c87ce93f..b7013b7c8 100644 --- a/src/core/audio/GaplessTransport.cpp +++ b/src/core/audio/GaplessTransport.cpp @@ -297,7 +297,6 @@ void GaplessTransport::OnPlaybackStarted(Player* player) { void GaplessTransport::OnPlaybackAlmostEnded(Player* player) { this->SetNextCanStart(true); - this->RaiseStreamEvent(GaplessTransport::StreamAlmostDone, player); { boost::recursive_mutex::scoped_lock lock(this->stateMutex); @@ -308,10 +307,11 @@ void GaplessTransport::OnPlaybackAlmostEnded(Player* player) { this->StartWithPlayer(this->nextPlayer); } } + + this->RaiseStreamEvent(GaplessTransport::StreamAlmostDone, player); } void GaplessTransport::OnPlaybackFinished(Player* player) { - this->SetNextCanStart(true); this->RaiseStreamEvent(GaplessTransport::StreamFinished, player); bool stopped = false; @@ -345,7 +345,6 @@ void GaplessTransport::OnPlaybackFinished(Player* player) { } void GaplessTransport::OnPlaybackError(Player* player) { - this->SetNextCanStart(true); this->RaiseStreamEvent(GaplessTransport::StreamError, player); this->SetPlaybackState(GaplessTransport::PlaybackStopped); DEFER(&GaplessTransport::RemoveActive, player); diff --git a/src/musikbox/app/service/PlaybackService.cpp b/src/musikbox/app/service/PlaybackService.cpp index c19277384..f2cdbfb36 100755 --- a/src/musikbox/app/service/PlaybackService.cpp +++ b/src/musikbox/app/service/PlaybackService.cpp @@ -67,19 +67,20 @@ PlaybackService::PlaybackService(LibraryPtr library, ITransport& transport) this->nextIndex = NO_POSITION; } +void PlaybackService::PrepareNextTrack() { + if (this->playlist.Count() > this->index + 1) { + if (this->nextIndex != this->index + 1) { + this->nextIndex = this->index + 1; + this->transport.PrepareNextTrack(URI_AT_INDEX(nextIndex)); + } + } +} + void PlaybackService::ProcessMessage(IMessage &message) { if (message.Type() == MESSAGE_STREAM_EVENT) { int64 eventType = message.UserData1(); - if (eventType == ITransport::StreamAlmostDone) { - if (this->playlist.Count() > this->index + 1) { - if (this->nextIndex != this->index + 1) { - this->nextIndex = this->index + 1; - this->transport.PrepareNextTrack(URI_AT_INDEX(nextIndex)); - } - } - } - else if (eventType == ITransport::StreamPlaying) { + if (eventType == ITransport::StreamPlaying) { if (this->nextIndex != NO_POSITION) { this->index = this->nextIndex; this->nextIndex = NO_POSITION; @@ -88,6 +89,8 @@ void PlaybackService::ProcessMessage(IMessage &message) { if (this->index != NO_POSITION) { this->TrackChanged(this->index, this->playlist.Get(this->index)); } + + this->PrepareNextTrack(); } } else if (message.Type() == MESSAGE_PLAYBACK_EVENT) { diff --git a/src/musikbox/app/service/PlaybackService.h b/src/musikbox/app/service/PlaybackService.h index 01f2ce8d6..9af685536 100755 --- a/src/musikbox/app/service/PlaybackService.h +++ b/src/musikbox/app/service/PlaybackService.h @@ -77,6 +77,7 @@ namespace musik { private: void OnStreamEvent(int eventType, std::string uri); void OnPlaybackEvent(int eventType); + void PrepareNextTrack(); musik::core::LibraryPtr library; musik::core::audio::ITransport& transport;