Music Hub  ..
A session-wide music playback service
player.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2013 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 #ifndef MPRIS_PLAYER_H_
21 #define MPRIS_PLAYER_H_
22 
23 #include <core/media/player.h>
24 #include <core/media/track.h>
25 
26 #include "core/media/codec.h"
27 
28 #include <core/dbus/bus.h>
29 #include <core/dbus/macros.h>
30 #include <core/dbus/object.h>
31 #include <core/dbus/property.h>
32 #include <core/dbus/interfaces/properties.h>
33 #include <core/dbus/types/any.h>
34 #include <core/dbus/types/object_path.h>
35 #include <core/dbus/types/variant.h>
36 
37 #include <core/dbus/types/stl/tuple.h>
38 
39 #include <boost/utility/identity_type.hpp>
40 
41 #include <string>
42 #include <tuple>
43 #include <vector>
44 
45 #include <cstdint>
46 
47 namespace dbus = core::dbus;
48 
49 namespace mpris
50 {
51 struct Player
52 {
53  static const std::string& name()
54  {
55  static const std::string s{"org.mpris.MediaPlayer2.Player"};
56  return s;
57  }
58 
59  struct LoopStatus
60  {
61  LoopStatus() = delete;
62 
63  static const char* from(core::ubuntu::media::Player::LoopStatus status)
64  {
65  switch(status)
66  {
67  case core::ubuntu::media::Player::LoopStatus::none:
68  return LoopStatus::none;
69  case core::ubuntu::media::Player::LoopStatus::track:
70  return LoopStatus::track;
71  case core::ubuntu::media::Player::LoopStatus::playlist:
72  return LoopStatus::playlist;
73  }
74 
75  return nullptr;
76  }
77 
78  static constexpr const char* none{"None"};
79  static constexpr const char* track{"Track"};
80  static constexpr const char* playlist{"Playlist"};
81  };
82 
84  {
85  PlaybackStatus() = delete;
86 
88  {
89  switch(status)
90  {
91  case core::ubuntu::media::Player::PlaybackStatus::null:
92  case core::ubuntu::media::Player::PlaybackStatus::ready:
93  case core::ubuntu::media::Player::PlaybackStatus::stopped:
95 
96  case core::ubuntu::media::Player::PlaybackStatus::playing:
98  case core::ubuntu::media::Player::PlaybackStatus::paused:
100  }
101 
102  return nullptr;
103  }
104 
105  static constexpr const char* playing{"Playing"};
106  static constexpr const char* paused{"Paused"};
107  static constexpr const char* stopped{"Stopped"};
108  };
109 
110  struct Error
111  {
113  {
114  static constexpr const char* name
115  {
116  "mpris.Player.Error.OutOfProcessBufferStreamingNotSupported"
117  };
118  };
119 
121  {
122  static constexpr const char* name
123  {
124  "mpris.Player.Error.InsufficientAppArmorPermissions"
125  };
126  };
127 
128  struct UriNotFound
129  {
130  static constexpr const char* name
131  {
132  "mpris.Player.Error.UriNotFound"
133  };
134  };
135  };
136 
137  typedef std::map<std::string, core::dbus::types::Variant> Dictionary;
138 
139  DBUS_CPP_METHOD_DEF(Next, Player)
140  DBUS_CPP_METHOD_DEF(Previous, Player)
141  DBUS_CPP_METHOD_DEF(Pause, Player)
142  DBUS_CPP_METHOD_DEF(PlayPause, Player)
143  DBUS_CPP_METHOD_DEF(Stop, Player)
144  DBUS_CPP_METHOD_DEF(Play, Player)
145  DBUS_CPP_METHOD_DEF(Seek, Player)
146  DBUS_CPP_METHOD_DEF(SetPosition, Player)
147  DBUS_CPP_METHOD_DEF(CreateVideoSink, Player)
148  DBUS_CPP_METHOD_DEF(Key, Player)
149  DBUS_CPP_METHOD_DEF(OpenUri, Player)
150  DBUS_CPP_METHOD_DEF(OpenUriExtended, Player)
151 
152  struct Signals
153  {
154  DBUS_CPP_SIGNAL_DEF(Seeked, Player, std::int64_t)
155  DBUS_CPP_SIGNAL_DEF(AboutToFinish, Player, void)
156  DBUS_CPP_SIGNAL_DEF(EndOfStream, Player, void)
157  DBUS_CPP_SIGNAL_DEF(PlaybackStatusChanged, Player, core::ubuntu::media::Player::PlaybackStatus)
158  DBUS_CPP_SIGNAL_DEF(VideoDimensionChanged, Player, core::ubuntu::media::video::Dimensions)
159  DBUS_CPP_SIGNAL_DEF(Error, Player, core::ubuntu::media::Player::Error)
160  };
161 
162  struct Properties
163  {
164  DBUS_CPP_READABLE_PROPERTY_DEF(PlaybackStatus, Player, std::string)
165  DBUS_CPP_READABLE_PROPERTY_DEF(TypedPlaybackStatus, Player, core::ubuntu::media::Player::PlaybackStatus)
166 
167  DBUS_CPP_WRITABLE_PROPERTY_DEF(LoopStatus, Player, std::string)
168  DBUS_CPP_WRITABLE_PROPERTY_DEF(TypedLoopStatus, Player, core::ubuntu::media::Player::LoopStatus)
169  DBUS_CPP_WRITABLE_PROPERTY_DEF(AudioStreamRole, Player, core::ubuntu::media::Player::AudioStreamRole)
170  DBUS_CPP_READABLE_PROPERTY_DEF(Orientation, Player, core::ubuntu::media::Player::Orientation)
171  DBUS_CPP_WRITABLE_PROPERTY_DEF(Lifetime, Player, core::ubuntu::media::Player::Lifetime)
172  DBUS_CPP_WRITABLE_PROPERTY_DEF(PlaybackRate, Player, double)
173  DBUS_CPP_WRITABLE_PROPERTY_DEF(Rate, Player, double)
174  DBUS_CPP_WRITABLE_PROPERTY_DEF(Shuffle, Player, bool)
175  DBUS_CPP_READABLE_PROPERTY_DEF(Metadata, Player, Dictionary)
176  DBUS_CPP_READABLE_PROPERTY_DEF(TypedMetaData, Player, core::ubuntu::media::Track::MetaData)
177  DBUS_CPP_WRITABLE_PROPERTY_DEF(Volume, Player, double)
178  DBUS_CPP_READABLE_PROPERTY_DEF(Position, Player, std::int64_t)
179  DBUS_CPP_READABLE_PROPERTY_DEF(Duration, Player, std::int64_t)
180  DBUS_CPP_READABLE_PROPERTY_DEF(MinimumRate, Player, double)
181  DBUS_CPP_READABLE_PROPERTY_DEF(MaximumRate, Player, double)
182  DBUS_CPP_READABLE_PROPERTY_DEF(IsVideoSource, Player, bool)
183  DBUS_CPP_READABLE_PROPERTY_DEF(IsAudioSource, Player, bool)
184  DBUS_CPP_READABLE_PROPERTY_DEF(CanGoNext, Player, bool)
185  DBUS_CPP_READABLE_PROPERTY_DEF(CanGoPrevious, Player, bool)
186  DBUS_CPP_READABLE_PROPERTY_DEF(CanPlay, Player, bool)
187  DBUS_CPP_READABLE_PROPERTY_DEF(CanPause, Player, bool)
188  DBUS_CPP_READABLE_PROPERTY_DEF(CanSeek, Player, bool)
189  DBUS_CPP_READABLE_PROPERTY_DEF(CanControl, Player, bool)
190  };
191 
192  // Convenience struct to create a skeleton implementation for org.mpris.MediaPlayer2.Player
193  struct Skeleton
194  {
195  static const std::vector<std::string>& the_empty_list_of_invalidated_properties()
196  {
197  static const std::vector<std::string> instance; return instance;
198  }
199 
200  // Creation time options go here.
202  {
203  // The bus connection that should be used
204  core::dbus::Bus::Ptr bus;
205  // The dbus object that should implement org.mpris.MediaPlayer2
206  core::dbus::Object::Ptr object;
207 
208  // Default values for properties
209  struct Defaults
210  {
211  Properties::CanPlay::ValueType can_play{false};
212  Properties::CanPause::ValueType can_pause{false};
213  Properties::CanSeek::ValueType can_seek{true};
214  Properties::CanControl::ValueType can_control{true};
215  Properties::CanGoNext::ValueType can_go_next{false};
216  Properties::CanGoPrevious::ValueType can_go_previous{false};
217  Properties::IsVideoSource::ValueType is_video_source{false};
218  Properties::IsAudioSource::ValueType is_audio_source{true};
219  Properties::PlaybackStatus::ValueType playback_status{PlaybackStatus::stopped};
220  Properties::TypedPlaybackStatus::ValueType typed_playback_status{core::ubuntu::media::Player::PlaybackStatus::null};
221  Properties::LoopStatus::ValueType loop_status{LoopStatus::none};
222  Properties::TypedLoopStatus::ValueType typed_loop_status{core::ubuntu::media::Player::LoopStatus::none};
223  Properties::PlaybackRate::ValueType playback_rate{1.f};
224  Properties::Shuffle::ValueType shuffle{false};
225  Properties::TypedMetaData::ValueType typed_meta_data{};
226  Properties::Volume::ValueType volume{0.f};
227  Properties::Position::ValueType position{0};
228  Properties::Duration::ValueType duration{0};
229  Properties::MinimumRate::ValueType minimum_rate{1.f};
230  Properties::MaximumRate::ValueType maximum_rate{1.f};
231  Properties::Orientation::ValueType orientation{core::ubuntu::media::Player::Orientation::rotate0};
232  } defaults;
233  };
234 
235  Skeleton(const Configuration& configuration)
236  : configuration(configuration),
237  properties
238  {
239  configuration.object->template get_property<Properties::CanPlay>(),
240  configuration.object->template get_property<Properties::CanPause>(),
241  configuration.object->template get_property<Properties::CanSeek>(),
242  configuration.object->template get_property<Properties::CanControl>(),
243  configuration.object->template get_property<Properties::CanGoNext>(),
244  configuration.object->template get_property<Properties::CanGoPrevious>(),
245  configuration.object->template get_property<Properties::IsVideoSource>(),
246  configuration.object->template get_property<Properties::IsAudioSource>(),
247  configuration.object->template get_property<Properties::PlaybackStatus>(),
248  configuration.object->template get_property<Properties::TypedPlaybackStatus>(),
249  configuration.object->template get_property<Properties::LoopStatus>(),
250  configuration.object->template get_property<Properties::TypedLoopStatus>(),
251  configuration.object->template get_property<Properties::AudioStreamRole>(),
252  configuration.object->template get_property<Properties::Orientation>(),
253  configuration.object->template get_property<Properties::Lifetime>(),
254  configuration.object->template get_property<Properties::PlaybackRate>(),
255  configuration.object->template get_property<Properties::Shuffle>(),
256  configuration.object->template get_property<Properties::TypedMetaData>(),
257  configuration.object->template get_property<Properties::Volume>(),
258  configuration.object->template get_property<Properties::Position>(),
259  configuration.object->template get_property<Properties::Duration>(),
260  configuration.object->template get_property<Properties::MinimumRate>(),
261  configuration.object->template get_property<Properties::MaximumRate>()
262  },
263  signals
264  {
265  configuration.object->template get_signal<Signals::Seeked>(),
266  configuration.object->template get_signal<Signals::AboutToFinish>(),
267  configuration.object->template get_signal<Signals::EndOfStream>(),
268  configuration.object->template get_signal<Signals::PlaybackStatusChanged>(),
269  configuration.object->template get_signal<Signals::VideoDimensionChanged>(),
270  configuration.object->template get_signal<Signals::Error>(),
271  configuration.object->template get_signal<core::dbus::interfaces::Properties::Signals::PropertiesChanged>()
272  }
273  {
274  properties.can_play->set(configuration.defaults.can_play);
275  properties.can_pause->set(configuration.defaults.can_pause);
276  properties.can_seek->set(configuration.defaults.can_seek);
277  properties.can_control->set(configuration.defaults.can_control);
278  properties.can_go_next->set(configuration.defaults.can_go_next);
279  properties.can_go_previous->set(configuration.defaults.can_go_previous);
280  properties.is_video_source->set(configuration.defaults.is_video_source);
281  properties.is_audio_source->set(configuration.defaults.is_audio_source);
282  properties.playback_status->set(configuration.defaults.playback_status);
283  properties.typed_playback_status->set(configuration.defaults.typed_playback_status);
284  properties.loop_status->set(configuration.defaults.loop_status);
285  properties.typed_loop_status->set(configuration.defaults.typed_loop_status);
286  properties.audio_stream_role->set(core::ubuntu::media::Player::AudioStreamRole::multimedia);
287  properties.orientation->set(core::ubuntu::media::Player::Orientation::rotate0);
288  properties.lifetime->set(core::ubuntu::media::Player::Lifetime::normal);
289  properties.playback_rate->set(configuration.defaults.playback_rate);
290  properties.shuffle->set(configuration.defaults.shuffle);
291  properties.position->set(configuration.defaults.position);
292  properties.duration->set(configuration.defaults.duration);
293  properties.minimum_playback_rate->set(configuration.defaults.minimum_rate);
294  properties.maximum_playback_rate->set(configuration.defaults.maximum_rate);
295 
296  // Make sure the Orientation Property gets sent over DBus to the client
297  properties.orientation->changed().connect([this](const core::ubuntu::media::Player::Orientation& o)
298  {
299  on_property_value_changed<Properties::Orientation>(o);
300  });
301 
302  properties.position->changed().connect([this](std::int64_t position)
303  {
304  on_property_value_changed<Properties::Position>(position);
305  });
306 
307  properties.duration->changed().connect([this](std::int64_t duration)
308  {
309  on_property_value_changed<Properties::Duration>(duration);
310  });
311 
312  properties.playback_status->changed().connect([this](const std::string& status)
313  {
314  on_property_value_changed<Properties::PlaybackStatus>(status);
315  });
316 
317  properties.loop_status->changed().connect([this](const std::string& status)
318  {
319  on_property_value_changed<Properties::LoopStatus>(status);
320  });
321 
322  properties.shuffle->changed().connect([this](bool shuffle)
323  {
324  on_property_value_changed<Properties::Shuffle>(shuffle);
325  });
326 
327  properties.can_play->changed().connect([this](bool can_play)
328  {
329  on_property_value_changed<Properties::CanPlay>(can_play);
330  });
331 
332  properties.can_pause->changed().connect([this](bool can_pause)
333  {
334  on_property_value_changed<Properties::CanPause>(can_pause);
335  });
336 
337  properties.can_go_next->changed().connect([this](bool can_go_next)
338  {
339  on_property_value_changed<Properties::CanGoNext>(can_go_next);
340  });
341 
342  properties.can_go_previous->changed().connect([this](bool can_go_previous)
343  {
344  on_property_value_changed<Properties::CanGoPrevious>(can_go_previous);
345  });
346  }
347 
348  template<typename Property>
349  void on_property_value_changed(const typename Property::ValueType& value)
350  {
351  Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
352 
353  signals.properties_changed->emit(std::make_tuple(
354  dbus::traits::Service<Player>::interface_name(),
355  dict,
356  the_empty_list_of_invalidated_properties()));
357  }
358 
359  Dictionary get_all_properties()
360  {
361  Dictionary dict;
362  dict[Properties::CanPlay::name()] = dbus::types::Variant::encode(properties.can_play->get());
363  dict[Properties::CanPause::name()] = dbus::types::Variant::encode(properties.can_pause->get());
364  dict[Properties::CanSeek::name()] = dbus::types::Variant::encode(properties.can_seek->get());
365  dict[Properties::CanControl::name()] = dbus::types::Variant::encode(properties.can_control->get());
366  dict[Properties::CanGoNext::name()] = dbus::types::Variant::encode(properties.can_go_next->get());
367  dict[Properties::CanGoPrevious::name()] = dbus::types::Variant::encode(properties.can_go_previous->get());
368  dict[Properties::PlaybackStatus::name()] = dbus::types::Variant::encode(properties.playback_status->get());
369  dict[Properties::TypedPlaybackStatus::name()] = dbus::types::Variant::encode(properties.typed_playback_status->get());
370  dict[Properties::LoopStatus::name()] = dbus::types::Variant::encode(properties.loop_status->get());
371  dict[Properties::TypedLoopStatus::name()] = dbus::types::Variant::encode(properties.typed_loop_status->get());
372  dict[Properties::AudioStreamRole::name()] = dbus::types::Variant::encode(properties.audio_stream_role->get());
373  dict[Properties::Orientation::name()] = dbus::types::Variant::encode(properties.orientation->get());
374  dict[Properties::Lifetime::name()] = dbus::types::Variant::encode(properties.lifetime->get());
375  dict[Properties::PlaybackRate::name()] = dbus::types::Variant::encode(properties.playback_rate->get());
376  dict[Properties::Shuffle::name()] = dbus::types::Variant::encode(properties.shuffle->get());
377  dict[Properties::Duration::name()] = dbus::types::Variant::encode(properties.duration->get());
378  dict[Properties::Position::name()] = dbus::types::Variant::encode(properties.position->get());
379  dict[Properties::MinimumRate::name()] = dbus::types::Variant::encode(properties.minimum_playback_rate->get());
380  dict[Properties::MaximumRate::name()] = dbus::types::Variant::encode(properties.maximum_playback_rate->get());
381 
382  return dict;
383  }
384 
385  // We just store creation time properties
387  // All the properties exposed to the bus go here.
388  struct
389  {
390  std::shared_ptr<core::dbus::Property<Properties::CanPlay>> can_play;
391  std::shared_ptr<core::dbus::Property<Properties::CanPause>> can_pause;
392  std::shared_ptr<core::dbus::Property<Properties::CanSeek>> can_seek;
393  std::shared_ptr<core::dbus::Property<Properties::CanControl>> can_control;
394  std::shared_ptr<core::dbus::Property<Properties::CanGoNext>> can_go_next;
395  std::shared_ptr<core::dbus::Property<Properties::CanGoPrevious>> can_go_previous;
396  std::shared_ptr<core::dbus::Property<Properties::IsVideoSource>> is_video_source;
397  std::shared_ptr<core::dbus::Property<Properties::IsAudioSource>> is_audio_source;
398 
399  std::shared_ptr<core::dbus::Property<Properties::PlaybackStatus>> playback_status;
400  std::shared_ptr<core::dbus::Property<Properties::TypedPlaybackStatus>> typed_playback_status;
401  std::shared_ptr<core::dbus::Property<Properties::LoopStatus>> loop_status;
402  std::shared_ptr<core::dbus::Property<Properties::TypedLoopStatus>> typed_loop_status;
403  std::shared_ptr<core::dbus::Property<Properties::AudioStreamRole>> audio_stream_role;
404  std::shared_ptr<core::dbus::Property<Properties::Orientation>> orientation;
405  std::shared_ptr<core::dbus::Property<Properties::Lifetime>> lifetime;
406  std::shared_ptr<core::dbus::Property<Properties::PlaybackRate>> playback_rate;
407  std::shared_ptr<core::dbus::Property<Properties::Shuffle>> shuffle;
408  std::shared_ptr<core::dbus::Property<Properties::TypedMetaData>> typed_meta_data_for_current_track;
409  std::shared_ptr<core::dbus::Property<Properties::Volume>> volume;
410  std::shared_ptr<core::dbus::Property<Properties::Position>> position;
411  std::shared_ptr<core::dbus::Property<Properties::Duration>> duration;
412  std::shared_ptr<core::dbus::Property<Properties::MinimumRate>> minimum_playback_rate;
413  std::shared_ptr<core::dbus::Property<Properties::MaximumRate>> maximum_playback_rate;
414  } properties;
415 
416  struct
417  {
418  typename core::dbus::Signal<Signals::Seeked, Signals::Seeked::ArgumentType>::Ptr seeked_to;
419  typename core::dbus::Signal<Signals::AboutToFinish, Signals::AboutToFinish::ArgumentType>::Ptr about_to_finish;
420  typename core::dbus::Signal<Signals::EndOfStream, Signals::EndOfStream::ArgumentType>::Ptr end_of_stream;
421  typename core::dbus::Signal<Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType>::Ptr playback_status_changed;
422  typename core::dbus::Signal<Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType>::Ptr video_dimension_changed;
423  typename core::dbus::Signal<Signals::Error, Signals::Error::ArgumentType>::Ptr error;
424 
425  dbus::Signal
426  <
427  core::dbus::interfaces::Properties::Signals::PropertiesChanged,
428  core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
430  } signals;
431  };
432 };
433 }
434 
435 #endif // MPRIS_PLAYER_H_
std::shared_ptr< core::dbus::Property< Properties::Duration > > duration
Definition: player.h:411
void on_property_value_changed(const typename Property::ValueType &value)
Definition: player.h:349
std::shared_ptr< core::dbus::Property< Properties::AudioStreamRole > > audio_stream_role
Definition: player.h:403
std::tuple< Height, Width > Dimensions
Height and Width of a video.
Definition: dimensions.h:139
std::shared_ptr< core::dbus::Property< Properties::IsAudioSource > > is_audio_source
Definition: player.h:397
std::shared_ptr< core::dbus::Property< Properties::LoopStatus > > loop_status
Definition: player.h:401
static const std::string & name()
Definition: player.h:53
static constexpr const char * none
Definition: player.h:78
std::shared_ptr< core::dbus::Property< Properties::MinimumRate > > minimum_playback_rate
Definition: player.h:412
core::dbus::Object::Ptr object
Definition: player.h:206
static constexpr const char * playlist
Definition: player.h:80
static constexpr const char * paused
Definition: player.h:106
std::shared_ptr< core::dbus::Property< Properties::MaximumRate > > maximum_playback_rate
Definition: player.h:413
static constexpr const char * stopped
Definition: player.h:107
static const char * from(core::ubuntu::media::Player::PlaybackStatus status)
Definition: player.h:87
core::dbus::Signal< Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType >::Ptr video_dimension_changed
Definition: player.h:422
static const std::vector< std::string > & the_empty_list_of_invalidated_properties()
Definition: player.h:195
std::map< std::string, core::dbus::types::Variant > Dictionary
Definition: player.h:137
static const char * from(core::ubuntu::media::Player::LoopStatus status)
Definition: player.h:63
Configuration configuration
Definition: player.h:386
std::shared_ptr< core::dbus::Property< Properties::Shuffle > > shuffle
Definition: player.h:407
core::dbus::Signal< Signals::AboutToFinish, Signals::AboutToFinish::ArgumentType >::Ptr about_to_finish
Definition: player.h:419
std::shared_ptr< core::dbus::Property< Properties::IsVideoSource > > is_video_source
Definition: player.h:396
std::shared_ptr< core::dbus::Property< Properties::TypedLoopStatus > > typed_loop_status
Definition: player.h:402
std::shared_ptr< core::dbus::Property< Properties::CanGoPrevious > > can_go_previous
Definition: player.h:395
std::shared_ptr< core::dbus::Property< Properties::CanPause > > can_pause
Definition: player.h:391
std::shared_ptr< core::dbus::Property< Properties::Lifetime > > lifetime
Definition: player.h:405
Dictionary get_all_properties()
Definition: player.h:359
std::shared_ptr< core::dbus::Property< Properties::Volume > > volume
Definition: player.h:409
std::shared_ptr< core::dbus::Property< Properties::CanSeek > > can_seek
Definition: player.h:392
static constexpr const char * track
Definition: player.h:79
core::dbus::Signal< Signals::Seeked, Signals::Seeked::ArgumentType >::Ptr seeked_to
Definition: player.h:418
std::shared_ptr< core::dbus::Property< Properties::Orientation > > orientation
Definition: player.h:404
Skeleton(const Configuration &configuration)
Definition: player.h:235
std::shared_ptr< core::dbus::Property< Properties::TypedPlaybackStatus > > typed_playback_status
Definition: player.h:400
std::shared_ptr< core::dbus::Property< Properties::PlaybackStatus > > playback_status
Definition: player.h:399
std::shared_ptr< core::dbus::Property< Properties::TypedMetaData > > typed_meta_data_for_current_track
Definition: player.h:408
core::dbus::Signal< Signals::EndOfStream, Signals::EndOfStream::ArgumentType >::Ptr end_of_stream
Definition: player.h:420
std::shared_ptr< core::dbus::Property< Properties::CanPlay > > can_play
Definition: player.h:390
std::shared_ptr< core::dbus::Property< Properties::CanControl > > can_control
Definition: player.h:393
static constexpr const char * playing
Definition: player.h:105
std::shared_ptr< core::dbus::Property< Properties::Position > > position
Definition: player.h:410
std::shared_ptr< core::dbus::Property< Properties::CanGoNext > > can_go_next
Definition: player.h:394
std::shared_ptr< core::dbus::Property< Properties::PlaybackRate > > playback_rate
Definition: player.h:406
dbus::Signal< core::dbus::interfaces::Properties::Signals::PropertiesChanged, core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType >::Ptr properties_changed
Definition: player.h:429
core::dbus::Signal< Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType >::Ptr playback_status_changed
Definition: player.h:421
core::dbus::Signal< Signals::Error, Signals::Error::ArgumentType >::Ptr error
Definition: player.h:423