36 #include <boost/asio.hpp>
46 #include <pulse/pulseaudio.h>
58 Private(
const ServiceImplementation::Configuration& configuration)
59 : configuration(configuration),
60 resume_key(
std::numeric_limits<
std::uint32_t>::max()),
63 display_state_lock(power_state_controller->display_state_lock()),
99 const bool resume_play_after_phonecall =
false;
104 case media::power::Level::low:
105 case media::power::Level::very_low:
108 pause_all_multimedia_sessions(resume_play_after_phonecall);
115 d->battery_observer->is_warning_active().changed().connect([
this](
bool active)
120 resume_multimedia_session();
123 d->audio_output_observer->external_output_state().changed().connect([
this](
audio::OutputState state)
125 const bool resume_play_after_phonecall =
false;
128 case audio::OutputState::Earpiece:
129 std::cout <<
"AudioOutputObserver reports that output is now Headphones/Headset." << std::endl;
131 case audio::OutputState::Speaker:
132 std::cout <<
"AudioOutputObserver reports that output is now Speaker." << std::endl;
135 pause_all_multimedia_sessions(resume_play_after_phonecall);
137 case audio::OutputState::External:
138 std::cout <<
"AudioOutputObserver reports that output is now External." << std::endl;
141 d->audio_output_state = state;
144 d->call_monitor->on_call_state_changed().connect([
this](media::telephony::CallMonitor::State state)
146 const bool resume_play_after_phonecall =
true;
148 case media::telephony::CallMonitor::State::OffHook:
149 std::cout <<
"Got call started signal, pausing all multimedia sessions" << std::endl;
152 pause_all_multimedia_sessions(resume_play_after_phonecall);
154 case media::telephony::CallMonitor::State::OnHook:
155 std::cout <<
"Got call ended signal, resuming paused multimedia sessions" << std::endl;
156 resume_paused_multimedia_sessions(
false);
161 d->recorder_observer->recording_state().changed().connect([
this](
RecordingState state)
163 if (state == media::RecordingState::started)
165 d->display_state_lock->request_acquire(media::power::DisplayState::on);
168 const bool resume_play_after_phonecall =
false;
169 pause_all_multimedia_sessions(resume_play_after_phonecall);
173 d->display_state_lock->request_release(media::power::DisplayState::on);
183 const media::Player::Configuration& conf)
187 media::PlayerSkeleton::Configuration
192 d->request_context_resolver,
193 d->request_authenticator
196 d->client_death_observer,
197 d->power_state_controller
201 player->on_client_disconnected().connect([
this, key]()
208 d->configuration.external_services.io_service.post([
this, key]()
210 if (!d->configuration.player_store->has_player_for_key(key))
213 if (d->configuration.player_store->player_for_key(key)->lifetime() == Player::Lifetime::normal)
214 d->configuration.player_store->remove_player_for_key(key);
229 return std::shared_ptr<media::Player>();
240 return std::shared_ptr<media::Player>();
246 return std::shared_ptr<media::Player>();
251 if (not d->configuration.player_store->has_player_for_key(key))
253 cerr <<
"Could not find Player by key: " << key << endl;
257 auto current_player = d->configuration.player_store->player_for_key(key);
261 d->configuration.player_store->set_current_player_for_key(key);
263 d->configuration.player_store->enumerate_players([current_player, key](
const media::Player::PlayerKey& other_key,
const std::shared_ptr<media::Player>& other_player)
275 cout <<
"Pausing Player with key: " << other_key << endl;
276 other_player->pause();
281 void media::ServiceImplementation::pause_all_multimedia_sessions(
bool resume_play_after_phonecall)
283 d->configuration.player_store->enumerate_players([
this, resume_play_after_phonecall](
const media::Player::PlayerKey& key,
const std::shared_ptr<media::Player>& player)
288 auto paused_player_pair = std::make_pair(key, resume_play_after_phonecall);
289 d->paused_sessions.push_back(paused_player_pair);
290 std::cout <<
"Pausing Player with key: " << key <<
", resuming after phone call? "
291 << (resume_play_after_phonecall ?
"yes" :
"no") << std::endl;
297 void media::ServiceImplementation::resume_paused_multimedia_sessions(
bool resume_video_sessions)
299 std::for_each(d->paused_sessions.begin(), d->paused_sessions.end(),
300 [
this, resume_video_sessions](
const std::pair<media::Player::PlayerKey, bool> &paused_player_pair) {
302 const bool resume_play_after_phonecall = paused_player_pair.second;
303 auto player = d->configuration.player_store->player_for_key(key);
305 if ((resume_video_sessions || player->is_audio_source()) && resume_play_after_phonecall)
308 std::cout <<
"Not auto-resuming video player session or other type of player session." << std::endl;
311 d->paused_sessions.clear();
314 void media::ServiceImplementation::resume_multimedia_session()
316 if (not d->configuration.player_store->has_player_for_key(d->resume_key))
319 auto player = d->configuration.player_store->player_for_key(d->resume_key);
323 cout <<
"Resuming playback of Player with key: " << d->resume_key << endl;
325 d->resume_key = std::numeric_limits<std::uint32_t>::max();