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  // Make sure the client has adequate apparmor permissions to open the URI
183  auto result = request_authenticator->authenticate_open_uri_request(context, uri);
184 
185  auto reply = dbus::Message::make_method_return(in);
186  reply->writer() << (std::get<0>(result) ? impl->open_uri(uri) : false);
187 
188  bus->send(reply);
189  });
190  }
191 
192  void handle_open_uri_extended(const core::dbus::Message::Ptr& in)
193  {
194  request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [this, in](const media::apparmor::ubuntu::Context& context)
195  {
196  Track::UriType uri;
197  Player::HeadersType headers;
198 
199  in->reader() >> uri >> headers;
200 
201  auto result = request_authenticator->authenticate_open_uri_request(context, uri);
202  auto reply = dbus::Message::make_method_return(in);
203  reply->writer() << (std::get<0>(result) ? impl->open_uri(uri, headers) : false);
204 
205  bus->send(reply);
206  });
207  }
208 
209  template<typename Property>
211  const typename Property::ValueType& value,
212  const dbus::Signal
213  <
214  core::dbus::interfaces::Properties::Signals::PropertiesChanged,
215  core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
216  >::Ptr& signal)
217  {
218  typedef std::map<std::string, dbus::types::Variant> Dictionary;
219 
220  static const std::vector<std::string> the_empty_list_of_invalidated_properties;
221 
222  Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
223 
224  signal->emit(std::make_tuple(
225  dbus::traits::Service<typename Property::Interface>::interface_name(),
226  dict,
227  the_empty_list_of_invalidated_properties));
228  }
229 
231  dbus::Bus::Ptr bus;
232  dbus::Object::Ptr object;
233  media::apparmor::ubuntu::RequestContextResolver::Ptr request_context_resolver;
234  media::apparmor::ubuntu::RequestAuthenticator::Ptr request_authenticator;
235 
237 
238  struct Signals
239  {
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;
246 
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)
253  {
254  seeked_to.connect([remote_seeked](std::uint64_t value)
255  {
256  remote_seeked->emit(value);
257  });
258 
259  about_to_finish.connect([remote_atf]()
260  {
261  remote_atf->emit();
262  });
263 
264  end_of_stream.connect([remote_eos]()
265  {
266  remote_eos->emit();
267  });
268 
269  playback_status_changed.connect([remote_playback_status_changed](const media::Player::PlaybackStatus& status)
270  {
271  remote_playback_status_changed->emit(status);
272  });
273 
274  video_dimension_changed.connect([remote_video_dimension_changed](const media::video::Dimensions& dimensions)
275  {
276  remote_video_dimension_changed->emit(dimensions);
277  });
278 
279  error.connect([remote_error](const media::Player::Error& e)
280  {
281  remote_error->emit(e);
282  });
283  }
284 
285  core::Signal<int64_t> seeked_to;
286  core::Signal<void> about_to_finish;
287  core::Signal<void> end_of_stream;
288  core::Signal<media::Player::PlaybackStatus> playback_status_changed;
289  core::Signal<media::video::Dimensions> video_dimension_changed;
290  core::Signal<media::Player::Error> error;
291  } signals;
292 
293 };
294 
295 media::PlayerSkeleton::PlayerSkeleton(const media::PlayerSkeleton::Configuration& config)
296  : d(new Private{this, config.bus, config.session, config.request_context_resolver, config.request_authenticator})
297 {
298  // Setup method handlers for mpris::Player methods.
299  auto next = std::bind(&Private::handle_next, d, std::placeholders::_1);
300  d->object->install_method_handler<mpris::Player::Next>(next);
301 
302  auto previous = std::bind(&Private::handle_previous, d, std::placeholders::_1);
303  d->object->install_method_handler<mpris::Player::Previous>(previous);
304 
305  auto pause = std::bind(&Private::handle_pause, d, std::placeholders::_1);
306  d->object->install_method_handler<mpris::Player::Pause>(pause);
307 
308  auto stop = std::bind(&Private::handle_stop, d, std::placeholders::_1);
309  d->object->install_method_handler<mpris::Player::Stop>(stop);
310 
311  auto play = std::bind(&Private::handle_play, d, std::placeholders::_1);
312  d->object->install_method_handler<mpris::Player::Play>(play);
313 
314  auto play_pause = std::bind(&Private::handle_play_pause, d, std::placeholders::_1);
315  d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
316 
317  auto seek = std::bind(&Private::handle_seek, d, std::placeholders::_1);
318  d->object->install_method_handler<mpris::Player::Seek>(seek);
319 
320  auto set_position = std::bind(&Private::handle_set_position, d, std::placeholders::_1);
321  d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
322 
323  auto open_uri = std::bind(&Private::handle_open_uri, d, std::placeholders::_1);
324  d->object->install_method_handler<mpris::Player::OpenUri>(open_uri);
325 
326  // All the method handlers that exceed the mpris spec go here.
327  d->object->install_method_handler<mpris::Player::CreateVideoSink>(
329  d,
330  std::placeholders::_1));
331 
332  d->object->install_method_handler<mpris::Player::Key>(
333  std::bind(&Private::handle_key,
334  d,
335  std::placeholders::_1));
336 
337  d->object->install_method_handler<mpris::Player::OpenUriExtended>(
339  d,
340  std::placeholders::_1));
341 }
342 
344 {
345  // The session object may outlive the private instance
346  // so uninstall all method handlers.
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>();
359 }
360 
361 const core::Property<bool>& media::PlayerSkeleton::can_play() const
362 {
363  return *d->skeleton.properties.can_play;
364 }
365 
366 const core::Property<bool>& media::PlayerSkeleton::can_pause() const
367 {
368  return *d->skeleton.properties.can_pause;
369 }
370 
371 const core::Property<bool>& media::PlayerSkeleton::can_seek() const
372 {
373  return *d->skeleton.properties.can_seek;
374 }
375 
376 const core::Property<bool>& media::PlayerSkeleton::can_go_previous() const
377 {
378  return *d->skeleton.properties.can_go_previous;
379 }
380 
381 const core::Property<bool>& media::PlayerSkeleton::can_go_next() const
382 {
383  return *d->skeleton.properties.can_go_next;
384 }
385 
386 const core::Property<bool>& media::PlayerSkeleton::is_video_source() const
387 {
388  return *d->skeleton.properties.is_video_source;
389 }
390 
391 const core::Property<bool>& media::PlayerSkeleton::is_audio_source() const
392 {
393  return *d->skeleton.properties.is_audio_source;
394 }
395 
396 const core::Property<media::Player::PlaybackStatus>& media::PlayerSkeleton::playback_status() const
397 {
398  return *d->skeleton.properties.typed_playback_status;
399 }
400 
401 const core::Property<media::Player::LoopStatus>& media::PlayerSkeleton::loop_status() const
402 {
403  return *d->skeleton.properties.typed_loop_status;
404 }
405 
406 const core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::playback_rate() const
407 {
408  return *d->skeleton.properties.playback_rate;
409 }
410 
411 const core::Property<bool>& media::PlayerSkeleton::shuffle() const
412 {
413  return *d->skeleton.properties.shuffle;
414 }
415 
416 const core::Property<media::Track::MetaData>& media::PlayerSkeleton::meta_data_for_current_track() const
417 {
418  return *d->skeleton.properties.typed_meta_data_for_current_track;
419 }
420 
421 const core::Property<media::Player::Volume>& media::PlayerSkeleton::volume() const
422 {
423  return *d->skeleton.properties.volume;
424 }
425 
426 const core::Property<int64_t>& media::PlayerSkeleton::position() const
427 {
428  return *d->skeleton.properties.position;
429 }
430 
431 const core::Property<int64_t>& media::PlayerSkeleton::duration() const
432 {
433  return *d->skeleton.properties.duration;
434 }
435 
436 const core::Property<media::Player::AudioStreamRole>& media::PlayerSkeleton::audio_stream_role() const
437 {
438  return *d->skeleton.properties.audio_stream_role;
439 }
440 
441 const core::Property<media::Player::Orientation>& media::PlayerSkeleton::orientation() const
442 {
443  return *d->skeleton.properties.orientation;
444 }
445 
446 const core::Property<media::Player::Lifetime>& media::PlayerSkeleton::lifetime() const
447 {
448  return *d->skeleton.properties.lifetime;
449 }
450 
451 const core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::minimum_playback_rate() const
452 {
453  return *d->skeleton.properties.minimum_playback_rate;
454 }
455 
456 const core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::maximum_playback_rate() const
457 {
458  return *d->skeleton.properties.maximum_playback_rate;
459 }
460 
461 core::Property<media::Player::LoopStatus>& media::PlayerSkeleton::loop_status()
462 {
463  return *d->skeleton.properties.typed_loop_status;
464 }
465 
466 core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::playback_rate()
467 {
468  return *d->skeleton.properties.playback_rate;
469 }
470 
471 core::Property<bool>& media::PlayerSkeleton::shuffle()
472 {
473  return *d->skeleton.properties.shuffle;
474 }
475 
476 core::Property<media::Player::Volume>& media::PlayerSkeleton::volume()
477 {
478  return *d->skeleton.properties.volume;
479 }
480 
481 core::Property<int64_t>& media::PlayerSkeleton::position()
482 {
483  return *d->skeleton.properties.position;
484 }
485 
486 core::Property<int64_t>& media::PlayerSkeleton::duration()
487 {
488  return *d->skeleton.properties.duration;
489 }
490 
491 core::Property<media::Player::AudioStreamRole>& media::PlayerSkeleton::audio_stream_role()
492 {
493  return *d->skeleton.properties.audio_stream_role;
494 }
495 
496 core::Property<media::Player::Orientation>& media::PlayerSkeleton::orientation()
497 {
498  return *d->skeleton.properties.orientation;
499 }
500 
501 core::Property<media::Player::Lifetime>& media::PlayerSkeleton::lifetime()
502 {
503  return *d->skeleton.properties.lifetime;
504 }
505 
506 core::Property<media::Player::PlaybackStatus>& media::PlayerSkeleton::playback_status()
507 {
508  return *d->skeleton.properties.typed_playback_status;
509 }
510 
511 core::Property<bool>& media::PlayerSkeleton::can_play()
512 {
513  return *d->skeleton.properties.can_play;
514 }
515 
516 core::Property<bool>& media::PlayerSkeleton::can_pause()
517 {
518  return *d->skeleton.properties.can_pause;
519 }
520 
521 core::Property<bool>& media::PlayerSkeleton::can_seek()
522 {
523  return *d->skeleton.properties.can_seek;
524 }
525 
526 core::Property<bool>& media::PlayerSkeleton::can_go_previous()
527 {
528  return *d->skeleton.properties.can_go_previous;
529 }
530 
531 core::Property<bool>& media::PlayerSkeleton::can_go_next()
532 {
533  return *d->skeleton.properties.can_go_next;
534 }
535 
536 core::Property<bool>& media::PlayerSkeleton::is_video_source()
537 {
538  return *d->skeleton.properties.is_video_source;
539 }
540 
541 core::Property<bool>& media::PlayerSkeleton::is_audio_source()
542 {
543  return *d->skeleton.properties.is_audio_source;
544 }
545 
546 core::Property<media::Track::MetaData>& media::PlayerSkeleton::meta_data_for_current_track()
547 {
548  return *d->skeleton.properties.typed_meta_data_for_current_track;
549 }
550 
551 core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::minimum_playback_rate()
552 {
553  return *d->skeleton.properties.minimum_playback_rate;
554 }
555 
556 core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::maximum_playback_rate()
557 {
558  return *d->skeleton.properties.maximum_playback_rate;
559 }
560 
561 const core::Signal<int64_t>& media::PlayerSkeleton::seeked_to() const
562 {
563  return d->signals.seeked_to;
564 }
565 
566 core::Signal<int64_t>& media::PlayerSkeleton::seeked_to()
567 {
568  return d->signals.seeked_to;
569 }
570 
571 const core::Signal<void>& media::PlayerSkeleton::about_to_finish() const
572 {
573  return d->signals.about_to_finish;
574 }
575 
576 core::Signal<void>& media::PlayerSkeleton::about_to_finish()
577 {
578  return d->signals.about_to_finish;
579 }
580 
581 const core::Signal<void>& media::PlayerSkeleton::end_of_stream() const
582 {
583  return d->signals.end_of_stream;
584 }
585 
586 core::Signal<void>& media::PlayerSkeleton::end_of_stream()
587 {
588  return d->signals.end_of_stream;
589 }
590 
591 core::Signal<media::Player::PlaybackStatus>& media::PlayerSkeleton::playback_status_changed()
592 {
593  return d->signals.playback_status_changed;
594 }
595 
596 const core::Signal<media::video::Dimensions>& media::PlayerSkeleton::video_dimension_changed() const
597 {
598  return d->signals.video_dimension_changed;
599 }
600 
601 core::Signal<media::video::Dimensions>& media::PlayerSkeleton::video_dimension_changed()
602 {
603  return d->signals.video_dimension_changed;
604 }
605 
606 core::Signal<media::Player::Error>& media::PlayerSkeleton::error()
607 {
608  return d->signals.error;
609 }
610 
611 const core::Signal<media::Player::Error>& media::PlayerSkeleton::error() const
612 {
613  return d->signals.error;
614 }
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 > & 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:386
virtual const core::Signal< void > & about_to_finish() const
std::map< std::string, std::string > HeadersType
Definition: player.h:49
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:383
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:382
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 > & shuffle() const
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:384
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:385
void handle_create_video_sink(const core::dbus::Message::Ptr &in)
core::dbus::Signal< Signals::Error, Signals::Error::ArgumentType >::Ptr error
Definition: player.h:387
void handle_key(const core::dbus::Message::Ptr &in)