Могу ли я создать FloatBuffer для поддержки прямого буфера JNI и для приведения массива float []? - PullRequest
0 голосов
/ 10 декабря 2018

Итак, я хочу прочитать сэмплы с плавающей запятой в FloatBuffer , передать его в C ++ через JNI и затем иметь возможность воспроизводить их через AudioTrack .Поскольку мой источник звука с плавающей запятой, это кажется оптимальным способом.Пожалуйста, не рекомендую использовать короткие образцы, я знаю, что могу добиться того же конвейера с ними, но давайте предположим, что у меня есть аудио CSP C ++, который работает только с плавающими числами, и я хочу избежать преобразования из коротких в плавающие в Java илиC ++.

Насколько я понимаю, для этого мне нужно два условия:

  1. Буфер float должен быть прямым буфером (поэтому я могу передать его вC ++), так что я могу получить от него действительный указатель через GetDirectBufferAddress() в C ++.
  2. Буфер float должен быть HeapFloatBuffer , чтобы я мог вызвать FloatBuffer::array()оператор на него и получить float[] для перехода к правильной перегрузке AudioTrack::write(), которая принимает float[].Другие перегрузки генерируются, если поток инициализируется с выборками с плавающей запятой.

Проблема заключается в том, что я не могу создать прямое FloatBuffer, кроме обтекания существующего ByteBuffer для удовлетворения первого, нотолько HeapFloatBuffer поддерживает вызов array() для удовлетворения второго.Так что я не могу иметь оба.Я что-то здесь упускаю или нет способа избежать конверсии?

...