20 #ifndef MPRIS_PLAYER_H_
21 #define MPRIS_PLAYER_H_
28 #include <core/dbus/bus.h>
29 #include <core/dbus/macros.h>
30 #include <core/dbus/object.h>
31 #include <core/dbus/property.h>
32 #include <core/dbus/interfaces/properties.h>
33 #include <core/dbus/types/any.h>
34 #include <core/dbus/types/object_path.h>
35 #include <core/dbus/types/variant.h>
37 #include <boost/utility/identity_type.hpp>
49 static const std::string&
name()
51 static const std::string s{
"org.mpris.MediaPlayer2.Player"};
63 case core::ubuntu::media::Player::LoopStatus::none:
65 case core::ubuntu::media::Player::LoopStatus::track:
67 case core::ubuntu::media::Player::LoopStatus::playlist:
74 static constexpr
const char*
none{
"None"};
75 static constexpr
const char*
track{
"Track"};
76 static constexpr
const char*
playlist{
"Playlist"};
87 case core::ubuntu::media::Player::PlaybackStatus::null:
88 case core::ubuntu::media::Player::PlaybackStatus::ready:
89 case core::ubuntu::media::Player::PlaybackStatus::stopped:
92 case core::ubuntu::media::Player::PlaybackStatus::playing:
94 case core::ubuntu::media::Player::PlaybackStatus::paused:
101 static constexpr
const char*
playing{
"Playing"};
102 static constexpr
const char*
paused{
"Paused"};
103 static constexpr
const char*
stopped{
"Stopped"};
106 typedef std::map<std::string, core::dbus::types::Variant>
Dictionary;
108 DBUS_CPP_METHOD_DEF(Next,
Player)
109 DBUS_CPP_METHOD_DEF(Previous,
Player)
110 DBUS_CPP_METHOD_DEF(Pause,
Player)
111 DBUS_CPP_METHOD_DEF(PlayPause,
Player)
112 DBUS_CPP_METHOD_DEF(Stop,
Player)
113 DBUS_CPP_METHOD_DEF(Play,
Player)
114 DBUS_CPP_METHOD_DEF(Seek,
Player)
115 DBUS_CPP_METHOD_DEF(SetPosition,
Player)
116 DBUS_CPP_METHOD_DEF(CreateVideoSink,
Player)
117 DBUS_CPP_METHOD_DEF(Key,
Player)
118 DBUS_CPP_METHOD_DEF(OpenUri,
Player)
119 DBUS_CPP_METHOD_DEF(OpenUriExtended,
Player)
123 DBUS_CPP_SIGNAL_DEF(Seeked,
Player, std::int64_t)
124 DBUS_CPP_SIGNAL_DEF(EndOfStream,
Player,
void)
126 DBUS_CPP_SIGNAL_DEF(VideoDimensionChanged,
Player, std::uint64_t)
140 DBUS_CPP_WRITABLE_PROPERTY_DEF(PlaybackRate,
Player,
double)
141 DBUS_CPP_WRITABLE_PROPERTY_DEF(Rate,
Player,
double)
142 DBUS_CPP_WRITABLE_PROPERTY_DEF(Shuffle,
Player,
bool)
143 DBUS_CPP_READABLE_PROPERTY_DEF(Metadata,
Player, Dictionary)
145 DBUS_CPP_WRITABLE_PROPERTY_DEF(Volume,
Player,
double)
146 DBUS_CPP_READABLE_PROPERTY_DEF(Position,
Player, std::int64_t)
147 DBUS_CPP_READABLE_PROPERTY_DEF(Duration,
Player, std::int64_t)
148 DBUS_CPP_READABLE_PROPERTY_DEF(MinimumRate,
Player,
double)
149 DBUS_CPP_READABLE_PROPERTY_DEF(MaximumRate,
Player,
double)
150 DBUS_CPP_READABLE_PROPERTY_DEF(IsVideoSource,
Player,
bool)
151 DBUS_CPP_READABLE_PROPERTY_DEF(IsAudioSource,
Player,
bool)
152 DBUS_CPP_READABLE_PROPERTY_DEF(CanGoNext,
Player,
bool)
153 DBUS_CPP_READABLE_PROPERTY_DEF(CanGoPrevious,
Player,
bool)
154 DBUS_CPP_READABLE_PROPERTY_DEF(CanPlay,
Player,
bool)
155 DBUS_CPP_READABLE_PROPERTY_DEF(CanPause,
Player,
bool)
156 DBUS_CPP_READABLE_PROPERTY_DEF(CanSeek,
Player,
bool)
157 DBUS_CPP_READABLE_PROPERTY_DEF(CanControl,
Player,
bool)
165 static const std::vector<std::string> instance;
return instance;
188 Properties::TypedPlaybackStatus::ValueType
typed_playback_status{core::ubuntu::media::Player::PlaybackStatus::null};
190 Properties::TypedLoopStatus::ValueType
typed_loop_status{core::ubuntu::media::Player::LoopStatus::none};
192 Properties::Shuffle::ValueType
shuffle{
false};
194 Properties::Volume::ValueType
volume{0.f};
199 Properties::Orientation::ValueType
orientation{core::ubuntu::media::Player::Orientation::rotate0};
204 : configuration(configuration),
207 configuration.
object->template get_property<Properties::CanPlay>(),
208 configuration.
object->template get_property<Properties::CanPause>(),
209 configuration.
object->template get_property<Properties::CanSeek>(),
210 configuration.
object->template get_property<Properties::CanControl>(),
211 configuration.
object->template get_property<Properties::CanGoNext>(),
212 configuration.
object->template get_property<Properties::CanGoPrevious>(),
213 configuration.
object->template get_property<Properties::IsVideoSource>(),
214 configuration.
object->template get_property<Properties::IsAudioSource>(),
215 configuration.
object->template get_property<Properties::PlaybackStatus>(),
216 configuration.
object->template get_property<Properties::TypedPlaybackStatus>(),
217 configuration.
object->template get_property<Properties::LoopStatus>(),
218 configuration.
object->template get_property<Properties::TypedLoopStatus>(),
219 configuration.
object->template get_property<Properties::AudioStreamRole>(),
220 configuration.
object->template get_property<Properties::Orientation>(),
221 configuration.
object->template get_property<Properties::Lifetime>(),
222 configuration.
object->template get_property<Properties::PlaybackRate>(),
223 configuration.
object->template get_property<Properties::Shuffle>(),
224 configuration.
object->template get_property<Properties::TypedMetaData>(),
225 configuration.
object->template get_property<Properties::Volume>(),
226 configuration.
object->template get_property<Properties::Position>(),
227 configuration.
object->template get_property<Properties::Duration>(),
228 configuration.
object->template get_property<Properties::MinimumRate>(),
229 configuration.
object->template get_property<Properties::MaximumRate>()
233 configuration.
object->template get_signal<Signals::Seeked>(),
234 configuration.
object->template get_signal<Signals::EndOfStream>(),
235 configuration.
object->template get_signal<Signals::PlaybackStatusChanged>(),
236 configuration.
object->template get_signal<Signals::VideoDimensionChanged>(),
237 configuration.
object->template get_signal<Signals::Error>(),
238 configuration.
object->template get_signal<core::dbus::interfaces::Properties::Signals::PropertiesChanged>()
253 properties.audio_stream_role->set(core::ubuntu::media::Player::AudioStreamRole::multimedia);
254 properties.orientation->set(core::ubuntu::media::Player::Orientation::rotate0);
255 properties.lifetime->set(core::ubuntu::media::Player::Lifetime::normal);
266 on_property_value_changed<Properties::Orientation>(o);
271 on_property_value_changed<Properties::Position>(
position);
276 on_property_value_changed<Properties::Duration>(
duration);
279 properties.playback_status->changed().connect([
this](
const std::string& status)
281 on_property_value_changed<Properties::PlaybackStatus>(status);
284 properties.loop_status->changed().connect([
this](
const std::string& status)
286 on_property_value_changed<Properties::LoopStatus>(status);
290 template<
typename Property>
293 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
295 signals.properties_changed->emit(std::make_tuple(
296 dbus::traits::Service<Player>::interface_name(),
304 dict[Properties::CanPlay::name()] = dbus::types::Variant::encode(
properties.can_play->get());
305 dict[Properties::CanPause::name()] = dbus::types::Variant::encode(
properties.can_pause->get());
306 dict[Properties::CanSeek::name()] = dbus::types::Variant::encode(
properties.can_seek->get());
307 dict[Properties::CanControl::name()] = dbus::types::Variant::encode(
properties.can_control->get());
308 dict[Properties::CanGoNext::name()] = dbus::types::Variant::encode(
properties.can_go_next->get());
309 dict[Properties::CanGoPrevious::name()] = dbus::types::Variant::encode(
properties.can_go_previous->get());
310 dict[Properties::PlaybackStatus::name()] = dbus::types::Variant::encode(
properties.playback_status->get());
311 dict[Properties::TypedPlaybackStatus::name()] = dbus::types::Variant::encode(
properties.typed_playback_status->get());
312 dict[Properties::LoopStatus::name()] = dbus::types::Variant::encode(
properties.loop_status->get());
313 dict[Properties::TypedLoopStatus::name()] = dbus::types::Variant::encode(
properties.typed_loop_status->get());
314 dict[Properties::AudioStreamRole::name()] = dbus::types::Variant::encode(
properties.audio_stream_role->get());
315 dict[Properties::Orientation::name()] = dbus::types::Variant::encode(
properties.orientation->get());
316 dict[Properties::Lifetime::name()] = dbus::types::Variant::encode(
properties.lifetime->get());
317 dict[Properties::PlaybackRate::name()] = dbus::types::Variant::encode(
properties.playback_rate->get());
318 dict[Properties::Shuffle::name()] = dbus::types::Variant::encode(
properties.is_shuffle->get());
319 dict[Properties::Duration::name()] = dbus::types::Variant::encode(
properties.duration->get());
320 dict[Properties::Position::name()] = dbus::types::Variant::encode(
properties.position->get());
321 dict[Properties::MinimumRate::name()] = dbus::types::Variant::encode(
properties.minimum_playback_rate->get());
322 dict[Properties::MaximumRate::name()] = dbus::types::Variant::encode(
properties.maximum_playback_rate->get());
332 std::shared_ptr<core::dbus::Property<Properties::CanPlay>>
can_play;
333 std::shared_ptr<core::dbus::Property<Properties::CanPause>>
can_pause;
334 std::shared_ptr<core::dbus::Property<Properties::CanSeek>>
can_seek;
335 std::shared_ptr<core::dbus::Property<Properties::CanControl>>
can_control;
336 std::shared_ptr<core::dbus::Property<Properties::CanGoNext>>
can_go_next;
343 std::shared_ptr<core::dbus::Property<Properties::LoopStatus>>
loop_status;
346 std::shared_ptr<core::dbus::Property<Properties::Orientation>>
orientation;
347 std::shared_ptr<core::dbus::Property<Properties::Lifetime>>
lifetime;
348 std::shared_ptr<core::dbus::Property<Properties::PlaybackRate>>
playback_rate;
349 std::shared_ptr<core::dbus::Property<Properties::Shuffle>>
is_shuffle;
351 std::shared_ptr<core::dbus::Property<Properties::Volume>>
volume;
352 std::shared_ptr<core::dbus::Property<Properties::Position>>
position;
353 std::shared_ptr<core::dbus::Property<Properties::Duration>>
duration;
360 typename core::dbus::Signal<Signals::Seeked, Signals::Seeked::ArgumentType>::Ptr
seeked_to;
361 typename core::dbus::Signal<Signals::EndOfStream, Signals::EndOfStream::ArgumentType>::Ptr
end_of_stream;
362 typename core::dbus::Signal<Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType>::Ptr
playback_status_changed;
363 typename core::dbus::Signal<Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType>::Ptr
video_dimension_changed;
364 typename core::dbus::Signal<Signals::Error, Signals::Error::ArgumentType>::Ptr
error;
368 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
369 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
376 #endif // MPRIS_PLAYER_H_
std::shared_ptr< core::dbus::Property< Properties::Duration > > duration
void on_property_value_changed(const typename Property::ValueType &value)
std::shared_ptr< core::dbus::Property< Properties::AudioStreamRole > > audio_stream_role
Properties::CanGoPrevious::ValueType can_go_previous
std::shared_ptr< core::dbus::Property< Properties::IsAudioSource > > is_audio_source
Properties::CanControl::ValueType can_control
std::shared_ptr< core::dbus::Property< Properties::LoopStatus > > loop_status
Properties::MaximumRate::ValueType maximum_rate
Properties::Volume::ValueType volume
static const std::string & name()
static constexpr const char * none
std::shared_ptr< core::dbus::Property< Properties::MinimumRate > > minimum_playback_rate
Properties::Duration::ValueType duration
core::dbus::Object::Ptr object
static constexpr const char * playlist
static constexpr const char * paused
std::shared_ptr< core::dbus::Property< Properties::MaximumRate > > maximum_playback_rate
Properties::CanGoNext::ValueType can_go_next
static constexpr const char * stopped
static const char * from(core::ubuntu::media::Player::PlaybackStatus status)
core::dbus::Signal< Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType >::Ptr video_dimension_changed
Properties::CanPause::ValueType can_pause
static const std::vector< std::string > & the_empty_list_of_invalidated_properties()
std::shared_ptr< core::dbus::Property< Properties::Shuffle > > is_shuffle
Properties::TypedPlaybackStatus::ValueType typed_playback_status
Properties::PlaybackStatus::ValueType playback_status
Properties::Orientation::ValueType orientation
struct mpris::Player::Skeleton::Configuration::Defaults defaults
struct mpris::Player::Skeleton::@14 properties
Properties::Position::ValueType position
std::map< std::string, core::dbus::types::Variant > Dictionary
static const char * from(core::ubuntu::media::Player::LoopStatus status)
Configuration configuration
std::shared_ptr< core::dbus::Property< Properties::IsVideoSource > > is_video_source
std::shared_ptr< core::dbus::Property< Properties::TypedLoopStatus > > typed_loop_status
std::shared_ptr< core::dbus::Property< Properties::CanGoPrevious > > can_go_previous
std::shared_ptr< core::dbus::Property< Properties::CanPause > > can_pause
Properties::PlaybackRate::ValueType playback_rate
Properties::TypedLoopStatus::ValueType typed_loop_status
std::shared_ptr< core::dbus::Property< Properties::Lifetime > > lifetime
Properties::CanSeek::ValueType can_seek
Dictionary get_all_properties()
struct mpris::Player::Skeleton::@15 signals
std::shared_ptr< core::dbus::Property< Properties::Volume > > volume
std::shared_ptr< core::dbus::Property< Properties::CanSeek > > can_seek
static constexpr const char * track
core::dbus::Signal< Signals::Seeked, Signals::Seeked::ArgumentType >::Ptr seeked_to
Properties::TypedMetaData::ValueType typed_meta_data
Properties::IsAudioSource::ValueType is_audio_source
std::shared_ptr< core::dbus::Property< Properties::Orientation > > orientation
Skeleton(const Configuration &configuration)
std::shared_ptr< core::dbus::Property< Properties::TypedPlaybackStatus > > typed_playback_status
Properties::MinimumRate::ValueType minimum_rate
std::shared_ptr< core::dbus::Property< Properties::PlaybackStatus > > playback_status
Properties::CanPlay::ValueType can_play
std::shared_ptr< core::dbus::Property< Properties::TypedMetaData > > typed_meta_data_for_current_track
core::dbus::Signal< Signals::EndOfStream, Signals::EndOfStream::ArgumentType >::Ptr end_of_stream
std::shared_ptr< core::dbus::Property< Properties::CanPlay > > can_play
Properties::IsVideoSource::ValueType is_video_source
std::shared_ptr< core::dbus::Property< Properties::CanControl > > can_control
static constexpr const char * playing
std::shared_ptr< core::dbus::Property< Properties::Position > > position
std::shared_ptr< core::dbus::Property< Properties::CanGoNext > > can_go_next
Properties::LoopStatus::ValueType loop_status
std::shared_ptr< core::dbus::Property< Properties::PlaybackRate > > playback_rate
dbus::Signal< core::dbus::interfaces::Properties::Signals::PropertiesChanged, core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType >::Ptr properties_changed
core::dbus::Signal< Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType >::Ptr playback_status_changed
core::dbus::Signal< Signals::Error, Signals::Error::ArgumentType >::Ptr error
Properties::Shuffle::ValueType shuffle