81 lines
3.0 KiB
C++
81 lines
3.0 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <giomm.h>
|
|
#include <sigc++/sigc++.h>
|
|
#include <set>
|
|
#include <vector>
|
|
#include "services/dbus/messages.hpp"
|
|
|
|
class MprisController {
|
|
public:
|
|
struct PlayerState {
|
|
std::string title;
|
|
std::vector<std::string> artist;
|
|
std::string artwork_url;
|
|
int64_t length_ms;
|
|
};
|
|
enum class PlaybackStatus {
|
|
Playing,
|
|
Paused,
|
|
Stopped,
|
|
};
|
|
|
|
static std::shared_ptr<MprisController> getInstance();
|
|
static std::shared_ptr<MprisController> createForPlayer(const std::string &bus_name);
|
|
|
|
std::vector<std::string> get_registered_players() const;
|
|
|
|
void toggle_play();
|
|
void pause();
|
|
void next_song();
|
|
void previous_song();
|
|
void emit_seeked(int64_t position_us);
|
|
void set_position(const std::string &track_id, int64_t position_us);
|
|
|
|
sigc::signal<void(const MprisPlayer2Message &)> &signal_mpris_updated();
|
|
sigc::signal<void(PlaybackStatus)> &signal_playback_status_changed();
|
|
sigc::signal<void(int64_t)> &signal_playback_position_changed();
|
|
sigc::signal<void(bool)> &signal_can_seek_changed();
|
|
sigc::signal<void(const std::string &)> &signal_player_registered();
|
|
sigc::signal<void(const std::string &)> &signal_player_deregistered();
|
|
|
|
private:
|
|
MprisController();
|
|
explicit MprisController(const std::string &bus_name);
|
|
std::map<std::string, PlaybackStatus> playbackStatusMap = {
|
|
{"Playing", PlaybackStatus::Playing},
|
|
{"Paused", PlaybackStatus::Paused},
|
|
{"Stopped", PlaybackStatus::Stopped},
|
|
};
|
|
|
|
PlaybackStatus currentPlaybackStatus = PlaybackStatus::Stopped;
|
|
|
|
Glib::RefPtr<Gio::DBus::Connection> m_connection;
|
|
Glib::RefPtr<Gio::DBus::Proxy> m_proxy;
|
|
Glib::RefPtr<Gio::DBus::Proxy> m_dbus_proxy;
|
|
std::string m_player_bus_name = "org.mpris.MediaPlayer2.spotify";
|
|
std::set<std::string> registeredPlayers;
|
|
|
|
sigc::signal<void(const MprisPlayer2Message &)> mprisUpdatedSignal;
|
|
sigc::signal<void(PlaybackStatus)> playbackStatusChangedSignal;
|
|
sigc::signal<void(int64_t)> playbackPositionChangedSignal;
|
|
sigc::signal<void(bool)> canSeekChangedSignal;
|
|
sigc::signal<void(const std::string &)> playerRegisteredSignal;
|
|
sigc::signal<void(const std::string &)> playerDeregisteredSignal;
|
|
|
|
void on_bus_connected(const Glib::RefPtr<Gio::AsyncResult> &result);
|
|
void signalNotification();
|
|
void emit_cached_playback_status();
|
|
void emit_cached_position();
|
|
void emit_cached_can_seek();
|
|
void on_dbus_signal(const Glib::ustring &sender_name,
|
|
const Glib::ustring &signal_name,
|
|
const Glib::VariantContainerBase ¶meters);
|
|
void handle_player_registered(const std::string &bus_name);
|
|
void handle_player_deregistered(const std::string &bus_name);
|
|
|
|
// Called when the song changes
|
|
void on_properties_changed(const Gio::DBus::Proxy::MapChangedProperties &changed_properties,
|
|
const std::vector<Glib::ustring> &invalidated_properties);
|
|
}; |