33 #include <core/dbus/property.h>
34 #include <core/dbus/types/object_path.h>
38 #define UNUSED __attribute__((unused))
46 const std::shared_ptr<core::dbus::Service>&
service,
47 const std::shared_ptr<core::dbus::Object>&
object,
48 const std::string&
uuid
58 object->get_property<mpris::Player::Properties::CanPlay>(),
59 object->get_property<mpris::Player::Properties::CanPause>(),
60 object->get_property<mpris::Player::Properties::CanSeek>(),
61 object->get_property<mpris::Player::Properties::CanControl>(),
62 object->get_property<mpris::Player::Properties::CanGoNext>(),
63 object->get_property<mpris::Player::Properties::CanGoPrevious>(),
64 object->get_property<mpris::Player::Properties::IsVideoSource>(),
65 object->get_property<mpris::Player::Properties::IsAudioSource>(),
66 object->get_property<mpris::Player::Properties::TypedPlaybackStatus>(),
67 object->get_property<mpris::Player::Properties::TypedLoopStatus>(),
68 object->get_property<mpris::Player::Properties::PlaybackRate>(),
69 object->get_property<mpris::Player::Properties::Shuffle>(),
70 object->get_property<mpris::Player::Properties::TypedMetaData>(),
71 object->get_property<mpris::Player::Properties::Volume>(),
72 object->get_property<mpris::Player::Properties::Position>(),
73 object->get_property<mpris::Player::Properties::Duration>(),
74 object->get_property<mpris::Player::Properties::AudioStreamRole>(),
75 object->get_property<mpris::Player::Properties::Orientation>(),
76 object->get_property<mpris::Player::Properties::Lifetime>(),
77 object->get_property<mpris::Player::Properties::MinimumRate>(),
78 object->get_property<mpris::Player::Properties::MaximumRate>()
82 object->get_signal<mpris::Player::Signals::Seeked>(),
83 object->get_signal<mpris::Player::Signals::AboutToFinish>(),
84 object->get_signal<mpris::Player::Signals::EndOfStream>(),
85 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>(),
86 object->get_signal<mpris::Player::Signals::VideoDimensionChanged>(),
87 object->get_signal<mpris::Player::Signals::Error>()
105 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
106 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
107 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
108 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
109 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
110 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
111 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
112 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
114 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedPlaybackStatus>>
playback_status;
115 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedLoopStatus>>
loop_status;
116 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
117 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
shuffle;
119 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
120 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
121 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
122 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::AudioStreamRole>>
audio_role;
123 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Orientation>>
orientation;
124 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Lifetime>>
lifetime;
131 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
132 typedef core::dbus::Signal<mpris::Player::Signals::AboutToFinish, mpris::Player::Signals::AboutToFinish::ArgumentType>
DBusAboutToFinishSignal;
133 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
134 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
135 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
136 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
138 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
139 const std::shared_ptr<DBusAboutToFinishSignal>& atf,
140 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
141 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status,
142 const std::shared_ptr<DBusVideoDimensionChangedSignal>& d,
143 const std::shared_ptr<DBusErrorSignal>& e)
160 dbus.seeked_to->connect([
this](std::uint64_t value)
162 std::cout <<
"SeekedTo signal arrived via the bus." << std::endl;
166 dbus.about_to_finish->connect([
this]()
168 std::cout <<
"AboutToFinish signal arrived via the bus." << std::endl;
172 dbus.end_of_stream->connect([
this]()
174 std::cout <<
"EndOfStream signal arrived via the bus." << std::endl;
180 std::cout <<
"PlaybackStatusChanged signal arrived via the bus (Status: " << status <<
")" << std::endl;
186 std::cout <<
"VideoDimensionChanged signal arrived via the bus." << std::endl;
192 std::cout <<
"Error signal arrived via the bus (Error: " << e <<
")" << std::endl;
202 core::Signal<media::Player::Error>
error;
211 std::shared_ptr<DBusErrorSignal>
error;
217 const std::shared_ptr<Service>& parent,
218 const std::shared_ptr<core::dbus::Service>& service,
219 const std::shared_ptr<core::dbus::Object>&
object,
220 const std::string& uuid)
248 d->track_list = std::make_shared<media::TrackListStub>(
250 d->service->object_for_path(
251 dbus::types::ObjectPath(
252 d->object->path().as_string() +
"/TrackList")));
254 return d->track_list;
264 auto op = d->object->transact_method<mpris::Player::OpenUri,
bool>(uri);
272 auto op = d->object->transact_method<mpris::Player::OpenUriExtended,
bool>(uri, headers);
279 auto op = d->object->transact_method<mpris::Player::CreateVideoSink,
void>(texture_id);
284 throw media::Player::Errors::OutOfProcessBufferStreamingNotSupported{};
286 throw std::runtime_error{op.error().print()};
289 return d->sink_factory(texture_id);
294 auto op = d->object->transact_method<mpris::Player::Next,
void>();
297 throw std::runtime_error(
"Problem switching to next track on remote object");
302 auto op = d->object->transact_method<mpris::Player::Previous,
void>();
305 throw std::runtime_error(
"Problem switching to previous track on remote object");
310 auto op = d->object->transact_method<mpris::Player::Play,
void>();
313 throw std::runtime_error(
"Problem starting playback on remote object");
318 auto op = d->object->transact_method<mpris::Player::Pause,
void>();
321 throw std::runtime_error(
"Problem pausing playback on remote object");
326 auto op = d->object->transact_method<mpris::Player::Seek, void, uint64_t>(offset.count());
329 throw std::runtime_error(
"Problem seeking on remote object");
334 auto op = d->object->transact_method<mpris::Player::Stop,
void>();
337 throw std::runtime_error(
"Problem stopping playback on remote object");
342 return *d->properties.can_play;
347 return *d->properties.can_pause;
352 return *d->properties.can_seek;
357 return *d->properties.can_go_previous;
362 return *d->properties.can_go_next;
367 return *d->properties.is_video_source;
372 return *d->properties.is_audio_source;
377 return *d->properties.playback_status;
382 return *d->properties.loop_status;
387 return *d->properties.playback_rate;
392 return *d->properties.shuffle;
397 return *d->properties.meta_data_for_current_track;
402 return *d->properties.volume;
407 return *d->properties.position;
412 return *d->properties.duration;
417 return *d->properties.audio_role;
422 return *d->properties.orientation;
427 return *d->properties.lifetime;
432 return *d->properties.minimum_playback_rate;
437 return *d->properties.maximum_playback_rate;
442 return *d->properties.loop_status;
447 return *d->properties.playback_rate;
452 return *d->properties.shuffle;
457 return *d->properties.volume;
462 return *d->properties.audio_role;
467 return *d->properties.lifetime;
472 return d->signals.seeked_to;
477 return d->signals.about_to_finish;
482 return d->signals.end_of_stream;
487 return d->signals.playback_status_changed;
492 return d->signals.video_dimension_changed;
497 return d->signals.error;
static constexpr const char * name