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

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

Issue 78033003: Adding device enumeration to Android device manager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: try again Created 7 years, 1 month 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
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() {

Powered by Google App Engine
This is Rietveld 408576698