36 #include <boost/asio.hpp>
45 #include <pulse/pulseaudio.h>
55 Private(
const ServiceImplementation::Configuration& configuration)
56 : configuration(configuration),
57 resume_key(
std::numeric_limits<
std::uint32_t>::max()),
60 display_state_lock(power_state_controller->display_state_lock()),
98 case media::power::Level::low:
99 case media::power::Level::very_low:
100 pause_all_multimedia_sessions();
107 d->battery_observer->is_warning_active().changed().connect([
this](
bool active)
112 resume_multimedia_session();
115 d->audio_output_observer->external_output_state().changed().connect([
this](
audio::OutputState state)
119 case audio::OutputState::Earpiece:
120 std::cout <<
"AudioOutputObserver reports that output is now Headphones/Headset." << std::endl;
122 case audio::OutputState::Speaker:
123 std::cout <<
"AudioOutputObserver reports that output is now Speaker." << std::endl;
124 pause_all_multimedia_sessions();
126 case audio::OutputState::External:
127 std::cout <<
"AudioOutputObserver reports that output is now External." << std::endl;
130 d->audio_output_state = state;
133 d->call_monitor->on_call_state_changed().connect([
this](media::telephony::CallMonitor::State state)
136 case media::telephony::CallMonitor::State::OffHook:
137 std::cout <<
"Got call started signal, pausing all multimedia sessions" << std::endl;
138 pause_all_multimedia_sessions();
140 case media::telephony::CallMonitor::State::OnHook:
141 std::cout <<
"Got call ended signal, resuming paused multimedia sessions" << std::endl;
142 resume_paused_multimedia_sessions(
false);
147 d->recorder_observer->recording_state().changed().connect([
this](
RecordingState state)
149 if (state == media::RecordingState::started)
151 d->display_state_lock->request_acquire(media::power::DisplayState::on);
152 pause_all_multimedia_sessions();
156 d->display_state_lock->request_release(media::power::DisplayState::on);
166 const media::Player::Configuration& conf)
170 media::PlayerSkeleton::Configuration
174 d->request_context_resolver,
175 d->request_authenticator
178 d->client_death_observer,
179 d->power_state_controller
183 player->on_client_disconnected().connect([
this, key]()
190 d->configuration.external_services.io_service.post([
this, key]()
192 if (!d->configuration.player_store->has_player_for_key(key))
195 if (d->configuration.player_store->player_for_key(key)->lifetime() == Player::Lifetime::normal)
196 d->configuration.player_store->remove_player_for_key(key);
206 return std::shared_ptr<media::Player>();
212 return std::shared_ptr<media::Player>();
217 if (not d->configuration.player_store->has_player_for_key(key))
219 cerr <<
"Could not find Player by key: " << key << endl;
223 auto current_player = d->configuration.player_store->player_for_key(key);
227 d->configuration.player_store->set_current_player_for_key(key);
229 d->configuration.player_store->enumerate_players([current_player, key](
const media::Player::PlayerKey& other_key,
const std::shared_ptr<media::Player>& other_player)
241 cout <<
"Pausing Player with key: " << other_key << endl;
242 other_player->pause();
247 void media::ServiceImplementation::pause_all_multimedia_sessions()
249 d->configuration.player_store->enumerate_players([
this](
const media::Player::PlayerKey& key,
const std::shared_ptr<media::Player>& player)
254 d->paused_sessions.push_back(key);
255 std::cout <<
"Pausing Player with key: " << key << std::endl;
261 void media::ServiceImplementation::resume_paused_multimedia_sessions(
bool resume_video_sessions)
263 std::for_each(d->paused_sessions.begin(), d->paused_sessions.end(), [
this, resume_video_sessions](
const media::Player::PlayerKey& key) {
264 auto player = d->configuration.player_store->player_for_key(key);
266 if (resume_video_sessions || player->is_audio_source())
269 std::cout <<
"Not auto-resuming video playback session." << std::endl;
272 d->paused_sessions.clear();
275 void media::ServiceImplementation::resume_multimedia_session()
277 if (not d->configuration.player_store->has_player_for_key(d->resume_key))
280 auto player = d->configuration.player_store->player_for_key(d->resume_key);
284 cout <<
"Resuming playback of Player with key: " << d->resume_key << endl;
286 d->resume_key = std::numeric_limits<std::uint32_t>::max();