| Index: media/audio/android/opensles_input.cc
|
| ===================================================================
|
| --- media/audio/android/opensles_input.cc (revision 189667)
|
| +++ media/audio/android/opensles_input.cc (working copy)
|
| @@ -7,6 +7,15 @@
|
| #include "base/logging.h"
|
| #include "media/audio/android/audio_manager_android.h"
|
|
|
| +#define LOG_ON_FAILURE_AND_RETURN(op, ...) \
|
| + do { \
|
| + SLresult err = (op); \
|
| + if (err != SL_RESULT_SUCCESS) { \
|
| + DLOG(ERROR) << #op << " failed: " << err; \
|
| + return __VA_ARGS__; \
|
| + } \
|
| + } while (0)
|
| +
|
| namespace media {
|
|
|
| OpenSLESInputStream::OpenSLESInputStream(AudioManagerAndroid* audio_manager,
|
| @@ -84,7 +93,6 @@
|
|
|
| // Start the recording by setting the state to |SL_RECORDSTATE_RECORDING|.
|
| err = (*recorder_)->SetRecordState(recorder_, SL_RECORDSTATE_RECORDING);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| if (SL_RESULT_SUCCESS != err)
|
| HandleError(err);
|
| }
|
| @@ -94,17 +102,13 @@
|
| return;
|
|
|
| // Stop recording by setting the record state to |SL_RECORDSTATE_STOPPED|.
|
| - SLresult err = (*recorder_)->SetRecordState(recorder_,
|
| - SL_RECORDSTATE_STOPPED);
|
| - if (SL_RESULT_SUCCESS != err) {
|
| - DLOG(WARNING) << "SetRecordState() failed to set the state to stop";
|
| - }
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + (*recorder_)->SetRecordState(recorder_,
|
| + SL_RECORDSTATE_STOPPED));
|
|
|
| // Clear the buffer queue to get rid of old data when resuming recording.
|
| - err = (*simple_buffer_queue_)->Clear(simple_buffer_queue_);
|
| - if (SL_RESULT_SUCCESS != err) {
|
| - DLOG(WARNING) << "Clear() failed to clear the buffer queue";
|
| - }
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + (*simple_buffer_queue_)->Clear(simple_buffer_queue_));
|
|
|
| started_ = false;
|
| }
|
| @@ -154,29 +158,25 @@
|
| SLEngineOption option[] = {
|
| { SL_ENGINEOPTION_THREADSAFE, static_cast<SLuint32>(SL_BOOLEAN_TRUE) }
|
| };
|
| - SLresult err = slCreateEngine(engine_object_.Receive(),
|
| - 1,
|
| - option,
|
| - 0,
|
| - NULL,
|
| - NULL);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| - if (SL_RESULT_SUCCESS != err)
|
| - return false;
|
| + LOG_ON_FAILURE_AND_RETURN(slCreateEngine(engine_object_.Receive(),
|
| + 1,
|
| + option,
|
| + 0,
|
| + NULL,
|
| + NULL),
|
| + false);
|
|
|
| // Realize the SL engine object in synchronous mode.
|
| - err = engine_object_->Realize(engine_object_.Get(), SL_BOOLEAN_FALSE);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| - if (SL_RESULT_SUCCESS != err)
|
| - return false;
|
| + LOG_ON_FAILURE_AND_RETURN(engine_object_->Realize(engine_object_.Get(),
|
| + SL_BOOLEAN_FALSE),
|
| + false);
|
|
|
| // Get the SL engine interface which is implicit.
|
| SLEngineItf engine;
|
| - err = engine_object_->GetInterface(
|
| - engine_object_.Get(), SL_IID_ENGINE, &engine);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| - if (SL_RESULT_SUCCESS != err)
|
| - return false;
|
| + LOG_ON_FAILURE_AND_RETURN(engine_object_->GetInterface(engine_object_.Get(),
|
| + SL_IID_ENGINE,
|
| + &engine),
|
| + false);
|
|
|
| // Audio source configuration.
|
| SLDataLocator_IODevice mic_locator = {
|
| @@ -193,58 +193,68 @@
|
| SLDataSink audio_sink = { &buffer_queue, &format_ };
|
|
|
| // Create an audio recorder.
|
| - const SLuint32 number_of_interfaces = 1;
|
| - const SLInterfaceID interface_id[number_of_interfaces] = {
|
| - SL_IID_ANDROIDSIMPLEBUFFERQUEUE
|
| + const SLInterfaceID interface_id[] = {
|
| + SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
|
| + SL_IID_ANDROIDCONFIGURATION
|
| };
|
| - const SLboolean interface_required[number_of_interfaces] = {
|
| + const SLboolean interface_required[] = {
|
| + SL_BOOLEAN_TRUE,
|
| SL_BOOLEAN_TRUE
|
| };
|
| - err = (*engine)->CreateAudioRecorder(engine,
|
| - recorder_object_.Receive(),
|
| - &audio_source,
|
| - &audio_sink,
|
| - number_of_interfaces,
|
| - interface_id,
|
| - interface_required);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| - if (SL_RESULT_SUCCESS != err) {
|
| - DLOG(ERROR) << "CreateAudioRecorder failed with error code " << err;
|
| - return false;
|
| - }
|
| + // Create AudioRecorder and specify SL_IID_ANDROIDCONFIGURATION.
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + (*engine)->CreateAudioRecorder(engine,
|
| + recorder_object_.Receive(),
|
| + &audio_source,
|
| + &audio_sink,
|
| + arraysize(interface_id),
|
| + interface_id,
|
| + interface_required),
|
| + false);
|
|
|
| + SLAndroidConfigurationItf recorder_config;
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + recorder_object_->GetInterface(recorder_object_.Get(),
|
| + SL_IID_ANDROIDCONFIGURATION,
|
| + &recorder_config),
|
| + false);
|
| +
|
| + SLint32 stream_type = SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION;
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + (*recorder_config)->SetConfiguration(recorder_config,
|
| + SL_ANDROID_KEY_RECORDING_PRESET,
|
| + &stream_type, sizeof(SLint32)),
|
| + false);
|
| +
|
| // Realize the recorder object in synchronous mode.
|
| - err = recorder_object_->Realize(recorder_object_.Get(), SL_BOOLEAN_FALSE);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| - if (SL_RESULT_SUCCESS != err) {
|
| - DLOG(ERROR) << "Recprder Realize() failed with error code " << err;
|
| - return false;
|
| - }
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + recorder_object_->Realize(recorder_object_.Get(),
|
| + SL_BOOLEAN_FALSE),
|
| + false);
|
|
|
| // Get an implicit recorder interface.
|
| - err = recorder_object_->GetInterface(recorder_object_.Get(),
|
| - SL_IID_RECORD,
|
| - &recorder_);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| - if (SL_RESULT_SUCCESS != err)
|
| - return false;
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + recorder_object_->GetInterface(recorder_object_.Get(),
|
| + SL_IID_RECORD,
|
| + &recorder_),
|
| + false);
|
|
|
| // Get the simple buffer queue interface.
|
| - err = recorder_object_->GetInterface(recorder_object_.Get(),
|
| - SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
|
| - &simple_buffer_queue_);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| - if (SL_RESULT_SUCCESS != err)
|
| - return false;
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + recorder_object_->GetInterface(recorder_object_.Get(),
|
| + SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
|
| + &simple_buffer_queue_),
|
| + false);
|
|
|
| // Register the input callback for the simple buffer queue.
|
| // This callback will be called when receiving new data from the device.
|
| - err = (*simple_buffer_queue_)->RegisterCallback(simple_buffer_queue_,
|
| - SimpleBufferQueueCallback,
|
| - this);
|
| - DCHECK_EQ(SL_RESULT_SUCCESS, err);
|
| + LOG_ON_FAILURE_AND_RETURN(
|
| + (*simple_buffer_queue_)->RegisterCallback(simple_buffer_queue_,
|
| + SimpleBufferQueueCallback,
|
| + this),
|
| + false);
|
|
|
| - return (SL_RESULT_SUCCESS == err);
|
| + return true;
|
| }
|
|
|
| void OpenSLESInputStream::SimpleBufferQueueCallback(
|
| @@ -293,7 +303,7 @@
|
| }
|
|
|
| void OpenSLESInputStream::HandleError(SLresult error) {
|
| - DLOG(FATAL) << "OpenSLES error " << error;
|
| + DLOG(FATAL) << "OpenSLES Input error " << error;
|
| if (callback_)
|
| callback_->OnError(this, error);
|
| }
|
|
|