1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MEDIA_AUDIO_ANDROID_AUDIO_MANAGER_ANDROID_H_ 6 #define MEDIA_AUDIO_ANDROID_AUDIO_MANAGER_ANDROID_H_ 7 8 #include <set> 9 10 #include "base/android/jni_android.h" 11 #include "base/gtest_prod_util.h" 12 #include "base/synchronization/lock.h" 13 #include "media/audio/audio_manager_base.h" 14 15 namespace media { 16 17 class OpenSLESOutputStream; 18 19 // Android implemention of AudioManager. 20 class MEDIA_EXPORT AudioManagerAndroid : public AudioManagerBase { 21 public: 22 AudioManagerAndroid(AudioLogFactory* audio_log_factory); 23 24 // Implementation of AudioManager. 25 virtual bool HasAudioOutputDevices() OVERRIDE; 26 virtual bool HasAudioInputDevices() OVERRIDE; 27 virtual void GetAudioInputDeviceNames( 28 AudioDeviceNames* device_names) OVERRIDE; 29 virtual void GetAudioOutputDeviceNames( 30 AudioDeviceNames* device_names) OVERRIDE; 31 virtual AudioParameters GetInputStreamParameters( 32 const std::string& device_id) OVERRIDE; 33 34 virtual AudioOutputStream* MakeAudioOutputStream( 35 const AudioParameters& params, 36 const std::string& device_id, 37 const std::string& input_device_id) OVERRIDE; 38 virtual AudioInputStream* MakeAudioInputStream( 39 const AudioParameters& params, 40 const std::string& device_id) OVERRIDE; 41 virtual void ReleaseOutputStream(AudioOutputStream* stream) OVERRIDE; 42 virtual void ReleaseInputStream(AudioInputStream* stream) OVERRIDE; 43 44 // Implementation of AudioManagerBase. 45 virtual AudioOutputStream* MakeLinearOutputStream( 46 const AudioParameters& params) OVERRIDE; 47 virtual AudioOutputStream* MakeLowLatencyOutputStream( 48 const AudioParameters& params, 49 const std::string& device_id, 50 const std::string& input_device_id) OVERRIDE; 51 virtual AudioInputStream* MakeLinearInputStream( 52 const AudioParameters& params, 53 const std::string& device_id) OVERRIDE; 54 virtual AudioInputStream* MakeLowLatencyInputStream( 55 const AudioParameters& params, 56 const std::string& device_id) OVERRIDE; 57 58 static bool RegisterAudioManager(JNIEnv* env); 59 60 void SetMute(JNIEnv* env, jobject obj, jboolean muted); 61 62 protected: 63 virtual ~AudioManagerAndroid(); 64 65 virtual AudioParameters GetPreferredOutputStreamParameters( 66 const std::string& output_device_id, 67 const AudioParameters& input_params) OVERRIDE; 68 69 private: 70 void Init(); 71 void Close(); 72 void SetAudioMode(int mode); 73 void SetAudioDevice(const std::string& device_id); 74 int GetNativeOutputSampleRate(); 75 bool IsAudioLowLatencySupported(); 76 int GetAudioLowLatencyOutputFrameSize(); 77 int GetOptimalOutputFrameSize(int sample_rate, int channels); 78 79 void DoSetMuteOnAudioThread(bool muted); 80 81 // Allow the AudioAndroidTest to access private methods. 82 FRIEND_TEST_ALL_PREFIXES(AudioAndroidOutputTest, IsAudioLowLatencySupported); 83 84 // Java AudioManager instance. 85 base::android::ScopedJavaGlobalRef<jobject> j_audio_manager_; 86 87 typedef std::set<OpenSLESOutputStream*> OutputStreams; 88 OutputStreams streams_; 89 // TODO(wjia): remove this lock once unit test modules are fixed to call 90 // AudioManager::MakeAudioOutputStream on the audio thread. For now, this 91 // lock is used to guard access to |streams_|. 92 base::Lock streams_lock_; 93 94 DISALLOW_COPY_AND_ASSIGN(AudioManagerAndroid); 95 }; 96 97 } // namespace media 98 99 #endif // MEDIA_AUDIO_ANDROID_AUDIO_MANAGER_ANDROID_H_ 100