Index: media/audio/android/audio_manager_android.cc |
=================================================================== |
--- media/audio/android/audio_manager_android.cc (revision 194203) |
+++ media/audio/android/audio_manager_android.cc (working copy) |
@@ -5,6 +5,7 @@ |
#include "media/audio/android/audio_manager_android.h" |
#include "base/logging.h" |
+#include "jni/AudioManagerAndroid_jni.h" |
#include "media/audio/android/opensles_input.h" |
#include "media/audio/android/opensles_output.h" |
#include "media/audio/audio_manager.h" |
@@ -18,12 +19,20 @@ |
// Maximum number of output streams that can be open simultaneously. |
static const int kMaxOutputStreams = 10; |
+static const int kAudioModeNormal = 0x00000000; |
+static const int kAudioModeInCommunication = 0x00000003; |
+ |
AudioManager* CreateAudioManager() { |
return new AudioManagerAndroid(); |
} |
AudioManagerAndroid::AudioManagerAndroid() { |
SetMaxOutputStreamsAllowed(kMaxOutputStreams); |
+ |
+ j_audio_manager_.Reset( |
+ Java_AudioManagerAndroid_createAudioManagerAndroid( |
+ base::android::AttachCurrentThread(), |
+ base::android::GetApplicationContext())); |
} |
AudioManagerAndroid::~AudioManagerAndroid() { |
@@ -57,6 +66,36 @@ |
kDefaultSampleRate, 16, kDefaultBufferSize); |
} |
+AudioOutputStream* AudioManagerAndroid::MakeAudioOutputStream( |
+ const AudioParameters& params) { |
+ AudioOutputStream* stream = |
+ AudioManagerBase::MakeAudioOutputStream(params); |
+ if (GetNumOutputStreams() == 1) |
+ RegisterHeadsetReceiver(); |
+ return stream; |
+} |
+ |
+AudioInputStream* AudioManagerAndroid::MakeAudioInputStream( |
+ const AudioParameters& params, const std::string& device_id) { |
+ AudioInputStream* stream = |
+ AudioManagerBase::MakeAudioInputStream(params, device_id); |
+ if (GetNumInputStreams() == 1) |
+ SetAudioMode(kAudioModeInCommunication); |
+ return stream; |
+} |
+ |
+void AudioManagerAndroid::ReleaseOutputStream(AudioOutputStream* stream) { |
+ AudioManagerBase::ReleaseOutputStream(stream); |
+ if (!GetNumOutputStreams()) |
+ UnregisterHeadsetReceiver(); |
+} |
+ |
+void AudioManagerAndroid::ReleaseInputStream(AudioInputStream* stream) { |
+ AudioManagerBase::ReleaseInputStream(stream); |
+ if (!GetNumInputStreams()) |
+ SetAudioMode(kAudioModeNormal); |
+} |
+ |
AudioOutputStream* AudioManagerAndroid::MakeLinearOutputStream( |
const AudioParameters& params) { |
DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format()); |
@@ -116,4 +155,27 @@ |
sample_rate, bits_per_sample, buffer_size); |
} |
+// static |
+bool AudioManagerAndroid::RegisterAudioManager(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+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::UnregisterHeadsetReceiver() { |
+ Java_AudioManagerAndroid_unregisterHeadsetReceiver( |
+ base::android::AttachCurrentThread(), |
+ j_audio_manager_.obj()); |
+} |
+ |
} // namespace media |