Implement loop status/shuffle for MPRIS
This commit is contained in:
		
							parent
							
								
									4c3835c61c
								
							
						
					
					
						commit
						ffe4208595
					
				
					 3 changed files with 56 additions and 2 deletions
				
			
		| 
						 | 
					@ -19,13 +19,26 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
				
			||||||
#include "main/main_account.h"
 | 
					#include "main/main_account.h"
 | 
				
			||||||
#include "main/main_session.h"
 | 
					#include "main/main_session.h"
 | 
				
			||||||
#include "media/audio/media_audio.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_instance.h"
 | 
				
			||||||
#include "media/streaming/media_streaming_player.h"
 | 
					#include "media/streaming/media_streaming_player.h"
 | 
				
			||||||
#include "ui/text/format_song_document_name.h"
 | 
					#include "ui/text/format_song_document_name.h"
 | 
				
			||||||
#include "window/window_controller.h"
 | 
					#include "window/window_controller.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Media {
 | 
					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() {
 | 
					bool SystemMediaControlsManager::Supported() {
 | 
				
			||||||
	return base::Platform::SystemMediaControls::Supported();
 | 
						return base::Platform::SystemMediaControls::Supported();
 | 
				
			||||||
| 
						 | 
					@ -185,6 +198,22 @@ SystemMediaControlsManager::SystemMediaControlsManager(
 | 
				
			||||||
		_controls->setIsPreviousEnabled(mediaPlayer->previousAvailable(type));
 | 
							_controls->setIsPreviousEnabled(mediaPlayer->previousAvailable(type));
 | 
				
			||||||
	}, _lifetime);
 | 
						}, _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(
 | 
						_controls->commandRequests(
 | 
				
			||||||
	) | rpl::start_with_next([=](Command command) {
 | 
						) | rpl::start_with_next([=](Command command) {
 | 
				
			||||||
		switch (command) {
 | 
							switch (command) {
 | 
				
			||||||
| 
						 | 
					@ -195,6 +224,29 @@ SystemMediaControlsManager::SystemMediaControlsManager(
 | 
				
			||||||
		case Command::Previous: mediaPlayer->previous(type); break;
 | 
							case Command::Previous: mediaPlayer->previous(type); break;
 | 
				
			||||||
		case Command::Stop: mediaPlayer->stop(type); break;
 | 
							case Command::Stop: mediaPlayer->stop(type); break;
 | 
				
			||||||
		case Command::Raise: controller->widget()->showFromTray(); 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: {
 | 
							case Command::Quit: {
 | 
				
			||||||
			if (const auto main = controller->widget()->sessionContent()) {
 | 
								if (const auto main = controller->widget()->sessionContent()) {
 | 
				
			||||||
				main->closeBothPlayers();
 | 
									main->closeBothPlayers();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "data/data_audio_msg_id.h"
 | 
					#include "data/data_audio_msg_id.h"
 | 
				
			||||||
 | 
					#include "media/player/media_player_instance.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace base::Platform {
 | 
					namespace base::Platform {
 | 
				
			||||||
class SystemMediaControls;
 | 
					class SystemMediaControls;
 | 
				
			||||||
| 
						 | 
					@ -40,6 +41,7 @@ private:
 | 
				
			||||||
	std::vector<std::shared_ptr<Data::DocumentMedia>> _cachedMediaView;
 | 
						std::vector<std::shared_ptr<Data::DocumentMedia>> _cachedMediaView;
 | 
				
			||||||
	std::unique_ptr<Media::Streaming::Instance> _streamed;
 | 
						std::unique_ptr<Media::Streaming::Instance> _streamed;
 | 
				
			||||||
	AudioMsgId _lastAudioMsgId;
 | 
						AudioMsgId _lastAudioMsgId;
 | 
				
			||||||
 | 
						Media::Player::OrderMode _lastOrderMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rpl::lifetime _lifetimeDownload;
 | 
						rpl::lifetime _lifetimeDownload;
 | 
				
			||||||
	rpl::lifetime _lifetime;
 | 
						rpl::lifetime _lifetime;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
Subproject commit a643b71886ae2947b8db85dfe7b5575c748ce326
 | 
					Subproject commit d985476a6c3aec54790b1310f590a0813d3bd790
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue