12e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen/*
22e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Copyright (C) 2009 The Android Open Source Project
32e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen *
42e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
52e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * you may not use this file except in compliance with the License.
62e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * You may obtain a copy of the License at
72e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen *
82e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
92e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen *
102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Unless required by applicable law or agreed to in writing, software
112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * See the License for the specific language governing permissions and
142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * limitations under the License.
152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen */
162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenpackage com.android.effectstest;
182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.app.Activity;
202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.content.Context;
212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.content.Intent;
222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.os.Bundle;
232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.util.Log;
242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.KeyEvent;
252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.Menu;
262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.View.OnClickListener;
272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.View;
282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.ViewGroup;
292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.Button;
302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.TextView;
312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.SeekBar;
322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.ToggleButton;
332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.CompoundButton;
342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.CompoundButton.OnCheckedChangeListener;
352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.ImageButton;
362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.ImageView;
372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.util.HashMap;
382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.util.Map;
392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.media.audiofx.EnvironmentalReverb;
412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.media.audiofx.AudioEffect;
422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.media.AudioManager;
432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenpublic class EnvReverbTest extends Activity implements OnCheckedChangeListener, SeekBar.OnSeekBarChangeListener {
452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private final static String TAG = "EnvReverbTest";
472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private static int NUM_PARAMS = 10;
492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private EffectParameter[] mParameters = new EffectParameter[NUM_PARAMS];
512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private EnvironmentalReverb mReverb;
522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    ToggleButton mOnOffButton;
532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    ToggleButton mReleaseButton;
542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    ToggleButton mAttachButton;
552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private static HashMap<Integer, EnvironmentalReverb> sInstances = new HashMap<Integer, EnvironmentalReverb>(10);
562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    static SimplePlayer sPlayerController = null;
572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    SeekBar mSendLevelSeekBar;
582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    TextView mSendLevelDisplay;
592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    static float sSendLevel = linToExp(50,100);
602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    static boolean sAttached = false;
612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    String mSettings = "";
622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public EnvReverbTest() {
642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        Log.d(TAG, "contructor");
652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    @Override
682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onCreate(Bundle icicle) {
692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        super.onCreate(icicle);
702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        Log.d(TAG, "onCreate");
712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        SeekBar seekBar;
722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        TextView textView;
732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        ToggleButton button;
742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        setContentView(R.layout.envreverbtest);
752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        ImageView playPause = (ImageView) findViewById(R.id.playPause1);
772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        ImageView stop = (ImageView) findViewById(R.id.stop1);
782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        textView = (TextView) findViewById(R.id.sessionText);
792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (sPlayerController == null) {
802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            sPlayerController = new SimplePlayer(this, R.id.playPause1, playPause,
812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    R.id.stop1, stop, textView,
822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    R.raw.mp3_sample, AudioManager.STREAM_MUSIC, 0);
832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        } else {
842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            sPlayerController.set(this, R.id.playPause1, playPause,
852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    R.id.stop1, stop, textView,
862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    AudioManager.STREAM_MUSIC, 0);
872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        // send level
902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSendLevelSeekBar = (SeekBar)findViewById(R.id.sendLevelSeekBar);
912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSendLevelDisplay = (TextView)findViewById(R.id.sendLevelValue);
922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSendLevelSeekBar.setMax(100);
932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSendLevelSeekBar.setOnSeekBarChangeListener(this);
942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSendLevelSeekBar.setProgress(expToLin(sSendLevel,100));
952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        sPlayerController.setAuxEffectSendLevel(sSendLevel);
962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mOnOffButton = (ToggleButton)findViewById(R.id.rvbOnOff);
982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mReleaseButton = (ToggleButton)findViewById(R.id.rvbReleaseButton);
992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mAttachButton = (ToggleButton)findViewById(R.id.attachButton);
1002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        getEffect(0);
1022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (mReverb != null) {
1042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mOnOffButton.setOnCheckedChangeListener(this);
1052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mReleaseButton.setOnCheckedChangeListener(this);
1062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mAttachButton.setOnCheckedChangeListener(this);
1072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//            button = (ToggleButton)findViewById(R.id.rvbBypass);
1092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//            button.setChecked(false);
1102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//            button.setOnCheckedChangeListener(this);
1112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Room level
1132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam1SeekBar);
1142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam1Value);
1152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[0] = new RoomLevelParam(mReverb, seekBar, textView);
1162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[0]);
1172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Room HF level
1192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam2SeekBar);
1202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam2Value);
1212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[1] = new RoomHFLevelParam(mReverb, seekBar, textView);
1222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[1]);
1232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Decay time
1252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam3SeekBar);
1262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam3Value);
1272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[2] = new DecayTimeParam(mReverb, seekBar, textView);
1282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[2]);
1292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Decay HF ratio
1312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam4SeekBar);
1322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam4Value);
1332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[3] = new DecayHFRatioParam(mReverb, seekBar, textView);
1342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[3]);
1352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Reflections level
1372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam5SeekBar);
1382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam5Value);
1392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[4] = new ReflectionsLevelParam(mReverb, seekBar, textView);
1402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[4]);
1412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Reflections delay
1432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam6SeekBar);
1442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam6Value);
1452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[5] = new ReflectionsDelayParam(mReverb, seekBar, textView);
1462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[5]);
1472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Reverb level
1492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam7SeekBar);
1502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam7Value);
1512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[6] = new ReverbLevelParam(mReverb, seekBar, textView);
1522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[6]);
1532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Reverb delay
1552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam8SeekBar);
1562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam8Value);
1572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[7] = new ReverbDelayParam(mReverb, seekBar, textView);
1582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[7]);
1592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Diffusion
1612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam9SeekBar);
1622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam9Value);
1632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[8] = new DiffusionParam(mReverb, seekBar, textView);
1642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[8]);
1652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Density
1672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar = (SeekBar)findViewById(R.id.rvbParam10SeekBar);
1682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            textView = (TextView)findViewById(R.id.rvbParam10Value);
1692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[9] = new DensityParam(mReverb, seekBar, textView);
1702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[9]);
1712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    @Override
1742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onResume() {
1752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        super.onResume();
1762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        Log.d(TAG, "onResume");
1772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    @Override
1802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onPause() {
1812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        super.onPause();
1822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    // OnCheckedChangeListener
1852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (buttonView.getId() == R.id.rvbOnOff) {
1872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
1882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setEnabled(isChecked);
1892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                Log.d(TAG,"onCheckedChanged: rvbOnOff");
1902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                for (int i = 0 ; i < mParameters.length; i++) {
1912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    mParameters[i].updateDisplay();
1922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
1932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
1942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (buttonView.getId() == R.id.rvbReleaseButton) {
1962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (isChecked) {
1972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                if (mReverb == null) {
1982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    getEffect(0);
1992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    for (int i = 0 ; i < mParameters.length; i++) {
2002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        mParameters[i].setEffect(mReverb);
2012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        mParameters[i].setEnabled(true);
2022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    }
2032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
2042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            } else {
2052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                if (mReverb != null) {
2062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    for (int i = 0 ; i < mParameters.length; i++) {
2072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        mParameters[i].setEnabled(false);
2082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    }
2092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    putEffect(0);
2102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
2112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
2122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//        if (buttonView.getId() == R.id.rvbBypass) {
2142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//            // REVERB_PARAM_BYPASS parametervalue is 11 in EffectEnvironmentalReverApi.h
2152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//            if (mReverb != null) {
2162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//                if (isChecked) {
2172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//                    mReverb.setParameter((int)11, (int)1);
2182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//                } else {
2192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//                    mReverb.setParameter((int)11, (int)0);
2202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//                }
2212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//            }
2222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen//        }
2232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (buttonView.getId() == R.id.attachButton) {
2242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
2252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                if (isChecked) {
2262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    sPlayerController.attachAuxEffect(mReverb.getId());
2272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    sAttached = true;
2282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                } else {
2292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    sPlayerController.attachAuxEffect(0);
2302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    sAttached = false;
2312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
2322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
2332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    // SeekBar.OnSeekBarChangeListener
2372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
2382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (seekBar != mSendLevelSeekBar) {
2402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            Log.e(TAG, "onProgressChanged called with wrong seekBar");
2412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return;
2422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        sSendLevel = linToExp(progress,100);
2452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (fromTouch) {
2462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            sPlayerController.setAuxEffectSendLevel(sSendLevel);
2472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        String text = Float.toString(sSendLevel);
2492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSendLevelDisplay.setText(text);
2502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (!fromTouch) {
2512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setProgress(progress);
2522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    static float linToExp(int lin, int range) {
2562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (lin == 0) return 0;
2572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        return (float)Math.pow((double)10,(double)72*(lin-range)/(20*range));
2582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    static int expToLin(float exp, int range) {
2612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (exp == 0) return 0;
2622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        return (int)(20*range*Math.log10((double)exp)/72 + range);
2632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onStartTrackingTouch(SeekBar seekBar) {
2662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onStopTrackingTouch(SeekBar seekBar) {
2692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class EnvReverbParam extends EffectParameter {
2722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        private EnvironmentalReverb mReverb;
2732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public EnvReverbParam(EnvironmentalReverb reverb, int min, int max, SeekBar seekBar, TextView textView, String unit) {
2752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (min, max, seekBar, textView, unit);
2762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mReverb = reverb;
2772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            updateDisplay();
2782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
2812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
2822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
2852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
2862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
2872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
2902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setEffect(Object reverb) {
2912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mReverb = (EnvironmentalReverb)reverb;
2922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class RoomLevelParam extends EnvReverbParam {
2962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public RoomLevelParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
2982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, -9600, 0, seekBar, textView, "mB");
2992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
3032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setRoomLevel(value.shortValue());
3052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
3102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return new Integer(mReverb.getRoomLevel());
3122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
3142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
3162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class RoomHFLevelParam extends EnvReverbParam {
3182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public RoomHFLevelParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
3202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, -4000, 0, seekBar, textView, "mB");
3212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
3252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setRoomHFLevel(value.shortValue());
3272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
3322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return new Integer(mReverb.getRoomHFLevel());
3342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
3362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
3382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class DecayTimeParam extends EnvReverbParam {
3402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public DecayTimeParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
3422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, 200, 4000, seekBar, textView, "ms");
3432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
3472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setDecayTime(value.intValue());
3492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
3542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return mReverb.getDecayTime();
3562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
3582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
3602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class DecayHFRatioParam extends EnvReverbParam {
3622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public DecayHFRatioParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
3642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, 100, 1000, seekBar, textView, "permilles");
3652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
3692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setDecayHFRatio(value.shortValue());
3712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
3762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return new Integer(mReverb.getDecayHFRatio());
3782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
3802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
3822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class ReflectionsLevelParam extends EnvReverbParam {
3842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public ReflectionsLevelParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
3862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, -9600, 0, seekBar, textView, "mB");
3872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
3912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setReflectionsLevel(value.shortValue());
3932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
3942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
3952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
3962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
3972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
3982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
3992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return new Integer(mReverb.getReflectionsLevel());
4002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
4022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
4042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class ReflectionsDelayParam extends EnvReverbParam {
4062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public ReflectionsDelayParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
4082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, 0, 65, seekBar, textView, "ms");
4092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
4122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
4132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
4142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setReflectionsDelay(value.intValue());
4152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
4192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
4202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
4212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return mReverb.getReflectionsDelay();
4222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
4242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
4262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class ReverbLevelParam extends EnvReverbParam {
4282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public ReverbLevelParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
4302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, -9600, 2000, seekBar, textView, "mB");
4312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
4342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
4352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
4362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setReverbLevel(value.shortValue());
4372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
4412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
4422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
4432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return new Integer(mReverb.getReverbLevel());
4442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
4462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
4482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class ReverbDelayParam extends EnvReverbParam {
4502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public ReverbDelayParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
4522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, 0, 65, seekBar, textView, "ms");
4532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
4562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
4572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
4582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setReverbDelay(value.intValue());
4592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
4632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
4642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
4652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return mReverb.getReverbDelay();
4662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
4682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
4702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class DiffusionParam extends EnvReverbParam {
4722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public DiffusionParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
4742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, 0, 1000, seekBar, textView, "permilles");
4752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
4782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
4792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
4802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setDiffusion(value.shortValue());
4812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
4852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
4862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
4872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return new Integer(mReverb.getDiffusion());
4882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
4892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
4902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
4922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class DensityParam extends EnvReverbParam {
4942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public DensityParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) {
4962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (reverb, 0, 1000, seekBar, textView, "permilles");
4972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
4982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
4992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
5002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
5012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
5022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setDensity(value.shortValue());
5032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
5042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
5052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
5062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
5072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
5082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
5092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return new Integer(mReverb.getDensity());
5102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
5112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
5122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
5132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
5142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
5152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private void getEffect(int session) {
5162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        synchronized (sInstances) {
5172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (sInstances.containsKey(session)) {
5182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb = sInstances.get(session);
5192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            } else {
5202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                try{
5212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    mReverb = new EnvironmentalReverb(0, session);
5222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                } catch (IllegalArgumentException e) {
5232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    Log.e(TAG,"Reverb effect not supported");
5242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                } catch (UnsupportedOperationException e) {
5252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    Log.e(TAG,"Reverb library not loaded");
5262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                } catch (RuntimeException e) {
5272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    Log.e(TAG,"Reverb effect not found");
5282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
5292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                Log.d(TAG, "new reverb: "+mReverb);
5302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                sInstances.put(session, mReverb);
5312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
5322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
5332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mReleaseButton.setEnabled(false);
5342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mOnOffButton.setEnabled(false);
5352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mAttachButton.setEnabled(false);
5362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (mReverb != null) {
5372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mSettings != "") {
5382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.setProperties(new EnvironmentalReverb.Settings(mSettings));
5392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
5402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mReleaseButton.setChecked(true);
5412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mReleaseButton.setEnabled(true);
5422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mOnOffButton.setChecked(mReverb.getEnabled());
5432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mOnOffButton.setEnabled(true);
5442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mAttachButton.setChecked(false);
5452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mAttachButton.setEnabled(true);
5462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (sAttached) {
5472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mAttachButton.setChecked(true);
5482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                sPlayerController.attachAuxEffect(mReverb.getId());
5492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
5502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
5512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
5522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
5532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private void putEffect(int session) {
5542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mOnOffButton.setChecked(false);
5552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mOnOffButton.setEnabled(false);
5562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mAttachButton.setChecked(false);
5572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mAttachButton.setEnabled(false);
5582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        synchronized (sInstances) {
5592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mReverb != null) {
5602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mSettings = mReverb.getProperties().toString();
5612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb.release();
5622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                Log.d(TAG,"Reverb released, settings: "+mSettings);
5632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mReverb = null;
5642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                sInstances.remove(session);
5652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
5662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
5672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
5682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen}
569