28 #define UNUSED __attribute__((unused))
30 namespace media = core::ubuntu::media;
31 namespace dbus = core::dbus;
38 const dbus::types::ObjectPath& session_path,
39 const std::shared_ptr<media::Service>& service,
40 PlayerImplementation::PlayerKey key)
43 engine(std::make_shared<gstreamer::Engine>()),
44 session_path(session_path),
46 new media::TrackListImplementation(
47 session_path.as_string() +
"/TrackList",
48 engine->meta_data_extractor())),
49 disp_lock_name(
"media-hub-video-playback"),
50 sys_lock_name(
"media-hub-music-playback"),
53 auto bus = std::shared_ptr<dbus::Bus>(
new dbus::Bus(core::dbus::WellKnownBus::system));
54 bus->install_executor(dbus::asio::make_executor(bus));
56 auto stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::Powerd>::interface_name());
57 powerd_session = stub_service->object_for_path(dbus::types::ObjectPath(
"/com/canonical/powerd"));
59 engine->state().changed().connect(
60 [parent,
this](
const Engine::State& state)
64 case Engine::State::ready:
70 case Engine::State::playing:
73 request_power_state();
76 case Engine::State::stopped:
82 case Engine::State::paused:
97 if (parent->is_video_source())
99 if (disp_cookie.empty())
101 auto result = powerd_session->invoke_method_synchronously<
core::Powerd::requestDisplayState, std::string>(disp_lock_name,
static_cast<int>(1), static_cast<unsigned int>(4));
102 if (result.is_error())
103 throw std::runtime_error(result.error().print());
105 disp_cookie = result.value();
110 if (sys_cookie.empty())
113 if (result.is_error())
114 throw std::runtime_error(result.error().print());
116 sys_cookie = result.value();
123 if (parent->is_video_source())
125 if (!disp_cookie.empty())
133 if (!sys_cookie.empty())
151 PlayerImplementation::PlayerKey
key;
155 const dbus::types::ObjectPath& session_path,
156 const std::shared_ptr<Service>& service,
158 : media::PlayerSkeleton(session_path),
182 std::function<uint64_t()> position_getter = [
this]()
184 return d->engine->position().get();
186 position().install(position_getter);
190 std::function<uint64_t()> duration_getter = [
this]()
192 return d->engine->duration().get();
194 duration().install(duration_getter);
196 std::function<bool()> video_type_getter = [
this]()
198 return d->engine->is_video_source().get();
202 std::function<bool()> audio_type_getter = [
this]()
204 return d->engine->is_audio_source().get();
208 d->engine->about_to_finish_signal().connect([
this]()
210 if (d->track_list->has_next())
212 Track::UriType uri = d->track_list->query_uri_for_track(d->track_list->next());
214 d->parent->open_uri(uri);
218 d->engine->seeked_to_signal().connect([
this](uint64_t value)
223 d->engine->end_of_stream_signal().connect([
this]()
240 return d->track_list;
251 return d->engine->open_resource_for_uri(uri);
256 d->engine->create_video_sink(texture_id);
302 d->engine->seek_to(ms);