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

#android #c #java-native-interface #datagram #oboe

#Android #c #java-native-интерфейс #дейтаграмма #oboe

Вопрос:

Я хотел бы транслировать аудио в прямом эфире по Wi-Fi между 2 устройствами 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)?

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

Любые предложения или примеры кода будут высоко оценены!

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

Комментарии:

1. вы решили проблему? можете ли вы поделиться тем, как с этим справиться? Спасибо

Ответ №1:

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

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

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