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::Object>&
object
54 object->get_property<mpris::Player::Properties::CanPlay>(),
55 object->get_property<mpris::Player::Properties::CanPause>(),
56 object->get_property<mpris::Player::Properties::CanSeek>(),
57 object->get_property<mpris::Player::Properties::CanControl>(),
58 object->get_property<mpris::Player::Properties::CanGoNext>(),
59 object->get_property<mpris::Player::Properties::CanGoPrevious>(),
60 object->get_property<mpris::Player::Properties::IsVideoSource>(),
61 object->get_property<mpris::Player::Properties::IsAudioSource>(),
62 object->get_property<mpris::Player::Properties::TypedPlaybackStatus>(),
63 object->get_property<mpris::Player::Properties::TypedLoopStatus>(),
64 object->get_property<mpris::Player::Properties::PlaybackRate>(),
65 object->get_property<mpris::Player::Properties::Shuffle>(),
66 object->get_property<mpris::Player::Properties::TypedMetaData>(),
67 object->get_property<mpris::Player::Properties::Volume>(),
68 object->get_property<mpris::Player::Properties::Position>(),
69 object->get_property<mpris::Player::Properties::Duration>(),
70 object->get_property<mpris::Player::Properties::AudioStreamRole>(),
71 object->get_property<mpris::Player::Properties::Orientation>(),
72 object->get_property<mpris::Player::Properties::Lifetime>(),
73 object->get_property<mpris::Player::Properties::MinimumRate>(),
74 object->get_property<mpris::Player::Properties::MaximumRate>()
78 object->get_signal<mpris::Player::Signals::Seeked>(),
79 object->get_signal<mpris::Player::Signals::AboutToFinish>(),
80 object->get_signal<mpris::Player::Signals::EndOfStream>(),
81 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>(),
82 object->get_signal<mpris::Player::Signals::VideoDimensionChanged>(),
83 object->get_signal<mpris::Player::Signals::Error>()
99 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
100 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
101 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
102 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
103 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
104 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
105 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
106 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
108 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedPlaybackStatus>>
playback_status;
109 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedLoopStatus>>
loop_status;
110 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
111 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
is_shuffle;
113 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
114 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
115 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
116 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::AudioStreamRole>>
audio_role;
117 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Orientation>>
orientation;
118 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Lifetime>>
lifetime;
125 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
126 typedef core::dbus::Signal<mpris::Player::Signals::AboutToFinish, mpris::Player::Signals::AboutToFinish::ArgumentType>
DBusAboutToFinishSignal;
127 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
128 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
129 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
130 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
132 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
133 const std::shared_ptr<DBusAboutToFinishSignal>& atf,
134 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
135 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status,
136 const std::shared_ptr<DBusVideoDimensionChangedSignal>& d,
137 const std::shared_ptr<DBusErrorSignal>& e)
154 dbus.seeked_to->connect([
this](std::uint64_t value)
156 std::cout <<
"seeked_to signal arrived via the bus." << std::endl;
160 dbus.about_to_finish->connect([
this]()
162 std::cout <<
"AboutToFinish signal arrived via the bus." << std::endl;
166 dbus.end_of_stream->connect([
this]()
168 std::cout <<
"EndOfStream signal arrived via the bus." << std::endl;
174 std::cout <<
"PlaybackStatusChanged signal arrived via the bus." << std::endl;
180 std::cout <<
"VideoDimensionChanged signal arrived via the bus." << std::endl;
186 std::cout <<
"Error signal arrived via the bus (Error: " << e <<
")" << std::endl;
196 core::Signal<media::Player::Error>
error;
205 std::shared_ptr<DBusErrorSignal>
error;
211 const std::shared_ptr<Service>& parent,
212 const std::shared_ptr<core::dbus::Object>&
object)
225 d->track_list = std::make_shared<media::TrackListStub>(
227 dbus::types::ObjectPath(d->object->path().as_string() +
"/TrackList"));
229 return d->track_list;
239 auto op = d->object->transact_method<mpris::Player::OpenUri,
bool>(uri);
247 auto op = d->object->transact_method<mpris::Player::OpenUriExtended,
bool>(uri, headers);
254 auto op = d->object->transact_method<mpris::Player::CreateVideoSink,
void>(texture_id);
259 throw media::Player::Errors::OutOfProcessBufferStreamingNotSupported{};
261 throw std::runtime_error{op.error().print()};
264 return d->sink_factory(texture_id);
269 auto op = d->object->transact_method<mpris::Player::Next,
void>();
272 throw std::runtime_error(
"Problem switching to next track on remote object");
277 auto op = d->object->transact_method<mpris::Player::Previous,
void>();
280 throw std::runtime_error(
"Problem switching to previous track on remote object");
285 auto op = d->object->transact_method<mpris::Player::Play,
void>();
288 throw std::runtime_error(
"Problem starting playback on remote object");
293 auto op = d->object->transact_method<mpris::Player::Pause,
void>();
296 throw std::runtime_error(
"Problem pausing playback on remote object");
301 auto op = d->object->transact_method<mpris::Player::Seek, void, uint64_t>(offset.count());
304 throw std::runtime_error(
"Problem seeking on remote object");
309 auto op = d->object->transact_method<mpris::Player::Stop,
void>();
312 throw std::runtime_error(
"Problem stopping playback on remote object");
317 return *d->properties.can_play;
322 return *d->properties.can_pause;
327 return *d->properties.can_seek;
332 return *d->properties.can_go_previous;
337 return *d->properties.can_go_next;
342 return *d->properties.is_video_source;
347 return *d->properties.is_audio_source;
352 return *d->properties.playback_status;
357 return *d->properties.loop_status;
362 return *d->properties.playback_rate;
367 return *d->properties.is_shuffle;
372 return *d->properties.meta_data_for_current_track;
377 return *d->properties.volume;
382 return *d->properties.position;
387 return *d->properties.duration;
392 return *d->properties.audio_role;
397 return *d->properties.orientation;
402 return *d->properties.lifetime;
407 return *d->properties.minimum_playback_rate;
412 return *d->properties.maximum_playback_rate;
417 return *d->properties.loop_status;
422 return *d->properties.playback_rate;
427 return *d->properties.is_shuffle;
432 return *d->properties.volume;
437 return *d->properties.audio_role;
442 return *d->properties.lifetime;
447 return d->signals.seeked_to;
452 return d->signals.about_to_finish;
457 return d->signals.end_of_stream;
462 return d->signals.playback_status_changed;
467 return d->signals.video_dimension_changed;
472 return d->signals.error;
static constexpr const char * name