35 #define UNUSED __attribute__((unused))
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)
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:
107 parent->meta_data_for_current_track().set(std::get<1>(engine->track_meta_data().get()));
110 if (previous_state == Engine::State::stopped || previous_state == Engine::State::paused)
112 request_power_state();
116 case Engine::State::stopped:
121 case Engine::State::paused:
124 if (previous_state == Engine::State::ready)
126 request_power_state();
128 else if (previous_state == Engine::State::playing)
130 wakelock_timeout.reset(
new timeout(4000,
true, std::bind(&Private::clear_wakelock,
131 this, std::placeholders::_1), current_wakelock_type()));
140 previous_state = state;
155 if (parent->is_video_source())
157 if (display_wakelock_count == 0)
160 if (result.is_error())
161 throw std::runtime_error(result.error().print());
162 disp_cookie = result.value();
163 cout <<
"Requested new display wakelock" << endl;
168 std::lock_guard<std::mutex> lock(wakelock_mutex);
169 ++display_wakelock_count;
174 if (system_wakelock_count == 0)
177 if (result.is_error())
178 throw std::runtime_error(result.error().print());
179 sys_cookie = result.value();
180 cout <<
"Requested new system wakelock" << endl;
185 std::lock_guard<std::mutex> lock(wakelock_mutex);
186 ++system_wakelock_count;
190 catch(
const std::exception& e)
192 std::cerr <<
"Warning: failed to request power state: ";
193 std::cerr << e.what() << std::endl;
199 cout << __PRETTY_FUNCTION__ << endl;
204 case wakelock_clear_t::WAKELOCK_CLEAR_INACTIVE:
206 case wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM:
208 std::lock_guard<std::mutex> lock(wakelock_mutex);
209 --system_wakelock_count;
212 if (system_wakelock_count == 0)
214 cout <<
"Clearing system wakelock" << endl;
219 case wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY:
221 std::lock_guard<std::mutex> lock(wakelock_mutex);
222 --display_wakelock_count;
225 if (display_wakelock_count == 0)
227 cout <<
"Clearing display wakelock" << endl;
232 case wakelock_clear_t::WAKELOCK_CLEAR_INVALID:
234 cerr <<
"Can't clear invalid wakelock type" << endl;
237 catch(
const std::exception& e)
239 std::cerr <<
"Warning: failed to clear power state: ";
240 std::cerr << e.what() << std::endl;
246 return (parent->is_video_source()) ?
247 wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY : wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM;
253 if (system_wakelock_count > 0)
256 std::lock_guard<std::mutex> lock(wakelock_mutex);
257 system_wakelock_count = 1;
259 clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM);
261 if (display_wakelock_count > 0)
264 std::lock_guard<std::mutex> lock(wakelock_mutex);
265 display_wakelock_count = 1;
267 clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY);
286 PlayerImplementation::PlayerKey
key;
291 const std::string& identity,
292 const std::shared_ptr<core::dbus::Bus>& bus,
293 const std::shared_ptr<core::dbus::Object>& session,
294 const std::shared_ptr<Service>& service,
296 :
media::PlayerSkeleton
298 media::PlayerSkeleton::Configuration
326 d->engine->audio_stream_role().set(Player::AudioStreamRole::multimedia);
330 std::function<uint64_t()> position_getter = [
this]()
332 return d->engine->position().get();
334 position().install(position_getter);
338 std::function<uint64_t()> duration_getter = [
this]()
340 return d->engine->duration().get();
342 duration().install(duration_getter);
344 std::function<bool()> video_type_getter = [
this]()
346 return d->engine->is_video_source().get();
350 std::function<bool()> audio_type_getter = [
this]()
352 return d->engine->is_audio_source().get();
360 d->engine->audio_stream_role().set(new_role);
363 d->engine->about_to_finish_signal().connect([
this]()
365 if (d->track_list->has_next())
367 Track::UriType uri = d->track_list->query_uri_for_track(d->track_list->next());
369 d->parent->open_uri(uri);
373 d->engine->client_disconnected_signal().connect([
this]()
377 d->clear_wakelocks();
379 d->on_client_disconnected();
382 d->engine->seeked_to_signal().connect([
this](uint64_t value)
387 d->engine->end_of_stream_signal().connect([
this]()
404 return d->track_list;
415 return d->engine->open_resource_for_uri(uri);
420 d->engine->create_video_sink(texture_id);
449 std::cout << __PRETTY_FUNCTION__ << std::endl;
467 d->engine->seek_to(ms);
472 return d->on_client_disconnected;