From bcf30a5eb583af7cd84d1fc53c5fac23cbb1eba4 Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Tue, 15 Mar 2016 00:52:45 +0100 Subject: [PATCH] MediaPlayer: Add support code for url items * It needs further work to avoid the AudioSupplier being recreated every time. It makes the BMediaFile to redo the sniffing process various times. --- .../playlist/ImportPLItemsCommand.cpp | 3 +- src/apps/mediaplayer/playlist/Playlist.cpp | 38 +++++++++++++++++-- src/apps/mediaplayer/playlist/Playlist.h | 6 ++- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/apps/mediaplayer/playlist/ImportPLItemsCommand.cpp b/src/apps/mediaplayer/playlist/ImportPLItemsCommand.cpp index 236630bc6d..be2f6889d6 100644 --- a/src/apps/mediaplayer/playlist/ImportPLItemsCommand.cpp +++ b/src/apps/mediaplayer/playlist/ImportPLItemsCommand.cpp @@ -59,8 +59,7 @@ ImportPLItemsCommand::ImportPLItemsCommand(Playlist* playlist, // init new entries int32 added = 0; for (int32 i = 0; i < fNewCount; i++) { - FilePlaylistItem* fileItem = dynamic_cast(temp.ItemAtFast(i)); - if (fileItem && !Playlist::ExtraMediaExists(playlist, fileItem->Ref())) { + if (!Playlist::ExtraMediaExists(playlist, temp.ItemAtFast(i))) { fNewItems[added] = temp.ItemAtFast(i)->Clone(); if (fNewItems[added] == NULL) { // indicate bad object init diff --git a/src/apps/mediaplayer/playlist/Playlist.cpp b/src/apps/mediaplayer/playlist/Playlist.cpp index 6b96fc87ea..d89f0c49f2 100644 --- a/src/apps/mediaplayer/playlist/Playlist.cpp +++ b/src/apps/mediaplayer/playlist/Playlist.cpp @@ -464,7 +464,7 @@ Playlist::AppendRefs(const BMessage* refsReceivedMessage, int32 appendIndex) if (_IsQuery(type)) AppendQueryToPlaylist(ref, &subPlaylist); else { - if (!ExtraMediaExists(this, ref)) { + if (!_ExtraMediaExists(this, ref)) { AppendToPlaylistRecursive(ref, &subPlaylist); } } @@ -520,7 +520,7 @@ Playlist::AppendToPlaylistRecursive(const entry_ref& ref, Playlist* playlist) BString mimeString = _MIMEString(&ref); if (_IsMediaFile(mimeString)) { PlaylistItem* item = new (std::nothrow) FilePlaylistItem(ref); - if (!ExtraMediaExists(playlist, ref)) { + if (!_ExtraMediaExists(playlist, ref)) { _BindExtraMedia(item); if (item != NULL && !playlist->AddItem(item)) delete item; @@ -601,7 +601,26 @@ Playlist::NotifyImportFailed() /*static*/ bool -Playlist::ExtraMediaExists(Playlist* playlist, const entry_ref& ref) +Playlist::ExtraMediaExists(Playlist* playlist, PlaylistItem* item) +{ + FilePlaylistItem* fileItem = dynamic_cast(item); + if (fileItem != NULL) + return _ExtraMediaExists(playlist, fileItem->Ref()); + + // If we are here let's see if it is an url + UrlPlaylistItem* urlItem = dynamic_cast(item); + if (urlItem == NULL) + return true; + + return _ExtraMediaExists(playlist, urlItem->Url()); +} + + +// #pragma mark - private + + +/*static*/ bool +Playlist::_ExtraMediaExists(Playlist* playlist, const entry_ref& ref) { BString exceptExtension = _GetExceptExtension(BPath(&ref).Path()); @@ -617,7 +636,18 @@ Playlist::ExtraMediaExists(Playlist* playlist, const entry_ref& ref) } -// #pragma mark - private +/*static*/ bool +Playlist::_ExtraMediaExists(Playlist* playlist, BUrl* url) +{ + for (int32 i = 0; i < playlist->CountItems(); i++) { + UrlPlaylistItem* compare = dynamic_cast(playlist->ItemAt(i)); + if (compare == NULL) + continue; + if (compare->Url() != url) + return true; + } + return false; +} /*static*/ bool diff --git a/src/apps/mediaplayer/playlist/Playlist.h b/src/apps/mediaplayer/playlist/Playlist.h index 0a2ca39893..eac0dd54d2 100644 --- a/src/apps/mediaplayer/playlist/Playlist.h +++ b/src/apps/mediaplayer/playlist/Playlist.h @@ -24,9 +24,11 @@ #include #include +#include #include "FilePlaylistItem.h" #include "PlaylistItem.h" +#include "UrlPlaylistItem.h" class BDataIO; class BMessage; @@ -115,13 +117,15 @@ public: void NotifyImportFailed(); - static bool ExtraMediaExists(Playlist* playlist, const entry_ref& ref); + static bool ExtraMediaExists(Playlist* playlist, PlaylistItem* item); private: Playlist(const Playlist& other); Playlist& operator=(const Playlist& other); // unimplemented + static bool _ExtraMediaExists(Playlist* playlist, const entry_ref& ref); + static bool _ExtraMediaExists(Playlist* playlist, BUrl* url); static bool _IsImageFile(const BString& mimeString); static bool _IsMediaFile(const BString& mimeString); static bool _IsTextPlaylist(const BString& mimeString);