diff --git a/src/apps/mediaplayer/Controller.cpp b/src/apps/mediaplayer/Controller.cpp index 3ab9f15046..f0708f5416 100644 --- a/src/apps/mediaplayer/Controller.cpp +++ b/src/apps/mediaplayer/Controller.cpp @@ -101,6 +101,7 @@ Controller::Controller() , fDuration(0) , fVideoFrameRate(25.0) , fSeekFrame(-1) + , fLastSeekEventTime(LONGLONG_MIN) , fAutoplay(true) , fPauseAtEndOfStream(false) @@ -269,6 +270,8 @@ Controller::SetTo(const entry_ref &ref) fVideoView->DisableOverlay(); // get video properties (if there is video at all) + bool useOverlays = fVideoView ? fVideoView->UseOverlays() : true; + int width; int height; GetSize(&width, &height); @@ -288,10 +291,11 @@ Controller::SetTo(const entry_ref &ref) if (InitCheck() != B_OK) { Init(BRect(0, 0, width - 1, height - 1), fVideoFrameRate, - preferredVideoFormat, LOOPING_ALL, false, 1.0, enabledNodes); + preferredVideoFormat, LOOPING_ALL, false, 1.0, enabledNodes, + useOverlays); } else { FormatChanged(BRect(0, 0, width - 1, height - 1), fVideoFrameRate, - preferredVideoFormat, enabledNodes); + preferredVideoFormat, enabledNodes, useOverlays); } _NotifyFileChanged(); @@ -578,9 +582,10 @@ Controller::SetPosition(float value) fSeekFrame = (int32)(Duration() * value); int32 currentFrame = CurrentFrame(); - if (fSeekFrame != currentFrame) + if (fSeekFrame != currentFrame) { SetCurrentFrame(fSeekFrame); - else + fLastSeekEventTime = system_time(); + } else fSeekFrame = -1; // TODO: What was this used for in the old framework? @@ -916,8 +921,10 @@ Controller::NotifyCurrentFrameChanged(int32 frame) const { // check if we are still waiting to reach the seekframe, // don't pass the event on to the listeners in that case - if (fSeekFrame >= 0 && frame != fSeekFrame) + if ((system_time() - fLastSeekEventTime) < 1000000 + && fSeekFrame >= 0 && frame != fSeekFrame) { return; + } fSeekFrame = -1; float position = 0.0; diff --git a/src/apps/mediaplayer/Controller.h b/src/apps/mediaplayer/Controller.h index c389edd6c8..fd12b9e1e0 100644 --- a/src/apps/mediaplayer/Controller.h +++ b/src/apps/mediaplayer/Controller.h @@ -175,6 +175,7 @@ private: bigtime_t fDuration; float fVideoFrameRate; mutable int32 fSeekFrame; + bigtime_t fLastSeekEventTime; bool fAutoplay; volatile bool fPauseAtEndOfStream; diff --git a/src/apps/mediaplayer/VideoView.cpp b/src/apps/mediaplayer/VideoView.cpp index 5a524fd156..a608695fde 100644 --- a/src/apps/mediaplayer/VideoView.cpp +++ b/src/apps/mediaplayer/VideoView.cpp @@ -8,10 +8,13 @@ #include +#include "Settings.h" + VideoView::VideoView(BRect frame, const char* name, uint32 resizeMask) : BView(frame, name, resizeMask, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE), - fOverlayMode(false) + fOverlayMode(false), + fGlobalSettingsListener(this) { SetViewColor(B_TRANSPARENT_COLOR); // might be reset to overlay key color if overlays are used @@ -22,11 +25,15 @@ VideoView::VideoView(BRect frame, const char* name, uint32 resizeMask) fOverlayRestrictions.max_width_scale = 8.0; fOverlayRestrictions.min_height_scale = 0.25; fOverlayRestrictions.max_height_scale = 8.0; + + Settings::Default()->AddListener(&fGlobalSettingsListener); + _AdoptGlobalSettings(); } VideoView::~VideoView() { + Settings::Default()->RemoveListener(&fGlobalSettingsListener); } @@ -36,11 +43,10 @@ VideoView::Draw(BRect updateRect) bool fillBlack = true; if (LockBitmap()) { - BRect r(Bounds()); if (const BBitmap* bitmap = GetBitmap()) { fillBlack = false; if (!fOverlayMode) - DrawBitmap(bitmap, bitmap->Bounds(), r); + _DrawBitmap(bitmap); } UnlockBitmap(); } @@ -50,6 +56,21 @@ VideoView::Draw(BRect updateRect) } +void +VideoView::MessageReceived(BMessage* message) +{ + switch (message->what) { + case MSG_OBJECT_CHANGED: + // TODO: find out which object, if we ever watch more than + // the global settings instance... + _AdoptGlobalSettings(); + break; + default: + BView::MessageReceived(message); + } +} + + void VideoView::SetBitmap(const BBitmap* bitmap) { @@ -60,8 +81,7 @@ VideoView::SetBitmap(const BBitmap* bitmap) // -> Window). if (bitmap && LockLooperWithTimeout(10000) == B_OK) { if (LockBitmap()) { -// if (fOverlayMode || bitmap->Flags() & B_BITMAP_WILL_OVERLAY) { - if (fOverlayMode || bitmap->ColorSpace() == B_YCbCr422) { + if (fOverlayMode || (bitmap->Flags() & B_BITMAP_WILL_OVERLAY)) { if (!fOverlayMode) { // init overlay rgb_color key; @@ -104,7 +124,7 @@ VideoView::SetBitmap(const BBitmap* bitmap) SetViewColor(B_TRANSPARENT_COLOR); } if (!fOverlayMode) - DrawBitmap(bitmap, bitmap->Bounds(), Bounds()); + _DrawBitmap(bitmap); UnlockBitmap(); } @@ -140,6 +160,13 @@ VideoView::OverlayScreenshotCleanup() } +bool +VideoView::UseOverlays() const +{ + return fUseOverlays; +} + + bool VideoView::IsOverlayActive() { @@ -167,3 +194,28 @@ VideoView::DisableOverlay() fOverlayMode = false; } + +// #pragma mark - + + +void +VideoView::_DrawBitmap(const BBitmap* bitmap) +{ +#ifdef __HAIKU__ + uint32 options = fUseBilinearScaling ? B_FILTER_BITMAP_BILINEAR : 0; + DrawBitmap(bitmap, bitmap->Bounds(), Bounds(), options); +#else + DrawBitmap(bitmap, bitmap->Bounds(), Bounds()); +#endif +} + + +void +VideoView::_AdoptGlobalSettings() +{ + mpSettings settings = Settings::CurrentSettings(); + + fUseOverlays = settings.useOverlays; + fUseBilinearScaling = settings.scaleBilinear; +} + diff --git a/src/apps/mediaplayer/VideoView.h b/src/apps/mediaplayer/VideoView.h index e4be3e1910..d68a4ab6fe 100644 --- a/src/apps/mediaplayer/VideoView.h +++ b/src/apps/mediaplayer/VideoView.h @@ -8,6 +8,7 @@ #include +#include "ListenerAdapter.h" #include "VideoTarget.h" @@ -19,6 +20,7 @@ public: // BView interface virtual void Draw(BRect updateRect); + virtual void MessageReceived(BMessage* message); // VideoTarget interface virtual void SetBitmap(const BBitmap* bitmap); @@ -30,13 +32,21 @@ public: void OverlayScreenshotPrepare(); void OverlayScreenshotCleanup(); + bool UseOverlays() const; bool IsOverlayActive(); void DisableOverlay(); private: + void _DrawBitmap(const BBitmap* bitmap); + void _AdoptGlobalSettings(); + bool fOverlayMode; overlay_restrictions fOverlayRestrictions; rgb_color fOverlayKeyColor; + + ListenerAdapter fGlobalSettingsListener; + bool fUseOverlays; + bool fUseBilinearScaling; }; #endif // VIDEO_VIEW_H diff --git a/src/apps/mediaplayer/media_node_framework/NodeManager.cpp b/src/apps/mediaplayer/media_node_framework/NodeManager.cpp index 88032e5dfa..159a7033ac 100644 --- a/src/apps/mediaplayer/media_node_framework/NodeManager.cpp +++ b/src/apps/mediaplayer/media_node_framework/NodeManager.cpp @@ -67,7 +67,7 @@ NodeManager::~NodeManager() status_t NodeManager::Init(BRect videoBounds, float videoFrameRate, color_space preferredVideoFormat, int32 loopingMode, - bool loopingEnabled, float speed, uint32 enabledNodes) + bool loopingEnabled, float speed, uint32 enabledNodes, bool useOverlays) { // init base class PlaybackManager::Init(videoFrameRate, loopingMode, loopingEnabled, speed); @@ -83,7 +83,7 @@ NodeManager::Init(BRect videoBounds, float videoFrameRate, fAudioSupplier = CreateAudioSupplier(); return FormatChanged(videoBounds, videoFrameRate, preferredVideoFormat, - enabledNodes, true); + enabledNodes, useOverlays, true); } // InitCheck @@ -118,7 +118,8 @@ NodeManager::CleanupNodes() // FormatChanged status_t NodeManager::FormatChanged(BRect videoBounds, float videoFrameRate, - color_space preferredVideoFormat, uint32 enabledNodes, bool force) + color_space preferredVideoFormat, uint32 enabledNodes, bool useOverlays, + bool force) { TRACE("NodeManager::FormatChanged()\n"); @@ -142,7 +143,8 @@ NodeManager::FormatChanged(BRect videoBounds, float videoFrameRate, SetVideoBounds(videoBounds); - status_t ret = _SetUpNodes(preferredVideoFormat, enabledNodes); + status_t ret = _SetUpNodes(preferredVideoFormat, enabledNodes, + useOverlays); if (ret == B_OK) _StartNodes(); else @@ -250,7 +252,8 @@ NodeManager::SetPeakListener(BHandler* handler) // _SetUpNodes status_t -NodeManager::_SetUpNodes(color_space preferredVideoFormat, uint32 enabledNodes) +NodeManager::_SetUpNodes(color_space preferredVideoFormat, uint32 enabledNodes, + bool useOverlays) { TRACE("NodeManager::_SetUpNodes()\n"); @@ -275,7 +278,7 @@ NodeManager::_SetUpNodes(color_space preferredVideoFormat, uint32 enabledNodes) // setup the video nodes if (enabledNodes != AUDIO_ONLY) { - fStatus = _SetUpVideoNodes(preferredVideoFormat); + fStatus = _SetUpVideoNodes(preferredVideoFormat, useOverlays); if (fStatus != B_OK) { print_error("Error setting up video nodes", fStatus); fMediaRoster->Unlock(); @@ -307,7 +310,8 @@ fNoAudio = true; // _SetUpVideoNodes status_t -NodeManager::_SetUpVideoNodes(color_space preferredVideoFormat) +NodeManager::_SetUpVideoNodes(color_space preferredVideoFormat, + bool useOverlays) { // create the video producer node fVideoProducer = new VideoProducer(NULL, "MediaPlayer Video Out", 0, @@ -381,7 +385,7 @@ NodeManager::_SetUpVideoNodes(color_space preferredVideoFormat) format.u.raw_video = videoFormat; // connect video producer to consumer (hopefully using overlays) - fVideoConsumer->SetTryOverlay(true); + fVideoConsumer->SetTryOverlay(useOverlays); fStatus = fMediaRoster->Connect(videoOutput.source, videoInput.destination, &format, &videoOutput, &videoInput); diff --git a/src/apps/mediaplayer/media_node_framework/NodeManager.h b/src/apps/mediaplayer/media_node_framework/NodeManager.h index e36a29e8a7..8192ee7ae3 100644 --- a/src/apps/mediaplayer/media_node_framework/NodeManager.h +++ b/src/apps/mediaplayer/media_node_framework/NodeManager.h @@ -40,10 +40,11 @@ class NodeManager : public PlaybackManager { status_t Init(BRect videoBounds, float videoFrameRate, color_space preferredVideoFormat, - int32 loopingMode = LOOPING_ALL, - bool loopingEnabled = true, - float speed = 1.0, - uint32 enabledNodes = AUDIO_AND_VIDEO); + int32 loopingMode, + bool loopingEnabled, + float speed, + uint32 enabledNodes, + bool useOverlays); status_t InitCheck(); // only call this if the // media_server has died! @@ -52,7 +53,8 @@ class NodeManager : public PlaybackManager { status_t FormatChanged(BRect videoBounds, float videoFrameRate, color_space preferredVideoFormat, - uint32 enabledNodes = AUDIO_AND_VIDEO, + uint32 enabledNodes, + bool useOverlays, bool force = false); virtual void SetPlayMode(int32 mode, bool continuePlaying = true); @@ -74,9 +76,10 @@ class NodeManager : public PlaybackManager { private: status_t _SetUpNodes(color_space preferredVideoFormat, - uint32 enabledNodes); + uint32 enabledNodes, bool useOverlays); status_t _SetUpVideoNodes( - color_space preferredVideoFormat); + color_space preferredVideoFormat, + bool useOverlays); status_t _SetUpAudioNodes(); status_t _TearDownNodes(bool disconnect = true); status_t _StartNodes(); diff --git a/src/apps/mediaplayer/settings/Settings.cpp b/src/apps/mediaplayer/settings/Settings.cpp index 6c057ef340..851fdac899 100644 --- a/src/apps/mediaplayer/settings/Settings.cpp +++ b/src/apps/mediaplayer/settings/Settings.cpp @@ -11,6 +11,20 @@ #include +bool +mpSettings::operator!=(const mpSettings& other) const +{ + return autostart != other.autostart + || closeWhenDonePlayingMovie != other.closeWhenDonePlayingMovie + || closeWhenDonePlayingSound != other.closeWhenDonePlayingSound + || loopMovie != other.loopMovie + || loopSound != other.loopSound + || useOverlays != other.useOverlays + || scaleBilinear != other.scaleBilinear + || backgroundMovieVolumeMode != other.backgroundMovieVolumeMode; +} + + Settings::Settings(const char* filename) : BLocker("settings lock"), fSettingsMessage(B_USER_CONFIG_DIRECTORY, filename) @@ -36,7 +50,7 @@ Settings::LoadSettings(mpSettings& settings) const settings.backgroundMovieVolumeMode = fSettingsMessage.GetValue("bgMovieVolumeMode", - (uint32)mpSettings::BG_MOVIES_MUTED); + (uint32)mpSettings::BG_MOVIES_FULL_VOLUME); } @@ -63,6 +77,8 @@ Settings::SaveSettings(const mpSettings& settings) // this will make sure the settings are saved even when the player // crashes. fSettingsMessage.Save(); + + Notify(); } diff --git a/src/apps/mediaplayer/settings/Settings.h b/src/apps/mediaplayer/settings/Settings.h index f8da1e7844..2aeecd7b17 100644 --- a/src/apps/mediaplayer/settings/Settings.h +++ b/src/apps/mediaplayer/settings/Settings.h @@ -11,6 +11,7 @@ #include +#include "Notifier.h" #include "SettingsMessage.h" struct mpSettings { @@ -27,11 +28,13 @@ struct mpSettings { BG_MOVIES_MUTED = 2 }; uint32 backgroundMovieVolumeMode; + + bool operator!=(const mpSettings& other) const; }; #define SETTINGS_FILENAME "MediaPlayerSettings" -class Settings : public BLocker { +class Settings : public BLocker, public Notifier { public: Settings( const char* filename = SETTINGS_FILENAME); @@ -44,6 +47,7 @@ public: private: SettingsMessage fSettingsMessage; + BList fListeners; static Settings sGlobalInstance; }; diff --git a/src/apps/mediaplayer/settings/SettingsWindow.cpp b/src/apps/mediaplayer/settings/SettingsWindow.cpp index 1a24d7c57b..c9eeba5c09 100644 --- a/src/apps/mediaplayer/settings/SettingsWindow.cpp +++ b/src/apps/mediaplayer/settings/SettingsWindow.cpp @@ -110,7 +110,7 @@ SettingsWindow::SettingsWindow(BRect frame) fMutedVolumeBGMoviesRB = new BRadioButton("rdbtnfullvolume", "Muted", new BMessage(M_START_MUTE_VOLUME)); - BButton* revertButton = new BButton("revert", "Revert", + fRevertB = new BButton("revert", "Revert", new BMessage(M_SETTINGS_REVERT)); BButton* cancelButton = new BButton("cancel", "Cancel", @@ -167,7 +167,7 @@ SettingsWindow::SettingsWindow(BRect frame) .SetInsets(5, 5, 15, 5) ) .Add(BGroupLayoutBuilder(buttonLayout) - .Add(revertButton) + .Add(fRevertB) .AddGlue() .Add(cancelButton) .Add(okButton) @@ -175,9 +175,8 @@ SettingsWindow::SettingsWindow(BRect frame) ) ); - - #else + frame = Bounds(); BView* view = new BView(frame,"SettingsView",B_FOLLOW_ALL_SIDES,B_WILL_DRAW); view->SetViewColor(216, 216, 216); @@ -251,8 +250,16 @@ SettingsWindow::SettingsWindow(BRect frame) #endif // disable currently unsupported features + fAutostartCB->SetEnabled(false); + fCloseWindowMoviesCB->SetEnabled(false); + fCloseWindowSoundsCB->SetEnabled(false); + fLoopMoviesCB->SetEnabled(false); fLoopSoundsCB->SetEnabled(false); + + fFullVolumeBGMoviesRB->SetEnabled(false); + fHalfVolumeBGMoviesRB->SetEnabled(false); + fMutedVolumeBGMoviesRB->SetEnabled(false); } @@ -339,6 +346,8 @@ SettingsWindow::AdoptSettings() == mpSettings::BG_MOVIES_HALF_VLUME); fMutedVolumeBGMoviesRB->SetValue(fSettings.backgroundMovieVolumeMode == mpSettings::BG_MOVIES_MUTED); + + fRevertB->SetEnabled(IsRevertable()); } @@ -368,6 +377,8 @@ SettingsWindow::ApplySettings() } Settings::Default()->SaveSettings(fSettings); + + fRevertB->SetEnabled(IsRevertable()); } @@ -379,3 +390,10 @@ SettingsWindow::Revert() Settings::Default()->SaveSettings(fSettings); } + +bool +SettingsWindow::IsRevertable() const +{ + return fSettings != fLastSettings; +} + diff --git a/src/apps/mediaplayer/settings/SettingsWindow.h b/src/apps/mediaplayer/settings/SettingsWindow.h index fea1a10e40..e254a9db07 100644 --- a/src/apps/mediaplayer/settings/SettingsWindow.h +++ b/src/apps/mediaplayer/settings/SettingsWindow.h @@ -27,7 +27,7 @@ public: void AdoptSettings(); void ApplySettings(); void Revert(); - bool IsRevertable(); + bool IsRevertable() const; private: mpSettings fSettings; @@ -45,6 +45,8 @@ private: BRadioButton* fFullVolumeBGMoviesRB; BRadioButton* fHalfVolumeBGMoviesRB; BRadioButton* fMutedVolumeBGMoviesRB; + + BButton* fRevertB; }; #endif