Implement loop status/shuffle for MPRIS

This commit is contained in:
Ilya Fedin 2021-12-26 22:49:35 +04:00 committed by John Preston
parent 4c3835c61c
commit ffe4208595
3 changed files with 56 additions and 2 deletions

View File

@ -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();

View File

@ -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<std::shared_ptr<Data::DocumentMedia>> _cachedMediaView;
std::unique_ptr<Media::Streaming::Instance> _streamed;
AudioMsgId _lastAudioMsgId;
Media::Player::OrderMode _lastOrderMode;
rpl::lifetime _lifetimeDownload;
rpl::lifetime _lifetime;

@ -1 +1 @@
Subproject commit a643b71886ae2947b8db85dfe7b5575c748ce326
Subproject commit d985476a6c3aec54790b1310f590a0813d3bd790