Я пишу пользовательский AudioProcessor для ExoPlayer (в kotlin / Java), который принимает входящие аудиоданные, передает их в Steam Audio API (в C ++), обрабатывает их с помощью iplApplyBinauralEffect
и передает их обратно в ExoPlayer.Проблема возникает, когда ByteBuffer, который предоставляет ExoPlayer из queueInput
, необходимо преобразовать в float * (IPLfloat32), который ожидает Steam.Как мне преобразовать ByteBuffer в число с плавающей точкой *, которое будет обрабатывать Steam?
ByteBuffer говорит, что он имеет прямой порядок байтов, поэтому я преобразовал его в большой порядок байтов, но он все еще возвращает массивные и крошечные значения.
Документы для Steam Audio API находятся здесь
, а документы для ExoPlayer здесь
аудиобуфер IPLAudioBuffer isздесь описано
(передано из подкласса AudioProcessor)
public ByteBuffer queueInput(ByteBuffer inputBuffer, ByteBuffer buffer, int position, int length) {
//inputBuffer.order(ByteOrder.BIG_ENDIAN);
FloatBuffer floatBuffer = inputBuffer.order(ByteOrder.BIG_ENDIAN).asFloatBuffer();
float[] input = new float[floatBuffer.limit()];
floatBuffer.get(input);
// get rendered output
float[] convertedArray = queueInput(playerIndex, input, floatBuffer.limit());
buffer = ByteBuffer.allocate(inputBuffer.limit() * 2);
FloatBuffer outputFloatBuffer = buffer.asFloatBuffer();
outputFloatBuffer.put(convertedArray);
buffer.rewind();
return buffer;
}
(через jni)
queueInput(JNIEnv *env, jobject instance, jint playerIndex, jfloatArray bytes, jint len) {
jfloat *input = env->GetFloatArrayElements(bytes, nullptr);
int inputaudio = engine->getOutput(static_cast<unsigned int>(playerIndex), input, len, input);
jfloatArray result;
result = env->NewFloatArray(inputaudio);
env->SetFloatArrayRegion(result, 0, inputaudio, input);
free(input);
env->ReleaseFloatArrayElements(bytes, input, JNI_COMMIT);
return result;
}
(передано в SteamPlayer)
int SteamPlayer::getOutput(float *input, int len, float *output) {
std::vector<float> outputaudioframe(static_cast<unsigned int>(2 * framesize));
std::vector<float> outputaudio;
int numFrames = len / framesize;
IPLAudioBuffer inbuffer{ stereo, framesize, input };
inbuffer.format.numSpeakers = 2;
inbuffer.format.speakerDirections = &inDirections;
IPLAudioBuffer outbuffer{stereo, framesize, outputaudioframe.data()};
outbuffer.format.numSpeakers = 2;
outDirections.x = x;
outDirections.y = y;
outDirections.z = z;
outbuffer.format.speakerDirections = &outDirections;
for (auto i = 0; i < numFrames; ++i) {
iplApplyBinauralEffect(effect, renderer, inbuffer, outDirections, IPL_HRTFINTERPOLATION_NEAREST, outbuffer);
std::copy(std::begin(outputaudioframe), std::end(outputaudioframe), std::back_inserter(outputaudio));
inbuffer.interleavedBuffer += framesize;
}
for (int i = 0; i < outputaudio.size(); ++i) {
outputaudio[i] *= 32767;
}
std::memcpy(output, outputaudio.data(), outputaudio.size());
return outputaudio.size();
}
Вот снимок экрана с некоторыми из поступающих данных, непосредственно перед строкой 'convertArray'
Любая помощь будет принята с благодарностью.