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.EditText;
322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.SeekBar;
332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.ToggleButton;
342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.CompoundButton;
352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.CompoundButton.OnCheckedChangeListener;
362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.nio.ByteOrder;
372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.nio.ByteBuffer;
382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.util.HashMap;
392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.util.Map;
402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.media.audiofx.PresetReverb;
422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.media.audiofx.AudioEffect;
432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenpublic class PresetReverbTest extends Activity implements OnCheckedChangeListener {
452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private final static String TAG = "PresetReverbTest";
472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private static int NUM_PARAMS = 1;
492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private EffectParameter[] mParameters = new EffectParameter[NUM_PARAMS];
512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private PresetReverb mPresetReverb;
522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    ToggleButton mOnOffButton;
532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    ToggleButton mReleaseButton;
542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    EditText mSessionText;
552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    static int sSession = 0;
562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    EffectListner mEffectListener = new EffectListner();
572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private static HashMap<Integer, PresetReverb> sInstances = new HashMap<Integer, PresetReverb>(10);
582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    String mSettings = "";
592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public PresetReverbTest() {
612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        Log.d(TAG, "contructor");
622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private static String[] sPresetNames = {
652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        "NONE",         //PresetReverb.PRESET_NONE
662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        "SMALLROOM",    //PresetReverb.PRESET_SMALLROOM
672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        "MEDIUMROOM",   //PresetReverb.PRESET_MEDIUMROOM
682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        "LARGEROOM",    //PresetReverb.PRESET_LARGEROOM
692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        "MEDIUMHALL",   //PresetReverb.PRESET_MEDIUMHALL
702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        "LARGEHALL",    //PresetReverb.PRESET_LARGEHALL
712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        "PLATE",        //PresetReverb.PRESET_PLATE
722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    };
732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    @Override
752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onCreate(Bundle icicle) {
762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        super.onCreate(icicle);
772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        setContentView(R.layout.presetreverbtest);
792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSessionText = (EditText) findViewById(R.id.sessionEdit);
812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSessionText.setOnKeyListener(mSessionKeyListener);
822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSessionText.setText(Integer.toString(sSession));
842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mReleaseButton = (ToggleButton)findViewById(R.id.presetrvbReleaseButton);
862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mOnOffButton = (ToggleButton)findViewById(R.id.presetrvbOnOff);
872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        getEffect(sSession);
892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (mPresetReverb != null) {
912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mReleaseButton.setOnCheckedChangeListener(this);
922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mOnOffButton.setOnCheckedChangeListener(this);
932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            // Presets
942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            SeekBar seekBar = (SeekBar)findViewById(R.id.presetrvbParam1SeekBar);
952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            TextView textView = (TextView)findViewById(R.id.presetrvbParam1Value);
962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[0] = new PresetParam(mPresetReverb, (short)0, (short)(sPresetNames.length - 1), seekBar, textView);
972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            seekBar.setOnSeekBarChangeListener(mParameters[0]);
982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    @Override
1022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onResume() {
1032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        super.onResume();
1042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    @Override
1072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onPause() {
1082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        super.onPause();
1092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private View.OnKeyListener mSessionKeyListener
1122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    = new View.OnKeyListener() {
1132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public boolean onKey(View v, int keyCode, KeyEvent event) {
1142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (event.getAction() == KeyEvent.ACTION_DOWN) {
1152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                switch (keyCode) {
1162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    case KeyEvent.KEYCODE_DPAD_CENTER:
1172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    case KeyEvent.KEYCODE_ENTER:
1182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        try {
1192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                            sSession = Integer.parseInt(mSessionText.getText().toString());
1202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                            getEffect(sSession);
1212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                            if (mPresetReverb != null) {
1222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                                for (int i = 0 ; i < mParameters.length; i++) {
1232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                                    mParameters[i].setEffect(mPresetReverb);
1242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                                    mParameters[i].setEnabled(true);
1252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                                    mParameters[i].updateDisplay();
1262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                                }
1272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                            }
1282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        } catch (NumberFormatException e) {
1292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                            Log.d(TAG, "Invalid session #: "+mSessionText.getText().toString());
1302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        }
1312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        return true;
1332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
1342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
1352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return false;
1362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    };
1382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    // OnCheckedChangeListener
1402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (buttonView.getId() == R.id.presetrvbOnOff) {
1422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mPresetReverb != null) {
1432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mPresetReverb.setEnabled(isChecked);
1442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                updateParams();
1452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
1462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (buttonView.getId() == R.id.presetrvbReleaseButton) {
1482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (isChecked) {
1492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                if (mPresetReverb == null) {
1502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    getEffect(sSession);
1512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    if (mPresetReverb != null) {
1522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        for (int i = 0 ; i < mParameters.length; i++) {
1532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                            mParameters[i].setEffect(mPresetReverb);
1542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                            mParameters[i].setEnabled(true);
1552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                            mParameters[i].updateDisplay();
1562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        }
1572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    }
1582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
1592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            } else {
1602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                if (mPresetReverb != null) {
1612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    for (int i = 0 ; i < mParameters.length; i++) {
1622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                        mParameters[i].setEnabled(false);
1632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    }
1642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    putEffect(sSession);
1652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
1662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
1672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private class PresetParam extends EffectParameter {
1712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        private PresetReverb mPresetReverb;
1722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public PresetParam(PresetReverb presetrvb, short min, short max, SeekBar seekBar, TextView textView) {
1742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            super (min, max, seekBar, textView, "");
1752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mPresetReverb = presetrvb;
1772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            updateDisplay();
1782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
1812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setParameter(Integer value) {
1822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mPresetReverb != null) {
1832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mPresetReverb.setPreset(value.shortValue());
1842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
1852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
1882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public Integer getParameter() {
1892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mPresetReverb != null) {
1902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                return new Integer(mPresetReverb.getPreset());
1912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
1922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return new Integer(0);
1932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
1962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void displayValue(int value, boolean fromTouch) {
1972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mValueText.setText(sPresetNames[value]);
1982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (!fromTouch) {
1992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mSeekBar.setProgress(value - mMin);
2002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            } else {
2012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                updateParams();
2022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
2032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        @Override
2062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void setEffect(Object presetrvb) {
2072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mPresetReverb = (PresetReverb)presetrvb;
2082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    protected void updateParams() {
2132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        for (int i = 0 ; i < mParameters.length; i++) {
2142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mParameters[i].updateDisplay();
2152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public class EffectListner implements AudioEffect.OnEnableStatusChangeListener,
2192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    AudioEffect.OnControlStatusChangeListener,
2202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    PresetReverb.OnParameterChangeListener
2212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen   {
2222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public EffectListner() {
2232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void onEnableStatusChange(AudioEffect effect, boolean enabled) {
2252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            Log.d(TAG,"onEnableStatusChange: "+ enabled);
2262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void onControlStatusChange(AudioEffect effect, boolean controlGranted) {
2282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            Log.d(TAG,"onControlStatusChange: "+ controlGranted);
2292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        public void onParameterChange(PresetReverb effect, int status, int param, short value) {
2322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            Log.d(TAG,"onParameterChange, status: "+status+" p: "+param+" v: "+value);
2332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        private int byteArrayToInt(byte[] valueBuf, int offset) {
2362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            ByteBuffer converter = ByteBuffer.wrap(valueBuf);
2372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            converter.order(ByteOrder.nativeOrder());
2382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return converter.getInt(offset);
2392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        private short byteArrayToShort(byte[] valueBuf, int offset) {
2422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            ByteBuffer converter = ByteBuffer.wrap(valueBuf);
2432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            converter.order(ByteOrder.nativeOrder());
2442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return converter.getShort(offset);
2452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private void getEffect(int session) {
2502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        synchronized (sInstances) {
2512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (sInstances.containsKey(session)) {
2522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mPresetReverb = sInstances.get(session);
2532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            } else {
2542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                try{
2552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    mPresetReverb = new PresetReverb(0, session);
2562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                } catch (IllegalArgumentException e) {
2572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    Log.e(TAG,"PresetReverb effect not supported");
2582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                } catch (UnsupportedOperationException e) {
2592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    Log.e(TAG,"PresetReverb library not loaded");
2602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                } catch (RuntimeException e) {
2612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                    Log.e(TAG,"PresetReverb effect not found");
2622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                }
2632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                sInstances.put(session, mPresetReverb);
2642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
2652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mReleaseButton.setEnabled(false);
2672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mOnOffButton.setEnabled(false);
2682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (mPresetReverb != null) {
2702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mSettings != "") {
2712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mPresetReverb.setProperties(new PresetReverb.Settings(mSettings));
2722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
2732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mPresetReverb.setEnableStatusListener(mEffectListener);
2742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mPresetReverb.setControlStatusListener(mEffectListener);
2752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mPresetReverb.setParameterListener(mEffectListener);
2762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mReleaseButton.setChecked(true);
2782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mReleaseButton.setEnabled(true);
2792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mOnOffButton.setChecked(mPresetReverb.getEnabled());
2812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mOnOffButton.setEnabled(true);
2822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
2852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private void putEffect(int session) {
2862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mOnOffButton.setChecked(false);
2872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mOnOffButton.setEnabled(false);
2882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        synchronized (sInstances) {
2892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            if (mPresetReverb != null) {
2902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mSettings = mPresetReverb.getProperties().toString();
2912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mPresetReverb.release();
2922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                Log.d(TAG,"PresetReverb released");
2932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                mPresetReverb = null;
2942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                sInstances.remove(session);
2952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            }
2962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
2972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
2982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen}
299