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<dbus::Service>& remote,
50 const dbus::types::ObjectPath&
path
59 object(remote->object_for_path(path)),
62 object->get_property<mpris::Player::Properties::CanPlay>(),
63 object->get_property<mpris::Player::Properties::CanPause>(),
64 object->get_property<mpris::Player::Properties::CanSeek>(),
65 object->get_property<mpris::Player::Properties::CanControl>(),
66 object->get_property<mpris::Player::Properties::CanGoNext>(),
67 object->get_property<mpris::Player::Properties::CanGoPrevious>(),
68 object->get_property<mpris::Player::Properties::IsVideoSource>(),
69 object->get_property<mpris::Player::Properties::IsAudioSource>(),
70 object->get_property<mpris::Player::Properties::PlaybackStatus>(),
71 object->get_property<mpris::Player::Properties::LoopStatus>(),
72 object->get_property<mpris::Player::Properties::PlaybackRate>(),
73 object->get_property<mpris::Player::Properties::Shuffle>(),
74 object->get_property<mpris::Player::Properties::MetaData>(),
75 object->get_property<mpris::Player::Properties::Volume>(),
76 object->get_property<mpris::Player::Properties::Position>(),
77 object->get_property<mpris::Player::Properties::Duration>(),
78 object->get_property<mpris::Player::Properties::AudioStreamRole>(),
79 object->get_property<mpris::Player::Properties::MinimumRate>(),
80 object->get_property<mpris::Player::Properties::MaximumRate>()
84 object->get_signal<mpris::Player::Signals::Seeked>(),
85 object->get_signal<mpris::Player::Signals::EndOfStream>(),
86 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>()
97 if (context !=
nullptr) {
102 std::cerr <<
"context is nullptr, can't call on_frame_available()" << std::endl;
111 std::cerr <<
"frame_available_cb is nullptr, can't call frame_available_cb()" << std::endl;
126 igbc_wrapper = decoding_service_get_igraphicbufferconsumer();
149 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
150 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
151 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
152 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
153 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
154 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
155 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
156 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
158 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackStatus>>
playback_status;
159 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::LoopStatus>>
loop_status;
160 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
161 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
is_shuffle;
163 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
164 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
165 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
166 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::AudioStreamRole>>
audio_role;
173 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
174 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
175 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
177 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
178 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
179 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status)
192 dbus.seeked_to->connect([
this](std::uint64_t value)
194 std::cout <<
"seeked_to signal arrived via the bus." << std::endl;
198 dbus.end_of_stream->connect([
this]()
200 std::cout <<
"EndOfStream signal arrived via the bus." << std::endl;
208 std::cout <<
"PlaybackStatusChanged signal arrived via the bus." << std::endl;
235 const std::shared_ptr<Service>& parent,
236 const dbus::types::ObjectPath& object_path)
241 worker = std::move(std::thread([bus]()
252 if (worker.joinable())
260 d->track_list = std::make_shared<media::TrackListStub>(
262 dbus::types::ObjectPath(d->path.as_string() +
"/TrackList"));
264 return d->track_list;
276 auto op = d->object->invoke_method_synchronously<mpris::Player::OpenUri,
bool>(uri);
283 auto op = d->object->invoke_method_synchronously<mpris::Player::CreateVideoSink,
void>(
texture_id);
285 d->get_gl_consumer();
288 throw std::runtime_error(
"Problem creating new video sink instance on remote object");
293 return d->glc_wrapper;
298 auto op = d->object->invoke_method_synchronously<mpris::Player::Next,
void>();
301 throw std::runtime_error(
"Problem switching to next track on remote object");
306 auto op = d->object->invoke_method_synchronously<mpris::Player::Previous,
void>();
309 throw std::runtime_error(
"Problem switching to previous track on remote object");
314 auto op = d->object->invoke_method_synchronously<mpris::Player::Play,
void>();
317 throw std::runtime_error(
"Problem starting playback on remote object");
322 auto op = d->object->invoke_method_synchronously<mpris::Player::Pause,
void>();
325 throw std::runtime_error(
"Problem pausing playback on remote object");
330 auto op = d->object->invoke_method_synchronously<mpris::Player::Seek, void, uint64_t>(offset.count());
333 throw std::runtime_error(
"Problem seeking on remote object");
338 auto op = d->object->invoke_method_synchronously<mpris::Player::Stop,
void>();
341 throw std::runtime_error(
"Problem stopping playback on remote object");
346 d->set_frame_available_cb(cb, context);
351 d->signals.set_playback_complete_cb(cb, context);
356 return *d->properties.can_play;
361 return *d->properties.can_pause;
366 return *d->properties.can_seek;
371 return *d->properties.can_go_previous;
376 return *d->properties.can_go_next;
381 return *d->properties.is_video_source;
386 return *d->properties.is_audio_source;
391 return *d->properties.playback_status;
396 return *d->properties.loop_status;
401 return *d->properties.playback_rate;
406 return *d->properties.is_shuffle;
411 return *d->properties.meta_data_for_current_track;
416 return *d->properties.volume;
421 return *d->properties.position;
426 return *d->properties.duration;
431 return *d->properties.audio_role;
436 return *d->properties.minimum_playback_rate;
441 return *d->properties.maximum_playback_rate;
446 return *d->properties.loop_status;
451 return *d->properties.playback_rate;
456 return *d->properties.is_shuffle;
461 return *d->properties.volume;
466 return *d->properties.audio_role;
471 return d->signals.seeked_to;
476 return d->signals.end_of_stream;
481 return d->signals.playback_status_changed;
core::dbus::Bus::Ptr the_session_bus()