Commit 42f255d5 authored by Thomas Guilbert's avatar Thomas Guilbert Committed by Commit Bot

Fix AAudio crash on device change

Currently, when using AAudio, we treat device changes like any other
error, which causes video playback to fail when plugging in headphones.

This CL changes this so we intercept device disconnection errors, and
report them as kDeviceChange errors to the OutputController, which
forces the graceful creation of a new stream.

Bug: 1136559
Change-Id: I7969ad3edac2b7bbc9a3e2271f423cf7a029e7f3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2462340
Commit-Queue: Thomas Guilbert <tguilbert@chromium.org>
Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
Auto-Submit: Thomas Guilbert <tguilbert@chromium.org>
Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#815438}
parent a4f1008a
...@@ -114,6 +114,13 @@ void AAudioOutputStream::Start(AudioSourceCallback* callback) { ...@@ -114,6 +114,13 @@ void AAudioOutputStream::Start(AudioSourceCallback* callback) {
{ {
base::AutoLock al(lock_); base::AutoLock al(lock_);
// The device might have been disconnected between Open() and Start().
if (device_changed_) {
callback->OnError(AudioSourceCallback::ErrorType::kDeviceChange);
return;
}
DCHECK(!callback_); DCHECK(!callback_);
callback_ = callback; callback_ = callback;
} }
...@@ -217,9 +224,20 @@ aaudio_data_callback_result_t AAudioOutputStream::OnAudioDataRequested( ...@@ -217,9 +224,20 @@ aaudio_data_callback_result_t AAudioOutputStream::OnAudioDataRequested(
void AAudioOutputStream::OnStreamError(aaudio_result_t error) { void AAudioOutputStream::OnStreamError(aaudio_result_t error) {
base::AutoLock al(lock_); base::AutoLock al(lock_);
if (error == AAUDIO_ERROR_DISCONNECTED)
device_changed_ = true;
if (!callback_)
return;
if (device_changed_) {
callback_->OnError(AudioSourceCallback::ErrorType::kDeviceChange);
return;
}
// TODO(dalecurtis): Consider sending a translated |error| code. // TODO(dalecurtis): Consider sending a translated |error| code.
if (callback_) callback_->OnError(AudioSourceCallback::ErrorType::kUnknown);
callback_->OnError(AudioSourceCallback::ErrorType::kUnknown);
} }
void AAudioOutputStream::SetVolume(double volume) { void AAudioOutputStream::SetVolume(double volume) {
......
...@@ -67,6 +67,7 @@ class AAudioOutputStream : public MuteableAudioOutputStream { ...@@ -67,6 +67,7 @@ class AAudioOutputStream : public MuteableAudioOutputStream {
AudioSourceCallback* callback_ GUARDED_BY(lock_) = nullptr; AudioSourceCallback* callback_ GUARDED_BY(lock_) = nullptr;
bool muted_ GUARDED_BY(lock_) = false; bool muted_ GUARDED_BY(lock_) = false;
double volume_ GUARDED_BY(lock_) = 1.0; double volume_ GUARDED_BY(lock_) = 1.0;
bool device_changed_ GUARDED_BY(lock_) = false;
DISALLOW_COPY_AND_ASSIGN(AAudioOutputStream); DISALLOW_COPY_AND_ASSIGN(AAudioOutputStream);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment