Как использовать TJAudioTrack TJAudioRecord параллельно долгое время (более 1 буфера) - PullRequest
0 голосов
/ 26 сентября 2019

Я более 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...