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

Side by Side 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: tommi@, nits Created 7 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/android/audio_manager_android.h" 5 #include "media/audio/android/audio_manager_android.h"
6 6
7 #include "base/android/build_info.h"
8 #include "base/android/jni_array.h"
9 #include "base/android/jni_string.h"
10 #include "base/android/scoped_java_ref.h"
7 #include "base/logging.h" 11 #include "base/logging.h"
8 #include "jni/AudioManagerAndroid_jni.h" 12 #include "jni/AudioManagerAndroid_jni.h"
9 #include "media/audio/android/opensles_input.h" 13 #include "media/audio/android/opensles_input.h"
10 #include "media/audio/android/opensles_output.h" 14 #include "media/audio/android/opensles_output.h"
11 #include "media/audio/audio_manager.h" 15 #include "media/audio/audio_manager.h"
12 #include "media/audio/audio_parameters.h" 16 #include "media/audio/audio_parameters.h"
13 #include "media/audio/fake_audio_input_stream.h" 17 #include "media/audio/fake_audio_input_stream.h"
14 #include "media/base/channel_layout.h" 18 #include "media/base/channel_layout.h"
15 19
20 using base::android::AppendJavaStringArrayToStringVector;
21 using base::android::AttachCurrentThread;
22 using base::android::ConvertJavaStringToUTF8;
23 using base::android::ScopedJavaLocalRef;
24
16 namespace media { 25 namespace media {
17 26
18 static void AddDefaultDevice(AudioDeviceNames* device_names) { 27 static void AddDefaultDevice(AudioDeviceNames* device_names) {
19 DCHECK(device_names->empty()); 28 DCHECK(device_names->empty());
20 device_names->push_front( 29 device_names->push_front(
21 AudioDeviceName(AudioManagerBase::kDefaultDeviceName, 30 AudioDeviceName(AudioManagerBase::kDefaultDeviceName,
22 AudioManagerBase::kDefaultDeviceId)); 31 AudioManagerBase::kDefaultDeviceId));
23 } 32 }
24 33
25 // Maximum number of output streams that can be open simultaneously. 34 // Maximum number of output streams that can be open simultaneously.
26 static const int kMaxOutputStreams = 10; 35 static const int kMaxOutputStreams = 10;
27 36
28 static const int kAudioModeNormal = 0x00000000; 37 static const int kAudioModeNormal = 0x00000000;
29 static const int kAudioModeInCommunication = 0x00000003; 38 static const int kAudioModeInCommunication = 0x00000003;
30 39
31 static const int kDefaultInputBufferSize = 1024; 40 static const int kDefaultInputBufferSize = 1024;
32 static const int kDefaultOutputBufferSize = 2048; 41 static const int kDefaultOutputBufferSize = 2048;
33 42
34 AudioManager* CreateAudioManager() { 43 AudioManager* CreateAudioManager() {
35 return new AudioManagerAndroid(); 44 return new AudioManagerAndroid();
36 } 45 }
37 46
38 AudioManagerAndroid::AudioManagerAndroid() { 47 AudioManagerAndroid::AudioManagerAndroid() {
39 SetMaxOutputStreamsAllowed(kMaxOutputStreams); 48 SetMaxOutputStreamsAllowed(kMaxOutputStreams);
40 49
41 j_audio_manager_.Reset( 50 j_audio_manager_.Reset(
42 Java_AudioManagerAndroid_createAudioManagerAndroid( 51 Java_AudioManagerAndroid_createAudioManagerAndroid(
43 base::android::AttachCurrentThread(), 52 base::android::AttachCurrentThread(),
44 base::android::GetApplicationContext())); 53 base::android::GetApplicationContext()));
54
55 Java_AudioManagerAndroid_init(
56 base::android::AttachCurrentThread(),
57 j_audio_manager_.obj());
45 } 58 }
46 59
47 AudioManagerAndroid::~AudioManagerAndroid() { 60 AudioManagerAndroid::~AudioManagerAndroid() {
61 Java_AudioManagerAndroid_close(
62 base::android::AttachCurrentThread(),
63 j_audio_manager_.obj());
48 Shutdown(); 64 Shutdown();
49 } 65 }
50 66
51 bool AudioManagerAndroid::HasAudioOutputDevices() { 67 bool AudioManagerAndroid::HasAudioOutputDevices() {
52 return true; 68 return true;
53 } 69 }
54 70
55 bool AudioManagerAndroid::HasAudioInputDevices() { 71 bool AudioManagerAndroid::HasAudioInputDevices() {
56 return true; 72 return true;
57 } 73 }
58 74
59 void AudioManagerAndroid::GetAudioInputDeviceNames( 75 void AudioManagerAndroid::GetAudioInputDeviceNames(
60 AudioDeviceNames* device_names) { 76 AudioDeviceNames* device_names) {
61 AddDefaultDevice(device_names); 77 AddDefaultDevice(device_names);
62 } 78 }
63 79
64 void AudioManagerAndroid::GetAudioOutputDeviceNames( 80 void AudioManagerAndroid::GetAudioOutputDeviceNames(
65 AudioDeviceNames* device_names) { 81 AudioDeviceNames* device_names) {
82 // Always add default device parameters as first element.
83 // TODO(henrika): figure out how we shall handle the term "default"
84 // on Android.
66 AddDefaultDevice(device_names); 85 AddDefaultDevice(device_names);
86
87 JNIEnv* env = AttachCurrentThread();
88 int sdk = base::android::BuildInfo::GetInstance()->sdk_int();
89 if (sdk <= 16) {
90 // TODO(henrika): figure out where/if we must draw a limit here.
91 AddDefaultDevice(device_names);
Jói 2013/11/25 13:09:35 Not sure you want to add the default device again
henrika (OOO until Aug 14) 2013/11/25 13:28:14 oops
92 } else {
93 ScopedJavaLocalRef<jobjectArray> j_device_array =
94 Java_AudioManagerAndroid_getAudioOutputDeviceNames(
95 env, j_audio_manager_.obj());
96 std::vector<std::string> devices;
97 AppendJavaStringArrayToStringVector(env, j_device_array.obj(), &devices);
98
99 std::vector<std::string>::iterator it = devices.begin();
100 while (it != devices.end()) {
101 device_names->push_back(AudioDeviceName(*it, *it));
102 DVLOG(1) << "ouput device name: " << *it;
103 ++it;
104 }
105 }
67 } 106 }
68 107
69 AudioParameters AudioManagerAndroid::GetInputStreamParameters( 108 AudioParameters AudioManagerAndroid::GetInputStreamParameters(
70 const std::string& device_id) { 109 const std::string& device_id) {
71 // Use mono as preferred number of input channels on Android to save 110 // Use mono as preferred number of input channels on Android to save
72 // resources. Using mono also avoids a driver issue seen on Samsung 111 // resources. Using mono also avoids a driver issue seen on Samsung
73 // Galaxy S3 and S4 devices. See http://crbug.com/256851 for details. 112 // Galaxy S3 and S4 devices. See http://crbug.com/256851 for details.
74 ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO; 113 ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO;
75 int buffer_size = Java_AudioManagerAndroid_getMinInputFrameSize( 114 int buffer_size = Java_AudioManagerAndroid_getMinInputFrameSize(
76 base::android::AttachCurrentThread(), GetNativeOutputSampleRate(), 115 base::android::AttachCurrentThread(), GetNativeOutputSampleRate(),
77 ChannelLayoutToChannelCount(channel_layout)); 116 ChannelLayoutToChannelCount(channel_layout));
78 117
79 return AudioParameters( 118 return AudioParameters(
80 AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, 119 AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
81 GetNativeOutputSampleRate(), 16, 120 GetNativeOutputSampleRate(), 16,
82 buffer_size <= 0 ? kDefaultInputBufferSize : buffer_size); 121 buffer_size <= 0 ? kDefaultInputBufferSize : buffer_size);
83 } 122 }
84 123
85 AudioOutputStream* AudioManagerAndroid::MakeAudioOutputStream( 124 AudioOutputStream* AudioManagerAndroid::MakeAudioOutputStream(
86 const AudioParameters& params, 125 const AudioParameters& params,
87 const std::string& device_id, 126 const std::string& device_id,
88 const std::string& input_device_id) { 127 const std::string& input_device_id) {
89 AudioOutputStream* stream = 128 AudioOutputStream* stream =
90 AudioManagerBase::MakeAudioOutputStream(params, std::string(), 129 AudioManagerBase::MakeAudioOutputStream(params, std::string(),
91 std::string()); 130 std::string());
92 if (stream && output_stream_count() == 1) { 131 if (stream && output_stream_count() == 1) {
93 SetAudioMode(kAudioModeInCommunication); 132 SetAudioMode(kAudioModeInCommunication);
94 RegisterHeadsetReceiver(); 133 // TODO(henrika): resolve conflict with device enumeration.
134 // RegisterHeadsetReceiver();
95 } 135 }
96 return stream; 136 return stream;
97 } 137 }
98 138
99 AudioInputStream* AudioManagerAndroid::MakeAudioInputStream( 139 AudioInputStream* AudioManagerAndroid::MakeAudioInputStream(
100 const AudioParameters& params, const std::string& device_id) { 140 const AudioParameters& params, const std::string& device_id) {
101 AudioInputStream* stream = 141 AudioInputStream* stream =
102 AudioManagerBase::MakeAudioInputStream(params, device_id); 142 AudioManagerBase::MakeAudioInputStream(params, device_id);
103 return stream; 143 return stream;
104 } 144 }
105 145
106 void AudioManagerAndroid::ReleaseOutputStream(AudioOutputStream* stream) { 146 void AudioManagerAndroid::ReleaseOutputStream(AudioOutputStream* stream) {
107 AudioManagerBase::ReleaseOutputStream(stream); 147 AudioManagerBase::ReleaseOutputStream(stream);
108 if (!output_stream_count()) { 148 if (!output_stream_count()) {
109 UnregisterHeadsetReceiver(); 149 // TODO(henrika): resolve conflict with device enumeration.
150 // UnregisterHeadsetReceiver();
110 SetAudioMode(kAudioModeNormal); 151 SetAudioMode(kAudioModeNormal);
111 } 152 }
112 } 153 }
113 154
114 void AudioManagerAndroid::ReleaseInputStream(AudioInputStream* stream) { 155 void AudioManagerAndroid::ReleaseInputStream(AudioInputStream* stream) {
115 AudioManagerBase::ReleaseInputStream(stream); 156 AudioManagerBase::ReleaseInputStream(stream);
116 } 157 }
117 158
118 AudioOutputStream* AudioManagerAndroid::MakeLinearOutputStream( 159 AudioOutputStream* AudioManagerAndroid::MakeLinearOutputStream(
119 const AudioParameters& params) { 160 const AudioParameters& params) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 j_audio_manager_.obj()); 259 j_audio_manager_.obj());
219 } 260 }
220 261
221 int AudioManagerAndroid::GetAudioLowLatencyOutputFrameSize() { 262 int AudioManagerAndroid::GetAudioLowLatencyOutputFrameSize() {
222 return Java_AudioManagerAndroid_getAudioLowLatencyOutputFrameSize( 263 return Java_AudioManagerAndroid_getAudioLowLatencyOutputFrameSize(
223 base::android::AttachCurrentThread(), 264 base::android::AttachCurrentThread(),
224 j_audio_manager_.obj()); 265 j_audio_manager_.obj());
225 } 266 }
226 267
227 } // namespace media 268 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698