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() { |