#pragma once #include #include #include #include #include #include "services/dbus/messages.hpp" class MprisController { public: struct PlayerState { std::string title; std::vector artist; std::string artwork_url; int64_t length_ms; }; enum class PlaybackStatus { Playing, Paused, Stopped, }; static std::shared_ptr getInstance(); static std::shared_ptr createForPlayer(const std::string &bus_name); std::vector 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 &signal_mpris_updated(); sigc::signal &signal_playback_status_changed(); sigc::signal &signal_playback_position_changed(); sigc::signal &signal_can_seek_changed(); sigc::signal &signal_player_registered(); sigc::signal &signal_player_deregistered(); private: MprisController(); explicit MprisController(const std::string &bus_name); std::map playbackStatusMap = { {"Playing", PlaybackStatus::Playing}, {"Paused", PlaybackStatus::Paused}, {"Stopped", PlaybackStatus::Stopped}, }; PlaybackStatus currentPlaybackStatus = PlaybackStatus::Stopped; Glib::RefPtr m_connection; Glib::RefPtr m_proxy; Glib::RefPtr m_dbus_proxy; std::string m_player_bus_name = "org.mpris.MediaPlayer2.spotify"; std::set registeredPlayers; sigc::signal mprisUpdatedSignal; sigc::signal playbackStatusChangedSignal; sigc::signal playbackPositionChangedSignal; sigc::signal canSeekChangedSignal; sigc::signal playerRegisteredSignal; sigc::signal playerDeregisteredSignal; void on_bus_connected(const Glib::RefPtr &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 &invalidated_properties); };