OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <memory> | 11 #include <memory> |
12 #include <SLES/OpenSLES_Android.h> | |
12 | 13 |
13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 #include "webrtc/base/arraysize.h" | |
14 #include "webrtc/base/format_macros.h" | 16 #include "webrtc/base/format_macros.h" |
15 #include "webrtc/modules/audio_device/android/build_info.h" | 17 #include "webrtc/modules/audio_device/android/build_info.h" |
16 #include "webrtc/modules/audio_device/android/audio_manager.h" | 18 #include "webrtc/modules/audio_device/android/audio_manager.h" |
17 #include "webrtc/modules/audio_device/android/ensure_initialized.h" | 19 #include "webrtc/modules/audio_device/android/ensure_initialized.h" |
18 | 20 |
19 #define PRINT(...) fprintf(stderr, __VA_ARGS__); | 21 #define PRINT(...) fprintf(stderr, __VA_ARGS__); |
20 | 22 |
21 namespace webrtc { | 23 namespace webrtc { |
22 | 24 |
23 static const char kTag[] = " "; | 25 static const char kTag[] = " "; |
(...skipping 13 matching lines...) Expand all Loading... | |
37 AudioManager* audio_manager() const { return audio_manager_.get(); } | 39 AudioManager* audio_manager() const { return audio_manager_.get(); } |
38 | 40 |
39 // A valid audio layer must always be set before calling Init(), hence we | 41 // A valid audio layer must always be set before calling Init(), hence we |
40 // might as well make it a part of the test fixture. | 42 // might as well make it a part of the test fixture. |
41 void SetActiveAudioLayer() { | 43 void SetActiveAudioLayer() { |
42 EXPECT_EQ(0, audio_manager()->GetDelayEstimateInMilliseconds()); | 44 EXPECT_EQ(0, audio_manager()->GetDelayEstimateInMilliseconds()); |
43 audio_manager()->SetActiveAudioLayer(AudioDeviceModule::kAndroidJavaAudio); | 45 audio_manager()->SetActiveAudioLayer(AudioDeviceModule::kAndroidJavaAudio); |
44 EXPECT_NE(0, audio_manager()->GetDelayEstimateInMilliseconds()); | 46 EXPECT_NE(0, audio_manager()->GetDelayEstimateInMilliseconds()); |
45 } | 47 } |
46 | 48 |
49 // One way to ensure that the engine object is valid is to create an | |
50 // SL Engine interface since it exposes creation methods of all the OpenSL ES | |
51 // object types and it is only supported on the engine object. This method | |
52 // also verifies that the engine interface supports at least one interface. | |
53 // Note that, the test below is not a full test of the SLEngineItf object | |
54 // but only a simple sanity test to check that the global engine object is OK. | |
55 bool SLEngineIsValid(SLObjectItf engine_object) { | |
magjed_webrtc
2016/05/31 11:24:07
If you return a bool, you will not know why SLEngi
henrika_webrtc
2016/05/31 12:04:03
Thanks. Used the second approach ;-)
| |
56 if (engine_object == nullptr) | |
57 return false; | |
58 // Get the SL Engine interface which is exposed by the engine object. | |
59 SLEngineItf engine; | |
60 SLresult result = | |
61 (*engine_object)->GetInterface(engine_object, SL_IID_ENGINE, &engine); | |
62 if (result != SL_RESULT_SUCCESS) | |
63 return false; | |
64 // Ensure that the SL Engine interface exposes at least one interface. | |
65 SLuint32 object_id = SL_OBJECTID_ENGINE; | |
66 SLuint32 num_supported_interfaces = 0; | |
67 result = (*engine)->QueryNumSupportedInterfaces(engine, object_id, | |
68 &num_supported_interfaces); | |
69 return (result == SL_RESULT_SUCCESS && num_supported_interfaces >= 1); | |
70 } | |
71 | |
47 std::unique_ptr<AudioManager> audio_manager_; | 72 std::unique_ptr<AudioManager> audio_manager_; |
48 AudioParameters playout_parameters_; | 73 AudioParameters playout_parameters_; |
49 AudioParameters record_parameters_; | 74 AudioParameters record_parameters_; |
50 }; | 75 }; |
51 | 76 |
52 TEST_F(AudioManagerTest, ConstructDestruct) { | 77 TEST_F(AudioManagerTest, ConstructDestruct) { |
53 } | 78 } |
54 | 79 |
80 // It should not be possible to create an OpenSL engine object if Java based | |
81 // audio is requested in both directions. | |
82 TEST_F(AudioManagerTest, GetOpenSLEngineShouldFailForJavaAudioLayer) { | |
83 audio_manager()->SetActiveAudioLayer(AudioDeviceModule::kAndroidJavaAudio); | |
84 SLObjectItf engine_object = audio_manager()->GetOpenSLEngine(); | |
85 EXPECT_EQ(nullptr, engine_object); | |
86 } | |
87 | |
88 // It should be possible to create an OpenSL engine object if OpenSL ES based | |
89 // audio is requested in any direction. | |
90 TEST_F(AudioManagerTest, GetOpenSLEngineShouldSucceedForOpenSLESAudioLayer) { | |
91 // List of supported audio layers that uses OpenSL ES audio. | |
92 const AudioDeviceModule::AudioLayer opensles_audio[] = { | |
93 AudioDeviceModule::kAndroidOpenSLESAudio, | |
94 AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio}; | |
95 // Verify that the global (singleton) OpenSL Engine can be acquired for all | |
96 // audio layes that uses OpenSL ES. Note that the engine is only created once. | |
97 for (size_t i = 0; i < arraysize(opensles_audio); ++i) { | |
magjed_webrtc
2016/05/31 11:24:07
nit: Use for-each loop instead, i.e.
for (const Au
henrika_webrtc
2016/05/31 12:04:03
Thanks, done ;-)
| |
98 audio_manager()->SetActiveAudioLayer(opensles_audio[i]); | |
99 SLObjectItf engine_object = audio_manager()->GetOpenSLEngine(); | |
100 EXPECT_NE(nullptr, engine_object); | |
101 // Perform a simple sanity check of the created engine object. | |
102 EXPECT_TRUE(SLEngineIsValid(engine_object)); | |
103 } | |
104 } | |
105 | |
55 TEST_F(AudioManagerTest, InitClose) { | 106 TEST_F(AudioManagerTest, InitClose) { |
56 EXPECT_TRUE(audio_manager()->Init()); | 107 EXPECT_TRUE(audio_manager()->Init()); |
57 EXPECT_TRUE(audio_manager()->Close()); | 108 EXPECT_TRUE(audio_manager()->Close()); |
58 } | 109 } |
59 | 110 |
60 TEST_F(AudioManagerTest, IsAcousticEchoCancelerSupported) { | 111 TEST_F(AudioManagerTest, IsAcousticEchoCancelerSupported) { |
61 PRINT("%sAcoustic Echo Canceler support: %s\n", kTag, | 112 PRINT("%sAcoustic Echo Canceler support: %s\n", kTag, |
62 audio_manager()->IsAcousticEchoCancelerSupported() ? "Yes" : "No"); | 113 audio_manager()->IsAcousticEchoCancelerSupported() ? "Yes" : "No"); |
63 } | 114 } |
64 | 115 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
151 params.frames_per_10ms_buffer()); | 202 params.frames_per_10ms_buffer()); |
152 EXPECT_EQ(kBytesPerFrame, params.GetBytesPerFrame()); | 203 EXPECT_EQ(kBytesPerFrame, params.GetBytesPerFrame()); |
153 EXPECT_EQ(kBytesPerFrame * kFramesPerBuffer, params.GetBytesPerBuffer()); | 204 EXPECT_EQ(kBytesPerFrame * kFramesPerBuffer, params.GetBytesPerBuffer()); |
154 EXPECT_EQ(kBytesPerFrame * kFramesPer10msBuffer, | 205 EXPECT_EQ(kBytesPerFrame * kFramesPer10msBuffer, |
155 params.GetBytesPer10msBuffer()); | 206 params.GetBytesPer10msBuffer()); |
156 EXPECT_EQ(kBufferSizeInMs, params.GetBufferSizeInMilliseconds()); | 207 EXPECT_EQ(kBufferSizeInMs, params.GetBufferSizeInMilliseconds()); |
157 } | 208 } |
158 | 209 |
159 } // namespace webrtc | 210 } // namespace webrtc |
160 | 211 |
OLD | NEW |