MediaPresetReverbTest.java revision db6028508c8eb31a0de1dcdfc410ddfe6df7c5ad
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.mediaframeworktest.functional.audio;
18
19import com.android.mediaframeworktest.MediaFrameworkTest;
20import com.android.mediaframeworktest.MediaNames;
21import com.android.mediaframeworktest.functional.EnergyProbe;
22import android.content.Context;
23import android.content.res.AssetFileDescriptor;
24import android.media.audiofx.AudioEffect;
25import android.media.AudioManager;
26import android.media.audiofx.PresetReverb;
27import android.media.audiofx.Visualizer;
28import android.media.MediaPlayer;
29
30import android.os.Looper;
31import android.test.suitebuilder.annotation.LargeTest;
32import android.test.suitebuilder.annotation.MediumTest;
33import android.test.suitebuilder.annotation.Suppress;
34import android.test.ActivityInstrumentationTestCase2;
35import android.util.Log;
36
37import java.nio.ByteOrder;
38import java.nio.ByteBuffer;
39import java.util.UUID;
40
41/**
42 * Junit / Instrumentation test case for the media AudioTrack api
43
44 */
45public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
46    private String TAG = "MediaPresetReverbTest";
47
48    private PresetReverb mReverb = null;
49    private int mSession = -1;
50
51    public MediaPresetReverbTest() {
52        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
53    }
54
55    @Override
56    protected void setUp() throws Exception {
57      super.setUp();
58    }
59
60    @Override
61    protected void tearDown() throws Exception {
62        super.tearDown();
63        releaseReverb();
64    }
65
66    private static void assumeTrue(String message, boolean cond) {
67        assertTrue("(assume)"+message, cond);
68    }
69
70    private void log(String testName, String message) {
71        Log.v(TAG, "["+testName+"] "+message);
72    }
73
74    private void loge(String testName, String message) {
75        Log.e(TAG, "["+testName+"] "+message);
76    }
77
78    //-----------------------------------------------------------------
79    // PRESET REVEB TESTS:
80    //----------------------------------
81
82
83    //-----------------------------------------------------------------
84    // 0 - constructor
85    //----------------------------------
86
87    //Test case 0.0: test constructor and release
88    @LargeTest
89    public void test0_0ConstructorAndRelease() throws Exception {
90        boolean result = false;
91        String msg = "test1_0ConstructorAndRelease()";
92        PresetReverb reverb = null;
93         try {
94            reverb = new PresetReverb(0, 0);
95            assertNotNull(msg + ": could not create PresetReverb", reverb);
96            try {
97                assertTrue(msg +": invalid effect ID", (reverb.getId() != 0));
98            } catch (IllegalStateException e) {
99                msg = msg.concat(": PresetReverb not initialized");
100            }
101            result = true;
102        } catch (IllegalArgumentException e) {
103            msg = msg.concat(": PresetReverb not found");
104        } catch (UnsupportedOperationException e) {
105            msg = msg.concat(": Effect library not loaded");
106        } finally {
107            if (reverb != null) {
108                reverb.release();
109            }
110        }
111        assertTrue(msg, result);
112    }
113
114    //-----------------------------------------------------------------
115    // 1 - get/set parameters
116    //----------------------------------
117
118    //Test case 1.0: test preset
119    @LargeTest
120    public void test1_0Preset() throws Exception {
121        boolean result = false;
122        String msg = "test1_0Preset()";
123        getReverb(0);
124        try {
125            mReverb.setPreset((short)PresetReverb.PRESET_LARGEROOM);
126            short preset = mReverb.getPreset();
127            assertEquals(msg +": got incorrect preset",
128                         (short)PresetReverb.PRESET_LARGEROOM,
129                         preset);
130            result = true;
131        } catch (IllegalArgumentException e) {
132            msg = msg.concat(": Bad parameter value");
133            loge(msg, "Bad parameter value");
134        } catch (UnsupportedOperationException e) {
135            msg = msg.concat(": get parameter() rejected");
136            loge(msg, "get parameter() rejected");
137        } catch (IllegalStateException e) {
138            msg = msg.concat("get parameter() called in wrong state");
139            loge(msg, "get parameter() called in wrong state");
140        } finally {
141            releaseReverb();
142        }
143        assertTrue(msg, result);
144    }
145
146    //Test case 1.1: test properties
147    @LargeTest
148    public void test1_1Properties() throws Exception {
149        boolean result = false;
150        String msg = "test1_1Properties()";
151        getReverb(0);
152        try {
153            PresetReverb.Settings settings = mReverb.getProperties();
154            short newPreset = (short)PresetReverb.PRESET_LARGEROOM;
155            if (settings.preset == (short)PresetReverb.PRESET_LARGEROOM) {
156                newPreset = (short)PresetReverb.PRESET_SMALLROOM;
157            }
158            String str = settings.toString();
159            settings = new PresetReverb.Settings(str);
160            settings.preset = newPreset;
161            mReverb.setProperties(settings);
162            settings = mReverb.getProperties();
163            assertEquals(msg +": setProperties failed", newPreset, settings.preset);
164            result = true;
165        } catch (IllegalArgumentException e) {
166            msg = msg.concat(": Bad parameter value");
167            loge(msg, "Bad parameter value");
168        } catch (UnsupportedOperationException e) {
169            msg = msg.concat(": get parameter() rejected");
170            loge(msg, "get parameter() rejected");
171        } catch (IllegalStateException e) {
172            msg = msg.concat("get parameter() called in wrong state");
173            loge(msg, "get parameter() called in wrong state");
174        } finally {
175            releaseReverb();
176        }
177        assertTrue(msg, result);
178    }
179
180    //-----------------------------------------------------------------
181    // 2 - Effect action
182    //----------------------------------
183
184    //Test case 2.0: test actual auxiliary reverb influence on sound
185    @LargeTest
186    public void test2_0AuxiliarySoundModification() throws Exception {
187        boolean result = false;
188        String msg = "test2_0AuxiliarySoundModification()";
189        EnergyProbe probe = null;
190        AudioEffect vc = null;
191        MediaPlayer mp = null;
192        AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
193        int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
194        am.setStreamVolume(AudioManager.STREAM_MUSIC,
195                           am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
196                           0);
197        getReverb(0);
198        try {
199            probe = new EnergyProbe(0);
200            // creating a volume controller on output mix ensures that ro.audio.silent mutes
201            // audio after the effects and not before
202            vc = new AudioEffect(
203                    AudioEffect.EFFECT_TYPE_NULL,
204                    UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
205                      0,
206                      0);
207            vc.setEnabled(true);
208
209            mp = new MediaPlayer();
210            mp.setDataSource(MediaNames.SINE_200_1000);
211            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
212            mp.attachAuxEffect(mReverb.getId());
213            mp.setAuxEffectSendLevel(1.0f);
214            mReverb.setPreset((short)PresetReverb.PRESET_PLATE);
215            mReverb.setEnabled(true);
216            mp.prepare();
217            mp.start();
218            Thread.sleep(1000);
219            mp.stop();
220            Thread.sleep(200);
221            // measure energy around 1kHz after media player was stopped for 200 ms
222            int energy1000 = probe.capture(1000);
223            assertTrue(msg + ": reverb has no effect", energy1000 > 0);
224            result = true;
225        } catch (IllegalArgumentException e) {
226            msg = msg.concat(": Bad parameter value");
227            loge(msg, "Bad parameter value");
228        } catch (UnsupportedOperationException e) {
229            msg = msg.concat(": get parameter() rejected");
230            loge(msg, "get parameter() rejected");
231        } catch (IllegalStateException e) {
232            msg = msg.concat("get parameter() called in wrong state");
233            loge(msg, "get parameter() called in wrong state");
234        } catch (InterruptedException e) {
235            loge(msg, "sleep() interrupted");
236        }
237        finally {
238            releaseReverb();
239            if (mp != null) {
240                mp.release();
241            }
242            if (vc != null) {
243                vc.release();
244            }
245            if (probe != null) {
246                probe.release();
247            }
248            am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
249        }
250        assertTrue(msg, result);
251    }
252
253    //Test case 2.1: test actual insert reverb influence on sound
254    @LargeTest
255    public void test2_1InsertSoundModification() throws Exception {
256        boolean result = false;
257        String msg = "test2_1InsertSoundModification()";
258        EnergyProbe probe = null;
259        AudioEffect vc = null;
260        MediaPlayer mp = null;
261        AudioEffect rvb = null;
262        AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
263        int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
264        am.setStreamVolume(AudioManager.STREAM_MUSIC,
265                           am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
266                           0);
267        try {
268            // creating a volume controller on output mix ensures that ro.audio.silent mutes
269            // audio after the effects and not before
270            vc = new AudioEffect(
271                    AudioEffect.EFFECT_TYPE_NULL,
272                    UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
273                      0,
274                      0);
275            vc.setEnabled(true);
276
277            mp = new MediaPlayer();
278            mp.setDataSource(MediaNames.SINE_200_1000);
279            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
280            getReverb(mp.getAudioSessionId());
281            mReverb.setPreset((short)PresetReverb.PRESET_PLATE);
282            mReverb.setEnabled(true);
283
284            // create reverb with UUID instead of PresetReverb constructor otherwise an auxiliary
285            // reverb will be chosen by the effect framework as we are on session 0
286            rvb = new AudioEffect(
287                        AudioEffect.EFFECT_TYPE_NULL,
288                        UUID.fromString("172cdf00-a3bc-11df-a72f-0002a5d5c51b"),
289                        0,
290                        0);
291
292            rvb.setParameter(PresetReverb.PARAM_PRESET, PresetReverb.PRESET_PLATE);
293            rvb.setEnabled(true);
294
295            // create probe after reverb so that it is chained behind the reverb in the
296            // effect chain
297            probe = new EnergyProbe(0);
298
299            mp.prepare();
300            mp.start();
301            Thread.sleep(1000);
302            mp.stop();
303            Thread.sleep(200);
304            // measure energy around 1kHz after media player was stopped for 200 ms
305            int energy1000 = probe.capture(1000);
306            assertTrue(msg + ": reverb has no effect", energy1000 > 0);
307            result = true;
308        } catch (IllegalArgumentException e) {
309            msg = msg.concat(": Bad parameter value");
310            loge(msg, "Bad parameter value");
311        } catch (UnsupportedOperationException e) {
312            msg = msg.concat(": get parameter() rejected");
313            loge(msg, "get parameter() rejected");
314        } catch (IllegalStateException e) {
315            msg = msg.concat("get parameter() called in wrong state");
316            loge(msg, "get parameter() called in wrong state");
317        } catch (InterruptedException e) {
318            loge(msg, "sleep() interrupted");
319        }
320        finally {
321            releaseReverb();
322            if (mp != null) {
323                mp.release();
324            }
325            if (vc != null) {
326                vc.release();
327            }
328            if (rvb != null) {
329                rvb.release();
330            }
331            if (probe != null) {
332                probe.release();
333            }
334            am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
335        }
336        assertTrue(msg, result);
337    }
338
339    //-----------------------------------------------------------------
340    // private methods
341    //----------------------------------
342
343    private void getReverb(int session) {
344         if (mReverb == null || session != mSession) {
345             if (session != mSession && mReverb != null) {
346                 mReverb.release();
347                 mReverb = null;
348             }
349             try {
350                mReverb = new PresetReverb(0, session);
351                mSession = session;
352            } catch (IllegalArgumentException e) {
353                Log.e(TAG, "getReverb() PresetReverb not found exception: "+e);
354            } catch (UnsupportedOperationException e) {
355                Log.e(TAG, "getReverb() Effect library not loaded exception: "+e);
356            }
357         }
358         assertNotNull("could not create mReverb", mReverb);
359    }
360
361    private void releaseReverb() {
362        if (mReverb != null) {
363            mReverb.release();
364            mReverb = null;
365        }
366   }
367
368}
369