From cae960484efe0478c65bc919fb2484158d0358ad Mon Sep 17 00:00:00 2001 From: Ceylo Date: Sat, 13 Jun 2015 13:11:36 +0200 Subject: [PATCH] #49 Seek after selecting stream to change stream at any time (working but still unstable) --- src/Demuxer.cpp | 2 -- src/MovieImpl.cpp | 31 ++++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/Demuxer.cpp b/src/Demuxer.cpp index c080b99b..01ac9b3e 100644 --- a/src/Demuxer.cpp +++ b/src/Demuxer.cpp @@ -268,8 +268,6 @@ namespace sfe void Demuxer::selectAudioStream(std::shared_ptr stream) { Status oldStatus = m_timer->getStatus(); - CHECK(oldStatus == Stopped, "Changing the selected stream after starting " - "the movie playback isn't supported yet"); if (oldStatus == Playing) m_timer->pause(); diff --git a/src/MovieImpl.cpp b/src/MovieImpl.cpp index a6df7219..ba0209c2 100644 --- a/src/MovieImpl.cpp +++ b/src/MovieImpl.cpp @@ -107,16 +107,16 @@ namespace sfe return false; } - if (m_timer->getStatus() != Stopped) - { - sfeLogError("Movie::selectStream() - cannot select a stream while media is not stopped"); - return false; - } - std::map > streams = m_demuxer->getStreams(); std::map >::iterator it = streams.find(streamDescriptor.identifier); std::shared_ptr streamToSelect = nullptr; + Status initialStatus = m_timer->getStatus(); + sf::Time initialTime = m_timer->getOffset(); + + if (m_timer->getStatus() != Stopped) + m_timer->stop(); + if (it != streams.end()) { streamToSelect = it->second; @@ -126,18 +126,31 @@ namespace sfe { case Audio: m_demuxer->selectAudioStream(std::dynamic_pointer_cast(streamToSelect)); - return true; + break; case Video: m_demuxer->selectVideoStream(std::dynamic_pointer_cast(streamToSelect)); - return true; + break; case Subtitle: m_demuxer->selectSubtitleStream(std::dynamic_pointer_cast(streamToSelect)); - return true; + break; default: sfeLogWarning("Movie::selectStream() - stream activation for stream of kind " + mediaTypeToString(it->second->getStreamKind()) + " is not supported"); return false; } + + if (setPlayingOffset(initialTime)) + { + if (initialStatus == Playing) + play(); + + return true; + } + else + { + return false; + } + } void MovieImpl::play()