package com.codefixia.audio;
import java.util.ArrayList;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
public class AndroidAudioThread extends Thread
{
private int minSize;
private AudioTrack track;
private short[] bufferS;
private float[] bufferF;
private ArrayList<AudioGenerator> audioGens;
private boolean running;
public AndroidAudioThread(float samplingRate, int bufferLength)
{
audioGens = new ArrayList<AudioGenerator>();
minSize =AudioTrack.getMinBufferSize( (int)samplingRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT );
//println();
// note that we set the buffer just to something small
// not to the minSize
// setting to minSize seems to cause glitches on the delivery of audio
// to the sound card (i.e. ireegular delivery rate)
bufferS = new short[bufferLength];
bufferF = new float[bufferLength];
track = new AudioTrack( AudioManager.STREAM_MUSIC, (int)samplingRate,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
minSize, AudioTrack.MODE_STREAM);
track.setStereoVolume(2.0f, 2.0f);
track.play();
}
// overidden from Thread
public void run() {
running = true;
while (running) {
//System.out.println("AudioThread : ags "+audioGens.size());
for (int i=0;i<bufferS.length;i++) {
// we add up using a 32bit int
// to prevent clipping
int val = 0;
short totalPlaying=0;
if (audioGens.size() > 0) {
for (int j=0;j<audioGens.size(); j++) {
AudioGenerator ag = (AudioGenerator)audioGens.get(j);
val += ag.getSample();
if(ag.isPlaying()){
totalPlaying++;
}
}
}
if(totalPlaying>0)
bufferS[i] = (short)(val*4/totalPlaying);
else
bufferS[i] = (short)(val*4);
/*
if(totalPlaying>4)
bufferS[i] = (short)val;
else if(totalPlaying>2)
bufferS[i] = (short)(val*2);
else if(totalPlaying>1)
bufferS[i] = (short)(val*2);
else
bufferS[i] = (short)(val*3);*/
}
// send it to the audio device!
track.write( bufferS, 0, bufferS.length );
}
}
public void quit(){
System.out.println("Quitting AndroidAudioThread");
this.running=false;
interrupt();
}
public void addAudioGenerator(AudioGenerator ag) {
audioGens.add(ag);
}
/*public int addAudioGenerator(AudioGenerator ag) {
//System.out.println("ag added ");
audioGens.add(ag);
return audioGens.lastIndexOf(ag);
}*/
public boolean removeAudioGenerator(AudioGenerator ag) {
//System.out.println("ag removed ");
return audioGens.remove(ag);
}
public void refreshAudio(int index, AudioGenerator ag)
{
audioGens.set(index, ag);
}
public void clearAudioGenerator() {
//System.out.println("ag added ");
audioGens.clear();
}
}