package com.source.sounds;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import com.rftransceiver.datasets.AudioData;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
//��������PCM������
//һ�������ı���
public class Audio_Player implements Runnable
{
private static Audio_Player player;
private AudioTrack audioTrack;
private List<AudioData> dataList = null;
private AudioData playData;
private boolean isPlaying = false;
////��������
private static final int sampleRate = 8000;
private static final int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private Audio_Player()
{
//ͬ�����߳�����
dataList = Collections.synchronizedList(new LinkedList<AudioData>());
}
//��ȡ�������ʵ������
public static Audio_Player getInstance()
{
if (player == null)
{
player = new Audio_Player();
}
return player;
}
// ���ս�����PCM����
public void addData(short[] decodedData2, int size)
{
AudioData decodedData = new AudioData();
decodedData.setSize(size);
short[] tempData = new short[size];
System.arraycopy(decodedData2, 0, tempData, 0, size);
decodedData.setRealData(tempData);
dataList.add(decodedData);
}
//����������
private boolean initAudioTrack()
{
int bufferSize = AudioTrack.getMinBufferSize(sampleRate,
channelConfig, audioFormat);
if (bufferSize < 0)
{
return false;
}
try
{
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
channelConfig, audioFormat, bufferSize, AudioTrack.MODE_STREAM);
}
catch (Exception e)
{
// TODO: handle exception
}
// ��������
audioTrack.setStereoVolume(1.0f, 1.0f);
//��������
audioTrack.play();
return true;
}
private void playFromList()
{
//ȡ����������ݽ��в���
while (dataList.size() > 0 && isPlaying)
{
playData = dataList.remove(0);
audioTrack.write(playData.getRealData(), 0, playData.getSize());
}
}
//��������
public void startPlaying()
{
if (isPlaying)
{
return;
}
new Thread(this).start();
}
//ֹͣ����
public void stopPlaying()
{
this.isPlaying = false;
}
//�߳�����ִ��
public void run()
{
this.isPlaying = true;
if (!initAudioTrack())
{
return;
}
while (isPlaying)
{
if (dataList.size() > 0)
{
playFromList();
}
else
{
try
{
Thread.sleep(20);
}
catch (InterruptedException e)
{
}
}
}
if (this.audioTrack != null)
{
//ֹͣ����
if (this.audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING)
{
this.audioTrack.stop();
this.audioTrack.release();
}
}
}
}