From 4fd26cd542fbc74c81a5f8196c4f188f92a585a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sat, 31 May 2008 11:06:04 +0000 Subject: [PATCH] Reuse existing nodes if the media formats do not change. This fixes the regression that audio playback of multiple files was not "seamless" anymore. Even video playback should be seamless, the remaining small glitch could be a problem with buffer timeout if the switch takes too long. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25735 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/mediaplayer/Controller.cpp | 9 +++++++-- .../mediaplayer/media_node_framework/NodeManager.cpp | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/apps/mediaplayer/Controller.cpp b/src/apps/mediaplayer/Controller.cpp index 77085ad027..5bcaa26248 100644 --- a/src/apps/mediaplayer/Controller.cpp +++ b/src/apps/mediaplayer/Controller.cpp @@ -258,8 +258,13 @@ Controller::SetTo(const entry_ref &ref) preferredVideoFormat = format.u.raw_video.display.format; } - Init(BRect(0, 0, width - 1, height - 1), fVideoFrameRate, - preferredVideoFormat, LOOPING_ALL, false); + if (InitCheck() != B_OK) { + Init(BRect(0, 0, width - 1, height - 1), fVideoFrameRate, + preferredVideoFormat, LOOPING_ALL, false); + } else { + FormatChanged(BRect(0, 0, width - 1, height - 1), fVideoFrameRate, + preferredVideoFormat); + } SetCurrentFrame(0); diff --git a/src/apps/mediaplayer/media_node_framework/NodeManager.cpp b/src/apps/mediaplayer/media_node_framework/NodeManager.cpp index e4eac6d861..705b343fed 100644 --- a/src/apps/mediaplayer/media_node_framework/NodeManager.cpp +++ b/src/apps/mediaplayer/media_node_framework/NodeManager.cpp @@ -119,11 +119,16 @@ status_t NodeManager::FormatChanged(BRect videoBounds, float videoFrameRate, color_space preferredVideoFormat, bool force) { + TRACE("NodeManager::FormatChanged()\n"); + if (!force && videoBounds == VideoBounds() - && videoFrameRate == FramesPerSecond()) + && videoFrameRate == FramesPerSecond()) { + TRACE(" -> reusing existing nodes\n"); return B_OK; + } if (videoFrameRate != FramesPerSecond()) { + TRACE(" -> need to Init()\n"); PlaybackManager::Init(videoFrameRate, LoopMode(), IsLoopingEnabled(), Speed(), MODE_PLAYING_PAUSED_FORWARD, CurrentFrame()); }