From ffe4208595b85fd072f81ac06545942f0d6410f5 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sun, 26 Dec 2021 22:49:35 +0400 Subject: [PATCH] Implement loop status/shuffle for MPRIS --- .../media/system_media_controls_manager.cpp | 54 ++++++++++++++++++- .../media/system_media_controls_manager.h | 2 + Telegram/lib_base | 2 +- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/media/system_media_controls_manager.cpp b/Telegram/SourceFiles/media/system_media_controls_manager.cpp index 5e37f2f049..c6310cdc52 100644 --- a/Telegram/SourceFiles/media/system_media_controls_manager.cpp +++ b/Telegram/SourceFiles/media/system_media_controls_manager.cpp @@ -19,13 +19,26 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_account.h" #include "main/main_session.h" #include "media/audio/media_audio.h" -#include "media/player/media_player_instance.h" #include "media/streaming/media_streaming_instance.h" #include "media/streaming/media_streaming_player.h" #include "ui/text/format_song_document_name.h" #include "window/window_controller.h" namespace Media { +namespace { + +[[nodiscard]] auto RepeatModeToLoopStatus(Media::Player::RepeatMode mode) { + using Mode = Media::Player::RepeatMode; + using Status = base::Platform::SystemMediaControls::LoopStatus; + switch (mode) { + case Mode::None: return Status::None; + case Mode::One: return Status::Track; + case Mode::All: return Status::Playlist; + } + Unexpected("RepeatModeToLoopStatus in SystemMediaControlsManager"); +} + +} // namespace bool SystemMediaControlsManager::Supported() { return base::Platform::SystemMediaControls::Supported(); @@ -185,6 +198,22 @@ SystemMediaControlsManager::SystemMediaControlsManager( _controls->setIsPreviousEnabled(mediaPlayer->previousAvailable(type)); }, _lifetime); + using Media::Player::RepeatMode; + using Media::Player::OrderMode; + + Core::App().settings().playerRepeatModeValue( + ) | rpl::start_with_next([=](RepeatMode mode) { + _controls->setLoopStatus(RepeatModeToLoopStatus(mode)); + }, _lifetime); + + Core::App().settings().playerOrderModeValue( + ) | rpl::start_with_next([=](OrderMode mode) { + if (mode != OrderMode::Shuffle) { + _lastOrderMode = mode; + } + _controls->setShuffle(mode == OrderMode::Shuffle); + }, _lifetime); + _controls->commandRequests( ) | rpl::start_with_next([=](Command command) { switch (command) { @@ -195,6 +224,29 @@ SystemMediaControlsManager::SystemMediaControlsManager( case Command::Previous: mediaPlayer->previous(type); break; case Command::Stop: mediaPlayer->stop(type); break; case Command::Raise: controller->widget()->showFromTray(); break; + case Command::LoopNone: { + Core::App().settings().setPlayerRepeatMode(RepeatMode::None); + Core::App().saveSettingsDelayed(); + break; + } + case Command::LoopTrack: { + Core::App().settings().setPlayerRepeatMode(RepeatMode::One); + Core::App().saveSettingsDelayed(); + break; + } + case Command::LoopPlaylist: { + Core::App().settings().setPlayerRepeatMode(RepeatMode::All); + Core::App().saveSettingsDelayed(); + break; + } + case Command::Shuffle: { + const auto current = Core::App().settings().playerOrderMode(); + Core::App().settings().setPlayerOrderMode((current == OrderMode::Shuffle) + ? _lastOrderMode + : OrderMode::Shuffle); + Core::App().saveSettingsDelayed(); + break; + } case Command::Quit: { if (const auto main = controller->widget()->sessionContent()) { main->closeBothPlayers(); diff --git a/Telegram/SourceFiles/media/system_media_controls_manager.h b/Telegram/SourceFiles/media/system_media_controls_manager.h index 687b0b4272..5638edf33b 100644 --- a/Telegram/SourceFiles/media/system_media_controls_manager.h +++ b/Telegram/SourceFiles/media/system_media_controls_manager.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "data/data_audio_msg_id.h" +#include "media/player/media_player_instance.h" namespace base::Platform { class SystemMediaControls; @@ -40,6 +41,7 @@ private: std::vector> _cachedMediaView; std::unique_ptr _streamed; AudioMsgId _lastAudioMsgId; + Media::Player::OrderMode _lastOrderMode; rpl::lifetime _lifetimeDownload; rpl::lifetime _lifetime; diff --git a/Telegram/lib_base b/Telegram/lib_base index a643b71886..d985476a6c 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit a643b71886ae2947b8db85dfe7b5575c748ce326 +Subproject commit d985476a6c3aec54790b1310f590a0813d3bd790