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

Unified Diff: media/audio/android/opensles_input.cc

Issue 23296008: Adding audio unit tests for Android (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: tommi@-#1 Created 7 years, 4 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/android/opensles_input.h ('k') | media/audio/android/opensles_output.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/audio/android/opensles_input.cc
diff --git a/media/audio/android/opensles_input.cc b/media/audio/android/opensles_input.cc
index 15c3eac3726389bb7f8d0a7f37ee4b8d35a82f91..8943167134ea58acee6219c4a97ab527c36729ca 100644
--- a/media/audio/android/opensles_input.cc
+++ b/media/audio/android/opensles_input.cc
@@ -27,6 +27,7 @@ OpenSLESInputStream::OpenSLESInputStream(AudioManagerAndroid* audio_manager,
active_queue_(0),
buffer_size_bytes_(0),
started_(false) {
+ DVLOG(2) << "OpenSLESInputStream::OpenSLESInputStream()";
format_.formatType = SL_DATAFORMAT_PCM;
format_.numChannels = static_cast<SLuint32>(params.channels());
// Provides sampling rate in milliHertz to OpenSLES.
@@ -47,6 +48,8 @@ OpenSLESInputStream::OpenSLESInputStream(AudioManagerAndroid* audio_manager,
}
OpenSLESInputStream::~OpenSLESInputStream() {
+ DVLOG(2) << "OpenSLESInputStream::~OpenSLESInputStream()";
+ DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(!recorder_object_.Get());
DCHECK(!engine_object_.Get());
DCHECK(!recorder_);
@@ -55,6 +58,8 @@ OpenSLESInputStream::~OpenSLESInputStream() {
}
bool OpenSLESInputStream::Open() {
+ DVLOG(2) << "OpenSLESInputStream::Open()";
+ DCHECK(thread_checker_.CalledOnValidThread());
if (engine_object_.Get())
return false;
@@ -67,27 +72,33 @@ bool OpenSLESInputStream::Open() {
}
void OpenSLESInputStream::Start(AudioInputCallback* callback) {
+ DVLOG(2) << "OpenSLESInputStream::Start()";
+ DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(callback);
DCHECK(recorder_);
DCHECK(simple_buffer_queue_);
- if (started_)
- return;
-
- // Enable the flags before streaming.
- callback_ = callback;
- active_queue_ = 0;
- started_ = true;
SLresult err = SL_RESULT_UNKNOWN_ERROR;
- // Enqueues |kNumOfQueuesInBuffer| zero buffers to get the ball rolling.
- for (int i = 0; i < kNumOfQueuesInBuffer; ++i) {
- err = (*simple_buffer_queue_)->Enqueue(
- simple_buffer_queue_,
- audio_data_[i],
- buffer_size_bytes_);
- if (SL_RESULT_SUCCESS != err) {
- HandleError(err);
+ {
+ base::AutoLock lock(lock_);
+ if (started_)
wjia(left Chromium) 2013/08/29 14:21:55 No need to guard this check since this is the only
return;
+
+ // Enable the flags before streaming.
+ callback_ = callback;
+ active_queue_ = 0;
+ started_ = true;
+
+ // Enqueues |kNumOfQueuesInBuffer| zero buffers to get the ball rolling.
+ for (int i = 0; i < kNumOfQueuesInBuffer; ++i) {
+ err = (*simple_buffer_queue_)->Enqueue(
+ simple_buffer_queue_,
+ audio_data_[i],
+ buffer_size_bytes_);
+ if (SL_RESULT_SUCCESS != err) {
+ HandleError(err);
+ return;
+ }
}
}
@@ -98,33 +109,60 @@ void OpenSLESInputStream::Start(AudioInputCallback* callback) {
}
void OpenSLESInputStream::Stop() {
- if (!started_)
- return;
+ DVLOG(2) << "OpenSLESInputStream::Stop()";
+ DCHECK(thread_checker_.CalledOnValidThread());
+ {
+ base::AutoLock lock(lock_);
+ if (!started_)
wjia(left Chromium) 2013/08/29 14:21:55 ditto.
+ return;
+ }
// Stop recording by setting the record state to |SL_RECORDSTATE_STOPPED|.
LOG_ON_FAILURE_AND_RETURN(
(*recorder_)->SetRecordState(recorder_,
SL_RECORDSTATE_STOPPED));
+ {
+ base::AutoLock lock(lock_);
- // Clear the buffer queue to get rid of old data when resuming recording.
- LOG_ON_FAILURE_AND_RETURN(
- (*simple_buffer_queue_)->Clear(simple_buffer_queue_));
+ // Clear the buffer queue to get rid of old data when resuming recording.
+ LOG_ON_FAILURE_AND_RETURN(
+ (*simple_buffer_queue_)->Clear(simple_buffer_queue_));
- started_ = false;
+ started_ = false;
+ }
}
void OpenSLESInputStream::Close() {
+ DVLOG(2) << "OpenSLESInputStream::Close()";
+ DCHECK(thread_checker_.CalledOnValidThread());
+
// Stop the stream if it is still recording.
Stop();
wjia(left Chromium) 2013/08/29 14:21:55 |lock_| is not needed after this point, since |sta
- // Explicitly free the player objects and invalidate their associated
- // interfaces. They have to be done in the correct order.
+ {
+ base::AutoLock lock(lock_);
+ if (callback_) {
+ callback_->OnClose(this);
+ callback_ = NULL;
+ }
+ }
+
+ // Destroy the buffer queue recorder object and invalidate all associated
+ // interfaces.
recorder_object_.Reset();
- engine_object_.Reset();
- simple_buffer_queue_ = NULL;
+ {
+ base::AutoLock lock(lock_);
+ simple_buffer_queue_ = NULL;
+ }
recorder_ = NULL;
- ReleaseAudioBuffer();
+ // Destroy the engine object. We don't store any associated interface for
+ // this object.
+ engine_object_.Reset();
+ {
+ base::AutoLock lock(lock_);
+ ReleaseAudioBuffer();
+ }
audio_manager_->ReleaseInputStream(this);
}
@@ -153,6 +191,12 @@ bool OpenSLESInputStream::GetAutomaticGainControl() {
}
bool OpenSLESInputStream::CreateRecorder() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(!engine_object_.Get());
+ DCHECK(!recorder_object_.Get());
+ DCHECK(!recorder_);
+ DCHECK(!simple_buffer_queue_);
+
// Initializes the engine object with specific option. After working with the
// object, we need to free the object and its resources.
SLEngineOption option[] = {
@@ -201,6 +245,7 @@ bool OpenSLESInputStream::CreateRecorder() {
SL_BOOLEAN_TRUE,
SL_BOOLEAN_TRUE
};
+
// Create AudioRecorder and specify SL_IID_ANDROIDCONFIGURATION.
LOG_ON_FAILURE_AND_RETURN(
(*engine)->CreateAudioRecorder(engine,
@@ -265,6 +310,7 @@ void OpenSLESInputStream::SimpleBufferQueueCallback(
}
void OpenSLESInputStream::ReadBufferQueue() {
+ base::AutoLock lock(lock_);
if (!started_)
return;
@@ -287,6 +333,7 @@ void OpenSLESInputStream::ReadBufferQueue() {
}
void OpenSLESInputStream::SetupAudioBuffer() {
+ DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(!audio_data_[0]);
for (int i = 0; i < kNumOfQueuesInBuffer; ++i) {
audio_data_[i] = new uint8[buffer_size_bytes_];
@@ -294,6 +341,7 @@ void OpenSLESInputStream::SetupAudioBuffer() {
}
void OpenSLESInputStream::ReleaseAudioBuffer() {
+ DCHECK(thread_checker_.CalledOnValidThread());
if (audio_data_[0]) {
for (int i = 0; i < kNumOfQueuesInBuffer; ++i) {
delete [] audio_data_[i];
« no previous file with comments | « media/audio/android/opensles_input.h ('k') | media/audio/android/opensles_output.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698