Index: media/audio/audio_manager_base.cc |
=================================================================== |
--- media/audio/audio_manager_base.cc (revision 194406) |
+++ media/audio/audio_manager_base.cc (working copy) |
@@ -9,6 +9,9 @@ |
#include "base/command_line.h" |
#include "base/message_loop_proxy.h" |
#include "base/threading/thread.h" |
+#if defined(OS_ANDROID) |
+#include "jni/AudioManagerAndroid_jni.h" |
+#endif |
#include "media/audio/audio_output_dispatcher_impl.h" |
#include "media/audio/audio_output_proxy.h" |
#include "media/audio/audio_output_resampler.h" |
@@ -31,6 +34,11 @@ |
static const int kMaxInputChannels = 2; |
+#if defined(OS_ANDROID) |
+static const int kAudioModeNormal = 0x00000000; |
+static const int kAudioModeInCommunication = 0x00000003; |
+#endif |
+ |
const char AudioManagerBase::kDefaultDeviceName[] = "Default"; |
const char AudioManagerBase::kDefaultDeviceId[] = "default"; |
@@ -55,6 +63,13 @@ |
CHECK(audio_thread_->Start()); |
#endif |
message_loop_ = audio_thread_->message_loop_proxy(); |
+ |
+#if defined(OS_ANDROID) |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ jobject context = base::android::GetApplicationContext(); |
+ j_audio_manager_.Reset( |
+ Java_AudioManagerAndroid_createAudioManagerAndroid(env, context)); |
+#endif |
} |
AudioManagerBase::~AudioManagerBase() { |
@@ -119,6 +134,10 @@ |
if (stream) { |
++num_output_streams_; |
+#if defined(OS_ANDROID) |
+ if (num_output_streams_ == 1) |
+ RegisterHeadsetReceiver(); |
+#endif |
} |
return stream; |
@@ -161,6 +180,10 @@ |
if (stream) { |
++num_input_streams_; |
+#if defined(OS_ANDROID) |
+ if (num_input_streams_ == 1) |
+ SetAudioMode(kAudioModeInCommunication); |
+#endif |
} |
return stream; |
@@ -245,6 +268,10 @@ |
// streams. |
--num_output_streams_; |
delete stream; |
+#if defined(OS_ANDROID) |
+ if (!num_output_streams_) |
+ UnregisterHeadsetReceiver(); |
+#endif |
} |
void AudioManagerBase::ReleaseInputStream(AudioInputStream* stream) { |
@@ -252,6 +279,10 @@ |
// TODO(xians) : Have a clearer destruction path for the AudioInputStream. |
--num_input_streams_; |
delete stream; |
+#if defined(OS_ANDROID) |
+ if (!num_input_streams_) |
+ SetAudioMode(kAudioModeNormal); |
+#endif |
} |
void AudioManagerBase::IncreaseActiveInputStreamCount() { |
@@ -319,6 +350,13 @@ |
#endif // defined(OS_IOS) |
} |
+#if defined(OS_ANDROID) |
+// static |
+bool AudioManagerBase::RegisterAudioManager(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+#endif |
+ |
void AudioManagerBase::AddOutputDeviceChangeListener( |
AudioDeviceListener* listener) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
@@ -347,4 +385,24 @@ |
return AudioParameters(); |
} |
+#if defined(OS_ANDROID) |
+void AudioManagerBase::SetAudioMode(int mode) { |
+ Java_AudioManagerAndroid_setMode( |
+ base::android::AttachCurrentThread(), |
+ j_audio_manager_.obj(), mode); |
+} |
+ |
+void AudioManagerBase::RegisterHeadsetReceiver() { |
+ Java_AudioManagerAndroid_registerHeadsetReceiver( |
+ base::android::AttachCurrentThread(), |
+ j_audio_manager_.obj()); |
+} |
+ |
+void AudioManagerBase::UnregisterHeadsetReceiver() { |
+ Java_AudioManagerAndroid_unregisterHeadsetReceiver( |
+ base::android::AttachCurrentThread(), |
+ j_audio_manager_.obj()); |
+} |
+#endif // defined(OS_ANDROID) |
+ |
} // namespace media |