Chromium Code Reviews| Index: media/audio/android/audio_manager_android.cc |
| diff --git a/media/audio/android/audio_manager_android.cc b/media/audio/android/audio_manager_android.cc |
| index dc77a4c3eec6a2c6e5310ecd0dec5a0a88cb7ec6..085e742e30fc48caad5e7bf2230567afe2c08082 100644 |
| --- a/media/audio/android/audio_manager_android.cc |
| +++ b/media/audio/android/audio_manager_android.cc |
| @@ -4,7 +4,12 @@ |
| #include "media/audio/android/audio_manager_android.h" |
| +#include "base/android/build_info.h" |
| +#include "base/android/jni_array.h" |
| +#include "base/android/jni_string.h" |
| +#include "base/android/scoped_java_ref.h" |
| #include "base/logging.h" |
| +#include "base/strings/string_number_conversions.h" |
| #include "jni/AudioManagerAndroid_jni.h" |
| #include "media/audio/android/opensles_input.h" |
| #include "media/audio/android/opensles_output.h" |
| @@ -13,6 +18,12 @@ |
| #include "media/audio/fake_audio_input_stream.h" |
| #include "media/base/channel_layout.h" |
| +using base::android::AppendJavaStringArrayToStringVector; |
| +using base::android::AttachCurrentThread; |
| +using base::android::ConvertJavaStringToUTF8; |
| +using base::android::ConvertUTF8ToJavaString; |
| +using base::android::ScopedJavaLocalRef; |
| + |
| namespace media { |
| static void AddDefaultDevice(AudioDeviceNames* device_names) { |
| @@ -42,9 +53,11 @@ AudioManagerAndroid::AudioManagerAndroid() { |
| Java_AudioManagerAndroid_createAudioManagerAndroid( |
| base::android::AttachCurrentThread(), |
| base::android::GetApplicationContext())); |
| + Init(); |
| } |
| AudioManagerAndroid::~AudioManagerAndroid() { |
| + Close(); |
| Shutdown(); |
| } |
| @@ -58,11 +71,32 @@ bool AudioManagerAndroid::HasAudioInputDevices() { |
| void AudioManagerAndroid::GetAudioInputDeviceNames( |
| AudioDeviceNames* device_names) { |
| + // Always add default device parameters as first element. |
| AddDefaultDevice(device_names); |
| + |
| + // Get all available devices and add these to the list. |
|
tommi (sloooow) - chröme
2013/11/29 15:04:33
nit: redundant comment (since we're inside GetAudi
henrika (OOO until Aug 14)
2013/11/29 15:39:50
Done.
|
| + AudioDeviceName device; |
|
tommi (sloooow) - chröme
2013/11/29 15:04:33
nit: declare above the loop where it's used.
henrika (OOO until Aug 14)
2013/11/29 15:39:50
Done.
|
| + JNIEnv* env = AttachCurrentThread(); |
| + ScopedJavaLocalRef<jobjectArray> j_device_array = |
| + Java_AudioManagerAndroid_getAudioInputDeviceNames( |
| + env, j_audio_manager_.obj()); |
| + jsize len = env->GetArrayLength(j_device_array.obj()); |
| + for (jsize i = 0; i < len; ++i) { |
| + ScopedJavaLocalRef<jobject> j_device( |
| + env, env->GetObjectArrayElement(j_device_array.obj(), i)); |
| + ScopedJavaLocalRef<jstring> j_device_name = |
| + Java_AudioDeviceName_name(env, j_device.obj()); |
| + ConvertJavaStringToUTF8(env, j_device_name.obj(), &device.device_name); |
| + ScopedJavaLocalRef<jstring> j_device_id = |
| + Java_AudioDeviceName_id(env, j_device.obj()); |
| + ConvertJavaStringToUTF8(env, j_device_id.obj(), &device.unique_id); |
| + device_names->push_back(device); |
| + } |
| } |
| void AudioManagerAndroid::GetAudioOutputDeviceNames( |
| AudioDeviceNames* device_names) { |
| + // TODO(henrika): enumerate using GetAudioInputDeviceNames(). |
| AddDefaultDevice(device_names); |
| } |
| @@ -91,7 +125,6 @@ AudioOutputStream* AudioManagerAndroid::MakeAudioOutputStream( |
| std::string()); |
| if (stream && output_stream_count() == 1) { |
| SetAudioMode(kAudioModeInCommunication); |
| - RegisterHeadsetReceiver(); |
| } |
| return stream; |
| } |
| @@ -106,7 +139,6 @@ AudioInputStream* AudioManagerAndroid::MakeAudioInputStream( |
| void AudioManagerAndroid::ReleaseOutputStream(AudioOutputStream* stream) { |
| AudioManagerBase::ReleaseOutputStream(stream); |
| if (!output_stream_count()) { |
| - UnregisterHeadsetReceiver(); |
| SetAudioMode(kAudioModeNormal); |
| } |
| } |
| @@ -139,6 +171,12 @@ AudioInputStream* AudioManagerAndroid::MakeLinearInputStream( |
| AudioInputStream* AudioManagerAndroid::MakeLowLatencyInputStream( |
| const AudioParameters& params, const std::string& device_id) { |
| DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); |
| + DLOG_IF(ERROR, device_id.empty()) << "Invalid device ID!"; |
| + // Utilize the device ID to select the correct input device. |
| + // Note that the input device is always associated with a certain output |
| + // device, i.e., this selection does also switch the output device. |
| + // All input and output streams will be affected by the device selection. |
| + SetAudioDevice(device_id); |
| return new OpenSLESInputStream(this, params); |
| } |
| @@ -188,22 +226,38 @@ bool AudioManagerAndroid::RegisterAudioManager(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| } |
| +void AudioManagerAndroid::Init() { |
| + Java_AudioManagerAndroid_init( |
| + base::android::AttachCurrentThread(), |
| + j_audio_manager_.obj()); |
| +} |
| + |
| +void AudioManagerAndroid::Close() { |
| + Java_AudioManagerAndroid_close( |
| + base::android::AttachCurrentThread(), |
| + j_audio_manager_.obj()); |
| +} |
| + |
| void AudioManagerAndroid::SetAudioMode(int mode) { |
| Java_AudioManagerAndroid_setMode( |
| base::android::AttachCurrentThread(), |
| j_audio_manager_.obj(), mode); |
| } |
| -void AudioManagerAndroid::RegisterHeadsetReceiver() { |
| - Java_AudioManagerAndroid_registerHeadsetReceiver( |
| - base::android::AttachCurrentThread(), |
| - j_audio_manager_.obj()); |
| -} |
| +void AudioManagerAndroid::SetAudioDevice(std::string device_id) { |
| + JNIEnv* env = AttachCurrentThread(); |
| -void AudioManagerAndroid::UnregisterHeadsetReceiver() { |
| - Java_AudioManagerAndroid_unregisterHeadsetReceiver( |
| - base::android::AttachCurrentThread(), |
| - j_audio_manager_.obj()); |
| + // Provide an empty string to the Java audio manager if the default device |
| + // is selected. |
| + if (device_id == AudioManagerBase::kDefaultDeviceId) |
| + device_id.clear(); |
| + |
| + // Send the unique device ID to the Java audio manager and make the |
| + // device switch. |
| + ScopedJavaLocalRef<jstring> j_device_id = |
| + ConvertUTF8ToJavaString(env, device_id); |
| + Java_AudioManagerAndroid_setDevice( |
| + env, j_audio_manager_.obj(), j_device_id.obj()); |
| } |
| int AudioManagerAndroid::GetNativeOutputSampleRate() { |