У меня есть программа, которая создает поток, который захватывает данные со звуковой карты на частоте 48 кГц и записывает их в буфер для сбора. Сердце кода потока выглядит следующим образом ..Проблема с потоком Java, который захватывает данные звуковой карты
public void run() {
// Run continously
for (;;) {
// get data from the audio device.
getSample();
}
}
// Read in 2 bytes from the audio source combine them together into a single integer
// then write that into the sound buffer
private void getSample() {
int sample,count,total=0,fsample;
byte buffer[]=new byte[2];
try {
while (total<1) {
count=Line.read(buffer,0,2);
total=total+count;
}
} catch (Exception e) {
String err=e.getMessage();
}
sample=(buffer[0]<<8)+buffer[1];
etc etc etc
}
Программа работает только процесс, как представляется, взять 100% времени центрального процессора. Я полагаю, это связано с тем, что поток сидит, ожидая, когда данные поступят в строку Line.Read. Я попытался вставить Thread.yield() в разные моменты в потоке, но, похоже, не имеет значения.
Может ли кто-нибудь предложить способы уменьшить количество процессорного времени, которое занимает эта нить?
Спасибо за ваше время
Ян
Спасибо. Я модифицировал getSample() для загрузки 256 байт за раз со звуковой карты. Программа работает нормально и загрузка процессора снижается до 52%. – IanW
Хорошая цель - всегда читать соответствующие размеры блоков. Даже программа c чтения одиночных байтов будет во много раз медленнее, чем чтение блоков. (Я могу проверить это экспериментально) –
Вы должны экспериментировать с разными размерами и находить то, что лучше всего подходит для вашего приложения. Я не знаю, но кажется, что 256 байтов довольно малы. Пока вы получаете нужные результаты, найдите размер, который дает самую низкую нагрузку на процессор. –