32 #include <core/dbus/property.h>
33 #include <core/dbus/types/object_path.h>
36 #include <hybris/media/media_codec_layer.h>
37 #include <hybris/media/surface_texture_client_hybris.h>
41 #define UNUSED __attribute__((unused))
49 const std::shared_ptr<core::dbus::Object>&
object
61 object->get_property<mpris::Player::Properties::CanPlay>(),
62 object->get_property<mpris::Player::Properties::CanPause>(),
63 object->get_property<mpris::Player::Properties::CanSeek>(),
64 object->get_property<mpris::Player::Properties::CanControl>(),
65 object->get_property<mpris::Player::Properties::CanGoNext>(),
66 object->get_property<mpris::Player::Properties::CanGoPrevious>(),
67 object->get_property<mpris::Player::Properties::IsVideoSource>(),
68 object->get_property<mpris::Player::Properties::IsAudioSource>(),
69 object->get_property<mpris::Player::Properties::TypedPlaybackStatus>(),
70 object->get_property<mpris::Player::Properties::TypedLoopStatus>(),
71 object->get_property<mpris::Player::Properties::PlaybackRate>(),
72 object->get_property<mpris::Player::Properties::Shuffle>(),
73 object->get_property<mpris::Player::Properties::TypedMetaData>(),
74 object->get_property<mpris::Player::Properties::Volume>(),
75 object->get_property<mpris::Player::Properties::Position>(),
76 object->get_property<mpris::Player::Properties::Duration>(),
77 object->get_property<mpris::Player::Properties::AudioStreamRole>(),
78 object->get_property<mpris::Player::Properties::Orientation>(),
79 object->get_property<mpris::Player::Properties::Lifetime>(),
80 object->get_property<mpris::Player::Properties::MinimumRate>(),
81 object->get_property<mpris::Player::Properties::MaximumRate>()
85 object->get_signal<mpris::Player::Signals::Seeked>(),
86 object->get_signal<mpris::Player::Signals::EndOfStream>(),
87 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>(),
88 object->get_signal<mpris::Player::Signals::VideoDimensionChanged>(),
89 object->get_signal<mpris::Player::Signals::Error>()
102 if (context !=
nullptr) {
107 std::cerr <<
"context is nullptr, can't call on_frame_available()" << std::endl;
116 std::cerr <<
"frame_available_cb is nullptr, can't call frame_available_cb()" << std::endl;
131 igbc_wrapper = decoding_service_get_igraphicbufferconsumer();
152 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
153 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
154 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
155 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
156 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
157 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
158 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
159 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
161 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedPlaybackStatus>>
playback_status;
162 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedLoopStatus>>
loop_status;
163 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
164 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
is_shuffle;
166 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
167 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
168 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
169 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::AudioStreamRole>>
audio_role;
170 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Orientation>>
orientation;
171 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Lifetime>>
lifetime;
178 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
179 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
180 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
181 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
182 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
184 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
185 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
186 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status,
187 const std::shared_ptr<DBusVideoDimensionChangedSignal>& d,
188 const std::shared_ptr<DBusErrorSignal>& e)
205 dbus.seeked_to->connect([
this](std::uint64_t value)
207 std::cout <<
"seeked_to signal arrived via the bus." << std::endl;
211 dbus.end_of_stream->connect([
this]()
213 std::cout <<
"EndOfStream signal arrived via the bus." << std::endl;
221 std::cout <<
"PlaybackStatusChanged signal arrived via the bus." << std::endl;
225 dbus.video_dimension_changed->connect([
this](uint64_t mask)
227 std::cout <<
"VideoDimensionChanged signal arrived via the bus." << std::endl;
233 std::cout <<
"Error signal arrived via the bus (Error: " << e <<
")" << std::endl;
250 core::Signal<media::Player::Error>
error;
258 std::shared_ptr<DBusErrorSignal>
error;
264 const std::shared_ptr<Service>& parent,
265 const std::shared_ptr<core::dbus::Object>&
object)
278 d->track_list = std::make_shared<media::TrackListStub>(
280 dbus::types::ObjectPath(d->object->path().as_string() +
"/TrackList"));
282 return d->track_list;
294 auto op = d->object->invoke_method_synchronously<mpris::Player::OpenUri,
bool>(uri);
301 auto op = d->object->invoke_method_synchronously<mpris::Player::OpenUriExtended,
bool>(uri, headers);
308 auto op = d->object->invoke_method_synchronously<mpris::Player::CreateVideoSink,
void>(
texture_id);
310 d->get_gl_consumer();
313 throw std::runtime_error(
"Problem creating new video sink instance on remote object");
318 return d->glc_wrapper;
323 auto op = d->object->invoke_method_synchronously<mpris::Player::Next,
void>();
326 throw std::runtime_error(
"Problem switching to next track on remote object");
331 auto op = d->object->invoke_method_synchronously<mpris::Player::Previous,
void>();
334 throw std::runtime_error(
"Problem switching to previous track on remote object");
339 auto op = d->object->invoke_method_synchronously<mpris::Player::Play,
void>();
342 throw std::runtime_error(
"Problem starting playback on remote object");
347 auto op = d->object->invoke_method_synchronously<mpris::Player::Pause,
void>();
350 throw std::runtime_error(
"Problem pausing playback on remote object");
355 auto op = d->object->invoke_method_synchronously<mpris::Player::Seek, void, uint64_t>(offset.count());
358 throw std::runtime_error(
"Problem seeking on remote object");
363 auto op = d->object->invoke_method_synchronously<mpris::Player::Stop,
void>();
366 throw std::runtime_error(
"Problem stopping playback on remote object");
371 d->set_frame_available_cb(cb, context);
376 d->signals.set_playback_complete_cb(cb, context);
381 return *d->properties.can_play;
386 return *d->properties.can_pause;
391 return *d->properties.can_seek;
396 return *d->properties.can_go_previous;
401 return *d->properties.can_go_next;
406 return *d->properties.is_video_source;
411 return *d->properties.is_audio_source;
416 return *d->properties.playback_status;
421 return *d->properties.loop_status;
426 return *d->properties.playback_rate;
431 return *d->properties.is_shuffle;
436 return *d->properties.meta_data_for_current_track;
441 return *d->properties.volume;
446 return *d->properties.position;
451 return *d->properties.duration;
456 return *d->properties.audio_role;
461 return *d->properties.orientation;
466 return *d->properties.lifetime;
471 return *d->properties.minimum_playback_rate;
476 return *d->properties.maximum_playback_rate;
481 return *d->properties.loop_status;
486 return *d->properties.playback_rate;
491 return *d->properties.is_shuffle;
496 return *d->properties.volume;
501 return *d->properties.audio_role;
506 return *d->properties.lifetime;
511 return d->signals.seeked_to;
516 return d->signals.end_of_stream;
521 return d->signals.playback_status_changed;
526 return d->signals.video_dimension_changed;
531 return d->signals.error;