36 #include <boost/asio.hpp>
46 #include <pulse/pulseaudio.h>
56 Private(
const ServiceImplementation::Configuration& configuration)
57 : configuration(configuration),
58 resume_key(
std::numeric_limits<
std::uint32_t>::max()),
61 display_state_lock(power_state_controller->display_state_lock()),
97 const bool resume_play_after_phonecall =
false;
102 case media::power::Level::low:
103 case media::power::Level::very_low:
106 pause_all_multimedia_sessions(resume_play_after_phonecall);
113 d->battery_observer->is_warning_active().changed().connect([
this](
bool active)
118 resume_multimedia_session();
121 d->audio_output_observer->external_output_state().changed().connect([
this](
audio::OutputState state)
123 const bool resume_play_after_phonecall =
false;
126 case audio::OutputState::Earpiece:
127 std::cout <<
"AudioOutputObserver reports that output is now Headphones/Headset." << std::endl;
129 case audio::OutputState::Speaker:
130 std::cout <<
"AudioOutputObserver reports that output is now Speaker." << std::endl;
133 pause_all_multimedia_sessions(resume_play_after_phonecall);
135 case audio::OutputState::External:
136 std::cout <<
"AudioOutputObserver reports that output is now External." << std::endl;
139 d->audio_output_state = state;
142 d->call_monitor->on_call_state_changed().connect([
this](media::telephony::CallMonitor::State state)
144 const bool resume_play_after_phonecall =
true;
146 case media::telephony::CallMonitor::State::OffHook:
147 std::cout <<
"Got call started signal, pausing all multimedia sessions" << std::endl;
150 pause_all_multimedia_sessions(resume_play_after_phonecall);
152 case media::telephony::CallMonitor::State::OnHook:
153 std::cout <<
"Got call ended signal, resuming paused multimedia sessions" << std::endl;
154 resume_paused_multimedia_sessions(
false);
159 d->recorder_observer->recording_state().changed().connect([
this](
RecordingState state)
161 if (state == media::RecordingState::started)
163 d->display_state_lock->request_acquire(media::power::DisplayState::on);
166 const bool resume_play_after_phonecall =
false;
167 pause_all_multimedia_sessions(resume_play_after_phonecall);
171 d->display_state_lock->request_release(media::power::DisplayState::on);
181 const media::Player::Configuration& conf)
185 media::PlayerSkeleton::Configuration
189 d->request_context_resolver,
190 d->request_authenticator
193 d->client_death_observer,
194 d->power_state_controller
198 player->on_client_disconnected().connect([
this, key]()
205 d->configuration.external_services.io_service.post([
this, key]()
207 if (!d->configuration.player_store->has_player_for_key(key))
210 if (d->configuration.player_store->player_for_key(key)->lifetime() == Player::Lifetime::normal)
211 d->configuration.player_store->remove_player_for_key(key);
221 return std::shared_ptr<media::Player>();
227 return std::shared_ptr<media::Player>();
232 if (not d->configuration.player_store->has_player_for_key(key))
234 cerr <<
"Could not find Player by key: " << key << endl;
238 auto current_player = d->configuration.player_store->player_for_key(key);
242 d->configuration.player_store->set_current_player_for_key(key);
244 d->configuration.player_store->enumerate_players([current_player, key](
const media::Player::PlayerKey& other_key,
const std::shared_ptr<media::Player>& other_player)
256 cout <<
"Pausing Player with key: " << other_key << endl;
257 other_player->pause();
262 void media::ServiceImplementation::pause_all_multimedia_sessions(
bool resume_play_after_phonecall)
264 d->configuration.player_store->enumerate_players([
this, resume_play_after_phonecall](
const media::Player::PlayerKey& key,
const std::shared_ptr<media::Player>& player)
269 auto paused_player_pair = std::make_pair(key, resume_play_after_phonecall);
270 d->paused_sessions.push_back(paused_player_pair);
271 std::cout <<
"Pausing Player with key: " << key <<
", resuming after phone call? "
272 << (resume_play_after_phonecall ?
"yes" :
"no") << std::endl;
278 void media::ServiceImplementation::resume_paused_multimedia_sessions(
bool resume_video_sessions)
280 std::for_each(d->paused_sessions.begin(), d->paused_sessions.end(),
281 [
this, resume_video_sessions](
const std::pair<media::Player::PlayerKey, bool> &paused_player_pair) {
283 const bool resume_play_after_phonecall = paused_player_pair.second;
284 auto player = d->configuration.player_store->player_for_key(key);
286 if ((resume_video_sessions || player->is_audio_source()) && resume_play_after_phonecall)
289 std::cout <<
"Not auto-resuming video player session or other type of player session." << std::endl;
292 d->paused_sessions.clear();
295 void media::ServiceImplementation::resume_multimedia_session()
297 if (not d->configuration.player_store->has_player_for_key(d->resume_key))
300 auto player = d->configuration.player_store->player_for_key(d->resume_key);
304 cout <<
"Resuming playback of Player with key: " << d->resume_key << endl;
306 d->resume_key = std::numeric_limits<std::uint32_t>::max();