36 #define UNUSED __attribute__((unused))
44 public std::enable_shared_from_this<Private>
48 WAKELOCK_CLEAR_INACTIVE,
49 WAKELOCK_CLEAR_DISPLAY,
50 WAKELOCK_CLEAR_SYSTEM,
51 WAKELOCK_CLEAR_INVALID
55 const dbus::types::ObjectPath& session_path,
56 const std::shared_ptr<media::Service>& service,
57 PlayerImplementation::PlayerKey key)
61 session_path(session_path),
63 new
media::TrackListImplementation(
64 session_path.as_string() +
"/TrackList",
65 engine->meta_data_extractor())),
66 sys_lock_name(
"media-hub-music-playback"),
68 system_wakelock_count(0),
69 display_wakelock_count(0),
70 previous_state(Engine::State::stopped),
72 engine_state_change_connection(engine->state().changed().connect(make_state_change_handler()))
74 auto bus = std::shared_ptr<dbus::Bus>(
new dbus::Bus(core::dbus::WellKnownBus::system));
75 bus->install_executor(dbus::asio::make_executor(bus));
77 auto stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::Powerd>::interface_name());
78 powerd_session = stub_service->object_for_path(dbus::types::ObjectPath(
"/com/canonical/powerd"));
80 auto uscreen_stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::UScreen>::interface_name());
81 uscreen_session = uscreen_stub_service->object_for_path(dbus::types::ObjectPath(
"/com/canonical/Unity/Screen"));
93 engine_state_change_connection.disconnect();
103 return [
this](
const Engine::State& state)
107 case Engine::State::ready:
110 if (previous_state == Engine::State::playing)
112 timeout(4000,
true, make_clear_wakelock_functor());
116 case Engine::State::playing:
120 parent->meta_data_for_current_track().set(std::get<1>(engine->track_meta_data().get()));
123 request_power_state();
126 case Engine::State::stopped:
129 if (previous_state == Engine::State::playing)
131 timeout(4000,
true, make_clear_wakelock_functor());
135 case Engine::State::paused:
138 if (previous_state == Engine::State::playing)
140 timeout(4000,
true, make_clear_wakelock_functor());
149 previous_state = state;
157 if (parent->is_video_source())
159 if (++display_wakelock_count == 1)
162 if (result.is_error())
163 throw std::runtime_error(result.error().print());
164 disp_cookie = result.value();
165 cout <<
"Requested new display wakelock" << endl;
170 if (++system_wakelock_count == 1)
173 if (result.is_error())
174 throw std::runtime_error(result.error().print());
175 sys_cookie = result.value();
176 cout <<
"Requested new system wakelock" << endl;
180 catch(
const std::exception& e)
182 std::cerr <<
"Warning: failed to request power state: ";
183 std::cerr << e.what() << std::endl;
189 cout << __PRETTY_FUNCTION__ << endl;
194 case wakelock_clear_t::WAKELOCK_CLEAR_INACTIVE:
196 case wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM:
198 if (--system_wakelock_count == 0)
200 cout <<
"Clearing system wakelock" << endl;
205 case wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY:
207 if (--display_wakelock_count == 0)
209 cout <<
"Clearing display wakelock" << endl;
214 case wakelock_clear_t::WAKELOCK_CLEAR_INVALID:
216 cerr <<
"Can't clear invalid wakelock type" << endl;
219 catch(
const std::exception& e)
221 std::cerr <<
"Warning: failed to clear power state: ";
222 std::cerr << e.what() << std::endl;
228 return (parent->is_video_source()) ?
229 wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY : wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM;
235 if (system_wakelock_count.load() > 0)
237 system_wakelock_count = 1;
238 clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM);
240 if (display_wakelock_count.load() > 0)
242 display_wakelock_count = 1;
243 clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY);
253 std::weak_ptr<Private> weak_self{shared_from_this()};
254 auto wakelock_type = current_wakelock_type();
255 return [weak_self, wakelock_type] {
256 if (
auto self = weak_self.lock())
257 self->clear_wakelock(wakelock_type);
274 PlayerImplementation::PlayerKey
key;
280 const std::string& identity,
281 const std::shared_ptr<core::dbus::Bus>& bus,
282 const std::shared_ptr<core::dbus::Object>& session,
283 const std::shared_ptr<Service>& service,
285 :
media::PlayerSkeleton
287 media::PlayerSkeleton::Configuration
294 d(make_shared<Private>(
315 d->engine->audio_stream_role().set(Player::AudioStreamRole::multimedia);
319 std::function<uint64_t()> position_getter = [
this]()
321 return d->engine->position().get();
323 position().install(position_getter);
327 std::function<uint64_t()> duration_getter = [
this]()
329 return d->engine->duration().get();
331 duration().install(duration_getter);
333 std::function<bool()> video_type_getter = [
this]()
335 return d->engine->is_video_source().get();
339 std::function<bool()> audio_type_getter = [
this]()
341 return d->engine->is_audio_source().get();
349 d->engine->audio_stream_role().set(new_role);
352 d->engine->about_to_finish_signal().connect([
this]()
354 if (d->track_list->has_next())
356 Track::UriType uri = d->track_list->query_uri_for_track(d->track_list->next());
358 d->parent->open_uri(uri);
362 d->engine->client_disconnected_signal().connect([
this]()
366 d->clear_wakelocks();
368 d->on_client_disconnected();
371 d->engine->seeked_to_signal().connect([
this](uint64_t value)
376 d->engine->end_of_stream_signal().connect([
this]()
393 return d->track_list;
404 return d->engine->open_resource_for_uri(uri);
409 d->engine->create_video_sink(texture_id);
438 std::cout << __PRETTY_FUNCTION__ << std::endl;
456 d->engine->seek_to(ms);
461 return d->on_client_disconnected;