1/* 2 * Copyright (C) 2015 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 android.media.tests; 18 19import android.content.Context; 20import android.media.AudioAttributes; 21import android.media.AudioFormat; 22import android.media.AudioManager; 23import android.media.AudioPatch; 24import android.media.AudioPort; 25import android.media.audiopolicy.AudioMix; 26import android.media.audiopolicy.AudioMixingRule; 27import android.media.audiopolicy.AudioPolicy; 28import android.os.Handler; 29import android.os.Looper; 30import android.test.AndroidTestCase; 31import android.test.suitebuilder.annotation.MediumTest; 32import android.util.Log; 33 34import java.util.ArrayList; 35import java.util.concurrent.Semaphore; 36import java.util.concurrent.TimeUnit; 37 38@MediumTest 39public class AudioPolicyTest extends AndroidTestCase { 40 private static final String TAG = AudioPolicyTest.class.getSimpleName(); 41 private static final long WAIT_TIMEOUT_MS = 1000; 42 private AudioManager mAudioManager; 43 private Handler mHandler; 44 45 @Override 46 protected void setUp() throws Exception { 47 super.setUp(); 48 mHandler = new Handler(Looper.getMainLooper()); 49 final Semaphore mWaitSemaphore = new Semaphore(0); 50 mHandler.post(new Runnable() { 51 @Override 52 public void run() { 53 mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 54 mWaitSemaphore.release(); 55 } 56 }); 57 assertTrue(mWaitSemaphore.tryAcquire(WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)); 58 } 59 60 public void testAudioPorts() throws Exception { 61 AudioPortUpdateListener listener = new AudioPortUpdateListener(); 62 mAudioManager.registerAudioPortUpdateListener(listener); 63 ArrayList<AudioPort> initialPorts = dumpAudioPorts("initial state"); 64 AudioMix mediaMix = createAudioMix(AudioAttributes.CONTENT_TYPE_UNKNOWN, 65 AudioAttributes.CONTENT_TYPE_MUSIC); 66 AudioPolicy audioPolicy = new AudioPolicy.Builder(getContext()) 67 .addMix(mediaMix) 68 .setLooper(Looper.getMainLooper()) 69 .build(); 70 mAudioManager.registerAudioPolicy(audioPolicy); 71 dumpAudioPorts("policy set"); 72 mAudioManager.unregisterAudioPolicyAsync(audioPolicy); 73 ArrayList<AudioPort> afterUnregisterPorts = dumpAudioPorts("policy unset"); 74 mAudioManager.unregisterAudioPortUpdateListener(listener); 75 } 76 77 private ArrayList<AudioPort> dumpAudioPorts(String msg) { 78 Log.i(TAG, msg + ", dump audio ports"); 79 ArrayList<AudioPort> ports = new ArrayList<>(); 80 assertEquals(AudioManager.SUCCESS, AudioManager.listAudioPorts(ports)); 81 for (AudioPort port : ports) { 82 Log.i(TAG, "port:" + port.toString() + " name:" + port.name()); 83 } 84 return ports; 85 } 86 87 private static AudioMix createAudioMix(int contentType, int usage) { 88 AudioAttributes.Builder audioAttributesBuilder = new AudioAttributes.Builder(); 89 audioAttributesBuilder.setContentType(contentType).setUsage(usage); 90 AudioAttributes audioAttributes = audioAttributesBuilder.build(); 91 AudioFormat audioFormat = new AudioFormat.Builder() 92 .setEncoding(AudioFormat.ENCODING_PCM_16BIT) 93 .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO) 94 .setSampleRate(48000) 95 .build(); 96 AudioMixingRule audioMixingRule = new AudioMixingRule.Builder() 97 .addRule(audioAttributes, AudioMixingRule.RULE_MATCH_ATTRIBUTE_USAGE) 98 .build(); 99 return new AudioMix.Builder(audioMixingRule) 100 .setFormat(audioFormat) 101 .build(); 102 } 103 104 private class AudioPortUpdateListener implements AudioManager.OnAudioPortUpdateListener { 105 106 @Override 107 public void onAudioPortListUpdate(AudioPort[] portList) { 108 Log.i(TAG, "onAudioPortListUpdate"); 109 for (AudioPort port : portList) { 110 Log.i(TAG, "port:" + port.toString() + " name:" + port.name()); 111 } 112 } 113 114 @Override 115 public void onAudioPatchListUpdate(AudioPatch[] patchList) { 116 Log.i(TAG, "onAudioPortListUpdate"); 117 for (AudioPatch patch : patchList) { 118 Log.i(TAG, "patch:" + patch.toString()); 119 } 120 } 121 122 @Override 123 public void onServiceDied() { 124 } 125 } 126} 127