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