Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1260)

Unified Diff: media/audio/pulse/audio_manager_pulse.cc

Issue 2784433002: Ensures that audio tasks cannot run after AudioManager is deleted. (Closed)
Patch Set: rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/audio/pulse/audio_manager_pulse.h ('k') | media/audio/pulse/pulse_util.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/audio/pulse/audio_manager_pulse.cc
diff --git a/media/audio/pulse/audio_manager_pulse.cc b/media/audio/pulse/audio_manager_pulse.cc
index 779bf92e58d3d39c981f398cf911ed504bc2191f..6fa330f0e82708556ff7f6d93f31d610c9261da9 100644
--- a/media/audio/pulse/audio_manager_pulse.cc
+++ b/media/audio/pulse/audio_manager_pulse.cc
@@ -6,7 +6,6 @@
#include "base/command_line.h"
#include "base/environment.h"
-#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/nix/xdg_util.h"
#include "base/stl_util.h"
@@ -20,14 +19,6 @@
#include "media/base/audio_parameters.h"
#include "media/base/channel_layout.h"
-#if defined(DLOPEN_PULSEAUDIO)
-#include "media/audio/pulse/pulse_stubs.h"
-
-using media_audio_pulse::kModulePulse;
-using media_audio_pulse::InitializeStubs;
-using media_audio_pulse::StubPathMap;
-#endif // defined(DLOPEN_PULSEAUDIO)
-
namespace media {
using pulse::AutoPulseLock;
@@ -43,43 +34,30 @@ static const int kMaximumOutputBufferSize = 8192;
// Default input buffer size.
static const int kDefaultInputBufferSize = 1024;
-#if defined(DLOPEN_PULSEAUDIO)
-static const base::FilePath::CharType kPulseLib[] =
- FILE_PATH_LITERAL("libpulse.so.0");
-#endif
-
-AudioManagerPulse::AudioManagerPulse(
- scoped_refptr<base::SingleThreadTaskRunner> task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
- AudioLogFactory* audio_log_factory)
- : AudioManagerBase(std::move(task_runner),
- std::move(worker_task_runner),
- audio_log_factory),
- input_mainloop_(NULL),
- input_context_(NULL),
+AudioManagerPulse::AudioManagerPulse(std::unique_ptr<AudioThread> audio_thread,
+ AudioLogFactory* audio_log_factory,
+ pa_threaded_mainloop* pa_mainloop,
+ pa_context* pa_context)
+ : AudioManagerBase(std::move(audio_thread), audio_log_factory),
+ input_mainloop_(pa_mainloop),
+ input_context_(pa_context),
devices_(NULL),
native_input_sample_rate_(0),
native_channel_count_(0) {
+ DCHECK(input_mainloop_);
+ DCHECK(input_context_);
SetMaxOutputStreamsAllowed(kMaxOutputStreams);
}
-AudioManagerPulse::~AudioManagerPulse() {
- Shutdown();
- // The Pulse objects are the last things to be destroyed since Shutdown()
- // needs them.
- DestroyPulse();
-}
+AudioManagerPulse::~AudioManagerPulse() = default;
-bool AudioManagerPulse::Init() {
- // TODO(alokp): Investigate if InitPulse can happen on the audio thread.
- // It currently needs to happen on the main thread so that is InitPulse fails,
- // we can fallback to ALSA implementation. Initializing it on audio thread
- // would unblock the main thread and make InitPulse consistent with
- // DestroyPulse which happens on the audio thread.
- return InitPulse();
+void AudioManagerPulse::ShutdownOnAudioThread() {
+ AudioManagerBase::ShutdownOnAudioThread();
+ // The Pulse objects are the last things to be destroyed since
+ // AudioManagerBase::ShutdownOnAudioThread() needs them.
+ pulse::DestroyPulse(input_mainloop_, input_context_);
}
-// Implementation of AudioManager.
bool AudioManagerPulse::HasAudioOutputDevices() {
AudioDeviceNames devices;
GetAudioOutputDeviceNames(&devices);
@@ -233,85 +211,6 @@ void AudioManagerPulse::UpdateNativeAudioHardwareInfo() {
WaitForOperationCompletion(input_mainloop_, operation);
}
-bool AudioManagerPulse::InitPulse() {
- DCHECK(!input_mainloop_);
-
-#if defined(DLOPEN_PULSEAUDIO)
- StubPathMap paths;
-
- // Check if the pulse library is avialbale.
- paths[kModulePulse].push_back(kPulseLib);
- if (!InitializeStubs(paths)) {
- VLOG(1) << "Failed on loading the Pulse library and symbols";
- return false;
- }
-#endif // defined(DLOPEN_PULSEAUDIO)
-
- // Create a mainloop API and connect to the default server.
- // The mainloop is the internal asynchronous API event loop.
- input_mainloop_ = pa_threaded_mainloop_new();
- if (!input_mainloop_)
- return false;
-
- // Start the threaded mainloop.
- if (pa_threaded_mainloop_start(input_mainloop_))
- return false;
-
- // Lock the event loop object, effectively blocking the event loop thread
- // from processing events. This is necessary.
- AutoPulseLock auto_lock(input_mainloop_);
-
- pa_mainloop_api* pa_mainloop_api =
- pa_threaded_mainloop_get_api(input_mainloop_);
- input_context_ = pa_context_new(pa_mainloop_api, "Chrome input");
- if (!input_context_)
- return false;
-
- pa_context_set_state_callback(input_context_, &pulse::ContextStateCallback,
- input_mainloop_);
- if (pa_context_connect(input_context_, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL)) {
- VLOG(1) << "Failed to connect to the context. Error: "
- << pa_strerror(pa_context_errno(input_context_));
- return false;
- }
-
- // Wait until |input_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(input_context_);
- if (!PA_CONTEXT_IS_GOOD(context_state))
- return false;
- if (context_state == PA_CONTEXT_READY)
- break;
- pa_threaded_mainloop_wait(input_mainloop_);
- }
-
- return true;
-}
-
-void AudioManagerPulse::DestroyPulse() {
- if (!input_mainloop_) {
- DCHECK(!input_context_);
- return;
- }
-
- {
- AutoPulseLock auto_lock(input_mainloop_);
- if (input_context_) {
- // Clear our state callback.
- pa_context_set_state_callback(input_context_, NULL, NULL);
- pa_context_disconnect(input_context_);
- pa_context_unref(input_context_);
- input_context_ = NULL;
- }
- }
-
- pa_threaded_mainloop_stop(input_mainloop_);
- pa_threaded_mainloop_free(input_mainloop_);
- input_mainloop_ = NULL;
-}
-
void AudioManagerPulse::InputDevicesInfoCallback(pa_context* context,
const pa_source_info* info,
int error, void *user_data) {
« no previous file with comments | « media/audio/pulse/audio_manager_pulse.h ('k') | media/audio/pulse/pulse_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698