From b5387eff2b1c71f491b9463bf7ab4e4fb74dd983 Mon Sep 17 00:00:00 2001 From: Markus Himmel Date: Thu, 7 Jan 2016 12:06:20 +0100 Subject: [PATCH] MediaPlayer: Show individual track length in playlist window Signed-off-by: Dario Casalinuovo --- .../mediaplayer/playlist/FilePlaylistItem.cpp | 13 ++++++ .../mediaplayer/playlist/FilePlaylistItem.h | 3 ++ .../mediaplayer/playlist/PlaylistItem.cpp | 35 +++++++++++++++ src/apps/mediaplayer/playlist/PlaylistItem.h | 3 ++ .../mediaplayer/playlist/PlaylistListView.cpp | 16 ++++++- .../mediaplayer/playlist/PlaylistWindow.cpp | 45 +------------------ .../mediaplayer/playlist/PlaylistWindow.h | 1 - 7 files changed, 70 insertions(+), 46 deletions(-) diff --git a/src/apps/mediaplayer/playlist/FilePlaylistItem.cpp b/src/apps/mediaplayer/playlist/FilePlaylistItem.cpp index 9279fe19ee..976cff41c0 100644 --- a/src/apps/mediaplayer/playlist/FilePlaylistItem.cpp +++ b/src/apps/mediaplayer/playlist/FilePlaylistItem.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -398,6 +399,18 @@ FilePlaylistItem::ImageRef() const } +bigtime_t +FilePlaylistItem::_CalculateDuration() const +{ + BMediaFile mediaFile(&Ref()); + + if (mediaFile.InitCheck() != B_OK || mediaFile.CountTracks() < 1) + return 0; + + return mediaFile.TrackAt(0)->Duration(); +} + + status_t FilePlaylistItem::_SetAttribute(const char* attrName, type_code type, const void* data, size_t size) diff --git a/src/apps/mediaplayer/playlist/FilePlaylistItem.h b/src/apps/mediaplayer/playlist/FilePlaylistItem.h index fb72f9e802..5ca3e431ca 100644 --- a/src/apps/mediaplayer/playlist/FilePlaylistItem.h +++ b/src/apps/mediaplayer/playlist/FilePlaylistItem.h @@ -61,6 +61,9 @@ public: status_t AddImageRef(const entry_ref& ref); const entry_ref& ImageRef() const; +protected: + virtual bigtime_t _CalculateDuration() const; + private: status_t _SetAttribute(const char* attrName, type_code type, const void* data, diff --git a/src/apps/mediaplayer/playlist/PlaylistItem.cpp b/src/apps/mediaplayer/playlist/PlaylistItem.cpp index fde90a89c8..e3ec718dc1 100644 --- a/src/apps/mediaplayer/playlist/PlaylistItem.cpp +++ b/src/apps/mediaplayer/playlist/PlaylistItem.cpp @@ -10,6 +10,9 @@ #include #include +#include "AudioTrackSupplier.h" +#include "TrackSupplier.h" +#include "VideoTrackSupplier.h" #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "MediaPlayer-PlaylistItem" @@ -107,6 +110,19 @@ PlaylistItem::TrackNumber() const } +bigtime_t +PlaylistItem::Duration() +{ + bigtime_t duration; + if (GetAttribute(ATTR_INT64_DURATION, duration) != B_OK) { + duration = this->_CalculateDuration(); + SetAttribute(ATTR_INT64_DURATION, duration); + } + + return duration; +} + + void PlaylistItem::SetPlaybackFailed() { @@ -143,3 +159,22 @@ PlaylistItem::_NotifyListeners() const } } + +bigtime_t PlaylistItem::_CalculateDuration() const +{ + // To be overridden in subclasses with more efficient methods + TrackSupplier* supplier = CreateTrackSupplier(); + + AudioTrackSupplier* au = supplier->CreateAudioTrackForIndex(0); + VideoTrackSupplier* vi = supplier->CreateVideoTrackForIndex(0); + + bigtime_t duration = max_c(au == NULL ? 0 : au->Duration(), + vi == NULL ? 0 : vi->Duration()); + + delete vi; + delete au; + delete supplier; + + return duration; +} + diff --git a/src/apps/mediaplayer/playlist/PlaylistItem.h b/src/apps/mediaplayer/playlist/PlaylistItem.h index 73de81aa31..5c7e94cf32 100644 --- a/src/apps/mediaplayer/playlist/PlaylistItem.h +++ b/src/apps/mediaplayer/playlist/PlaylistItem.h @@ -80,6 +80,8 @@ public: int32 TrackNumber() const; + bigtime_t Duration(); + // methods virtual BString LocationURI() const = 0; virtual status_t GetIcon(BBitmap* bitmap, @@ -101,6 +103,7 @@ public: protected: void _NotifyListeners() const; + virtual bigtime_t _CalculateDuration() const; private: BList fListeners; diff --git a/src/apps/mediaplayer/playlist/PlaylistListView.cpp b/src/apps/mediaplayer/playlist/PlaylistListView.cpp index d7dc9d8213..005a7d5492 100644 --- a/src/apps/mediaplayer/playlist/PlaylistListView.cpp +++ b/src/apps/mediaplayer/playlist/PlaylistListView.cpp @@ -21,6 +21,7 @@ #include "Controller.h" #include "ControllerObserver.h" #include "CopyPLItemsCommand.h" +#include "DurationToString.h" #include "ImportPLItemsCommand.h" #include "ListViews.h" #include "MovePLItemsCommand.h" @@ -132,9 +133,22 @@ PlaylistListView::Item::Draw(BView* owner, BRect frame, const font_height& fh, float playbackMarkSize = playback_mark_size(fh); float textOffset = text_offset(fh); + char buffer[64]; + bigtime_t duration = fItem->Duration(); + duration /= 1000000; + duration_to_string(duration, buffer, sizeof(buffer)); + + BString truncatedDuration(buffer); + owner->TruncateString(&truncatedDuration, B_TRUNCATE_END, + frame.Width() - playbackMarkSize - textOffset); + float truncatedWidth = owner->StringWidth(truncatedDuration.String()); + owner->DrawString(truncatedDuration.String(), + BPoint(frame.right - truncatedWidth, + floorf(frame.top + frame.bottom + fh.ascent) / 2 - 1)); + BString truncatedString(text); owner->TruncateString(&truncatedString, B_TRUNCATE_MIDDLE, - frame.Width() - playbackMarkSize - textOffset); + frame.Width() - playbackMarkSize - textOffset - truncatedWidth); owner->DrawString(truncatedString.String(), BPoint(frame.left + playbackMarkSize + textOffset, floorf(frame.top + frame.bottom + fh.ascent) / 2 - 1)); diff --git a/src/apps/mediaplayer/playlist/PlaylistWindow.cpp b/src/apps/mediaplayer/playlist/PlaylistWindow.cpp index c99e971ac5..824a3cc72f 100644 --- a/src/apps/mediaplayer/playlist/PlaylistWindow.cpp +++ b/src/apps/mediaplayer/playlist/PlaylistWindow.cpp @@ -22,8 +22,6 @@ #include #include #include -#include -#include #include #include #include @@ -35,14 +33,11 @@ #include #include -#include "AudioTrackSupplier.h" #include "CommandStack.h" #include "DurationToString.h" #include "MainApp.h" #include "PlaylistListView.h" #include "RWLocker.h" -#include "TrackSupplier.h" -#include "VideoTrackSupplier.h" #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "MediaPlayer-PlaylistWindow" @@ -548,7 +543,7 @@ void PlaylistWindow::DurationListener::_HandleItemAdded(PlaylistItem* item, int32 index) { - bigtime_t duration = _DetermineItemDuration(item); + bigtime_t duration = item->Duration(); fTotalDuration += duration; fParent._UpdateTotalDuration(fTotalDuration); fKnown.AddItem(new bigtime_t(duration), index); @@ -568,41 +563,3 @@ PlaylistWindow::DurationListener::_HandleItemRemoved(int32 index) delete deleted; } - -bigtime_t -PlaylistWindow::DurationListener::_DetermineItemDuration(PlaylistItem* item) -{ - bigtime_t duration; - if (item->GetAttribute(PlaylistItem::ATTR_INT64_DURATION, duration) == B_OK) - return duration; - - // We have to find out the duration ourselves - if (FilePlaylistItem* file = dynamic_cast(item)) { - // We are dealing with a file - BMediaFile mediaFile(&file->Ref()); - - if (mediaFile.InitCheck() != B_OK || mediaFile.CountTracks() < 1) - return 0; - - duration = mediaFile.TrackAt(0)->Duration(); - } else { - // Not a file, so fall back to the generic TrackSupplier solution - TrackSupplier* supplier = item->CreateTrackSupplier(); - - AudioTrackSupplier* au = supplier->CreateAudioTrackForIndex(0); - VideoTrackSupplier* vi = supplier->CreateVideoTrackForIndex(0); - - duration = max_c(au == NULL ? 0 : au->Duration(), - vi == NULL ? 0 : vi->Duration()); - - delete vi; - delete au; - delete supplier; - } - - // Store the duration for later use - item->SetAttribute(PlaylistItem::ATTR_INT64_DURATION, duration); - - return duration; -} - diff --git a/src/apps/mediaplayer/playlist/PlaylistWindow.h b/src/apps/mediaplayer/playlist/PlaylistWindow.h index 6b70e76c4e..4ca65a7c1f 100644 --- a/src/apps/mediaplayer/playlist/PlaylistWindow.h +++ b/src/apps/mediaplayer/playlist/PlaylistWindow.h @@ -70,7 +70,6 @@ private: void _HandleItemAdded(PlaylistItem* item, int32 index); void _HandleItemRemoved(int32 index); - bigtime_t _DetermineItemDuration(PlaylistItem* item); BObjectList fKnown;