1d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi/* 2d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Copyright (C) 2013 The Android Open Source Project 3d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * 4d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * you may not use this file except in compliance with the License. 6d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * You may obtain a copy of the License at 7d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * 8d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * 10d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * See the License for the specific language governing permissions and 14d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * limitations under the License. 15d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 16d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 17d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivipackage android.media.audiofx; 18d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 19d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Triviimport android.media.AudioTrack; 20d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Triviimport android.media.MediaPlayer; 21d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Triviimport android.media.audiofx.AudioEffect; 22d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Triviimport android.util.Log; 23d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 24d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Triviimport java.util.StringTokenizer; 25d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 26d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 27d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi/** 28d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * LoudnessEnhancer is an audio effect for increasing audio loudness. 29d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * The processing is parametrized by a target gain value, which determines the maximum amount 30d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * by which an audio signal will be amplified; signals amplified outside of the sample 31d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * range supported by the platform are compressed. 32d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * An application creates a LoudnessEnhancer object to instantiate and control a 33d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * this audio effect in the audio framework. 34d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * To attach the LoudnessEnhancer to a particular AudioTrack or MediaPlayer, 35d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * specify the audio session ID of this AudioTrack or MediaPlayer when constructing the effect 36d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * (see {@link AudioTrack#getAudioSessionId()} and {@link MediaPlayer#getAudioSessionId()}). 37d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 38d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 39d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivipublic class LoudnessEnhancer extends AudioEffect { 40d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 41d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi private final static String TAG = "LoudnessEnhancer"; 42d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 43d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi // These parameter constants must be synchronized with those in 44d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi // /system/media/audio_effects/include/audio_effects/effect_loudnessenhancer.h 45d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 46d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * The maximum gain applied applied to the signal to process. 47d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * It is expressed in millibels (100mB = 1dB) where 0mB corresponds to no amplification. 48d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 49d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public static final int PARAM_TARGET_GAIN_MB = 0; 50d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 51d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 52d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Registered listener for parameter changes. 53d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 54d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi private OnParameterChangeListener mParamListener = null; 55d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 56d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 57d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Listener used internally to to receive raw parameter change events 58d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * from AudioEffect super class 59d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 60d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi private BaseParameterListener mBaseParamListener = null; 61d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 62d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 63d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Lock for access to mParamListener 64d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 65d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi private final Object mParamListenerLock = new Object(); 66d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 67d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 68d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Class constructor. 69d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param audioSession system-wide unique audio session identifier. The LoudnessEnhancer 70d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * will be attached to the MediaPlayer or AudioTrack in the same audio session. 71d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * 72d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws java.lang.IllegalStateException 73d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws java.lang.IllegalArgumentException 74d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws java.lang.UnsupportedOperationException 75d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws java.lang.RuntimeException 76d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 77d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public LoudnessEnhancer(int audioSession) 78d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throws IllegalStateException, IllegalArgumentException, 79d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi UnsupportedOperationException, RuntimeException { 80d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi super(EFFECT_TYPE_LOUDNESS_ENHANCER, EFFECT_TYPE_NULL, 0, audioSession); 81d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 82d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (audioSession == 0) { 83d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi Log.w(TAG, "WARNING: attaching a LoudnessEnhancer to global output mix is deprecated!"); 84d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 85d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 86d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 87d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 88d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @hide 89c3c0b9921fc35472c2cae5ddcd0248f364495965Jean-Michel Trivi * Class constructor for the LoudnessEnhancer audio effect. 90d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param priority the priority level requested by the application for controlling the 91d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * LoudnessEnhancer engine. As the same engine can be shared by several applications, 92d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * this parameter indicates how much the requesting application needs control of effect 93d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * parameters. The normal priority is 0, above normal is a positive number, below normal a 94d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * negative number. 95d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param audioSession system-wide unique audio session identifier. The LoudnessEnhancer 96d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * will be attached to the MediaPlayer or AudioTrack in the same audio session. 97d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * 98d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws java.lang.IllegalStateException 99d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws java.lang.IllegalArgumentException 100d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws java.lang.UnsupportedOperationException 101d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws java.lang.RuntimeException 102d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 103d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public LoudnessEnhancer(int priority, int audioSession) 104d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throws IllegalStateException, IllegalArgumentException, 105d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi UnsupportedOperationException, RuntimeException { 106d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi super(EFFECT_TYPE_LOUDNESS_ENHANCER, EFFECT_TYPE_NULL, priority, audioSession); 107d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 108d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (audioSession == 0) { 109d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi Log.w(TAG, "WARNING: attaching a LoudnessEnhancer to global output mix is deprecated!"); 110d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 111d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 112d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 113d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 114d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Set the target gain for the audio effect. 115d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * The target gain is the maximum value by which a sample value will be amplified when the 116d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * effect is enabled. 117d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param gainmB the effect target gain expressed in mB. 0mB corresponds to no amplification. 118d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalStateException 119d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalArgumentException 120d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws UnsupportedOperationException 121d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 122d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public void setTargetGain(int gainmB) 123d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 124d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi checkStatus(setParameter(PARAM_TARGET_GAIN_MB, gainmB)); 125d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 126d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 127d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 128d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Return the target gain. 129d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @return the effect target gain expressed in mB. 130d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalStateException 131d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalArgumentException 132d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws UnsupportedOperationException 133d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 134d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public float getTargetGain() 135d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 136d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi int[] value = new int[1]; 137d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi checkStatus(getParameter(PARAM_TARGET_GAIN_MB, value)); 138d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi return value[0]; 139d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 140d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 141d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 142d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @hide 143d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * The OnParameterChangeListener interface defines a method called by the LoudnessEnhancer 144d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * when a parameter value has changed. 145d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 146d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public interface OnParameterChangeListener { 147d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 148d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Method called when a parameter value has changed. The method is called only if the 149d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * parameter was changed by another application having the control of the same 150d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * LoudnessEnhancer engine. 151d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param effect the LoudnessEnhancer on which the interface is registered. 152d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param param ID of the modified parameter. See {@link #PARAM_GENERIC_PARAM1} ... 153d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param value the new parameter value. 154d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 155d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi void onParameterChange(LoudnessEnhancer effect, int param, int value); 156d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 157d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 158d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 159d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Listener used internally to receive unformatted parameter change events from AudioEffect 160d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * super class. 161d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 162d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi private class BaseParameterListener implements AudioEffect.OnParameterChangeListener { 163d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi private BaseParameterListener() { 164d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 165d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 166d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public void onParameterChange(AudioEffect effect, int status, byte[] param, byte[] value) { 167d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi // only notify when the parameter was successfully change 168d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (status != AudioEffect.SUCCESS) { 169d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi return; 170d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 171d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi OnParameterChangeListener l = null; 172d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi synchronized (mParamListenerLock) { 173d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (mParamListener != null) { 174d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi l = mParamListener; 175d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 176d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 177d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (l != null) { 178d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi int p = -1; 179d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi int v = Integer.MIN_VALUE; 180d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 181d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (param.length == 4) { 182d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi p = byteArrayToInt(param, 0); 183d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 184d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (value.length == 4) { 185d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi v = byteArrayToInt(value, 0); 186d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 187d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (p != -1 && v != Integer.MIN_VALUE) { 188d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi l.onParameterChange(LoudnessEnhancer.this, p, v); 189d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 190d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 191d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 192d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 193d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 194d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 195d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @hide 196d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Registers an OnParameterChangeListener interface. 197d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param listener OnParameterChangeListener interface registered 198d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 199d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public void setParameterListener(OnParameterChangeListener listener) { 200d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi synchronized (mParamListenerLock) { 201d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (mParamListener == null) { 202d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi mBaseParamListener = new BaseParameterListener(); 203d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi super.setParameterListener(mBaseParamListener); 204d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 205d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi mParamListener = listener; 206d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 207d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 208d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 209d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 210d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @hide 211d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * The Settings class regroups the LoudnessEnhancer parameters. It is used in 212d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * conjunction with the getProperties() and setProperties() methods to backup and restore 213d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * all parameters in a single call. 214d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 215d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public static class Settings { 216d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public int targetGainmB; 217d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 218d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public Settings() { 219d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 220d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 221d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 222d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Settings class constructor from a key=value; pairs formatted string. The string is 223d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * typically returned by Settings.toString() method. 224d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalArgumentException if the string is not correctly formatted. 225d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 226d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public Settings(String settings) { 227d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi StringTokenizer st = new StringTokenizer(settings, "=;"); 228d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi //int tokens = st.countTokens(); 229d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (st.countTokens() != 3) { 230d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throw new IllegalArgumentException("settings: " + settings); 231d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 232d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi String key = st.nextToken(); 233d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (!key.equals("LoudnessEnhancer")) { 234d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throw new IllegalArgumentException( 235d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi "invalid settings for LoudnessEnhancer: " + key); 236d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 237d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi try { 238d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi key = st.nextToken(); 239d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi if (!key.equals("targetGainmB")) { 240d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throw new IllegalArgumentException("invalid key name: " + key); 241d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 242d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi targetGainmB = Integer.parseInt(st.nextToken()); 243d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } catch (NumberFormatException nfe) { 244d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throw new IllegalArgumentException("invalid value for key: " + key); 245d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 246d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 247d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 248d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi @Override 249d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public String toString() { 250d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi String str = new String ( 251d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi "LoudnessEnhancer"+ 252d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi ";targetGainmB="+Integer.toString(targetGainmB) 253d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi ); 254d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi return str; 255d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 256d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi }; 257d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 258d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 259d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 260d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @hide 261d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Gets the LoudnessEnhancer properties. This method is useful when a snapshot of current 262d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * effect settings must be saved by the application. 263d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @return a LoudnessEnhancer.Settings object containing all current parameters values 264d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalStateException 265d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalArgumentException 266d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws UnsupportedOperationException 267d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 268d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public LoudnessEnhancer.Settings getProperties() 269d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 270d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi Settings settings = new Settings(); 271d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi int[] value = new int[1]; 272d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi checkStatus(getParameter(PARAM_TARGET_GAIN_MB, value)); 273d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi settings.targetGainmB = value[0]; 274d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi return settings; 275d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 276d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi 277d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi /** 278d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @hide 279d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * Sets the LoudnessEnhancer properties. This method is useful when bass boost settings 280d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * have to be applied from a previous backup. 281d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @param settings a LoudnessEnhancer.Settings object containing the properties to apply 282d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalStateException 283d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws IllegalArgumentException 284d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi * @throws UnsupportedOperationException 285d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi */ 286d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi public void setProperties(LoudnessEnhancer.Settings settings) 287d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 288d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi checkStatus(setParameter(PARAM_TARGET_GAIN_MB, settings.targetGainmB)); 289d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi } 290d69e4e14226258fd103d0b9c1c5b4d8529e6a3ecJean-Michel Trivi} 291