Я использую следующий код в потоке для захвата необработанных звуковых образцов с микрофона и воспроизведения их через динамик.
public void run(){
short[] lin = new short[SIZE_OF_RECORD_ARRAY];
int num = 0;
// am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); // -> MOVED THESE TO init()
// am.setMode(AudioManager.MODE_IN_COMMUNICATION);
record.startRecording();
track.play();
while (passThroughMode) {
// while (!isInterrupted()) {
num = record.read(lin, 0, SIZE_OF_RECORD_ARRAY);
for(i=0;i<lin.length;i++)
lin[i] *= WAV_SAMPLE_MULTIPLICATION_FACTOR;
track.write(lin, 0, num);
}
// /*
record.stop();
track.stop();
record.release();
track.release();
// */
}
где record
— это AudioRecord
, а track
— это Audiotrack
. Мне нужно знать подробно (и, если возможно, в упрощенном виде), как AudioRecord сохраняет данные PCM, а AudioTrack воспроизводит данные PCM. Вот как я понял это до сих пор:
Поскольку цикл while() выполняется непрерывно, record
получает количество выборок SIZE_OF_RECORD_ARRAY (которое на данный момент равно 1024), как показано на рисунке. Образцы сохраняются последовательно в массиве шорт lin[] (16-битные шорты, так как я использую 16-битное кодирование PCM). Это сделано record.read()
. Затем track.write()
помещает эти сэмплы в динамик, который воспроизводится оборудованием. Это правильно или я что-то пропустил здесь?