35 #define UNUSED __attribute__((unused))
37 namespace media = core::ubuntu::media;
38 namespace dbus = core::dbus;
46 WAKELOCK_CLEAR_INACTIVE,
47 WAKELOCK_CLEAR_DISPLAY,
48 WAKELOCK_CLEAR_SYSTEM,
49 WAKELOCK_CLEAR_INVALID
53 const dbus::types::ObjectPath& session_path,
54 const std::shared_ptr<media::Service>& service,
55 PlayerImplementation::PlayerKey key)
58 engine(std::make_shared<gstreamer::Engine>()),
59 session_path(session_path),
61 new media::TrackListImplementation(
62 session_path.as_string() +
"/TrackList",
63 engine->meta_data_extractor())),
64 sys_lock_name(
"media-hub-music-playback"),
66 system_wakelock_count(0),
67 display_wakelock_count(0),
68 previous_state(Engine::State::stopped),
71 auto bus = std::shared_ptr<dbus::Bus>(
new dbus::Bus(core::dbus::WellKnownBus::system));
72 bus->install_executor(dbus::asio::make_executor(bus));
74 auto stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::Powerd>::interface_name());
75 powerd_session = stub_service->object_for_path(dbus::types::ObjectPath(
"/com/canonical/powerd"));
77 auto uscreen_stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::UScreen>::interface_name());
78 uscreen_session = uscreen_stub_service->object_for_path(dbus::types::ObjectPath(
"/com/canonical/Unity/Screen"));
88 engine->state().changed().connect(
89 [parent,
this](
const Engine::State& state)
93 case Engine::State::ready:
96 if (previous_state == Engine::State::playing)
98 wakelock_timeout.reset(
new timeout(4000,
true, std::bind(&Private::clear_wakelock,
99 this, std::placeholders::_1), current_wakelock_type()));
103 case Engine::State::playing:
106 if (previous_state == Engine::State::stopped || previous_state == Engine::State::paused)
108 request_power_state();
112 case Engine::State::stopped:
117 case Engine::State::paused:
120 if (previous_state == Engine::State::ready)
122 request_power_state();
124 else if (previous_state == Engine::State::playing)
126 wakelock_timeout.reset(
new timeout(4000,
true, std::bind(&Private::clear_wakelock,
127 this, std::placeholders::_1), current_wakelock_type()));
136 previous_state = state;
152 if (parent->is_video_source())
154 if (display_wakelock_count == 0)
157 if (result.is_error())
158 throw std::runtime_error(result.error().print());
159 disp_cookie = result.value();
160 cout <<
"Requested new display wakelock" << endl;
165 std::lock_guard<std::mutex> lock(wakelock_mutex);
166 ++display_wakelock_count;
171 if (system_wakelock_count == 0)
174 if (result.is_error())
175 throw std::runtime_error(result.error().print());
176 sys_cookie = result.value();
177 cout <<
"Requested new system wakelock" << endl;
182 std::lock_guard<std::mutex> lock(wakelock_mutex);
183 ++system_wakelock_count;
187 catch(
const std::exception& e)
189 std::cerr <<
"Warning: failed to request power state: ";
190 std::cerr << e.what() << std::endl;
196 cout << __PRETTY_FUNCTION__ << endl;
201 case wakelock_clear_t::WAKELOCK_CLEAR_INACTIVE:
203 case wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM:
205 std::lock_guard<std::mutex> lock(wakelock_mutex);
206 --system_wakelock_count;
209 if (system_wakelock_count == 0)
211 cout <<
"Clearing system wakelock" << endl;
216 case wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY:
218 std::lock_guard<std::mutex> lock(wakelock_mutex);
219 --display_wakelock_count;
222 if (display_wakelock_count == 0)
224 cout <<
"Clearing display wakelock" << endl;
229 case wakelock_clear_t::WAKELOCK_CLEAR_INVALID:
231 cerr <<
"Can't clear invalid wakelock type" << endl;
234 catch(
const std::exception& e)
236 std::cerr <<
"Warning: failed to clear power state: ";
237 std::cerr << e.what() << std::endl;
243 return (parent->is_video_source()) ?
244 wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY : wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM;
250 if (system_wakelock_count > 0)
253 std::lock_guard<std::mutex> lock(wakelock_mutex);
254 system_wakelock_count = 1;
256 clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM);
258 if (display_wakelock_count > 0)
261 std::lock_guard<std::mutex> lock(wakelock_mutex);
262 display_wakelock_count = 1;
264 clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY);
283 PlayerImplementation::PlayerKey
key;
287 const dbus::types::ObjectPath& session_path,
288 const std::shared_ptr<Service>& service,
290 : media::PlayerSkeleton(session_path),
314 std::function<uint64_t()> position_getter = [
this]()
316 return d->engine->position().get();
318 position().install(position_getter);
322 std::function<uint64_t()> duration_getter = [
this]()
324 return d->engine->duration().get();
326 duration().install(duration_getter);
328 std::function<bool()> video_type_getter = [
this]()
330 return d->engine->is_video_source().get();
334 std::function<bool()> audio_type_getter = [
this]()
336 return d->engine->is_audio_source().get();
340 d->engine->about_to_finish_signal().connect([
this]()
342 if (d->track_list->has_next())
344 Track::UriType uri = d->track_list->query_uri_for_track(d->track_list->next());
346 d->parent->open_uri(uri);
350 d->engine->client_disconnected_signal().connect([
this]()
354 d->clear_wakelocks();
357 d->engine->seeked_to_signal().connect([
this](uint64_t value)
362 d->engine->end_of_stream_signal().connect([
this]()
379 return d->track_list;
390 return d->engine->open_resource_for_uri(uri);
395 d->engine->create_video_sink(texture_id);
441 d->engine->seek_to(ms);