スレッドで次のコードを使用して、マイクから未加工のオーディオ サンプルをキャプチャし、スピーカーから再生します。
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 ビットの PCM エンコーディングを使用しているため、16 ビットのショート)。これは によって行われrecord.read()
ます。次にtrack.write()
、ハードウェアによって再生されるスピーカーにこれらのサンプルを配置します。これは正しいですか、それともここで何か不足していますか?