summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristos Papageorgiou <root.expert.xda@gmail.com>2020-04-22 13:55:16 +0300
committerChristos Papageorgiou <root.expert.xda@gmail.com>2020-04-22 13:55:16 +0300
commit89b2c81a0a32c4dc51e20b47d4f293f7afa976d4 (patch)
treef616cf54e7054c7b5a6f3530fa943026435fa2cb
parent4360cc9183531ce3de43eee146800279d11eca76 (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.java256
-rw-r--r--app/src/main/java/james/dsp/utils/ParameterUtils.java173
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);
+ }
+ }
+}