35 #include <core/dbus/object.h>
36 #include <core/dbus/property.h>
37 #include <core/dbus/stub.h>
39 #include <core/dbus/asio/executor.h>
40 #include <core/dbus/interfaces/properties.h>
48 const std::shared_ptr<core::dbus::Bus>&
bus,
49 const std::shared_ptr<core::dbus::Object>& session,
55 request_context_resolver{request_context_resolver},
73 auto reply = dbus::Message::make_method_return(msg);
80 auto reply = dbus::Message::make_method_return(msg);
87 auto reply = dbus::Message::make_method_return(msg);
94 auto reply = dbus::Message::make_method_return(msg);
101 auto reply = dbus::Message::make_method_return(msg);
107 switch(
impl->playback_status().get())
109 case core::ubuntu::media::Player::PlaybackStatus::ready:
110 case core::ubuntu::media::Player::PlaybackStatus::paused:
111 case core::ubuntu::media::Player::PlaybackStatus::stopped:
114 case core::ubuntu::media::Player::PlaybackStatus::playing:
121 bus->send(dbus::Message::make_method_return(msg));
127 in->reader() >> ticks;
128 impl->seek_to(std::chrono::microseconds(ticks));
130 auto reply = dbus::Message::make_method_return(in);
141 in->reader() >> texture_id;
143 core::dbus::Message::Ptr reply;
147 impl->create_gl_texture_video_sink(texture_id);
148 reply = dbus::Message::make_method_return(in);
150 catch (
const media::Player::Errors::OutOfProcessBufferStreamingNotSupported& e)
152 reply = dbus::Message::make_error(
159 reply = dbus::Message::make_error(
170 auto reply = dbus::Message::make_method_return(in);
171 reply->writer() <<
impl->key();
177 request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [
this, in](
const media::apparmor::ubuntu::Context& context)
185 auto reply = dbus::Message::make_method_return(in);
186 reply->writer() << (std::get<0>(result) ?
impl->open_uri(uri) :
false);
194 request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [
this, in](
const media::apparmor::ubuntu::Context& context)
199 in->reader() >> uri >> headers;
202 auto reply = dbus::Message::make_method_return(in);
203 reply->writer() << (std::get<0>(result) ?
impl->open_uri(uri, headers) :
false);
209 template<
typename Property>
211 const typename Property::ValueType& value,
214 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
215 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
218 typedef std::map<std::string, dbus::types::Variant> Dictionary;
220 static const std::vector<std::string> the_empty_list_of_invalidated_properties;
222 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
224 signal->emit(std::make_tuple(
225 dbus::traits::Service<typename Property::Interface>::interface_name(),
227 the_empty_list_of_invalidated_properties));
240 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
241 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
242 typedef core::dbus::Signal<mpris::Player::Signals::AboutToFinish, mpris::Player::Signals::AboutToFinish::ArgumentType>
DBusAboutToFinishSignal;
243 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
244 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
245 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
247 Signals(
const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
248 const std::shared_ptr<DBusAboutToFinishSignal>& remote_atf,
249 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
250 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed,
251 const std::shared_ptr<DBusVideoDimensionChangedSignal>& remote_video_dimension_changed,
252 const std::shared_ptr<DBusErrorSignal>& remote_error)
254 seeked_to.connect([remote_seeked](std::uint64_t value)
256 remote_seeked->emit(value);
271 remote_playback_status_changed->emit(status);
276 remote_video_dimension_changed->emit(dimensions);
281 remote_error->emit(e);
290 core::Signal<media::Player::Error>
error;
296 : d(new
Private{
this, config.
bus, config.session, config.request_context_resolver, config.request_authenticator})
300 d->object->install_method_handler<mpris::Player::Next>(
next);
303 d->object->install_method_handler<mpris::Player::Previous>(
previous);
306 d->object->install_method_handler<mpris::Player::Pause>(
pause);
309 d->object->install_method_handler<mpris::Player::Stop>(
stop);
312 d->object->install_method_handler<mpris::Player::Play>(
play);
315 d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
318 d->object->install_method_handler<mpris::Player::Seek>(seek);
321 d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
324 d->object->install_method_handler<mpris::Player::OpenUri>(
open_uri);
327 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
330 std::placeholders::_1));
332 d->object->install_method_handler<mpris::Player::Key>(
335 std::placeholders::_1));
337 d->object->install_method_handler<mpris::Player::OpenUriExtended>(
340 std::placeholders::_1));
347 d->object->uninstall_method_handler<mpris::Player::Next>();
348 d->object->uninstall_method_handler<mpris::Player::Previous>();
349 d->object->uninstall_method_handler<mpris::Player::Pause>();
350 d->object->uninstall_method_handler<mpris::Player::Stop>();
351 d->object->uninstall_method_handler<mpris::Player::Play>();
352 d->object->uninstall_method_handler<mpris::Player::PlayPause>();
353 d->object->uninstall_method_handler<mpris::Player::Seek>();
354 d->object->uninstall_method_handler<mpris::Player::SetPosition>();
355 d->object->uninstall_method_handler<mpris::Player::OpenUri>();
356 d->object->uninstall_method_handler<mpris::Player::CreateVideoSink>();
357 d->object->uninstall_method_handler<mpris::Player::Key>();
358 d->object->uninstall_method_handler<mpris::Player::OpenUriExtended>();
363 return *d->skeleton.properties.can_play;
368 return *d->skeleton.properties.can_pause;
373 return *d->skeleton.properties.can_seek;
378 return *d->skeleton.properties.can_go_previous;
383 return *d->skeleton.properties.can_go_next;
388 return *d->skeleton.properties.is_video_source;
393 return *d->skeleton.properties.is_audio_source;
398 return *d->skeleton.properties.typed_playback_status;
403 return *d->skeleton.properties.typed_loop_status;
408 return *d->skeleton.properties.playback_rate;
413 return *d->skeleton.properties.shuffle;
418 return *d->skeleton.properties.typed_meta_data_for_current_track;
423 return *d->skeleton.properties.volume;
428 return *d->skeleton.properties.position;
433 return *d->skeleton.properties.duration;
438 return *d->skeleton.properties.audio_stream_role;
443 return *d->skeleton.properties.orientation;
448 return *d->skeleton.properties.lifetime;
453 return *d->skeleton.properties.minimum_playback_rate;
458 return *d->skeleton.properties.maximum_playback_rate;
463 return *d->skeleton.properties.typed_loop_status;
468 return *d->skeleton.properties.playback_rate;
473 return *d->skeleton.properties.shuffle;
478 return *d->skeleton.properties.volume;
483 return *d->skeleton.properties.position;
488 return *d->skeleton.properties.duration;
493 return *d->skeleton.properties.audio_stream_role;
498 return *d->skeleton.properties.orientation;
503 return *d->skeleton.properties.lifetime;
508 return *d->skeleton.properties.typed_playback_status;
513 return *d->skeleton.properties.can_play;
518 return *d->skeleton.properties.can_pause;
523 return *d->skeleton.properties.can_seek;
528 return *d->skeleton.properties.can_go_previous;
533 return *d->skeleton.properties.can_go_next;
538 return *d->skeleton.properties.is_video_source;
543 return *d->skeleton.properties.is_audio_source;
548 return *d->skeleton.properties.typed_meta_data_for_current_track;
553 return *d->skeleton.properties.minimum_playback_rate;
558 return *d->skeleton.properties.maximum_playback_rate;
563 return d->signals.seeked_to;
568 return d->signals.seeked_to;
573 return d->signals.about_to_finish;
578 return d->signals.about_to_finish;
583 return d->signals.end_of_stream;
588 return d->signals.end_of_stream;
593 return d->signals.playback_status_changed;
598 return d->signals.video_dimension_changed;
603 return d->signals.video_dimension_changed;
608 return d->signals.error;
613 return d->signals.error;
struct mpris::Player::Skeleton::@16 signals
core::dbus::Signal< Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType >::Ptr video_dimension_changed
static constexpr const char * name
core::dbus::Signal< Signals::AboutToFinish, Signals::AboutToFinish::ArgumentType >::Ptr about_to_finish
core::dbus::Signal< Signals::Seeked, Signals::Seeked::ArgumentType >::Ptr seeked_to
core::dbus::Signal< Signals::EndOfStream, Signals::EndOfStream::ArgumentType >::Ptr end_of_stream
core::dbus::Signal< Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType >::Ptr playback_status_changed
core::dbus::Signal< Signals::Error, Signals::Error::ArgumentType >::Ptr error