audio_manager_android.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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
15namespace media {
16
17class OpenSLESOutputStream;
18
19// Android implemention of AudioManager.
20class 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(AudioAndroidTest, 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