Как использовать Oboe (библиотека C ++ для аудио с низкой задержкой для Android) для получения буфера byte [] из DatagramPacket?

Я хочу транслировать аудио в прямом эфире через Wi-Fi между двумя устройствами Android.

Чтобы уменьшить задержку звука, применение библиотеки Oboe C ++ кажется правильным направлением.

Моя текущая структура заключается в использовании DatagramPacket для передачи и приема аудиоданных. Тип данных буфера, содержащего входящую дейтаграмму, - byte []. Согласно моему исследованию, мне нужно передать данные из буфера byte [] через JNI (собственный интерфейс Java), а затем прочитать данные в неблокирующей очереди? (например: https://github.com/google/oboe/blob/master/samples/RhythmGame/src/main/cpp/utils/LockFreeQueue.h)

Если я правильно понимаю, в C ++ нет типа данных byte [], поэтому мне нужно преобразовать byte [] (jbyteArray в JNI) в тип данных (например, int16_t)?

Однако я не очень уверен, как реализовать такое преобразование? Или даже я ошибаюсь?

Мы будем очень признательны за любые предложения или образцы кода!

Большое спасибо!


person MAGNETO    schedule 22.11.2020    source источник


Ответы (1)


Я предлагаю вам изучить использование пула прямых ByteBuffers. Эти объекты заключают в себе большой двоичный объект собственной памяти, и к ним можно получить доступ непосредственно из C ++.

Когда вы получаете пакет из сети, возьмите свободный ByteBuffer из пула, скопируйте в него содержимое пакета и каким-то образом пометьте буфер как полученный. (добавив его в очередь taken?) Затем добавьте указатель + размер в очередь, к которой C ++ может получить доступ.

В обратном вызове Oboe onAudioReady вы можете просто взять элементы из этой очереди и скопировать их содержимое в буфер данных Oboe. Сообщите миру Java, сколько элементов было израсходовано, чтобы он мог вернуть буферы в свободный пул.

person Botje    schedule 23.11.2020