31 #include <core/dbus/property.h>
32 #include <core/dbus/types/object_path.h>
35 #include <hybris/media/media_codec_layer.h>
36 #include <hybris/media/surface_texture_client_hybris.h>
40 #define UNUSED __attribute__((unused))
42 namespace dbus = core::dbus;
43 namespace media = core::ubuntu::media;
48 const std::shared_ptr<dbus::Service>& remote,
49 const dbus::types::ObjectPath&
path
58 object(remote->object_for_path(path)),
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::PlaybackStatus>(),
70 object->get_property<mpris::Player::Properties::LoopStatus>(),
71 object->get_property<mpris::Player::Properties::PlaybackRate>(),
72 object->get_property<mpris::Player::Properties::Shuffle>(),
73 object->get_property<mpris::Player::Properties::MetaData>(),
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::MinimumRate>(),
78 object->get_property<mpris::Player::Properties::MaximumRate>()
82 object->get_signal<mpris::Player::Signals::Seeked>(),
83 object->get_signal<mpris::Player::Signals::EndOfStream>(),
84 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>()
95 if (context !=
nullptr) {
100 std::cout <<
"context is nullptr, can't call on_frame_available()" << std::endl;
109 std::cout <<
"frame_available_cb is nullptr, can't call frame_available_cb()" << std::endl;
124 igbc_wrapper = decoding_service_get_igraphicbufferconsumer();
147 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
148 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
149 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
150 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
151 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
152 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
153 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
154 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
156 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackStatus>>
playback_status;
157 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::LoopStatus>>
loop_status;
158 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
159 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
is_shuffle;
161 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
162 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
163 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
170 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
171 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
172 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
174 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
175 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
176 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status)
191 std::cout <<
"seeked_to signal arrived via the bus." << std::endl;
197 std::cout <<
"EndOfStream signal arrived via the bus." << std::endl;
205 std::cout <<
"PlaybackStatusChanged signal arrived via the bus." << std::endl;
232 const std::shared_ptr<Service>& parent,
233 const dbus::types::ObjectPath& object_path)
238 worker = std::move(std::thread([bus]()
249 if (worker.joinable())
257 d->track_list = std::make_shared<media::TrackListStub>(
259 dbus::types::ObjectPath(d->path.as_string() +
"/TrackList"));
261 return d->track_list;
273 auto op = d->object->invoke_method_synchronously<mpris::Player::OpenUri,
bool>(uri);
280 auto op = d->object->invoke_method_synchronously<mpris::Player::CreateVideoSink,
void>(
texture_id);
282 d->get_gl_consumer();
285 throw std::runtime_error(
"Problem creating new video sink instance on remote object");
290 return d->glc_wrapper;
295 auto op = d->object->invoke_method_synchronously<mpris::Player::Next,
void>();
298 throw std::runtime_error(
"Problem switching to next track on remote object");
303 auto op = d->object->invoke_method_synchronously<mpris::Player::Previous,
void>();
306 throw std::runtime_error(
"Problem switching to previous track on remote object");
311 auto op = d->object->invoke_method_synchronously<mpris::Player::Play,
void>();
314 throw std::runtime_error(
"Problem starting playback on remote object");
319 auto op = d->object->invoke_method_synchronously<mpris::Player::Pause,
void>();
322 throw std::runtime_error(
"Problem pausing playback on remote object");
327 auto op = d->object->invoke_method_synchronously<mpris::Player::Seek, void, uint64_t>(offset.count());
330 throw std::runtime_error(
"Problem seeking on remote object");
335 auto op = d->object->invoke_method_synchronously<mpris::Player::Stop,
void>();
338 throw std::runtime_error(
"Problem stopping playback on remote object");
343 d->set_frame_available_cb(cb, context);
348 d->signals.set_playback_complete_cb(cb, context);
353 return *d->properties.can_play;
358 return *d->properties.can_pause;
363 return *d->properties.can_seek;
368 return *d->properties.can_go_previous;
373 return *d->properties.can_go_next;
378 return *d->properties.is_video_source;
383 return *d->properties.is_audio_source;
388 return *d->properties.playback_status;
393 return *d->properties.loop_status;
398 return *d->properties.playback_rate;
403 return *d->properties.is_shuffle;
408 return *d->properties.meta_data_for_current_track;
413 return *d->properties.volume;
418 return *d->properties.position;
423 return *d->properties.duration;
428 return *d->properties.minimum_playback_rate;
433 return *d->properties.maximum_playback_rate;
438 return *d->properties.loop_status;
443 return *d->properties.playback_rate;
448 return *d->properties.is_shuffle;
453 return *d->properties.volume;
458 return d->signals.seeked_to;
463 return d->signals.end_of_stream;
468 return d->signals.playback_status_changed;
core::dbus::Bus::Ptr the_session_bus()