Вот код, который я использую для создания непрерывной синусоидальной волны в студии android. Все это работает в потоке. Мой вопрос: когда я вызываю audio.write(), что происходит с любыми данными, которые все еще могут находиться в буфере? Сбрасывает ли старые образцы и записывает новый набор или добавляет новый массив образцов к оставшимся образцам?Что происходит с данными в буфере на AudioTrack.write()
int buffSize = AudioTrack.getMinBufferSize(sr, AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT);
//create the AudioTrack object
AudioTrack audio = new AudioTrack( AudioManager.STREAM_MUSIC,
sr,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffSize,
AudioTrack.MODE_STREAM);
//initialise values for synthesis
short samples[]= new short[buffSize]; //array the same size as buffer
int amp=10000; //amplitude of the waveform
double twopi = 8.*Math.tan(1.); //2*pi
double fr = 440; //the frequency to create
double ph = 0; //phase shift
//start audio
audio.play();
//synthesis loop
while (isRunning)
{
fr=440+4.4*sliderVal;
for (int i=0;i<buffSize;i++)
{
samples[i]=(short)(amp*Math.sin(ph));
ph+=twopi*fr/sr;
}
audio.write(samples,0,buffSize);
}
//stop the audio track
audio.stop();
audio.release();
Спасибо за обратную связь, у меня на правильный путь. Существуют ли случаи, когда синхронизация необходима для обеспечения того, чтобы устройство воспроизводило образцы x перед записью следующих x образцов? – Johan
Рад это слышать! Ну, вам не нужно синхронизировать, но вам нужно «идти в ногу». Если вы не можете быстро заполнить блоки буферизации, вы получите пропуск или выпад. Вы знаете, что это происходит, потому что вы можете это услышать. Это большая проблема в Android из-за проблем с задержкой звука. Каждое устройство Android, когда-либо производившееся, имеет более высокую задержку, чем каждое устройство iOS. Тяжело поверить, но это правда. Существует действительно хорошее приложение с открытым исходным кодом Google, называемое AudioBuffersSize, которое показывает возможности устройства, такие как буферизация и выборка. Затем вы можете правильно установить их в своем звуковом приложении. –
Спасибо, Марк! Я еще не сталкивался с этой проблемой. Было бы неплохо написать отдельный, легкий поток writeToBuffer? – Johan