package org.freemp.droid.player;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import com.flurry.android.FlurryAgent;
import com.un4seen.bass.BASS;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class BassPlayer {
private static int chan;
private static int[] fxBands = new int[10];
private static int fxReverb;
private final Object lock = new Object();
public boolean isPlaying;
int req;
private int totalTime;
private OnCompletionListener completionListener;
private final BASS.SYNCPROC EndSync = new BASS.SYNCPROC() {
public void SYNCPROC(int handle, int channel, int data, Object user) {
isPlaying = false;
if (completionListener != null)
completionListener.onCompletion();
}
};
private FileChannel fc;
private String filePath;
private final BASS.DOWNLOADPROC StatusProc = new BASS.DOWNLOADPROC() {
@Override
public void DOWNLOADPROC(ByteBuffer buffer, int length, Object user) {
//&& (Integer)user == req
if (filePath != null) {
try {
if (buffer != null) {
if (fc == null)
fc = new FileOutputStream(new File(filePath)).getChannel();
fc.write(buffer);
} else if (fc != null) {
fc.close();
fc = null;
}
} catch (IOException e) {
FlurryAgent.onError("5", "5", e);
}
}
}
};
public BassPlayer(Context context) {
BASS.BASS_Init(-1, 44100, 0);
BASS.BASS_SetConfig(BASS.BASS_CONFIG_FLOATDSP, 32);
chan = 0;
ApplicationInfo info = context.getApplicationInfo();
if (info != null) {
String path = info.nativeLibraryDir;
String[] list = new File(path).list();
for (String s : list) {
BASS.BASS_PluginLoad(path + "/" + s, 0);
}
}
}
public static void updateFX(int progress, int n) {
BASS.BASS_DX8_PARAMEQ p = new BASS.BASS_DX8_PARAMEQ();
BASS.BASS_FXGetParameters(fxBands[n], p);
//p.fGain = EqualizerBandsFragment.convertProgressToGain(progress);
BASS.BASS_FXSetParameters(fxBands[n], p);
}
public static void setReverb(int progress) {
BASS.BASS_DX8_REVERB p = new BASS.BASS_DX8_REVERB();
BASS.BASS_FXGetParameters(fxReverb, p);
p.fReverbMix = (float) (progress > 15 ? Math.log((double) progress / 20.0) * 20.0 : -96.0);
BASS.BASS_FXSetParameters(fxReverb, p);
}
public static void setLowFreq(int progress) {
for (int i = 0; i < 5; i++) {
BASS.BASS_DX8_PARAMEQ p = new BASS.BASS_DX8_PARAMEQ();
BASS.BASS_FXGetParameters(fxBands[i], p);
if (i < 3)
p.fBandwidth = 0.5f * convertProgressToFreq(progress);
else
p.fBandwidth = 2f * convertProgressToFreq(progress);
BASS.BASS_FXSetParameters(fxBands[i], p);
}
}
public static void setHightFreq(int progress) {
for (int i = 6; i < 10; i++) {
BASS.BASS_DX8_PARAMEQ p = new BASS.BASS_DX8_PARAMEQ();
BASS.BASS_FXGetParameters(fxBands[i], p);
if (i < 8)
p.fBandwidth = 4f * convertProgressToFreq(progress);
else
p.fBandwidth = 8f * convertProgressToFreq(progress);
BASS.BASS_FXSetParameters(fxBands[i], p);
}
}
public static float convertProgressToFreq(int progress) {
return ((float) progress * 3f / 100f) + 1;
}
public void setOnCompletetion(OnCompletionListener listener) {
this.completionListener = listener;
}
public void prepareFile(String url) throws IOException {
chan = BASS.BASS_StreamCreateFile(url, 0L, 0L, 0);
if (chan == 0) {
throw new IOException("prepare exception " + BASS.BASS_ErrorGetCode());
}
long bytes = BASS.BASS_ChannelGetLength(chan, BASS.BASS_POS_BYTE);
totalTime = (int) BASS.BASS_ChannelBytes2Seconds(chan, bytes);
BASS.BASS_CHANNELINFO info = new BASS.BASS_CHANNELINFO();
BASS.BASS_ChannelGetInfo(chan, info);
BASS.BASS_ChannelSetSync(chan, BASS.BASS_SYNC_END, 0, EndSync, 0);
setUpEffects();
}
private void setUpEffects() {
fxBands[0] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[1] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[2] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[3] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[4] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[5] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[6] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[7] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[8] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxBands[9] = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_PARAMEQ, 0);
fxReverb = BASS.BASS_ChannelSetFX(chan, BASS.BASS_FX_DX8_REVERB, 0);
BASS.BASS_DX8_PARAMEQ p = new BASS.BASS_DX8_PARAMEQ();
p.fGain = 0;
p.fBandwidth = 0.5f;
p.fCenter = 32;
BASS.BASS_FXSetParameters(fxBands[0], p);
p.fCenter = 64;
BASS.BASS_FXSetParameters(fxBands[1], p);
p.fCenter = 125;
BASS.BASS_FXSetParameters(fxBands[2], p);
p.fBandwidth = 2f;
p.fCenter = 250;
BASS.BASS_FXSetParameters(fxBands[3], p);
p.fCenter = 500;
BASS.BASS_FXSetParameters(fxBands[4], p);
p.fBandwidth = 4f;
p.fCenter = 1000;
BASS.BASS_FXSetParameters(fxBands[5], p);
p.fCenter = 2000;
BASS.BASS_FXSetParameters(fxBands[6], p);
p.fCenter = 4000;
BASS.BASS_FXSetParameters(fxBands[7], p);
p.fCenter = 8000;
p.fBandwidth = 8f;
BASS.BASS_FXSetParameters(fxBands[8], p);
p.fCenter = 16000;
BASS.BASS_FXSetParameters(fxBands[9], p);
//int[] bounds = EqualizerBandsFragment.getSavedBounds();
//for(int i = 0 ; i < bounds.length ; i++ )
// updateFX(bounds[i], i);
//int[] effecs = EqualizerEffectsFragment.getSavedEffects();
//setLowFreq(effecs[0]);
//setHightFreq(effecs[1]);
//setReverb(effecs[2]);
}
public void prepareNet(String url) throws IOException {
int r;
synchronized (lock) {
r = ++req;
}
int c = BASS.BASS_StreamCreateURL(url, 0, BASS.BASS_STREAM_STATUS, StatusProc, r);
synchronized (lock) {
if (r != req) {
if (c != 0) {
BASS.BASS_StreamFree(c);
}
throw new IOException("prepare exception");
}
chan = c;
}
if (chan == 0) {
throw new IOException("prepare exception");
}
long bytes = BASS.BASS_ChannelGetLength(chan, BASS.BASS_POS_BYTE);
totalTime = (int) BASS.BASS_ChannelBytes2Seconds(chan, bytes);
BASS.BASS_CHANNELINFO info = new BASS.BASS_CHANNELINFO();
BASS.BASS_ChannelGetInfo(chan, info);
BASS.BASS_ChannelSetSync(chan, BASS.BASS_SYNC_END, 0, EndSync, 0);
setUpEffects();
}
public void start() {
BASS.BASS_ChannelPlay(chan, false);
isPlaying = true;
}
public void pause() {
BASS.BASS_ChannelPause(chan);
isPlaying = false;
}
public int getCurrentPosition() {
return (int) BASS.BASS_ChannelBytes2Seconds(chan, BASS.BASS_ChannelGetPosition(chan, BASS.BASS_POS_BYTE));
}
public int getTotalTime() {
return totalTime;
}
public void seekTo(int to) {
BASS.BASS_ChannelSetPosition(chan, BASS.BASS_ChannelSeconds2Bytes(chan, to), BASS.BASS_POS_BYTE);
}
public void releaseTotal() {
BASS.BASS_Free();
BASS.BASS_PluginFree(0);
}
public void release() {
BASS.BASS_MusicFree(chan);
BASS.BASS_StreamFree(chan);
assert fc == null;
filePath = null;
}
public int getPercentage() {
if (getTotalTime() == 0)
return 0;
return (100 * getCurrentPosition()) / getTotalTime();
}
public interface OnCompletionListener {
void onCompletion();
}
}