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
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    // private methods
251    //----------------------------------
252
253    private void getEqualizer(int session) {
254         if (mEqualizer == null || session != mSession) {
255             if (session != mSession && mEqualizer != null) {
256                 mEqualizer.release();
257                 mEqualizer = null;
258             }
259             try {
260                mEqualizer = new Equalizer(0, session);
261                mSession = session;
262            } catch (IllegalArgumentException e) {
263                Log.e(TAG, "getEqualizer() Equalizer not found exception: "+e);
264            } catch (UnsupportedOperationException e) {
265                Log.e(TAG, "getEqualizer() Effect library not loaded exception: "+e);
266            }
267         }
268         assertNotNull("could not create mEqualizer", mEqualizer);
269    }
270
271    private void releaseEqualizer() {
272        if (mEqualizer != null) {
273            mEqualizer.release();
274            mEqualizer = null;
275        }
276   }
277
278}
279