Music Hub  ..
A session-wide music playback service
player_skeleton.cpp
Go to the documentation of this file.
1 /*
2  * Copyright © 2013-2015 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License version 3,
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored by: Thomas Voß <thomas.voss@canonical.com>
17  * Jim Hodapp <jim.hodapp@canonical.com>
18  */
19 
20 #include "codec.h"
21 #include "engine.h"
22 #include "external_services.h"
23 #include "player_skeleton.h"
24 #include "player_traits.h"
25 #include "property_stub.h"
26 #include "the_session_bus.h"
27 #include "xesam.h"
28 
29 #include "apparmor/ubuntu.h"
30 #include "mpris/media_player2.h"
31 #include "mpris/metadata.h"
32 #include "mpris/player.h"
33 #include "mpris/playlists.h"
34 
35 #include <core/dbus/object.h>
36 #include <core/dbus/property.h>
37 #include <core/dbus/stub.h>
38 
39 #include <core/dbus/asio/executor.h>
40 #include <core/dbus/interfaces/properties.h>
41 
42 namespace dbus = core::dbus;
43 namespace media = core::ubuntu::media;
44 
46 {
48  const std::shared_ptr<core::dbus::Bus>& bus,
49  const std::shared_ptr<core::dbus::Object>& session,
50  const apparmor::ubuntu::RequestContextResolver::Ptr& request_context_resolver,
51  const apparmor::ubuntu::RequestAuthenticator::Ptr& request_authenticator)
52  : impl(player),
53  bus(bus),
54  object(session),
55  request_context_resolver{request_context_resolver},
58  signals
59  {
66  }
67  {
68  }
69 
70  void handle_next(const core::dbus::Message::Ptr& msg)
71  {
72  impl->next();
73  auto reply = dbus::Message::make_method_return(msg);
74  bus->send(reply);
75  }
76 
77  void handle_previous(const core::dbus::Message::Ptr& msg)
78  {
79  impl->previous();
80  auto reply = dbus::Message::make_method_return(msg);
81  bus->send(reply);
82  }
83 
84  void handle_pause(const core::dbus::Message::Ptr& msg)
85  {
86  impl->pause();
87  auto reply = dbus::Message::make_method_return(msg);
88  bus->send(reply);
89  }
90 
91  void handle_stop(const core::dbus::Message::Ptr& msg)
92  {
93  impl->stop();
94  auto reply = dbus::Message::make_method_return(msg);
95  bus->send(reply);
96  }
97 
98  void handle_play(const core::dbus::Message::Ptr& msg)
99  {
100  impl->play();
101  auto reply = dbus::Message::make_method_return(msg);
102  bus->send(reply);
103  }
104 
105  void handle_play_pause(const core::dbus::Message::Ptr& msg)
106  {
107  switch(impl->playback_status().get())
108  {
109  case core::ubuntu::media::Player::PlaybackStatus::ready:
110  case core::ubuntu::media::Player::PlaybackStatus::paused:
111  case core::ubuntu::media::Player::PlaybackStatus::stopped:
112  impl->play();
113  break;
114  case core::ubuntu::media::Player::PlaybackStatus::playing:
115  impl->pause();
116  break;
117  default:
118  break;
119  }
120 
121  bus->send(dbus::Message::make_method_return(msg));
122  }
123 
124  void handle_seek(const core::dbus::Message::Ptr& in)
125  {
126  uint64_t ticks;
127  in->reader() >> ticks;
128  impl->seek_to(std::chrono::microseconds(ticks));
129 
130  auto reply = dbus::Message::make_method_return(in);
131  bus->send(reply);
132  }
133 
134  void handle_set_position(const core::dbus::Message::Ptr&)
135  {
136  }
137 
138  void handle_create_video_sink(const core::dbus::Message::Ptr& in)
139  {
140  uint32_t texture_id;
141  in->reader() >> texture_id;
142 
143  core::dbus::Message::Ptr reply;
144 
145  try
146  {
147  impl->create_gl_texture_video_sink(texture_id);
148  reply = dbus::Message::make_method_return(in);
149  }
150  catch (const media::Player::Errors::OutOfProcessBufferStreamingNotSupported& e)
151  {
152  reply = dbus::Message::make_error(
153  in,
155  e.what());
156  }
157  catch (...)
158  {
159  reply = dbus::Message::make_error(
160  in,
162  std::string{});
163  }
164 
165  bus->send(reply);
166  }
167 
168  void handle_key(const core::dbus::Message::Ptr& in)
169  {
170  auto reply = dbus::Message::make_method_return(in);
171  reply->writer() << impl->key();
172  bus->send(reply);
173  }
174 
175  void handle_open_uri(const core::dbus::Message::Ptr& in)
176  {
177  request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [this, in](const media::apparmor::ubuntu::Context& context)
178  {
179  Track::UriType uri;
180  in->reader() >> uri;
181 
182  auto result = request_authenticator->authenticate_open_uri_request(context, uri);
183 
184  auto reply = dbus::Message::make_method_return(in);
185  reply->writer() << (std::get<0>(result) ? impl->open_uri(uri) : false);
186 
187  bus->send(reply);
188  });
189  }
190 
191  void handle_open_uri_extended(const core::dbus::Message::Ptr& in)
192  {
193  request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [this, in](const media::apparmor::ubuntu::Context& context)
194  {
195  Track::UriType uri;
196  Player::HeadersType headers;
197 
198  in->reader() >> uri >> headers;
199 
200  auto result = request_authenticator->authenticate_open_uri_request(context, uri);
201  auto reply = dbus::Message::make_method_return(in);
202  reply->writer() << (std::get<0>(result) ? impl->open_uri(uri, headers) : false);
203 
204  bus->send(reply);
205  });
206  }
207 
208  template<typename Property>
210  const typename Property::ValueType& value,
211  const dbus::Signal
212  <
213  core::dbus::interfaces::Properties::Signals::PropertiesChanged,
214  core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
215  >::Ptr& signal)
216  {
217  typedef std::map<std::string, dbus::types::Variant> Dictionary;
218 
219  static const std::vector<std::string> the_empty_list_of_invalidated_properties;
220 
221  Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
222 
223  signal->emit(std::make_tuple(
224  dbus::traits::Service<typename Property::Interface>::interface_name(),
225  dict,
226  the_empty_list_of_invalidated_properties));
227  }
228 
230  dbus::Bus::Ptr bus;
231  dbus::Object::Ptr object;
232  media::apparmor::ubuntu::RequestContextResolver::Ptr request_context_resolver;
233  media::apparmor::ubuntu::RequestAuthenticator::Ptr request_authenticator;
234 
236 
237  struct Signals
238  {
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;
245 
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)
252  {
253  seeked_to.connect([remote_seeked](std::uint64_t value)
254  {
255  remote_seeked->emit(value);
256  });
257 
258  about_to_finish.connect([remote_atf]()
259  {
260  remote_atf->emit();
261  });
262 
263  end_of_stream.connect([remote_eos]()
264  {
265  remote_eos->emit();
266  });
267 
268  playback_status_changed.connect([remote_playback_status_changed](const media::Player::PlaybackStatus& status)
269  {
270  remote_playback_status_changed->emit(status);
271  });
272 
273  video_dimension_changed.connect([remote_video_dimension_changed](const media::video::Dimensions& dimensions)
274  {
275  remote_video_dimension_changed->emit(dimensions);
276  });
277 
278  error.connect([remote_error](const media::Player::Error& e)
279  {
280  remote_error->emit(e);
281  });
282  }
283 
284  core::Signal<int64_t> seeked_to;
285  core::Signal<void> about_to_finish;
286  core::Signal<void> end_of_stream;
287  core::Signal<media::Player::PlaybackStatus> playback_status_changed;
288  core::Signal<media::video::Dimensions> video_dimension_changed;
289  core::Signal<media::Player::Error> error;
290  } signals;
291 
292 };
293 
294 media::PlayerSkeleton::PlayerSkeleton(const media::PlayerSkeleton::Configuration& config)
295  : d(new Private{this, config.bus, config.session, config.request_context_resolver, config.request_authenticator})
296 {
297  // Setup method handlers for mpris::Player methods.
298  auto next = std::bind(&Private::handle_next, d, std::placeholders::_1);
299  d->object->install_method_handler<mpris::Player::Next>(next);
300 
301  auto previous = std::bind(&Private::handle_previous, d, std::placeholders::_1);
302  d->object->install_method_handler<mpris::Player::Previous>(previous);
303 
304  auto pause = std::bind(&Private::handle_pause, d, std::placeholders::_1);
305  d->object->install_method_handler<mpris::Player::Pause>(pause);
306 
307  auto stop = std::bind(&Private::handle_stop, d, std::placeholders::_1);
308  d->object->install_method_handler<mpris::Player::Stop>(stop);
309 
310  auto play = std::bind(&Private::handle_play, d, std::placeholders::_1);
311  d->object->install_method_handler<mpris::Player::Play>(play);
312 
313  auto play_pause = std::bind(&Private::handle_play_pause, d, std::placeholders::_1);
314  d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
315 
316  auto seek = std::bind(&Private::handle_seek, d, std::placeholders::_1);
317  d->object->install_method_handler<mpris::Player::Seek>(seek);
318 
319  auto set_position = std::bind(&Private::handle_set_position, d, std::placeholders::_1);
320  d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
321 
322  auto open_uri = std::bind(&Private::handle_open_uri, d, std::placeholders::_1);
323  d->object->install_method_handler<mpris::Player::OpenUri>(open_uri);
324 
325  // All the method handlers that exceed the mpris spec go here.
326  d->object->install_method_handler<mpris::Player::CreateVideoSink>(
328  d,
329  std::placeholders::_1));
330 
331  d->object->install_method_handler<mpris::Player::Key>(
332  std::bind(&Private::handle_key,
333  d,
334  std::placeholders::_1));
335 
336  d->object->install_method_handler<mpris::Player::OpenUriExtended>(
338  d,
339  std::placeholders::_1));
340 }
341 
343 {
344  // The session object may outlive the private instance
345  // so uninstall all method handlers.
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>();
358 }
359 
360 const core::Property<bool>& media::PlayerSkeleton::can_play() const
361 {
362  return *d->skeleton.properties.can_play;
363 }
364 
365 const core::Property<bool>& media::PlayerSkeleton::can_pause() const
366 {
367  return *d->skeleton.properties.can_pause;
368 }
369 
370 const core::Property<bool>& media::PlayerSkeleton::can_seek() const
371 {
372  return *d->skeleton.properties.can_seek;
373 }
374 
375 const core::Property<bool>& media::PlayerSkeleton::can_go_previous() const
376 {
377  return *d->skeleton.properties.can_go_previous;
378 }
379 
380 const core::Property<bool>& media::PlayerSkeleton::can_go_next() const
381 {
382  return *d->skeleton.properties.can_go_next;
383 }
384 
385 const core::Property<bool>& media::PlayerSkeleton::is_video_source() const
386 {
387  return *d->skeleton.properties.is_video_source;
388 }
389 
390 const core::Property<bool>& media::PlayerSkeleton::is_audio_source() const
391 {
392  return *d->skeleton.properties.is_audio_source;
393 }
394 
395 const core::Property<media::Player::PlaybackStatus>& media::PlayerSkeleton::playback_status() const
396 {
397  return *d->skeleton.properties.typed_playback_status;
398 }
399 
400 const core::Property<media::Player::LoopStatus>& media::PlayerSkeleton::loop_status() const
401 {
402  return *d->skeleton.properties.typed_loop_status;
403 }
404 
405 const core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::playback_rate() const
406 {
407  return *d->skeleton.properties.playback_rate;
408 }
409 
410 const core::Property<bool>& media::PlayerSkeleton::is_shuffle() const
411 {
412  return *d->skeleton.properties.is_shuffle;
413 }
414 
415 const core::Property<media::Track::MetaData>& media::PlayerSkeleton::meta_data_for_current_track() const
416 {
417  return *d->skeleton.properties.typed_meta_data_for_current_track;
418 }
419 
420 const core::Property<media::Player::Volume>& media::PlayerSkeleton::volume() const
421 {
422  return *d->skeleton.properties.volume;
423 }
424 
425 const core::Property<int64_t>& media::PlayerSkeleton::position() const
426 {
427  return *d->skeleton.properties.position;
428 }
429 
430 const core::Property<int64_t>& media::PlayerSkeleton::duration() const
431 {
432  return *d->skeleton.properties.duration;
433 }
434 
435 const core::Property<media::Player::AudioStreamRole>& media::PlayerSkeleton::audio_stream_role() const
436 {
437  return *d->skeleton.properties.audio_stream_role;
438 }
439 
440 const core::Property<media::Player::Orientation>& media::PlayerSkeleton::orientation() const
441 {
442  return *d->skeleton.properties.orientation;
443 }
444 
445 const core::Property<media::Player::Lifetime>& media::PlayerSkeleton::lifetime() const
446 {
447  return *d->skeleton.properties.lifetime;
448 }
449 
450 const core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::minimum_playback_rate() const
451 {
452  return *d->skeleton.properties.minimum_playback_rate;
453 }
454 
455 const core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::maximum_playback_rate() const
456 {
457  return *d->skeleton.properties.maximum_playback_rate;
458 }
459 
460 core::Property<media::Player::LoopStatus>& media::PlayerSkeleton::loop_status()
461 {
462  return *d->skeleton.properties.typed_loop_status;
463 }
464 
465 core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::playback_rate()
466 {
467  return *d->skeleton.properties.playback_rate;
468 }
469 
470 core::Property<bool>& media::PlayerSkeleton::is_shuffle()
471 {
472  return *d->skeleton.properties.is_shuffle;
473 }
474 
475 core::Property<media::Player::Volume>& media::PlayerSkeleton::volume()
476 {
477  return *d->skeleton.properties.volume;
478 }
479 
480 core::Property<int64_t>& media::PlayerSkeleton::position()
481 {
482  return *d->skeleton.properties.position;
483 }
484 
485 core::Property<int64_t>& media::PlayerSkeleton::duration()
486 {
487  return *d->skeleton.properties.duration;
488 }
489 
490 core::Property<media::Player::AudioStreamRole>& media::PlayerSkeleton::audio_stream_role()
491 {
492  return *d->skeleton.properties.audio_stream_role;
493 }
494 
495 core::Property<media::Player::Orientation>& media::PlayerSkeleton::orientation()
496 {
497  return *d->skeleton.properties.orientation;
498 }
499 
500 core::Property<media::Player::Lifetime>& media::PlayerSkeleton::lifetime()
501 {
502  return *d->skeleton.properties.lifetime;
503 }
504 
505 core::Property<media::Player::PlaybackStatus>& media::PlayerSkeleton::playback_status()
506 {
507  return *d->skeleton.properties.typed_playback_status;
508 }
509 
510 core::Property<bool>& media::PlayerSkeleton::can_play()
511 {
512  return *d->skeleton.properties.can_play;
513 }
514 
515 core::Property<bool>& media::PlayerSkeleton::can_pause()
516 {
517  return *d->skeleton.properties.can_pause;
518 }
519 
520 core::Property<bool>& media::PlayerSkeleton::can_seek()
521 {
522  return *d->skeleton.properties.can_seek;
523 }
524 
525 core::Property<bool>& media::PlayerSkeleton::can_go_previous()
526 {
527  return *d->skeleton.properties.can_go_previous;
528 }
529 
530 core::Property<bool>& media::PlayerSkeleton::can_go_next()
531 {
532  return *d->skeleton.properties.can_go_next;
533 }
534 
535 core::Property<bool>& media::PlayerSkeleton::is_video_source()
536 {
537  return *d->skeleton.properties.is_video_source;
538 }
539 
540 core::Property<bool>& media::PlayerSkeleton::is_audio_source()
541 {
542  return *d->skeleton.properties.is_audio_source;
543 }
544 
545 core::Property<media::Track::MetaData>& media::PlayerSkeleton::meta_data_for_current_track()
546 {
547  return *d->skeleton.properties.typed_meta_data_for_current_track;
548 }
549 
550 core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::minimum_playback_rate()
551 {
552  return *d->skeleton.properties.minimum_playback_rate;
553 }
554 
555 core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::maximum_playback_rate()
556 {
557  return *d->skeleton.properties.maximum_playback_rate;
558 }
559 
560 const core::Signal<int64_t>& media::PlayerSkeleton::seeked_to() const
561 {
562  return d->signals.seeked_to;
563 }
564 
565 core::Signal<int64_t>& media::PlayerSkeleton::seeked_to()
566 {
567  return d->signals.seeked_to;
568 }
569 
570 const core::Signal<void>& media::PlayerSkeleton::about_to_finish() const
571 {
572  return d->signals.about_to_finish;
573 }
574 
575 core::Signal<void>& media::PlayerSkeleton::about_to_finish()
576 {
577  return d->signals.about_to_finish;
578 }
579 
580 const core::Signal<void>& media::PlayerSkeleton::end_of_stream() const
581 {
582  return d->signals.end_of_stream;
583 }
584 
585 core::Signal<void>& media::PlayerSkeleton::end_of_stream()
586 {
587  return d->signals.end_of_stream;
588 }
589 
590 core::Signal<media::Player::PlaybackStatus>& media::PlayerSkeleton::playback_status_changed()
591 {
592  return d->signals.playback_status_changed;
593 }
594 
595 const core::Signal<media::video::Dimensions>& media::PlayerSkeleton::video_dimension_changed() const
596 {
597  return d->signals.video_dimension_changed;
598 }
599 
600 core::Signal<media::video::Dimensions>& media::PlayerSkeleton::video_dimension_changed()
601 {
602  return d->signals.video_dimension_changed;
603 }
604 
605 core::Signal<media::Player::Error>& media::PlayerSkeleton::error()
606 {
607  return d->signals.error;
608 }
609 
610 const core::Signal<media::Player::Error>& media::PlayerSkeleton::error() const
611 {
612  return d->signals.error;
613 }
void handle_previous(const core::dbus::Message::Ptr &msg)
struct mpris::Player::Skeleton::@16 signals
virtual const core::Signal< Error > & error() const
mpris::Player::Skeleton skeleton
void handle_play(const core::dbus::Message::Ptr &msg)
virtual const core::Property< PlaybackStatus > & playback_status() const
std::tuple< Height, Width > Dimensions
Height and Width of a video.
Definition: dimensions.h:139
virtual const core::Property< bool > & is_video_source() const
virtual const core::Signal< void > & end_of_stream() const
virtual const core::Property< int64_t > & duration() const
virtual const core::Property< bool > & can_seek() const
virtual const core::Property< PlaybackRate > & maximum_playback_rate() const
virtual const core::Property< bool > & is_shuffle() const
virtual const core::Property< bool > & can_go_next() const
virtual const core::Property< int64_t > & position() const
virtual const core::Property< bool > & can_go_previous() const
virtual void previous()=0
void handle_set_position(const core::dbus::Message::Ptr &)
void handle_open_uri_extended(const core::dbus::Message::Ptr &in)
virtual const core::Property< bool > & can_play() const
core::dbus::Signal< Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType >::Ptr video_dimension_changed
Definition: player.h:381
virtual const core::Signal< void > & about_to_finish() const
std::map< std::string, std::string > HeadersType
Definition: player.h:48
void handle_play_pause(const core::dbus::Message::Ptr &msg)
virtual const core::Property< Track::MetaData > & meta_data_for_current_track() const
virtual const core::Property< bool > & can_pause() const
virtual const core::Property< LoopStatus > & loop_status() const
void handle_stop(const core::dbus::Message::Ptr &msg)
virtual bool open_uri(const Track::UriType &uri)=0
virtual const core::Signal< int64_t > & seeked_to() const
virtual const core::Property< PlaybackRate > & playback_rate() const
PlayerSkeleton(const Configuration &configuration)
Private(media::PlayerSkeleton *player, const std::shared_ptr< core::dbus::Bus > &bus, const std::shared_ptr< core::dbus::Object > &session, const apparmor::ubuntu::RequestContextResolver::Ptr &request_context_resolver, const apparmor::ubuntu::RequestAuthenticator::Ptr &request_authenticator)
virtual const core::Property< AudioStreamRole > & audio_stream_role() const
core::dbus::Signal< mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType > DBusEndOfStreamSignal
media::apparmor::ubuntu::RequestContextResolver::Ptr request_context_resolver
media::PlayerSkeleton * impl
core::dbus::Signal< Signals::AboutToFinish, Signals::AboutToFinish::ArgumentType >::Ptr about_to_finish
Definition: player.h:378
core::dbus::Signal< mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType > DBusVideoDimensionChangedSignal
void handle_pause(const core::dbus::Message::Ptr &msg)
core::dbus::Signal< mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType > DBusPlaybackStatusChangedSignal
virtual const core::Property< PlaybackRate > & minimum_playback_rate() const
struct media::PlayerSkeleton::Private::Signals signals
core::Signal< media::Player::Error > error
void handle_seek(const core::dbus::Message::Ptr &in)
virtual const core::Property< Orientation > & orientation() const
void handle_open_uri(const core::dbus::Message::Ptr &in)
core::dbus::Signal< Signals::Seeked, Signals::Seeked::ArgumentType >::Ptr seeked_to
Definition: player.h:377
virtual const core::Property< Volume > & volume() const
virtual const core::Signal< video::Dimensions > & video_dimension_changed() const
std::string UriType
Definition: track.h:40
Signals(const std::shared_ptr< DBusSeekedToSignal > &remote_seeked, const std::shared_ptr< DBusAboutToFinishSignal > &remote_atf, const std::shared_ptr< DBusEndOfStreamSignal > &remote_eos, const std::shared_ptr< DBusPlaybackStatusChangedSignal > &remote_playback_status_changed, const std::shared_ptr< DBusVideoDimensionChangedSignal > &remote_video_dimension_changed, const std::shared_ptr< DBusErrorSignal > &remote_error)
void handle_next(const core::dbus::Message::Ptr &msg)
virtual core::Signal< PlaybackStatus > & playback_status_changed()
void on_property_value_changed(const typename Property::ValueType &value, const dbus::Signal< core::dbus::interfaces::Properties::Signals::PropertiesChanged, core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType >::Ptr &signal)
virtual const core::Property< bool > & is_audio_source() const
media::apparmor::ubuntu::RequestAuthenticator::Ptr request_authenticator
core::Signal< media::video::Dimensions > video_dimension_changed
core::dbus::Signal< mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType > DBusSeekedToSignal
core::dbus::Signal< Signals::EndOfStream, Signals::EndOfStream::ArgumentType >::Ptr end_of_stream
Definition: player.h:379
core::dbus::Signal< mpris::Player::Signals::AboutToFinish, mpris::Player::Signals::AboutToFinish::ArgumentType > DBusAboutToFinishSignal
core::dbus::Signal< mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType > DBusErrorSignal
core::Signal< media::Player::PlaybackStatus > playback_status_changed
virtual const core::Property< Lifetime > & lifetime() const
core::dbus::Signal< Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType >::Ptr playback_status_changed
Definition: player.h:380
void handle_create_video_sink(const core::dbus::Message::Ptr &in)
core::dbus::Signal< Signals::Error, Signals::Error::ArgumentType >::Ptr error
Definition: player.h:382
void handle_key(const core::dbus::Message::Ptr &in)