Ticket #6564: mediaplayer2.patch

File mediaplayer2.patch, 9.9 KB (added by TwoFx, 8 years ago)

Individual duration & visual improvements

  • src/apps/mediaplayer/playlist/FilePlaylistItem.cpp

    From 966850d9b75a74c036fbf07fa01751cb32d35712 Mon Sep 17 00:00:00 2001
    From: Markus Himmel <markus@himmel-villmar.de>
    Date: Thu, 7 Jan 2016 12:06:20 +0100
    Subject: [PATCH 1/2] MediaPlayer: Show individual track length in playlist
     window
    
    ---
     src/apps/mediaplayer/playlist/FilePlaylistItem.cpp | 13 +++++++
     src/apps/mediaplayer/playlist/FilePlaylistItem.h   |  3 ++
     src/apps/mediaplayer/playlist/PlaylistItem.cpp     | 35 +++++++++++++++++
     src/apps/mediaplayer/playlist/PlaylistItem.h       |  3 ++
     src/apps/mediaplayer/playlist/PlaylistListView.cpp | 16 +++++++-
     src/apps/mediaplayer/playlist/PlaylistWindow.cpp   | 45 +---------------------
     src/apps/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 9279fe1..976cff4 100644
    a b  
    1313#include <File.h>
    1414#include <FindDirectory.h>
    1515#include <MediaFile.h>
     16#include <MediaTrack.h>
    1617#include <Path.h>
    1718#include <TranslationUtils.h>
    1819
    FilePlaylistItem::ImageRef() const  
    398399}
    399400
    400401
     402bigtime_t
     403FilePlaylistItem::_CalculateDuration() const
     404{
     405    BMediaFile mediaFile(&Ref());
     406
     407    if (mediaFile.InitCheck() != B_OK || mediaFile.CountTracks() < 1)
     408        return 0;
     409
     410    return mediaFile.TrackAt(0)->Duration();
     411}
     412
     413
    401414status_t
    402415FilePlaylistItem::_SetAttribute(const char* attrName, type_code type,
    403416    const void* data, size_t size)
  • src/apps/mediaplayer/playlist/FilePlaylistItem.h

    diff --git a/src/apps/mediaplayer/playlist/FilePlaylistItem.h b/src/apps/mediaplayer/playlist/FilePlaylistItem.h
    index fb72f9e..5ca3e43 100644
    a b public:  
    6161            status_t            AddImageRef(const entry_ref& ref);
    6262            const entry_ref&    ImageRef() const;
    6363
     64protected:
     65    virtual bigtime_t           _CalculateDuration() const;
     66
    6467private:
    6568            status_t            _SetAttribute(const char* attrName,
    6669                                    type_code type, const void* data,
  • src/apps/mediaplayer/playlist/PlaylistItem.cpp

    diff --git a/src/apps/mediaplayer/playlist/PlaylistItem.cpp b/src/apps/mediaplayer/playlist/PlaylistItem.cpp
    index fde90a8..e3ec718 100644
    a b  
    1010#include <Catalog.h>
    1111#include <Locale.h>
    1212
     13#include "AudioTrackSupplier.h"
     14#include "TrackSupplier.h"
     15#include "VideoTrackSupplier.h"
    1316
    1417#undef B_TRANSLATION_CONTEXT
    1518#define B_TRANSLATION_CONTEXT "MediaPlayer-PlaylistItem"
    PlaylistItem::TrackNumber() const  
    107110}
    108111
    109112
     113bigtime_t
     114PlaylistItem::Duration()
     115{
     116    bigtime_t duration;
     117    if (GetAttribute(ATTR_INT64_DURATION, duration) != B_OK) {
     118        duration = this->_CalculateDuration();
     119        SetAttribute(ATTR_INT64_DURATION, duration);
     120    }
     121
     122    return duration;
     123}
     124
     125
    110126void
    111127PlaylistItem::SetPlaybackFailed()
    112128{
    PlaylistItem::_NotifyListeners() const  
    143159    }
    144160}
    145161
     162
     163bigtime_t PlaylistItem::_CalculateDuration() const
     164{
     165    // To be overridden in subclasses with more efficient methods
     166    TrackSupplier* supplier = CreateTrackSupplier();
     167
     168    AudioTrackSupplier* au = supplier->CreateAudioTrackForIndex(0);
     169    VideoTrackSupplier* vi = supplier->CreateVideoTrackForIndex(0);
     170
     171    bigtime_t duration = max_c(au == NULL ? 0 : au->Duration(),
     172        vi == NULL ? 0 : vi->Duration());
     173
     174    delete vi;
     175    delete au;
     176    delete supplier;
     177
     178    return duration;
     179}
     180
  • src/apps/mediaplayer/playlist/PlaylistItem.h

    diff --git a/src/apps/mediaplayer/playlist/PlaylistItem.h b/src/apps/mediaplayer/playlist/PlaylistItem.h
    index 73de81a..5c7e94c 100644
    a b public:  
    8080
    8181            int32               TrackNumber() const;
    8282
     83            bigtime_t           Duration();
     84
    8385    // methods
    8486    virtual BString             LocationURI() const = 0;
    8587    virtual status_t            GetIcon(BBitmap* bitmap,
    public:  
    101103
    102104protected:
    103105            void                _NotifyListeners() const;
     106    virtual bigtime_t           _CalculateDuration() const;
    104107
    105108private:
    106109            BList               fListeners;
  • src/apps/mediaplayer/playlist/PlaylistListView.cpp

    diff --git a/src/apps/mediaplayer/playlist/PlaylistListView.cpp b/src/apps/mediaplayer/playlist/PlaylistListView.cpp
    index d7dc9d8..005a7d5 100644
    a b  
    2121#include "Controller.h"
    2222#include "ControllerObserver.h"
    2323#include "CopyPLItemsCommand.h"
     24#include "DurationToString.h"
    2425#include "ImportPLItemsCommand.h"
    2526#include "ListViews.h"
    2627#include "MovePLItemsCommand.h"
    PlaylistListView::Item::Draw(BView* owner, BRect frame, const font_height& fh,  
    132133    float playbackMarkSize = playback_mark_size(fh);
    133134    float textOffset = text_offset(fh);
    134135
     136    char buffer[64];
     137    bigtime_t duration = fItem->Duration();
     138    duration /= 1000000;
     139    duration_to_string(duration, buffer, sizeof(buffer));
     140
     141    BString truncatedDuration(buffer);
     142    owner->TruncateString(&truncatedDuration, B_TRUNCATE_END,
     143        frame.Width() - playbackMarkSize - textOffset);
     144    float truncatedWidth = owner->StringWidth(truncatedDuration.String());
     145    owner->DrawString(truncatedDuration.String(),
     146        BPoint(frame.right - truncatedWidth,
     147            floorf(frame.top + frame.bottom + fh.ascent) / 2 - 1));
     148
    135149    BString truncatedString(text);
    136150    owner->TruncateString(&truncatedString, B_TRUNCATE_MIDDLE,
    137         frame.Width() - playbackMarkSize - textOffset);
     151        frame.Width() - playbackMarkSize - textOffset - truncatedWidth);
    138152    owner->DrawString(truncatedString.String(),
    139153        BPoint(frame.left + playbackMarkSize + textOffset,
    140154            floorf(frame.top + frame.bottom + fh.ascent) / 2 - 1));
  • src/apps/mediaplayer/playlist/PlaylistWindow.cpp

    diff --git a/src/apps/mediaplayer/playlist/PlaylistWindow.cpp b/src/apps/mediaplayer/playlist/PlaylistWindow.cpp
    index c99e971..824a3cc 100644
    a b  
    2222#include <File.h>
    2323#include <FilePanel.h>
    2424#include <Locale.h>
    25 #include <MediaFile.h>
    26 #include <MediaTrack.h>
    2725#include <Menu.h>
    2826#include <MenuBar.h>
    2927#include <MenuItem.h>
     
    3533#include <String.h>
    3634#include <StringView.h>
    3735
    38 #include "AudioTrackSupplier.h"
    3936#include "CommandStack.h"
    4037#include "DurationToString.h"
    4138#include "MainApp.h"
    4239#include "PlaylistListView.h"
    4340#include "RWLocker.h"
    44 #include "TrackSupplier.h"
    45 #include "VideoTrackSupplier.h"
    4641
    4742#undef B_TRANSLATION_CONTEXT
    4843#define B_TRANSLATION_CONTEXT "MediaPlayer-PlaylistWindow"
    void  
    548543PlaylistWindow::DurationListener::_HandleItemAdded(PlaylistItem* item,
    549544    int32 index)
    550545{
    551     bigtime_t duration = _DetermineItemDuration(item);
     546    bigtime_t duration = item->Duration();
    552547    fTotalDuration += duration;
    553548    fParent._UpdateTotalDuration(fTotalDuration);
    554549    fKnown.AddItem(new bigtime_t(duration), index);
    PlaylistWindow::DurationListener::_HandleItemRemoved(int32 index)  
    568563    delete deleted;
    569564}
    570565
    571 
    572 bigtime_t
    573 PlaylistWindow::DurationListener::_DetermineItemDuration(PlaylistItem* item)
    574 {
    575     bigtime_t duration;
    576     if (item->GetAttribute(PlaylistItem::ATTR_INT64_DURATION, duration) == B_OK)
    577         return duration;
    578 
    579     // We have to find out the duration ourselves
    580     if (FilePlaylistItem* file = dynamic_cast<FilePlaylistItem*>(item)) {
    581         // We are dealing with a file
    582         BMediaFile mediaFile(&file->Ref());
    583 
    584         if (mediaFile.InitCheck() != B_OK || mediaFile.CountTracks() < 1)
    585             return 0;
    586 
    587         duration =  mediaFile.TrackAt(0)->Duration();
    588     } else {
    589         // Not a file, so fall back to the generic TrackSupplier solution
    590         TrackSupplier* supplier = item->CreateTrackSupplier();
    591 
    592         AudioTrackSupplier* au = supplier->CreateAudioTrackForIndex(0);
    593         VideoTrackSupplier* vi = supplier->CreateVideoTrackForIndex(0);
    594 
    595         duration = max_c(au == NULL ? 0 : au->Duration(),
    596             vi == NULL ? 0 : vi->Duration());
    597 
    598         delete vi;
    599         delete au;
    600         delete supplier;
    601     }
    602 
    603     // Store the duration for later use
    604     item->SetAttribute(PlaylistItem::ATTR_INT64_DURATION, duration);
    605 
    606     return duration;
    607 }
    608 
  • src/apps/mediaplayer/playlist/PlaylistWindow.h

    diff --git a/src/apps/mediaplayer/playlist/PlaylistWindow.h b/src/apps/mediaplayer/playlist/PlaylistWindow.h
    index 6b70e76..4ca65a7 100644
    a b private:  
    7070            void                _HandleItemAdded(PlaylistItem* item,
    7171                                    int32 index);
    7272            void                _HandleItemRemoved(int32 index);
    73             bigtime_t           _DetermineItemDuration(PlaylistItem* item);
    7473
    7574            BObjectList<bigtime_t>
    7675                                fKnown;
  • src/apps/mediaplayer/playlist/PlaylistWindow.cpp

    -- 
    2.2.2
    
    
    From ae4e3e57a6338c0b2635bdf7eb531c3b1528a2f6 Mon Sep 17 00:00:00 2001
    From: Markus Himmel <markus@himmel-villmar.de>
    Date: Thu, 7 Jan 2016 13:35:01 +0100
    Subject: [PATCH 2/2] MediaPlayer: Playlist window visual fixes
    
    ---
     src/apps/mediaplayer/playlist/PlaylistWindow.cpp | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/src/apps/mediaplayer/playlist/PlaylistWindow.cpp b/src/apps/mediaplayer/playlist/PlaylistWindow.cpp
    index 824a3cc..379dc88 100644
    a b PlaylistWindow::PlaylistWindow(BRect frame, Playlist* playlist,  
    115115
    116116    fTotalDuration = new BStringView(frame, "fDuration", "",
    117117        B_FOLLOW_BOTTOM | B_FOLLOW_LEFT_RIGHT);
     118    fTotalDuration->SetAlignment(B_ALIGN_RIGHT);
     119    fTotalDuration->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
    118120    AddChild(fTotalDuration);
    119121
    120122    _UpdateTotalDuration(0);
    PlaylistWindow::_UpdateTotalDuration(bigtime_t duration)  
    470472    duration_to_string(duration, buffer, sizeof(buffer));
    471473
    472474    BString text;
    473     text.SetToFormat(B_TRANSLATE("Total duration : %s"), buffer);
     475    text.SetToFormat(B_TRANSLATE("Total duration: %s"), buffer);
    474476
    475477    fTotalDuration->SetText(text.String());
    476478}