MediaVirtualizerTest.java revision 1a5149e5d7f2dddc8b324f7695e69fd89af73c52
1441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent/*
2441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * Copyright (C) 2010 The Android Open Source Project
3441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent *
4441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * you may not use this file except in compliance with the License.
6441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * You may obtain a copy of the License at
7441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent *
8441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent *
10441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * Unless required by applicable law or agreed to in writing, software
11441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * See the License for the specific language governing permissions and
14441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * limitations under the License.
15441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent */
16441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
17441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentpackage com.android.mediaframeworktest.functional;
18441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
19441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport com.android.mediaframeworktest.MediaFrameworkTest;
20441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport com.android.mediaframeworktest.MediaNames;
21441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.content.Context;
22441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.content.res.AssetFileDescriptor;
231a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentimport android.media.audiofx.AudioEffect;
24441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.media.AudioManager;
251a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentimport android.media.audiofx.Virtualizer;
261a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentimport android.media.audiofx.Visualizer;
27441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.media.MediaPlayer;
28441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
29441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.os.Looper;
30441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.test.suitebuilder.annotation.LargeTest;
31441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.test.suitebuilder.annotation.MediumTest;
32441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.test.suitebuilder.annotation.Suppress;
33441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.test.ActivityInstrumentationTestCase2;
34441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport android.util.Log;
35441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
36441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport java.nio.ByteOrder;
37441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport java.nio.ByteBuffer;
38441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentimport java.util.UUID;
39441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
40441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent/**
41441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent * Junit / Instrumentation test case for the media AudioTrack api
42441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
43441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent */
44441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurentpublic class MediaVirtualizerTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
45441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private String TAG = "MediaVirtualizerTest";
46391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private final static int MIN_ENERGY_RATIO_2 = 3;
47441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private final static short TEST_STRENGTH = 500;
48ec1e9c7a441d6a8ba6206386a1fb43652f6bbd36Eric Laurent    private final static int TEST_VOLUME = 4;
49441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
50441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private Virtualizer mVirtualizer = null;
51441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private int mSession = -1;
52441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
53441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    public MediaVirtualizerTest() {
54441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
55441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
56441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
57441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    @Override
58441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    protected void setUp() throws Exception {
59441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent      super.setUp();
60441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
61441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
62441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    @Override
63441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    protected void tearDown() throws Exception {
64441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        super.tearDown();
65441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        releaseVirtualizer();
66441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
67441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
68441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private static void assumeTrue(String message, boolean cond) {
69441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        assertTrue("(assume)"+message, cond);
70441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
71441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
72441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private void log(String testName, String message) {
73441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        Log.v(TAG, "["+testName+"] "+message);
74441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
75441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
76441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private void loge(String testName, String message) {
77441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        Log.e(TAG, "["+testName+"] "+message);
78441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
79441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
80441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //-----------------------------------------------------------------
81441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    // VIRTUALIZER TESTS:
82441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //----------------------------------
83441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
84441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
85441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //-----------------------------------------------------------------
86441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    // 0 - constructor
87441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //----------------------------------
88441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
89441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //Test case 0.0: test constructor and release
90441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    @LargeTest
91441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    public void test0_0ConstructorAndRelease() throws Exception {
92441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        boolean result = false;
93441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        String msg = "test1_0ConstructorAndRelease()";
94441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        Virtualizer virtualizer = null;
95441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent         try {
96441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            virtualizer = new Virtualizer(0, 0);
97441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            assertNotNull(msg + ": could not create Virtualizer", virtualizer);
98441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            try {
99441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                assertTrue(msg +": invalid effect ID", (virtualizer.getId() != 0));
100441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            } catch (IllegalStateException e) {
101441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                msg = msg.concat(": Virtualizer not initialized");
102441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            }
103441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            result = true;
104441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (IllegalArgumentException e) {
105441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat(": Virtualizer not found");
106441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (UnsupportedOperationException e) {
107441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat(": Effect library not loaded");
108441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } finally {
109441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            if (virtualizer != null) {
110441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                virtualizer.release();
111441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            }
112441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        }
113441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        assertTrue(msg, result);
114441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
115441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
116441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
117441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //-----------------------------------------------------------------
118441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    // 1 - get/set parameters
119441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //----------------------------------
120441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
121441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //Test case 1.0: test strength
122441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    @LargeTest
123441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    public void test1_0Strength() throws Exception {
124441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        boolean result = false;
125441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        String msg = "test1_0Strength()";
126441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        getVirtualizer(0);
127441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        try {
128441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            if (mVirtualizer.getStrengthSupported()) {
129441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                mVirtualizer.setStrength((short)TEST_STRENGTH);
130441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                short strength = mVirtualizer.getRoundedStrength();
131441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                // allow 10% difference between set strength and rounded strength
132441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                assertTrue(msg +": got incorrect strength",
133441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                        ((float)strength > (float)TEST_STRENGTH * 0.9f) &&
134441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                        ((float)strength < (float)TEST_STRENGTH * 1.1f));
135441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            } else {
136441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                short strength = mVirtualizer.getRoundedStrength();
137441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                assertTrue(msg +": got incorrect strength", strength >= 0 && strength <= 1000);
138441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            }
139441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            result = true;
140441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (IllegalArgumentException e) {
141441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat(": Bad parameter value");
142441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "Bad parameter value");
143441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (UnsupportedOperationException e) {
144441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat(": get parameter() rejected");
145441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "get parameter() rejected");
146441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (IllegalStateException e) {
147441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
148441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "get parameter() called in wrong state");
149441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } finally {
150441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            releaseVirtualizer();
151441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        }
152441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        assertTrue(msg, result);
153441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
154441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
155441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //Test case 1.1: test properties
156441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    @LargeTest
157441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    public void test1_1Properties() throws Exception {
158441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        boolean result = false;
159441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        String msg = "test1_1Properties()";
160441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        getVirtualizer(0);
161441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        try {
162441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            Virtualizer.Settings settings = mVirtualizer.getProperties();
163441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            String str = settings.toString();
164441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            settings = new Virtualizer.Settings(str);
165441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mVirtualizer.setProperties(settings);
166441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            result = true;
167441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (IllegalArgumentException e) {
168441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat(": Bad parameter value");
169441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "Bad parameter value");
170441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (UnsupportedOperationException e) {
171441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat(": get parameter() rejected");
172441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "get parameter() rejected");
173441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (IllegalStateException e) {
174441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
175441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "get parameter() called in wrong state");
176441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } finally {
177441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            releaseVirtualizer();
178441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        }
179441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        assertTrue(msg, result);
180441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
181441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
182441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //-----------------------------------------------------------------
183441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    // 2 - Effect action
184441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //----------------------------------
185441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
186441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //Test case 2.0: test actual virtualizer influence on sound
187441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    @LargeTest
188441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    public void test2_0SoundModification() throws Exception {
189441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        boolean result = false;
190441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        String msg = "test2_0SoundModification()";
191441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        EnergyProbe probe = null;
192441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        AudioEffect vc = null;
193441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        MediaPlayer mp = null;
194441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
195441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
196441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        am.setStreamVolume(AudioManager.STREAM_MUSIC,
197ec1e9c7a441d6a8ba6206386a1fb43652f6bbd36Eric Laurent                           TEST_VOLUME,
198441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                           0);
199441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
200441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        try {
201441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            probe = new EnergyProbe(0);
202441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // creating a volume controller on output mix ensures that ro.audio.silent mutes
203441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // audio after the effects and not before
204441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            vc = new AudioEffect(
205441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                    AudioEffect.EFFECT_TYPE_NULL,
206441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                    UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
207441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                      0,
208441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                      0);
209441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            vc.setEnabled(true);
210441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
211441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mp = new MediaPlayer();
212441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mp.setDataSource(MediaNames.SINE_200_1000);
213441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
214441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            getVirtualizer(mp.getAudioSessionId());
215441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mp.prepare();
216441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mp.start();
217441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            Thread.sleep(200);
218441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // measure reference energy around 1kHz
219441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            int refEnergy200 = probe.capture(200);
220441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            int refEnergy1000 = probe.capture(1000);
221441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mVirtualizer.setStrength((short)1000);
222441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mVirtualizer.setEnabled(true);
223441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            Thread.sleep(500);
224441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // measure energy around 1kHz with band level at min
225441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            int energy200 = probe.capture(200);
226441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            int energy1000 = probe.capture(1000);
227441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // verify that the energy ration between low and high frequencies is at least
228391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // MIN_ENERGY_RATIO_2 times higher with virtualizer on.
229441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // NOTE: this is what is observed with current virtualizer implementation and the test
230441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // audio file but is not the primary effect of the virtualizer. A better way would
231441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // be to have a stereo PCM capture and check that a strongly paned input is centered
232441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            // when output. However, we cannot capture stereo with the visualizer.
233441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            assertTrue(msg + ": virtiualizer has no effect",
234441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                    ((float)energy200/(float)energy1000) >
235441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                    (MIN_ENERGY_RATIO_2 * ((float)refEnergy200/(float)refEnergy1000)));
236441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            result = true;
237441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (IllegalArgumentException e) {
238441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat(": Bad parameter value");
239441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "Bad parameter value");
240441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (UnsupportedOperationException e) {
241441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat(": get parameter() rejected");
242441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "get parameter() rejected");
243441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (IllegalStateException e) {
244441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
245441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "get parameter() called in wrong state");
246441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        } catch (InterruptedException e) {
247441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            loge(msg, "sleep() interrupted");
248441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        }
249441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        finally {
250441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            releaseVirtualizer();
251441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            if (mp != null) {
252441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                mp.release();
253441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            }
254441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            if (vc != null) {
255441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                vc.release();
256441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            }
257441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            if (probe != null) {
258441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                probe.release();
259441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            }
260441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
261441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        }
262441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        assertTrue(msg, result);
263441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
264441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //-----------------------------------------------------------------
265441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    // private methods
266441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    //----------------------------------
267441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
268441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private void getVirtualizer(int session) {
269441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent         if (mVirtualizer == null || session != mSession) {
270441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent             if (session != mSession && mVirtualizer != null) {
271441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                 mVirtualizer.release();
272441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                 mVirtualizer = null;
273441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent             }
274441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent             try {
275441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                mVirtualizer = new Virtualizer(0, session);
276441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                mSession = session;
277441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            } catch (IllegalArgumentException e) {
278441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                Log.e(TAG, "getVirtualizer() Virtualizer not found exception: "+e);
279441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            } catch (UnsupportedOperationException e) {
280441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent                Log.e(TAG, "getVirtualizer() Effect library not loaded exception: "+e);
281441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            }
282441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent         }
283441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent         assertNotNull("could not create mVirtualizer", mVirtualizer);
284441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    }
285441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
286441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent    private void releaseVirtualizer() {
287441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        if (mVirtualizer != null) {
288441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mVirtualizer.release();
289441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent            mVirtualizer = null;
290441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent        }
291441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent   }
292441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
293441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent}
294441ec6bd106a6ac09ff0ceed1f8d437c33cfc156Eric Laurent
295