package com.fastbootmobile.encore.providers.bassboost;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.util.Log;
import com.fastbootmobile.encore.providers.AudioClientSocket;
import com.fastbootmobile.encore.providers.AudioSocket;
import com.fastbootmobile.encore.providers.IDSPProvider;
import com.fastbootmobile.encore.providers.ProviderIdentifier;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;
import omnimusic.Plugin;
public class PluginService extends Service implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = "PluginService";
private ProviderIdentifier mIdentifier;
private AudioSocket mSocket;
private static BiQuadFilter mFilterL = new BiQuadFilter();
short[] mSamplesBuffer = new short[16384];
byte[] mBytesBuffer = new byte[32768];
AudioClientSocket.ISocketCallback mSocketCallback = new AudioSocket.ISocketCallback() {
@Override
public void onAudioData(AudioSocket socket, Plugin.AudioData.Builder message) {
ByteBuffer inputBytes = message.getSamples().asReadOnlyByteBuffer();
ShortBuffer shortBuf = inputBytes.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
final int numShorts = shortBuf.limit();
if (mSamplesBuffer.length < numShorts) {
mSamplesBuffer = new short[numShorts];
}
shortBuf.get(mSamplesBuffer, 0, numShorts);
for (int i = 0; i < numShorts; i += 2) {
int inL = mSamplesBuffer[i];
int inR = mSamplesBuffer[i + 1];
int boost = mFilterL.process(inL + inR);
mSamplesBuffer[i] = BiQuadFilter.clamp16(inL + boost);
mSamplesBuffer[i + 1] = BiQuadFilter.clamp16(inR + boost);
}
// push it back
try {
final int numBytes = numShorts * 2;
if (mBytesBuffer.length < numBytes) {
mBytesBuffer = new byte[numBytes];
}
ByteBuffer.wrap(mBytesBuffer)
.order(ByteOrder.LITTLE_ENDIAN)
.asShortBuffer()
.put(mSamplesBuffer, 0, numShorts);
mSocket.writeAudioData(mBytesBuffer, 0, numBytes);
} catch (IOException e) {
Log.e(TAG, "Cannot write audio data", e);
}
}
@Override
public void onAudioResponse(AudioSocket socket, Plugin.AudioResponse.Builder message) {
}
@Override
public void onRequest(AudioSocket socket, Plugin.Request.Builder message) {
}
@Override
public void onFormatInfo(AudioSocket socket, Plugin.FormatInfo.Builder message) {
}
@Override
public void onBufferInfo(AudioSocket socket, Plugin.BufferInfo.Builder message) {
}
};
public PluginService() {
}
@Override
public void onCreate() {
super.onCreate();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(PluginService.this);
prefs.registerOnSharedPreferenceChangeListener(this);
updateFilterSettings();
}
public void updateFilterSettings() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(PluginService.this);
String frequency = prefs.getString("center_frequency", "55");
String gain = prefs.getString("gain", "0");
double dfrequency = Double.parseDouble(frequency);
double dgain = Double.parseDouble(gain);
mFilterL.setLowPass(10, dfrequency, 44100.0, dgain / 666.0);
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
private void setupAudioSocket(final String socketName) {
Log.d(TAG, "setupAudioSocket(" + socketName + ")");
try {
if (mSocket == null) {
mSocket = new AudioClientSocket();
}
mSocket.connect(socketName);
mSocket.setCallback(mSocketCallback);
} catch (IOException e) {
Log.e(TAG, "Cannot open the socket for audio data", e);
}
}
private IDSPProvider.Stub mBinder = new IDSPProvider.Stub() {
@Override
public int getVersion() throws RemoteException {
return 1;
}
@Override
public void setIdentifier(ProviderIdentifier identifier) throws RemoteException {
mIdentifier = identifier;
}
@Override
public void setAudioSocketName(String socketName) throws RemoteException {
setupAudioSocket(socketName);
}
};
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
updateFilterSettings();
}
}