diff options
| author | Christos Papageorgiou <root.expert.xda@gmail.com> | 2020-04-22 13:55:16 +0300 |
|---|---|---|
| committer | Christos Papageorgiou <root.expert.xda@gmail.com> | 2020-04-22 13:55:16 +0300 |
| commit | 89b2c81a0a32c4dc51e20b47d4f293f7afa976d4 (patch) | |
| tree | f616cf54e7054c7b5a6f3530fa943026435fa2cb | |
| parent | 4360cc9183531ce3de43eee146800279d11eca76 (diff) | |
JamesDSPManager: De-clutter HeadsetService a little bit.
Signed-off-by: Christos Papageorgiou <root.expert.xda@gmail.com>
Change-Id: I9d2349dd61a52e527a39235e142a8029c237ee26
| -rw-r--r-- | app/src/main/java/james/dsp/service/HeadsetService.java | 256 | ||||
| -rw-r--r-- | app/src/main/java/james/dsp/utils/ParameterUtils.java | 173 |
2 files changed, 220 insertions, 209 deletions
diff --git a/app/src/main/java/james/dsp/service/HeadsetService.java b/app/src/main/java/james/dsp/service/HeadsetService.java index 9a4ee95..4fe131c 100644 --- a/app/src/main/java/james/dsp/service/HeadsetService.java +++ b/app/src/main/java/james/dsp/service/HeadsetService.java @@ -33,6 +33,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; import james.dsp.activity.JdspImpResToolbox; +import james.dsp.utils.ParameterUtils; import static james.dsp.activity.DSPManager.NOTIFICATION_CHANNEL; import static james.dsp.activity.DSPManager.TAG; @@ -61,6 +62,7 @@ public class HeadsetService extends Service public class JDSPModule { AudioEffect JamesDSP; + ParameterUtils parameterUtils; JDSPModule(int sessionId) { try @@ -89,6 +91,8 @@ public class HeadsetService extends Service Toast.makeText(HeadsetService.this, "Effect load failed!\nTry re-enable audio effect in current player!", Toast.LENGTH_SHORT).show(); } } + + parameterUtils = new ParameterUtils(); } void release() @@ -96,173 +100,7 @@ public class HeadsetService extends Service JamesDSP.release(); } - private byte[] IntToByte(int[] input) - { - int int_index, byte_index; - int iterations = input.length; - byte[] buffer = new byte[input.length * 4]; - int_index = byte_index = 0; - for (; int_index != iterations;) - { - buffer[byte_index] = (byte)(input[int_index] & 0x00FF); - buffer[byte_index + 1] = (byte)((input[int_index] & 0xFF00) >> 8); - buffer[byte_index + 2] = (byte)((input[int_index] & 0xFF0000) >> 16); - buffer[byte_index + 3] = (byte)((input[int_index] & 0xFF000000) >> 24); - ++int_index; - byte_index += 4; - } - return buffer; - } - private int byteArrayToInt(byte[] encodedValue) - { - int value = (encodedValue[3] << 24); - value |= (encodedValue[2] & 0xFF) << 16; - value |= (encodedValue[1] & 0xFF) << 8; - value |= (encodedValue[0] & 0xFF); - return value; - } - private void setParameterIntArray(AudioEffect audioEffect, int parameter, int[] value) - { - try - { - byte[] arguments = new byte[] - { - (byte)(parameter), (byte)(parameter >> 8), - (byte)(parameter >> 16), (byte)(parameter >> 24) - }; - byte[] result = IntToByte(value); - Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); - setParameter.invoke(audioEffect, arguments, result); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - private void setParameterFloatArray(AudioEffect audioEffect, int parameter, float value[]) - { - try - { - byte[] arguments = new byte[] - { - (byte)(parameter), (byte)(parameter >> 8), - (byte)(parameter >> 16), (byte)(parameter >> 24) - }; - byte[] result = new byte[value.length * 4]; - ByteBuffer byteDataBuffer = ByteBuffer.wrap(result); - byteDataBuffer.order(ByteOrder.nativeOrder()); - for (int i = 0; i < value.length; i++) - byteDataBuffer.putFloat(value[i]); - Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); - setParameter.invoke(audioEffect, arguments, result); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - private byte[] concatArrays(byte[]... arrays) - { - int len = 0; - for (byte[] a : arrays) - len += a.length; - byte[] b = new byte[len]; - int offs = 0; - for (byte[] a : arrays) - { - System.arraycopy(a, 0, b, offs, a.length); - offs += a.length; - } - return b; - } - private void setParameterCharArray(AudioEffect audioEffect, int parameter, String value) - { - try - { - byte[] arguments = new byte[] - { - (byte)(parameter), (byte)(parameter >> 8), - (byte)(parameter >> 16), (byte)(parameter >> 24) - }; - byte[] result = value.getBytes(Charset.forName("US-ASCII")); - if (result.length < 256) - { - int zeroPad = 256 - result.length; - byte[] zeroArray = new byte[zeroPad]; - result = concatArrays(result, zeroArray); - zeroArray = null; - } - Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); - setParameter.invoke(audioEffect, arguments, result); - result = null; - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - private void setParameterInt(AudioEffect audioEffect, int parameter, int value) - { - try - { - byte[] arguments = new byte[] - { - (byte)(parameter), (byte)(parameter >> 8), - (byte)(parameter >> 16), (byte)(parameter >> 24) - }; - byte[] result = new byte[] - { - (byte)(value), (byte)(value >> 8), - (byte)(value >> 16), (byte)(value >> 24) - }; - Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); - setParameter.invoke(audioEffect, arguments, result); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - private void setParameterShort(AudioEffect audioEffect, int parameter, short value) - { - try - { - byte[] arguments = new byte[] - { - (byte)(parameter), (byte)(parameter >> 8), - (byte)(parameter >> 16), (byte)(parameter >> 24) - }; - byte[] result = new byte[] - { - (byte)(value), (byte)(value >> 8) - }; - Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); - setParameter.invoke(audioEffect, arguments, result); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - private int getParameter(AudioEffect audioEffect, int parameter) - { - try - { - byte[] arguments = new byte[] - { - (byte)(parameter), (byte)(parameter >> 8), - (byte)(parameter >> 16), (byte)(parameter >> 24) - }; - byte[] result = new byte[4]; - Method getParameter = AudioEffect.class.getMethod("getParameter", byte[].class, byte[].class); - getParameter.invoke(audioEffect, arguments, result); - return byteArrayToInt(result); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } + } public class LocalBinder extends Binder @@ -612,7 +450,7 @@ class StartUpOptimiserThread implements Runnable { String pid = ""; if (JamesDSPGbEf != null) - pid = " PID:" + JamesDSPGbEf.getParameter(JamesDSPGbEf.JamesDSP, 20002); + pid = " PID:" + JamesDSPGbEf.parameterUtils.getParameter(JamesDSPGbEf.JamesDSP, 20002); if (mode == "bluetooth") foregroundPersistent(getString(R.string.bluetooth_title) + pid); else if (mode == "headset") @@ -664,10 +502,10 @@ class StartUpOptimiserThread implements Runnable { int analogModelEnabled = preferences.getBoolean("dsp.analogmodelling.enable", false) ? 1 : 0; int viperddcEnabled = preferences.getBoolean("dsp.ddc.enable", false) ? 1 : 0; // int wavechild670Enabled = preferences.getBoolean("dsp.wavechild670.enable", false) ? 1 : 0; - dspModuleSamplingRate = session.getParameter(session.JamesDSP, 20000); + dspModuleSamplingRate = session.parameterUtils.getParameter(session.JamesDSP, 20000); if (dspModuleSamplingRate == 0) { - if (JamesDSPGbEf.getParameter(JamesDSPGbEf.JamesDSP, 20002) == 0) + if (JamesDSPGbEf.parameterUtils.getParameter(JamesDSPGbEf.JamesDSP, 20002) == 0) { Toast.makeText(HeadsetService.this, R.string.dspneedreboot, Toast.LENGTH_LONG).show(); return; @@ -675,43 +513,43 @@ class StartUpOptimiserThread implements Runnable { Toast.makeText(HeadsetService.this, R.string.dspcrashed, Toast.LENGTH_LONG).show(); return; } - int convolutionBenchmarkDataReady = session.getParameter(session.JamesDSP, 20003); + int convolutionBenchmarkDataReady = session.parameterUtils.getParameter(session.JamesDSP, 20003); if (convolutionBenchmarkDataReady == 0 && bench_c0[0] > 0.0f && bench_c1[0] > 0.0f) { - session.setParameterFloatArray(session.JamesDSP, 1997, bench_c0); - session.setParameterFloatArray(session.JamesDSP, 1998, bench_c1); + session.parameterUtils.setParameterFloatArray(session.JamesDSP, 1997, bench_c0); + session.parameterUtils.setParameterFloatArray(session.JamesDSP, 1998, bench_c1); } float limthreshold = Float.valueOf(advancedPref.getString("dsp.masterswitch.limthreshold", "-0.1")); float limrelease = Float.valueOf(advancedPref.getString("dsp.masterswitch.limrelease", "60")); if (prelimthreshold != limthreshold || prelimrelease != limrelease) - session.setParameterFloatArray(session.JamesDSP, 1500, new float[]{ limthreshold, limrelease }); + session.parameterUtils.setParameterFloatArray(session.JamesDSP, 1500, new float[]{ limthreshold, limrelease }); prelimthreshold = limthreshold; prelimrelease = limrelease; if (compressorEnabled == 1 && updateMajor) { - session.setParameterShort(session.JamesDSP, 100, Short.valueOf(advancedPref.getString("dsp.compression.pregain", "12"))); - Log.e(TAG, String.valueOf(session.getParameter(session.JamesDSP, 100))); - session.setParameterShort(session.JamesDSP, 101, (short)Math.abs(Short.valueOf(advancedPref.getString("dsp.compression.threshold", "-60")))); - session.setParameterShort(session.JamesDSP, 102, Short.valueOf(advancedPref.getString("dsp.compression.knee", "30"))); - session.setParameterShort(session.JamesDSP, 103, Short.valueOf(advancedPref.getString("dsp.compression.ratio", "12"))); - session.setParameterShort(session.JamesDSP, 104, (short)(Float.valueOf((advancedPref.getString("dsp.compression.attack", "0.01")))*1000)); - session.setParameterShort(session.JamesDSP, 105, (short)(Float.valueOf((advancedPref.getString("dsp.compression.release", "0.01")))*1000)); + session.parameterUtils.setParameterShort(session.JamesDSP, 100, Short.valueOf(advancedPref.getString("dsp.compression.pregain", "12"))); + Log.e(TAG, String.valueOf(session.parameterUtils.getParameter(session.JamesDSP, 100))); + session.parameterUtils.setParameterShort(session.JamesDSP, 101, (short)Math.abs(Short.valueOf(advancedPref.getString("dsp.compression.threshold", "-60")))); + session.parameterUtils.setParameterShort(session.JamesDSP, 102, Short.valueOf(advancedPref.getString("dsp.compression.knee", "30"))); + session.parameterUtils.setParameterShort(session.JamesDSP, 103, Short.valueOf(advancedPref.getString("dsp.compression.ratio", "12"))); + session.parameterUtils.setParameterShort(session.JamesDSP, 104, (short)(Float.valueOf((advancedPref.getString("dsp.compression.attack", "0.01")))*1000)); + session.parameterUtils.setParameterShort(session.JamesDSP, 105, (short)(Float.valueOf((advancedPref.getString("dsp.compression.release", "0.01")))*1000)); } - session.setParameterShort(session.JamesDSP, 1200, (short)compressorEnabled); // Compressor switch - session.setParameterShort(session.JamesDSP, 1201, (short)bassBoostEnabled); // Bass boost switch + session.parameterUtils.setParameterShort(session.JamesDSP, 1200, (short)compressorEnabled); // Compressor switch + session.parameterUtils.setParameterShort(session.JamesDSP, 1201, (short)bassBoostEnabled); // Bass boost switch if (bassBoostEnabled == 1 && updateMajor) { - session.setParameterShort(session.JamesDSP, 112, Short.valueOf(preferences.getString("dsp.bass.mode", "80"))); + session.parameterUtils.setParameterShort(session.JamesDSP, 112, Short.valueOf(preferences.getString("dsp.bass.mode", "80"))); short filtertype = Short.valueOf(advancedPref.getString("dsp.bass.filtertype", "0")); - session.setParameterShort(session.JamesDSP, 113, filtertype); + session.parameterUtils.setParameterShort(session.JamesDSP, 113, filtertype); short freq = Short.valueOf(advancedPref.getString("dsp.bass.freq", "55")); - session.setParameterShort(session.JamesDSP, 114, freq); + session.parameterUtils.setParameterShort(session.JamesDSP, 114, freq); if(DSPManager.devMsgDisplay) if(filtertype == 0 && freq < 90) Toast.makeText(HeadsetService.this, R.string.preferredlpf, Toast.LENGTH_SHORT).show(); } - session.setParameterShort(session.JamesDSP, 151, Short.valueOf(advancedPref.getString("dsp.tone.filtertype", "0"))); - session.setParameterShort(session.JamesDSP, 1202, (short)equalizerEnabled); // Equalizer switch + session.parameterUtils.setParameterShort(session.JamesDSP, 151, Short.valueOf(advancedPref.getString("dsp.tone.filtertype", "0"))); + session.parameterUtils.setParameterShort(session.JamesDSP, 1202, (short)equalizerEnabled); // Equalizer switch if (equalizerEnabled == 1) { /* Equalizer state is in a single string preference with all values separated by ; */ @@ -725,20 +563,20 @@ class StartUpOptimiserThread implements Runnable { for (short i = 0; i < levels.length; i++) eqLevels[i] = Float.valueOf(levels[i]); } - session.setParameterFloatArray(session.JamesDSP, 115, eqLevels); + session.parameterUtils.setParameterFloatArray(session.JamesDSP, 115, eqLevels); } if (reverbEnabled == 1 && updateMajor) - session.setParameterShort(session.JamesDSP, 128, Short.valueOf(preferences.getString("dsp.headphone.preset", "0"))); - session.setParameterShort(session.JamesDSP, 1203, (short)reverbEnabled); // Reverb switch + session.parameterUtils.setParameterShort(session.JamesDSP, 128, Short.valueOf(preferences.getString("dsp.headphone.preset", "0"))); + session.parameterUtils.setParameterShort(session.JamesDSP, 1203, (short)reverbEnabled); // Reverb switch if (stereoWideEnabled == 1 && updateMajor) - session.setParameterShort(session.JamesDSP, 137, Short.valueOf(preferences.getString("dsp.stereowide.mode", "0"))); - session.setParameterShort(session.JamesDSP, 1204, (short)stereoWideEnabled); // Stereo widener switch - session.setParameterShort(session.JamesDSP, 1208, (short)bs2bEnabled); // BS2B switch + session.parameterUtils.setParameterShort(session.JamesDSP, 137, Short.valueOf(preferences.getString("dsp.stereowide.mode", "0"))); + session.parameterUtils.setParameterShort(session.JamesDSP, 1204, (short)stereoWideEnabled); // Stereo widener switch + session.parameterUtils.setParameterShort(session.JamesDSP, 1208, (short)bs2bEnabled); // BS2B switch if (bs2bEnabled == 1 && updateMajor) - session.setParameterShort(session.JamesDSP, 188, Short.valueOf(preferences.getString("dsp.bs2b.mode", "0"))); + session.parameterUtils.setParameterShort(session.JamesDSP, 188, Short.valueOf(preferences.getString("dsp.bs2b.mode", "0"))); if (analogModelEnabled == 1 && updateMajor) - session.setParameterShort(session.JamesDSP, 150, (short) (Float.valueOf(advancedPref.getString("dsp.analogmodelling.tubedrive", "2"))*1000)); - session.setParameterShort(session.JamesDSP, 1206, (short)analogModelEnabled); // Analog modelling switch + session.parameterUtils.setParameterShort(session.JamesDSP, 150, (short) (Float.valueOf(advancedPref.getString("dsp.analogmodelling.tubedrive", "2"))*1000)); + session.parameterUtils.setParameterShort(session.JamesDSP, 1206, (short)analogModelEnabled); // Analog modelling switch if (viperddcEnabled == 1 && updateMajor) { String ddcFilePath = preferences.getString("dsp.ddc.files", ""); @@ -762,19 +600,19 @@ class StartUpOptimiserThread implements Runnable { { int stringLength = ddcString.length(); int numTime2Send = (int)Math.ceil((double)stringLength / arraySize2Send); // Number of times that have to send - session.setParameterIntArray(session.JamesDSP, 8888, new int[]{ numTime2Send, arraySize2Send }); // Send buffer info for module to allocate memory + session.parameterUtils.setParameterIntArray(session.JamesDSP, 8888, new int[]{ numTime2Send, arraySize2Send }); // Send buffer info for module to allocate memory for (int i = 0; i < numTime2Send; i++) { - session.setParameterShort(session.JamesDSP, 10005, (short)i); // Increment sliced buffer - session.setParameterCharArray(session.JamesDSP, 12001, ddcString.substring(arraySize2Send * i, Math.min(arraySize2Send * i + arraySize2Send, stringLength))); // Commit buffer + session.parameterUtils.setParameterShort(session.JamesDSP, 10005, (short)i); // Increment sliced buffer + session.parameterUtils.setParameterCharArray(session.JamesDSP, 12001, ddcString.substring(arraySize2Send * i, Math.min(arraySize2Send * i + arraySize2Send, stringLength))); // Commit buffer } - session.setParameterShort(session.JamesDSP, 10009, (short)1); // Notify send array completed and generate filter in native side + session.parameterUtils.setParameterShort(session.JamesDSP, 10009, (short)1); // Notify send array completed and generate filter in native side } } } else oldVDCName = ""; - session.setParameterShort(session.JamesDSP, 1212, (short)viperddcEnabled); // VDC switch + session.parameterUtils.setParameterShort(session.JamesDSP, 1212, (short)viperddcEnabled); // VDC switch if (convolverEnabled == 1 && updateMajor) { String mConvIRFilePath = preferences.getString("dsp.convolver.files", ""); @@ -789,7 +627,7 @@ class StartUpOptimiserThread implements Runnable { oldImpulseName = mConvIRFilePath; oldQuality = quality; olddBGainIR = dBGainIR; - session.setParameterShort(session.JamesDSP, 1205, (short)0); + session.parameterUtils.setParameterShort(session.JamesDSP, 1205, (short)0); String mConvIRFileName = mConvIRFilePath.replace(DSPManager.impulseResponsePath, ""); int[] impinfo = JdspImpResToolbox.GetLoadImpulseResponseInfo(mConvIRFilePath); if (impinfo == null) @@ -810,19 +648,19 @@ class StartUpOptimiserThread implements Runnable { float[] sendArray = new float[arraySize2Send]; int numTime2Send = (int)Math.ceil((double)impulseCutted / arraySize2Send); // Send number of times that have to send int[] sendBufInfo = new int[] {impulseCutted, impinfo[0], (int)(Math.ceil(Float.valueOf(preferences.getString("dsp.convolver.gain", "0.0")) * 262144.0f)), numTime2Send}; - session.setParameterIntArray(session.JamesDSP, 9999, sendBufInfo); // Send buffer info for module to allocate memory + session.parameterUtils.setParameterIntArray(session.JamesDSP, 9999, sendBufInfo); // Send buffer info for module to allocate memory float[] finalArray = new float[numTime2Send*arraySize2Send]; // Fill final array with zero padding System.arraycopy(impulseResponse, 0, finalArray, 0, impulseCutted); for (int i = 0; i < numTime2Send; i++) { System.arraycopy(finalArray, arraySize2Send * i, sendArray, 0, arraySize2Send); - session.setParameterShort(session.JamesDSP, 10003, (short)i); // Increment sliced buffer - session.setParameterFloatArray(session.JamesDSP, 12000, sendArray); // Commit buffer + session.parameterUtils.setParameterShort(session.JamesDSP, 10003, (short)i); // Increment sliced buffer + session.parameterUtils.setParameterFloatArray(session.JamesDSP, 12000, sendArray); // Commit buffer } - session.setParameterShort(session.JamesDSP, 10004, (short)1); // Notify send array completed and resize array in native side + session.parameterUtils.setParameterShort(session.JamesDSP, 10004, (short)1); // Notify send array completed and resize array in native side if (DSPManager.devMsgDisplay) { - int convolutionStrategy = session.getParameter(session.JamesDSP, 20004); + int convolutionStrategy = session.parameterUtils.getParameter(session.JamesDSP, 20004); if (impinfo[0] == 1) Toast.makeText(HeadsetService.this, getString(R.string.convolversuccess, mConvIRFileName, impinfo[2], getString(R.string.mono_conv), impinfo[1], (int)impulseCutted, convolutionStrategy), Toast.LENGTH_SHORT).show(); else if (impinfo[0] == 2) @@ -838,7 +676,7 @@ class StartUpOptimiserThread implements Runnable { oldImpulseName = ""; oldQuality = 0; } - session.setParameterShort(session.JamesDSP, 1205, (short)convolverEnabled); // Convolver switch + session.parameterUtils.setParameterShort(session.JamesDSP, 1205, (short)convolverEnabled); // Convolver switch } } } diff --git a/app/src/main/java/james/dsp/utils/ParameterUtils.java b/app/src/main/java/james/dsp/utils/ParameterUtils.java new file mode 100644 index 0000000..9912619 --- /dev/null +++ b/app/src/main/java/james/dsp/utils/ParameterUtils.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2020 The Android Ice Cold Project + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +package james.dsp.utils; + +import android.media.audiofx.AudioEffect; + +import java.lang.reflect.Method; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.Charset; + +public class ParameterUtils { + private byte[] IntToByte(int[] input) { + int int_index, byte_index; + int iterations = input.length; + byte[] buffer = new byte[input.length * 4]; + int_index = byte_index = 0; + for (; int_index != iterations; ) { + buffer[byte_index] = (byte) (input[int_index] & 0x00FF); + buffer[byte_index + 1] = (byte) ((input[int_index] & 0xFF00) >> 8); + buffer[byte_index + 2] = (byte) ((input[int_index] & 0xFF0000) >> 16); + buffer[byte_index + 3] = (byte) ((input[int_index] & 0xFF000000) >> 24); + ++int_index; + byte_index += 4; + } + return buffer; + } + + private int byteArrayToInt(byte[] encodedValue) { + int value = (encodedValue[3] << 24); + value |= (encodedValue[2] & 0xFF) << 16; + value |= (encodedValue[1] & 0xFF) << 8; + value |= (encodedValue[0] & 0xFF); + return value; + } + + private byte[] concatArrays(byte[]... arrays) { + int len = 0; + for (byte[] a : arrays) + len += a.length; + byte[] b = new byte[len]; + int offs = 0; + for (byte[] a : arrays) { + System.arraycopy(a, 0, b, offs, a.length); + offs += a.length; + } + return b; + } + + public void setParameterIntArray(AudioEffect audioEffect, int parameter, int[] value) { + try { + byte[] arguments = new byte[] + { + (byte) (parameter), (byte) (parameter >> 8), + (byte) (parameter >> 16), (byte) (parameter >> 24) + }; + byte[] result = IntToByte(value); + Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); + setParameter.invoke(audioEffect, arguments, result); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void setParameterFloatArray(AudioEffect audioEffect, int parameter, float value[]) { + try { + byte[] arguments = new byte[] + { + (byte) (parameter), (byte) (parameter >> 8), + (byte) (parameter >> 16), (byte) (parameter >> 24) + }; + byte[] result = new byte[value.length * 4]; + ByteBuffer byteDataBuffer = ByteBuffer.wrap(result); + byteDataBuffer.order(ByteOrder.nativeOrder()); + for (int i = 0; i < value.length; i++) + byteDataBuffer.putFloat(value[i]); + Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); + setParameter.invoke(audioEffect, arguments, result); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void setParameterCharArray(AudioEffect audioEffect, int parameter, String value) { + try { + byte[] arguments = new byte[] + { + (byte) (parameter), (byte) (parameter >> 8), + (byte) (parameter >> 16), (byte) (parameter >> 24) + }; + byte[] result = value.getBytes(Charset.forName("US-ASCII")); + if (result.length < 256) { + int zeroPad = 256 - result.length; + byte[] zeroArray = new byte[zeroPad]; + result = concatArrays(result, zeroArray); + zeroArray = null; + } + Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); + setParameter.invoke(audioEffect, arguments, result); + result = null; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void setParameterInt(AudioEffect audioEffect, int parameter, int value) { + try { + byte[] arguments = new byte[] + { + (byte) (parameter), (byte) (parameter >> 8), + (byte) (parameter >> 16), (byte) (parameter >> 24) + }; + byte[] result = new byte[] + { + (byte) (value), (byte) (value >> 8), + (byte) (value >> 16), (byte) (value >> 24) + }; + Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); + setParameter.invoke(audioEffect, arguments, result); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void setParameterShort(AudioEffect audioEffect, int parameter, short value) { + try { + byte[] arguments = new byte[] + { + (byte) (parameter), (byte) (parameter >> 8), + (byte) (parameter >> 16), (byte) (parameter >> 24) + }; + byte[] result = new byte[] + { + (byte) (value), (byte) (value >> 8) + }; + Method setParameter = AudioEffect.class.getMethod("setParameter", byte[].class, byte[].class); + setParameter.invoke(audioEffect, arguments, result); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public int getParameter(AudioEffect audioEffect, int parameter) { + try { + byte[] arguments = new byte[] + { + (byte) (parameter), (byte) (parameter >> 8), + (byte) (parameter >> 16), (byte) (parameter >> 24) + }; + byte[] result = new byte[4]; + Method getParameter = AudioEffect.class.getMethod("getParameter", byte[].class, byte[].class); + getParameter.invoke(audioEffect, arguments, result); + return byteArrayToInt(result); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} |
