From d48e964d05af100866e8a9264a2e6926611b26c6 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 7 May 2019 17:54:47 -0700 Subject: [PATCH] Use a short[] for the audio buffer to avoid using deprecated AudioTrack functionality --- .../limelight/nvstream/av/audio/AudioRenderer.java | 2 +- .../com/limelight/nvstream/jni/MoonBridge.java | 2 +- .../src/main/jni/moonlight-core/callbacks.c | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/av/audio/AudioRenderer.java b/moonlight-common/src/main/java/com/limelight/nvstream/av/audio/AudioRenderer.java index 78bacdb6..6944cc39 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/av/audio/AudioRenderer.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/av/audio/AudioRenderer.java @@ -7,7 +7,7 @@ public interface AudioRenderer { void stop(); - void playDecodedAudio(byte[] audioData); + void playDecodedAudio(short[] audioData); void cleanup(); } diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/jni/MoonBridge.java b/moonlight-common/src/main/java/com/limelight/nvstream/jni/MoonBridge.java index 28b1e3d0..028bf4a8 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/jni/MoonBridge.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/jni/MoonBridge.java @@ -111,7 +111,7 @@ public class MoonBridge { } } - public static void bridgeArPlaySample(byte[] pcmData) { + public static void bridgeArPlaySample(short[] pcmData) { if (audioRenderer != null) { audioRenderer.playDecodedAudio(pcmData); } diff --git a/moonlight-common/src/main/jni/moonlight-core/callbacks.c b/moonlight-common/src/main/jni/moonlight-core/callbacks.c index a03fc8db..f379db39 100644 --- a/moonlight-common/src/main/jni/moonlight-core/callbacks.c +++ b/moonlight-common/src/main/jni/moonlight-core/callbacks.c @@ -33,7 +33,7 @@ static jmethodID BridgeClConnectionTerminatedMethod; static jmethodID BridgeClRumbleMethod; static jmethodID BridgeClConnectionStatusUpdateMethod; static jbyteArray DecodedFrameBuffer; -static jbyteArray DecodedAudioBuffer; +static jshortArray DecodedAudioBuffer; void DetachThread(void* context) { (*JVM)->DetachCurrentThread(JVM); @@ -84,7 +84,7 @@ Java_com_limelight_nvstream_jni_MoonBridge_init(JNIEnv *env, jclass clazz) { BridgeArStartMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArStart", "()V"); BridgeArStopMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArStop", "()V"); BridgeArCleanupMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArCleanup", "()V"); - BridgeArPlaySampleMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArPlaySample", "([B)V"); + BridgeArPlaySampleMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArPlaySample", "([S)V"); BridgeClStageStartingMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeClStageStarting", "(I)V"); BridgeClStageCompleteMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeClStageComplete", "(I)V"); BridgeClStageFailedMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeClStageFailed", "(IJ)V"); @@ -224,7 +224,7 @@ int BridgeArInit(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusCon } // We know ahead of time what the buffer size will be for decoded audio, so pre-allocate it - DecodedAudioBuffer = (*env)->NewGlobalRef(env, (*env)->NewByteArray(env, opusConfig->channelCount * opusConfig->samplesPerFrame * sizeof(short))); + DecodedAudioBuffer = (*env)->NewGlobalRef(env, (*env)->NewShortArray(env, opusConfig->channelCount * opusConfig->samplesPerFrame)); } return err; @@ -271,23 +271,23 @@ void BridgeArDecodeAndPlaySample(char* sampleData, int sampleLength) { return; } - jbyte* decodedData = (*env)->GetByteArrayElements(env, DecodedAudioBuffer, 0); + jshort* decodedData = (*env)->GetShortArrayElements(env, DecodedAudioBuffer, 0); int decodeLen = opus_multistream_decode(Decoder, (const unsigned char*)sampleData, sampleLength, - (opus_int16*)decodedData, + decodedData, OpusConfig.samplesPerFrame, 0); if (decodeLen > 0) { // We must release the array elements first to ensure the data is copied before the callback - (*env)->ReleaseByteArrayElements(env, DecodedAudioBuffer, decodedData, 0); + (*env)->ReleaseShortArrayElements(env, DecodedAudioBuffer, decodedData, 0); (*env)->CallStaticVoidMethod(env, GlobalBridgeClass, BridgeArPlaySampleMethod, DecodedAudioBuffer); } else { // We can abort here to avoid the copy back since no data was modified - (*env)->ReleaseByteArrayElements(env, DecodedAudioBuffer, decodedData, JNI_ABORT); + (*env)->ReleaseShortArrayElements(env, DecodedAudioBuffer, decodedData, JNI_ABORT); } }