diff options
Diffstat (limited to 'chromium/media/audio/pulse/pulse_output.cc')
-rw-r--r-- | chromium/media/audio/pulse/pulse_output.cc | 94 |
1 files changed, 1 insertions, 93 deletions
diff --git a/chromium/media/audio/pulse/pulse_output.cc b/chromium/media/audio/pulse/pulse_output.cc index c06093e1f43..953f9acebfa 100644 --- a/chromium/media/audio/pulse/pulse_output.cc +++ b/chromium/media/audio/pulse/pulse_output.cc @@ -61,102 +61,10 @@ PulseAudioOutputStream::~PulseAudioOutputStream() { DCHECK(!pa_mainloop_); } -bool PulseAudioOutputStream::InitializeMainloopAndContext() { - DCHECK(!pa_mainloop_); - DCHECK(!pa_context_); - DCHECK(thread_checker_.CalledOnValidThread()); - pa_mainloop_ = pa_threaded_mainloop_new(); - if (!pa_mainloop_) { - DLOG(ERROR) << "Failed to create PulseAudio main loop."; - return false; - } - - pa_mainloop_api* pa_mainloop_api = pa_threaded_mainloop_get_api(pa_mainloop_); - std::string app_name = AudioManager::GetGlobalAppName(); - pa_context_ = pa_context_new( - pa_mainloop_api, app_name.empty() ? "Chromium" : app_name.c_str()); - if (!pa_context_) { - DLOG(ERROR) << "Failed to create PulseAudio context."; - return false; - } - - // A state callback must be set before calling pa_threaded_mainloop_lock() or - // pa_threaded_mainloop_wait() calls may lead to dead lock. - pa_context_set_state_callback(pa_context_, &pulse::ContextStateCallback, - pa_mainloop_); - { - // Lock the main loop while setting up the context. Failure to do so may - // lead to crashes as the PulseAudio thread tries to run before things are - // ready. - AutoPulseLock auto_lock(pa_mainloop_); - - if (pa_threaded_mainloop_start(pa_mainloop_) != 0) { - DLOG(ERROR) << "Failed to start PulseAudio main loop."; - return false; - } - - if (pa_context_connect(pa_context_, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL) != - 0) { - DLOG(ERROR) << "Failed to connect PulseAudio context."; - return false; - } - - // Wait until |pa_context_| is ready. pa_threaded_mainloop_wait() must be - // called after pa_context_get_state() in case the context is already ready, - // otherwise pa_threaded_mainloop_wait() will hang indefinitely. - while (true) { - pa_context_state_t context_state = pa_context_get_state(pa_context_); - if (!PA_CONTEXT_IS_GOOD(context_state)) { - DLOG(ERROR) << "Invalid PulseAudio context state."; - return false; - } - - if (context_state == PA_CONTEXT_READY) - break; - pa_threaded_mainloop_wait(pa_mainloop_); - } - } - - return true; -} - -// static, used by pa_context_get_server_info. -void PulseAudioOutputStream::GetSystemDefaultOutputDeviceCallback( - pa_context* context, - const pa_server_info* info, - void* user_data) { - media::PulseAudioOutputStream* stream = - static_cast<media::PulseAudioOutputStream*>(user_data); - stream->default_system_device_name_ = info->default_sink_name; - pa_threaded_mainloop_signal(stream->pa_mainloop_, 0); -} - -void PulseAudioOutputStream::GetSystemDefaultOutputDevice() { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(pa_mainloop_); - DCHECK(pa_context_); - pa_operation* operation = pa_context_get_server_info( - pa_context_, PulseAudioOutputStream::GetSystemDefaultOutputDeviceCallback, - this); - WaitForOperationCompletion(pa_mainloop_, operation); -} - bool PulseAudioOutputStream::Open() { DCHECK(thread_checker_.CalledOnValidThread()); - if (!InitializeMainloopAndContext()) { - return false; - } - - AutoPulseLock auto_lock(pa_mainloop_); - - std::string device_name_to_use = device_id_; - if (device_id_ == AudioManagerBase::kDefaultDeviceId) { - GetSystemDefaultOutputDevice(); - device_name_to_use = default_system_device_name_; - } - return pulse::CreateOutputStream( - pa_mainloop_, pa_context_, &pa_stream_, params_, device_name_to_use, + &pa_mainloop_, &pa_context_, &pa_stream_, params_, device_id_, AudioManager::GetGlobalAppName(), &StreamNotifyCallback, &StreamRequestCallback, this); } |