В моем приложении я хочу использовать класс AudioTrack
для воспроизведения записанного мной звука.Я записываю звук через объект AudioRecord
, читаю объект и затем хочу воспроизвести записанный звук.Однако то, как я его сейчас запрограммировал, приведет к ошибке в AudioTrack-JNI
, которая скажет, что «Прямой доступ к буферу не поддерживается, запись невозможна».
Код выглядит следующим образом:
public class RecorderThread extends Thread{
private static AudioRecord mAudioRecorder;
private final int USE_MIC = MediaRecorder.AudioSource.MIC;
private static final int FREQUENCY = 8000;
private int mBuffSize, mChannel, mEncoding;
private byte[] mBuffer;
private Context mContext;
private volatile boolean mContinueLoop = true,
mDataPresent = false,
mProcessData = false;
private BroadcastReceiver mActionListener = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent){
if(intent.getAction().equals(mContext.getString(R.string.STOP_THREAD))){
mContinueLoop = false;
Thread.currentThread().interrupt();
} else if(intent.getAction().equals(mContext.getString(R.string.START_RECORDING))){
mAudioRecorder.startRecording();
} else if(intent.getAction().equals(mContext.getString(R.string.STOP_RECORDING))){
mAudioRecorder.stop();
mDataPresent = true;
} else if(intent.getAction().equals(mContext.getString(R.string.PROCESS_DATA))){
if(mDataPresent){
mProcessData = true;
mDataPresent = false;
}
}
}
};
public RecorderThread(Context context){
mContext = context;
mChannel = AudioFormat.CHANNEL_IN_MONO;
mEncoding = AudioFormat.ENCODING_PCM_16BIT;
mBuffSize = AudioRecord.getMinBufferSize(FREQUENCY, mChannel, mEncoding);
mBuffer = new byte[FREQUENCY * 10];
mAudioRecorder = new AudioRecord(USE_MIC, FREQUENCY, mChannel, mEncoding, mBuffer.length);
IntentFilter filter = new IntentFilter();
filter.addAction(mContext.getString(R.string.START_RECORDING));
filter.addAction(mContext.getString(R.string.STOP_RECORDING));
filter.addAction(mContext.getString(R.string.PROCESS_DATA));
filter.addAction(mContext.getString(R.string.STOP_THREAD));
mContext.registerReceiver(mActionListener, filter);
}
@Override
public void run(){
while(mContinueLoop){
if(mProcessData){
// Process data.
ByteBuffer sampledData = ByteBuffer.wrap(mBuffer);
int readSamples = mAudioRecorder.read(sampledData, sampledData.limit());
processData(sampledData, readSamples);
mProcessData = false;
}
try{
Thread.sleep(100);
} catch(InterruptedException e){
e.printStackTrace();
}
}
mAudioRecorder.release();
}
private void processData(ByteBuffer sampledData, int readSamples) {
byte[] data = sampledData.array();
AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,
FREQUENCY,
AudioFormat.CHANNEL_OUT_MONO,
mEncoding,
data.length,
AudioTrack.MODE_STATIC);
if(track != null){
track.write(data, 0, data.length);
track.play();
track.release();
}
}
}
Я просмотрел собственный код, который делает AudioTrack-JNI
(http://www.netmite.com/android/mydroid/1.6/frameworks/base/core/jni/android_media_AudioRecord.cpp),, но это не делает его более понятным. Единственный раз, когда эта ошибка появляется, это когда емкость буфера<= 0 или когда адрес этого буфера нулевой. </p>
Так что, да, я понятия не имею, почему это не работает ... Любой, у кого есть немного опыта, может иметь ... Такпожалуйста, просветите меня? Заранее спасибо ...