MediaEqualizerTest.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.Equalizer;
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 MediaEqualizerTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
46    private String TAG = "MediaEqualizerTest";
47    private final static int MIN_NUMBER_OF_BANDS = 4;
48    private final static int MIN_BAND_LEVEL = -1500;
49    private final static int MAX_BAND_LEVEL = 1500;
50    private final static int TEST_FREQUENCY_MILLIHERTZ = 1000000;
51    private final static int MIN_NUMBER_OF_PRESETS = 4;
52    private final static int TEST_VOLUME = 4;
53    private Equalizer mEqualizer = null;
54    private int mSession = -1;
55
56    public MediaEqualizerTest() {
57        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
58    }
59
60    @Override
61    protected void setUp() throws Exception {
62      super.setUp();
63    }
64
65    @Override
66    protected void tearDown() throws Exception {
67        super.tearDown();
68        releaseEqualizer();
69    }
70
71    private static void assumeTrue(String message, boolean cond) {
72        assertTrue("(assume)"+message, cond);
73    }
74
75    private void log(String testName, String message) {
76        Log.v(TAG, "["+testName+"] "+message);
77    }
78
79    private void loge(String testName, String message) {
80        Log.e(TAG, "["+testName+"] "+message);
81    }
82
83    //-----------------------------------------------------------------
84    // EQUALIZER TESTS:
85    //----------------------------------
86
87
88    //-----------------------------------------------------------------
89    // 0 - constructor
90    //----------------------------------
91
92    //Test case 0.0: test constructor and release
93    @LargeTest
94    public void test0_0ConstructorAndRelease() throws Exception {
95        boolean result = false;
96        String msg = "test1_0ConstructorAndRelease()";
97        Equalizer eq = null;
98         try {
99            eq = new Equalizer(0, 0);
100            assertNotNull(msg + ": could not create Equalizer", eq);
101            try {
102                assertTrue(msg +": invalid effect ID", (eq.getId() != 0));
103            } catch (IllegalStateException e) {
104                msg = msg.concat(": Equalizer not initialized");
105            }
106            result = true;
107        } catch (IllegalArgumentException e) {
108            msg = msg.concat(": Equalizer not found");
109        } catch (UnsupportedOperationException e) {
110            msg = msg.concat(": Effect library not loaded");
111        } finally {
112            if (eq != null) {
113                eq.release();
114            }
115        }
116        assertTrue(msg, result);
117    }
118
119
120    //-----------------------------------------------------------------
121    // 1 - get/set parameters
122    //----------------------------------
123
124    //Test case 1.0: test setBandLevel() and getBandLevel()
125    @LargeTest
126    public void test1_0BandLevel() throws Exception {
127        boolean result = false;
128        String msg = "test1_0BandLevel()";
129        getEqualizer(0);
130        try {
131            short numBands = mEqualizer.getNumberOfBands();
132            assertTrue(msg + ": not enough bands", numBands >= MIN_NUMBER_OF_BANDS);
133
134            short[] levelRange = mEqualizer.getBandLevelRange();
135            assertTrue(msg + ": min level too high", levelRange[0] <= MIN_BAND_LEVEL);
136            assertTrue(msg + ": max level too low", levelRange[1] >= MAX_BAND_LEVEL);
137
138            mEqualizer.setBandLevel((short)0, levelRange[1]);
139            short level = mEqualizer.getBandLevel((short)0);
140            // 10% margin on actual level compared to requested level
141            assertTrue(msg + ": setBandLevel failed",
142                    ((float)level > (float)levelRange[1] * 0.9f) &&
143                    ((float)level < (float)levelRange[1] * 1.1f));
144            result = true;
145        } catch (IllegalArgumentException e) {
146            msg = msg.concat(": Bad parameter value");
147            loge(msg, "Bad parameter value");
148        } catch (UnsupportedOperationException e) {
149            msg = msg.concat(": get parameter() rejected");
150            loge(msg, "get parameter() rejected");
151        } catch (IllegalStateException e) {
152            msg = msg.concat("get parameter() called in wrong state");
153            loge(msg, "get parameter() called in wrong state");
154        } finally {
155            releaseEqualizer();
156        }
157        assertTrue(msg, result);
158    }
159
160    //Test case 1.1: test band frequency
161    @LargeTest
162    public void test1_1BandFrequency() throws Exception {
163        boolean result = false;
164        String msg = "test1_1BandFrequency()";
165        getEqualizer(0);
166        try {
167            short band = mEqualizer.getBand(TEST_FREQUENCY_MILLIHERTZ);
168            assertTrue(msg + ": getBand failed", band >= 0);
169            int[] freqRange = mEqualizer.getBandFreqRange(band);
170            assertTrue(msg + ": getBandFreqRange failed",
171                    (freqRange[0] <= TEST_FREQUENCY_MILLIHERTZ) &&
172                    (freqRange[1] >= TEST_FREQUENCY_MILLIHERTZ));
173            int freq = mEqualizer.getCenterFreq(band);
174            assertTrue(msg + ": getCenterFreq failed",
175                    (freqRange[0] <= freq) && (freqRange[1] >= freq));
176            result = true;
177        } catch (IllegalArgumentException e) {
178            msg = msg.concat(": Bad parameter value");
179            loge(msg, "Bad parameter value");
180        } catch (UnsupportedOperationException e) {
181            msg = msg.concat(": get parameter() rejected");
182            loge(msg, "get parameter() rejected");
183        } catch (IllegalStateException e) {
184            msg = msg.concat("get parameter() called in wrong state");
185            loge(msg, "get parameter() called in wrong state");
186        } finally {
187            releaseEqualizer();
188        }
189        assertTrue(msg, result);
190    }
191
192    //Test case 1.2: test presets
193    @LargeTest
194    public void test1_2Presets() throws Exception {
195        boolean result = false;
196        String msg = "test1_2Presets()";
197        getEqualizer(0);
198        try {
199            short numPresets = mEqualizer.getNumberOfPresets();
200            assertTrue(msg + ": getNumberOfPresets failed", numPresets >= MIN_NUMBER_OF_PRESETS);
201            mEqualizer.usePreset((short)(numPresets - 1));
202            short preset = mEqualizer.getCurrentPreset();
203            assertEquals(msg + ": usePreset failed", preset, (short)(numPresets - 1));
204            String name = mEqualizer.getPresetName(preset);
205            assertNotNull(msg + ": getPresetName failed", name);
206            result = true;
207        } catch (IllegalArgumentException e) {
208            msg = msg.concat(": Bad parameter value");
209            loge(msg, "Bad parameter value");
210        } catch (UnsupportedOperationException e) {
211            msg = msg.concat(": get parameter() rejected");
212            loge(msg, "get parameter() rejected");
213        } catch (IllegalStateException e) {
214            msg = msg.concat("get parameter() called in wrong state");
215            loge(msg, "get parameter() called in wrong state");
216        } finally {
217            releaseEqualizer();
218        }
219        assertTrue(msg, result);
220    }
221
222    //Test case 1.3: test properties
223    @LargeTest
224    public void test1_3Properties() throws Exception {
225        boolean result = false;
226        String msg = "test1_3Properties()";
227        getEqualizer(0);
228        try {
229            Equalizer.Settings settings = mEqualizer.getProperties();
230            String str = settings.toString();
231            settings = new Equalizer.Settings(str);
232            mEqualizer.setProperties(settings);
233            result = true;
234        } catch (IllegalArgumentException e) {
235            msg = msg.concat(": Bad parameter value");
236            loge(msg, "Bad parameter value");
237        } catch (UnsupportedOperationException e) {
238            msg = msg.concat(": get parameter() rejected");
239            loge(msg, "get parameter() rejected");
240        } catch (IllegalStateException e) {
241            msg = msg.concat("get parameter() called in wrong state");
242            loge(msg, "get parameter() called in wrong state");
243        } finally {
244            releaseEqualizer();
245        }
246        assertTrue(msg, result);
247    }
248
249    //-----------------------------------------------------------------
250    // 2 - Effect action
251    //----------------------------------
252
253    //Test case 2.0: test that the equalizer actually alters the sound
254    @LargeTest
255    public void test2_0SoundModification() throws Exception {
256        boolean result = false;
257        String msg = "test2_0SoundModification()";
258        EnergyProbe probe = null;
259        AudioEffect vc = null;
260        MediaPlayer mp = null;
261        AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
262        int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
263        am.setStreamVolume(AudioManager.STREAM_MUSIC,
264                           TEST_VOLUME,
265                           0);
266        try {
267            probe = new EnergyProbe(0);
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            getEqualizer(mp.getAudioSessionId());
281            mp.prepare();
282            mp.start();
283            Thread.sleep(500);
284            // measure reference energy around 1kHz
285            int refEnergy = probe.capture(1000);
286            short band = mEqualizer.getBand(1000000);
287            short[] levelRange = mEqualizer.getBandLevelRange();
288            mEqualizer.setBandLevel(band, levelRange[0]);
289            mEqualizer.setEnabled(true);
290            Thread.sleep(500);
291            // measure energy around 1kHz with band level at min
292            int energy = probe.capture(1000);
293            assertTrue(msg + ": equalizer has no effect at 1kHz", energy < refEnergy/4);
294            result = true;
295        } catch (IllegalArgumentException e) {
296            msg = msg.concat(": Bad parameter value");
297            loge(msg, "Bad parameter value");
298        } catch (UnsupportedOperationException e) {
299            msg = msg.concat(": get parameter() rejected");
300            loge(msg, "get parameter() rejected");
301        } catch (IllegalStateException e) {
302            msg = msg.concat("get parameter() called in wrong state");
303            loge(msg, "get parameter() called in wrong state");
304        } catch (InterruptedException e) {
305            loge(msg, "sleep() interrupted");
306        }
307        finally {
308            releaseEqualizer();
309            if (mp != null) {
310                mp.release();
311            }
312            if (vc != null) {
313                vc.release();
314            }
315            if (probe != null) {
316                probe.release();
317            }
318            am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
319        }
320        assertTrue(msg, result);
321    }
322
323    //-----------------------------------------------------------------
324    // private methods
325    //----------------------------------
326
327    private void getEqualizer(int session) {
328         if (mEqualizer == null || session != mSession) {
329             if (session != mSession && mEqualizer != null) {
330                 mEqualizer.release();
331                 mEqualizer = null;
332             }
333             try {
334                mEqualizer = new Equalizer(0, session);
335                mSession = session;
336            } catch (IllegalArgumentException e) {
337                Log.e(TAG, "getEqualizer() Equalizer not found exception: "+e);
338            } catch (UnsupportedOperationException e) {
339                Log.e(TAG, "getEqualizer() Effect library not loaded exception: "+e);
340            }
341         }
342         assertNotNull("could not create mEqualizer", mEqualizer);
343    }
344
345    private void releaseEqualizer() {
346        if (mEqualizer != null) {
347            mEqualizer.release();
348            mEqualizer = null;
349        }
350   }
351
352}
353