35 #include <core/dbus/property.h> 36 #include <core/dbus/types/object_path.h> 41 #define UNUSED __attribute__((unused)) 49 const std::shared_ptr<core::dbus::Service>&
service,
50 const std::shared_ptr<core::dbus::Object>&
object,
51 const std::string&
uuid 60 object->get_property<mpris::Player::Properties::CanPlay>(),
61 object->get_property<mpris::Player::Properties::CanPause>(),
62 object->get_property<mpris::Player::Properties::CanSeek>(),
63 object->get_property<mpris::Player::Properties::CanControl>(),
64 object->get_property<mpris::Player::Properties::CanGoNext>(),
65 object->get_property<mpris::Player::Properties::CanGoPrevious>(),
66 object->get_property<mpris::Player::Properties::IsVideoSource>(),
67 object->get_property<mpris::Player::Properties::IsAudioSource>(),
68 object->get_property<mpris::Player::Properties::TypedPlaybackStatus>(),
69 object->get_property<mpris::Player::Properties::TypedBackend>(),
70 object->get_property<mpris::Player::Properties::TypedLoopStatus>(),
71 object->get_property<mpris::Player::Properties::PlaybackRate>(),
72 object->get_property<mpris::Player::Properties::Shuffle>(),
73 object->get_property<mpris::Player::Properties::Metadata>(),
74 object->get_property<mpris::Player::Properties::Volume>(),
75 object->get_property<mpris::Player::Properties::Position>(),
76 object->get_property<mpris::Player::Properties::Duration>(),
77 object->get_property<mpris::Player::Properties::AudioStreamRole>(),
78 object->get_property<mpris::Player::Properties::Orientation>(),
79 object->get_property<mpris::Player::Properties::Lifetime>(),
80 object->get_property<mpris::Player::Properties::MinimumRate>(),
81 object->get_property<mpris::Player::Properties::MaximumRate>()
85 object->get_signal<mpris::Player::Signals::Seeked>(),
86 object->get_signal<mpris::Player::Signals::AboutToFinish>(),
87 object->get_signal<mpris::Player::Signals::EndOfStream>(),
88 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>(),
89 object->get_signal<mpris::Player::Signals::VideoDimensionChanged>(),
90 object->get_signal<mpris::Player::Signals::Buffering>(),
91 object->get_signal<mpris::Player::Signals::Error>()
111 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
112 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
113 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
114 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
115 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
116 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
117 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
118 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
120 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedPlaybackStatus>>
playback_status;
121 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedBackend>>
backend;
122 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedLoopStatus>>
loop_status;
123 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
124 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
shuffle;
126 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
127 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
128 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
129 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::AudioStreamRole>>
audio_role;
130 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Orientation>>
orientation;
131 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Lifetime>>
lifetime;
138 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
139 typedef core::dbus::Signal<mpris::Player::Signals::AboutToFinish, mpris::Player::Signals::AboutToFinish::ArgumentType>
DBusAboutToFinishSignal;
140 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
141 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
142 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
143 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
146 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
147 const std::shared_ptr<DBusAboutToFinishSignal>& atf,
148 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
149 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status,
150 const std::shared_ptr<DBusVideoDimensionChangedSignal>& d,
151 const std::shared_ptr<DBusBufferingChangedSignal>& bp,
152 const std::shared_ptr<DBusErrorSignal>& e)
171 dbus.seeked_to->connect([
this](std::uint64_t value)
173 MH_DEBUG(
"SeekedTo signal arrived via the bus.");
177 dbus.about_to_finish->connect([
this]()
179 MH_DEBUG(
"AboutToFinish signal arrived via the bus.");
183 dbus.end_of_stream->connect([
this]()
185 MH_DEBUG(
"EndOfStream signal arrived via the bus.");
191 MH_DEBUG(
"PlaybackStatusChanged signal arrived via the bus (status: %s)",
198 MH_DEBUG(
"VideoDimensionChanged signal arrived via the bus.");
204 MH_DEBUG(
"Error signal arrived via the bus (error: %s)", e);
208 dbus.buffering_changed->connect([
this](
int percent)
210 MH_DEBUG(
"BufferingChanged signal arrived via the bus (percent: %d", percent);
220 core::Signal<media::Player::Error>
error;
230 std::shared_ptr<DBusErrorSignal>
error;
237 const std::shared_ptr<Service>&
parent,
238 const std::shared_ptr<core::dbus::Service>&
service,
239 const std::shared_ptr<core::dbus::Object>&
object,
240 const std::string&
uuid)
270 d->track_list = std::make_shared<media::TrackListStub>(
272 d->service->object_for_path(
273 dbus::types::ObjectPath(
274 d->object->path().as_string() +
"/TrackList")));
277 return d->track_list;
288 const auto op = d->object->transact_method<mpris::Player::OpenUri,
bool>(uri);
292 throw media::Player::Errors::InsufficientAppArmorPermissions{op.error().print()};
294 throw media::Player::Errors::UriNotFound{op.error().print()};
296 throw std::runtime_error{op.error().print()};
305 const auto op = d->object->transact_method<mpris::Player::OpenUriExtended,
bool>(uri, headers);
309 throw media::Player::Errors::InsufficientAppArmorPermissions{op.error().print()};
311 throw std::runtime_error{op.error().print()};
319 auto op = d->object->transact_method<mpris::Player::CreateVideoSink,
void>(texture_id);
324 throw media::Player::Errors::OutOfProcessBufferStreamingNotSupported{};
326 throw std::runtime_error{op.error().print()};
329 return d->sink_factory(texture_id);
334 auto op = d->object->transact_method<mpris::Player::Next,
void>();
337 throw std::runtime_error(
"Problem switching to next track on remote object");
342 auto op = d->object->transact_method<mpris::Player::Previous,
void>();
345 throw std::runtime_error(
"Problem switching to previous track on remote object");
350 auto op = d->object->transact_method<mpris::Player::Play,
void>();
353 throw std::runtime_error(
"Problem starting playback on remote object");
358 auto op = d->object->transact_method<mpris::Player::Pause,
void>();
361 throw std::runtime_error(
"Problem pausing playback on remote object");
366 auto op = d->object->transact_method<mpris::Player::Seek, void, uint64_t>(offset.count());
369 throw std::runtime_error(
"Problem seeking on remote object");
374 auto op = d->object->transact_method<mpris::Player::Stop,
void>();
377 throw std::runtime_error(
"Problem stopping playback on remote object");
382 return *d->properties.can_play;
387 return *d->properties.can_pause;
392 return *d->properties.can_seek;
397 return *d->properties.can_go_previous;
402 return *d->properties.can_go_next;
407 return *d->properties.is_video_source;
412 return *d->properties.is_audio_source;
417 return *d->properties.playback_status;
422 return *d->properties.backend;
427 return *d->properties.loop_status;
432 return *d->properties.playback_rate;
437 return *d->properties.shuffle;
442 return *d->properties.meta_data_for_current_track;
447 return *d->properties.volume;
452 return *d->properties.position;
457 return *d->properties.duration;
462 return *d->properties.audio_role;
467 return *d->properties.orientation;
472 return *d->properties.lifetime;
477 return *d->properties.minimum_playback_rate;
482 return *d->properties.maximum_playback_rate;
487 return *d->properties.loop_status;
492 return *d->properties.playback_rate;
497 return *d->properties.shuffle;
502 return *d->properties.volume;
507 return *d->properties.audio_role;
512 return *d->properties.lifetime;
517 return d->signals.seeked_to;
522 return d->signals.about_to_finish;
527 return d->signals.end_of_stream;
532 return d->signals.playback_status_changed;
537 return d->signals.video_dimension_changed;
542 return d->signals.error;
547 return d->signals.buffering_changed;
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name