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"));
85 engine->state().changed().connect(
86 [parent,
this](
const Engine::State& state)
90 case Engine::State::ready:
93 if (previous_state == Engine::State::playing)
95 wakelock_timeout.reset(
new timeout(4000,
true, std::bind(&Private::clear_wakelock,
96 this, std::placeholders::_1), current_wakelock_type()));
100 case Engine::State::playing:
104 parent->meta_data_for_current_track().set(std::get<1>(engine->track_meta_data().get()));
107 request_power_state();
110 case Engine::State::stopped:
113 if (previous_state == Engine::State::playing)
115 wakelock_timeout.reset(
new timeout(4000,
true, std::bind(&Private::clear_wakelock,
116 this, std::placeholders::_1), current_wakelock_type()));
120 case Engine::State::paused:
123 if (previous_state == Engine::State::playing)
125 wakelock_timeout.reset(
new timeout(4000,
true, std::bind(&Private::clear_wakelock,
126 this, std::placeholders::_1), current_wakelock_type()));
135 previous_state = state;
150 if (parent->is_video_source())
152 if (++display_wakelock_count == 1)
155 if (result.is_error())
156 throw std::runtime_error(result.error().print());
157 disp_cookie = result.value();
158 cout <<
"Requested new display wakelock" << endl;
163 if (++system_wakelock_count == 1)
166 if (result.is_error())
167 throw std::runtime_error(result.error().print());
168 sys_cookie = result.value();
169 cout <<
"Requested new system wakelock" << endl;
173 catch(
const std::exception& e)
175 std::cerr <<
"Warning: failed to request power state: ";
176 std::cerr << e.what() << std::endl;
182 cout << __PRETTY_FUNCTION__ << endl;
187 case wakelock_clear_t::WAKELOCK_CLEAR_INACTIVE:
189 case wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM:
191 if (--system_wakelock_count == 0)
193 cout <<
"Clearing system wakelock" << endl;
198 case wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY:
200 if (--display_wakelock_count == 0)
202 cout <<
"Clearing display wakelock" << endl;
207 case wakelock_clear_t::WAKELOCK_CLEAR_INVALID:
209 cerr <<
"Can't clear invalid wakelock type" << endl;
212 catch(
const std::exception& e)
214 std::cerr <<
"Warning: failed to clear power state: ";
215 std::cerr << e.what() << std::endl;
221 return (parent->is_video_source()) ?
222 wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY : wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM;
228 if (system_wakelock_count.load() > 0)
230 system_wakelock_count = 1;
231 clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM);
233 if (display_wakelock_count.load() > 0)
235 display_wakelock_count = 1;
236 clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY);
254 PlayerImplementation::PlayerKey
key;
259 const std::string& identity,
260 const std::shared_ptr<core::dbus::Bus>& bus,
261 const std::shared_ptr<core::dbus::Object>& session,
262 const std::shared_ptr<Service>& service,
264 :
media::PlayerSkeleton
266 media::PlayerSkeleton::Configuration
294 d->engine->audio_stream_role().set(Player::AudioStreamRole::multimedia);
298 std::function<uint64_t()> position_getter = [
this]()
300 return d->engine->position().get();
302 position().install(position_getter);
306 std::function<uint64_t()> duration_getter = [
this]()
308 return d->engine->duration().get();
310 duration().install(duration_getter);
312 std::function<bool()> video_type_getter = [
this]()
314 return d->engine->is_video_source().get();
318 std::function<bool()> audio_type_getter = [
this]()
320 return d->engine->is_audio_source().get();
328 d->engine->audio_stream_role().set(new_role);
331 d->engine->about_to_finish_signal().connect([
this]()
333 if (d->track_list->has_next())
335 Track::UriType uri = d->track_list->query_uri_for_track(d->track_list->next());
337 d->parent->open_uri(uri);
341 d->engine->client_disconnected_signal().connect([
this]()
345 d->clear_wakelocks();
347 d->on_client_disconnected();
350 d->engine->seeked_to_signal().connect([
this](uint64_t value)
355 d->engine->end_of_stream_signal().connect([
this]()
372 return d->track_list;
383 return d->engine->open_resource_for_uri(uri);
388 d->engine->create_video_sink(texture_id);
417 std::cout << __PRETTY_FUNCTION__ << std::endl;
435 d->engine->seek_to(ms);
440 return d->on_client_disconnected;