32 #define UNUSED __attribute__((unused))
34 namespace media = core::ubuntu::media;
35 namespace dbus = core::dbus;
42 const dbus::types::ObjectPath& session_path,
43 const std::shared_ptr<media::Service>& service,
44 PlayerImplementation::PlayerKey key)
47 engine(std::make_shared<gstreamer::Engine>()),
48 session_path(session_path),
50 new media::TrackListImplementation(
51 session_path.as_string() +
"/TrackList",
52 engine->meta_data_extractor())),
53 sys_lock_name(
"media-hub-music-playback"),
54 active_display_on_request(false),
57 auto bus = std::shared_ptr<dbus::Bus>(
new dbus::Bus(core::dbus::WellKnownBus::system));
58 bus->install_executor(dbus::asio::make_executor(bus));
60 auto stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::Powerd>::interface_name());
61 powerd_session = stub_service->object_for_path(dbus::types::ObjectPath(
"/com/canonical/powerd"));
63 auto uscreen_stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::UScreen>::interface_name());
64 uscreen_session = uscreen_stub_service->object_for_path(dbus::types::ObjectPath(
"/com/canonical/Unity/Screen"));
66 engine->state().changed().connect(
67 [parent,
this](
const Engine::State& state)
71 case Engine::State::ready:
77 case Engine::State::playing:
80 request_power_state();
83 case Engine::State::stopped:
89 case Engine::State::paused:
106 if (parent->is_video_source())
108 if (!active_display_on_request)
111 if (result.is_error())
112 throw std::runtime_error(result.error().print());
114 disp_cookie = result.value();
115 active_display_on_request =
true;
120 if (sys_cookie.empty())
123 if (result.is_error())
124 throw std::runtime_error(result.error().print());
126 sys_cookie = result.value();
130 catch(std::exception& e)
132 std::cerr <<
"Warning: failed to request power state: ";
133 std::cerr << e.what() << std::endl;
141 if (parent->is_video_source())
143 if (active_display_on_request)
146 active_display_on_request =
false;
151 if (!sys_cookie.empty())
158 catch(std::exception& e)
160 std::cerr <<
"Warning: failed to clear power state: ";
161 std::cerr << e.what() << std::endl;
176 PlayerImplementation::PlayerKey
key;
180 const dbus::types::ObjectPath& session_path,
181 const std::shared_ptr<Service>& service,
183 : media::PlayerSkeleton(session_path),
207 std::function<uint64_t()> position_getter = [
this]()
209 return d->engine->position().get();
211 position().install(position_getter);
215 std::function<uint64_t()> duration_getter = [
this]()
217 return d->engine->duration().get();
219 duration().install(duration_getter);
221 std::function<bool()> video_type_getter = [
this]()
223 return d->engine->is_video_source().get();
227 std::function<bool()> audio_type_getter = [
this]()
229 return d->engine->is_audio_source().get();
233 d->engine->about_to_finish_signal().connect([
this]()
235 if (d->track_list->has_next())
237 Track::UriType uri = d->track_list->query_uri_for_track(d->track_list->next());
239 d->parent->open_uri(uri);
243 d->engine->seeked_to_signal().connect([
this](uint64_t value)
248 d->engine->end_of_stream_signal().connect([
this]()
265 return d->track_list;
276 return d->engine->open_resource_for_uri(uri);
281 d->engine->create_video_sink(texture_id);
327 d->engine->seek_to(ms);