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)
184 auto reply = dbus::Message::make_method_return(in);
185 reply->writer() << (std::get<0>(result) ?
impl->open_uri(uri) :
false);
193 request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [
this, in](
const media::apparmor::ubuntu::Context& context)
198 in->reader() >> uri >> headers;
201 auto reply = dbus::Message::make_method_return(in);
202 reply->writer() << (std::get<0>(result) ?
impl->open_uri(uri, headers) :
false);
208 template<
typename Property>
210 const typename Property::ValueType& value,
213 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
214 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
217 typedef std::map<std::string, dbus::types::Variant> Dictionary;
219 static const std::vector<std::string> the_empty_list_of_invalidated_properties;
221 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
223 signal->emit(std::make_tuple(
224 dbus::traits::Service<typename Property::Interface>::interface_name(),
226 the_empty_list_of_invalidated_properties));
239 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
240 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
241 typedef core::dbus::Signal<mpris::Player::Signals::AboutToFinish, mpris::Player::Signals::AboutToFinish::ArgumentType>
DBusAboutToFinishSignal;
242 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
243 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
244 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
246 Signals(
const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
247 const std::shared_ptr<DBusAboutToFinishSignal>& remote_atf,
248 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
249 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed,
250 const std::shared_ptr<DBusVideoDimensionChangedSignal>& remote_video_dimension_changed,
251 const std::shared_ptr<DBusErrorSignal>& remote_error)
253 seeked_to.connect([remote_seeked](std::uint64_t value)
255 remote_seeked->emit(value);
270 remote_playback_status_changed->emit(status);
275 remote_video_dimension_changed->emit(dimensions);
280 remote_error->emit(e);
289 core::Signal<media::Player::Error>
error;
295 : d(new
Private{
this, config.
bus, config.session, config.request_context_resolver, config.request_authenticator})
299 d->object->install_method_handler<mpris::Player::Next>(
next);
302 d->object->install_method_handler<mpris::Player::Previous>(
previous);
305 d->object->install_method_handler<mpris::Player::Pause>(
pause);
308 d->object->install_method_handler<mpris::Player::Stop>(
stop);
311 d->object->install_method_handler<mpris::Player::Play>(
play);
314 d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
317 d->object->install_method_handler<mpris::Player::Seek>(seek);
320 d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
323 d->object->install_method_handler<mpris::Player::OpenUri>(
open_uri);
326 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
329 std::placeholders::_1));
331 d->object->install_method_handler<mpris::Player::Key>(
334 std::placeholders::_1));
336 d->object->install_method_handler<mpris::Player::OpenUriExtended>(
339 std::placeholders::_1));
346 d->object->uninstall_method_handler<mpris::Player::Next>();
347 d->object->uninstall_method_handler<mpris::Player::Previous>();
348 d->object->uninstall_method_handler<mpris::Player::Pause>();
349 d->object->uninstall_method_handler<mpris::Player::Stop>();
350 d->object->uninstall_method_handler<mpris::Player::Play>();
351 d->object->uninstall_method_handler<mpris::Player::PlayPause>();
352 d->object->uninstall_method_handler<mpris::Player::Seek>();
353 d->object->uninstall_method_handler<mpris::Player::SetPosition>();
354 d->object->uninstall_method_handler<mpris::Player::OpenUri>();
355 d->object->uninstall_method_handler<mpris::Player::CreateVideoSink>();
356 d->object->uninstall_method_handler<mpris::Player::Key>();
357 d->object->uninstall_method_handler<mpris::Player::OpenUriExtended>();
362 return *d->skeleton.properties.can_play;
367 return *d->skeleton.properties.can_pause;
372 return *d->skeleton.properties.can_seek;
377 return *d->skeleton.properties.can_go_previous;
382 return *d->skeleton.properties.can_go_next;
387 return *d->skeleton.properties.is_video_source;
392 return *d->skeleton.properties.is_audio_source;
397 return *d->skeleton.properties.typed_playback_status;
402 return *d->skeleton.properties.typed_loop_status;
407 return *d->skeleton.properties.playback_rate;
412 return *d->skeleton.properties.is_shuffle;
417 return *d->skeleton.properties.typed_meta_data_for_current_track;
422 return *d->skeleton.properties.volume;
427 return *d->skeleton.properties.position;
432 return *d->skeleton.properties.duration;
437 return *d->skeleton.properties.audio_stream_role;
442 return *d->skeleton.properties.orientation;
447 return *d->skeleton.properties.lifetime;
452 return *d->skeleton.properties.minimum_playback_rate;
457 return *d->skeleton.properties.maximum_playback_rate;
462 return *d->skeleton.properties.typed_loop_status;
467 return *d->skeleton.properties.playback_rate;
472 return *d->skeleton.properties.is_shuffle;
477 return *d->skeleton.properties.volume;
482 return *d->skeleton.properties.position;
487 return *d->skeleton.properties.duration;
492 return *d->skeleton.properties.audio_stream_role;
497 return *d->skeleton.properties.orientation;
502 return *d->skeleton.properties.lifetime;
507 return *d->skeleton.properties.typed_playback_status;
512 return *d->skeleton.properties.can_play;
517 return *d->skeleton.properties.can_pause;
522 return *d->skeleton.properties.can_seek;
527 return *d->skeleton.properties.can_go_previous;
532 return *d->skeleton.properties.can_go_next;
537 return *d->skeleton.properties.is_video_source;
542 return *d->skeleton.properties.is_audio_source;
547 return *d->skeleton.properties.typed_meta_data_for_current_track;
552 return *d->skeleton.properties.minimum_playback_rate;
557 return *d->skeleton.properties.maximum_playback_rate;
562 return d->signals.seeked_to;
567 return d->signals.seeked_to;
572 return d->signals.about_to_finish;
577 return d->signals.about_to_finish;
582 return d->signals.end_of_stream;
587 return d->signals.end_of_stream;
592 return d->signals.playback_status_changed;
597 return d->signals.video_dimension_changed;
602 return d->signals.video_dimension_changed;
607 return d->signals.error;
612 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