Я более 15 лет кодирую в Delphi.
Мне нужно много времени 10 ... 60 минут, чтобы сгенерировать ультразвуковой сигнал с частотой 20000 Гц и проанализировать отраженный сигнал.Я сделал два потока - один поток создает tjaudiotrack и генерирует необходимый сигнал, пополняя буфер звуковыми данными для рассчитанного семпла.второй поток создает tjaudiorecord, получает данные с микрофона и передает данные в основной поток для анализа.
ПРОБЛЕМА: по отдельности оба потока работают нормально, но когда два потока запускаются, потоки ждут друг другав то же время.Те, пока не закончится обработка в первом потоке, второй не выполняется.Я сделал третий тестовый поток (просто счетчик), он обычно работает одновременно с любым из аудиопотоков.
В чем я не прав?
Скомпилировал проект в Project1 в Project2 - запущендва приложения - все ок.один воспроизводит звук, другой слушает и обрабатывает его.Те.отсутствует аппаратный запрет на одновременную работу микрофона и динамика.
{ TRecordThread }
constructor TRecordThread.Create;
begin
inherited Create;
FIsInited:= False;
FAudioSource:= TJMediaRecorder_AudioSource.JavaClass.MIC;
end;
destructor TRecordThread.Destroy;
begin
DeInit;
inherited Destroy;
end;
function TRecordThread.Init: Boolean;
begin
DeInit;
FMinBufSize:= TJAudioRecord.JavaClass.getMinBufferSize(FSampleRate, FChannelConfig, FAudioFormat);
FIsInited:= (0 < FMinBufSize);
if FIsInited then
try
FAudioRecorder:= TJAudioRecord.JavaClass.init
(FAudioSource, FSampleRate, FChannelConfig, FAudioFormat, 4*FMinBufSize);
FOffset:= 0;
FAudio:= TJavaArray<SmallInt>.Create( 4 * FMinBufSize );
except
FIsInited:= False;
end;
Result:= FIsInited;
end;
function TRecordThread.DeInit: Boolean;
begin
Result:= FIsInited;
if Not FIsInited then Exit;
FAudioRecorder.release;
FAudio.Free;
end;
procedure TRecordThread.Execute;
var n: Integer;
begin
if not Terminated then
FAudioRecorder.startRecording;
while not Terminated do
begin
n:= (FAudioRecorder As JAudioRecord).read( FAudio, FOffSet, 4*FMinBufSize);
Inc(FOffSet, n);
end;
// FAudioRecorder.stop;
end;