Fix Audio Buffer allocation on Android >= 4.2
This commit is contained in:
parent
5220df817b
commit
070defcf11
2 changed files with 21 additions and 13 deletions
|
@ -353,8 +353,6 @@ public class SDLActivity extends Activity {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
private static Object buf;
|
|
||||||
|
|
||||||
public static Object audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {
|
public static Object audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {
|
||||||
int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
|
int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
|
||||||
int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
|
int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
|
||||||
|
@ -373,13 +371,6 @@ public class SDLActivity extends Activity {
|
||||||
audioStartThread();
|
audioStartThread();
|
||||||
|
|
||||||
Log.v("SDL", "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + ((float)mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer");
|
Log.v("SDL", "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + ((float)mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer");
|
||||||
|
|
||||||
if (is16Bit) {
|
|
||||||
buf = new short[desiredFrames * (isStereo ? 2 : 1)];
|
|
||||||
} else {
|
|
||||||
buf = new byte[desiredFrames * (isStereo ? 2 : 1)];
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void audioStartThread() {
|
public static void audioStartThread() {
|
||||||
|
|
|
@ -120,7 +120,7 @@ extern "C" void SDL_Android_Init(JNIEnv* mEnv, jclass cls)
|
||||||
midFlipBuffers = mEnv->GetStaticMethodID(mActivityClass,
|
midFlipBuffers = mEnv->GetStaticMethodID(mActivityClass,
|
||||||
"flipBuffers","()V");
|
"flipBuffers","()V");
|
||||||
midAudioInit = mEnv->GetStaticMethodID(mActivityClass,
|
midAudioInit = mEnv->GetStaticMethodID(mActivityClass,
|
||||||
"audioInit", "(IZZI)Ljava/lang/Object;");
|
"audioInit", "(IZZI)V");
|
||||||
midAudioWriteShortBuffer = mEnv->GetStaticMethodID(mActivityClass,
|
midAudioWriteShortBuffer = mEnv->GetStaticMethodID(mActivityClass,
|
||||||
"audioWriteShortBuffer", "([S)V");
|
"audioWriteShortBuffer", "([S)V");
|
||||||
midAudioWriteByteBuffer = mEnv->GetStaticMethodID(mActivityClass,
|
midAudioWriteByteBuffer = mEnv->GetStaticMethodID(mActivityClass,
|
||||||
|
@ -433,13 +433,30 @@ extern "C" int Android_JNI_OpenAudioDevice(int sampleRate, int is16Bit, int chan
|
||||||
audioBuffer16Bit = is16Bit;
|
audioBuffer16Bit = is16Bit;
|
||||||
audioBufferStereo = channelCount > 1;
|
audioBufferStereo = channelCount > 1;
|
||||||
|
|
||||||
audioBuffer = env->CallStaticObjectMethod(mActivityClass, midAudioInit, sampleRate, audioBuffer16Bit, audioBufferStereo, desiredBufferFrames);
|
env->CallStaticObjectMethod(mActivityClass, midAudioInit, sampleRate, audioBuffer16Bit, audioBufferStereo, desiredBufferFrames);
|
||||||
|
|
||||||
|
/* Allocating the audio buffer from the Java side and passing it as the return value for audioInit no longer works on
|
||||||
|
* Android >= 4.2 due to a "stale global reference" error. So now we allocate this buffer directly from this side. */
|
||||||
|
|
||||||
|
if (is16Bit) {
|
||||||
|
jshortArray audioBufferLocal = env->NewShortArray(desiredBufferFrames * (audioBufferStereo ? 2 : 1));
|
||||||
|
if (audioBufferLocal) {
|
||||||
|
audioBuffer = env->NewGlobalRef(audioBufferLocal);
|
||||||
|
env->DeleteLocalRef(audioBufferLocal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
jbyteArray audioBufferLocal = env->NewByteArray(desiredBufferFrames * (audioBufferStereo ? 2 : 1));
|
||||||
|
if (audioBufferLocal) {
|
||||||
|
audioBuffer = env->NewGlobalRef(audioBufferLocal);
|
||||||
|
env->DeleteLocalRef(audioBufferLocal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (audioBuffer == NULL) {
|
if (audioBuffer == NULL) {
|
||||||
__android_log_print(ANDROID_LOG_WARN, "SDL", "SDL audio: didn't get back a good audio buffer!");
|
__android_log_print(ANDROID_LOG_WARN, "SDL", "SDL audio: could not allocate an audio buffer!");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
audioBuffer = env->NewGlobalRef(audioBuffer);
|
|
||||||
|
|
||||||
jboolean isCopy = JNI_FALSE;
|
jboolean isCopy = JNI_FALSE;
|
||||||
if (audioBuffer16Bit) {
|
if (audioBuffer16Bit) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue