diff options
author | sfan5 <sfan5@live.de> | 2023-08-06 16:22:39 +0200 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2023-08-08 20:15:20 +0200 |
commit | 8b7904618e159593c35fea91c49c6b973e4b5a3e (patch) | |
tree | 97157699fc850ddb1d202c85660ebeac02d281d4 /audio/out | |
parent | 36bea732fb411c1097d47b756eb9a323ce1e3a56 (diff) | |
download | mpv-8b7904618e159593c35fea91c49c6b973e4b5a3e.tar.bz2 mpv-8b7904618e159593c35fea91c49c6b973e4b5a3e.tar.xz |
ao_audiotrack: allow byte buffer data transfer for float samples
Diffstat (limited to 'audio/out')
-rw-r--r-- | audio/out/ao_audiotrack.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/audio/out/ao_audiotrack.c b/audio/out/ao_audiotrack.c index acd39fb869..e008b53e17 100644 --- a/audio/out/ao_audiotrack.c +++ b/audio/out/ao_audiotrack.c @@ -501,20 +501,21 @@ static int AudioTrack_write(struct ao *ao, int len) if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1; if (ret > 0) ret *= 2; - } else if (p->format == AudioFormat.ENCODING_PCM_FLOAT) { - (*env)->SetFloatArrayRegion(env, p->floatarray, 0, len / sizeof(float), buf); - if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1; - ret = MP_JNI_CALL_INT(p->audiotrack, AudioTrack.writeFloat, p->floatarray, 0, len / sizeof(float), AudioTrack.WRITE_BLOCKING); - if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1; - if (ret > 0) ret *= sizeof(float); - } else if (AudioTrack.writeBufferV21) { + // reset positions for reading jobject bbuf = MP_JNI_CALL_OBJECT(p->bbuf, ByteBuffer.clear); if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1; (*env)->DeleteLocalRef(env, bbuf); ret = MP_JNI_CALL_INT(p->audiotrack, AudioTrack.writeBufferV21, p->bbuf, len, AudioTrack.WRITE_BLOCKING); if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1; + } else if (p->format == AudioFormat.ENCODING_PCM_FLOAT) { + (*env)->SetFloatArrayRegion(env, p->floatarray, 0, len / sizeof(float), buf); + if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1; + ret = MP_JNI_CALL_INT(p->audiotrack, AudioTrack.writeFloat, p->floatarray, 0, len / sizeof(float), AudioTrack.WRITE_BLOCKING); + if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1; + if (ret > 0) ret *= sizeof(float); + } else { (*env)->SetByteArrayRegion(env, p->bytearray, 0, len, buf); if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1; @@ -669,7 +670,7 @@ static int init(struct ao *ao) p->format = AudioFormat.ENCODING_IEC61937; } else if (ao->format == AF_FORMAT_U8) { p->format = AudioFormat.ENCODING_PCM_8BIT; - } else if (p->cfg_pcm_float && (ao->format == AF_FORMAT_FLOAT || ao->format == AF_FORMAT_FLOATP)) { + } else if (p->cfg_pcm_float && af_fmt_is_float(ao->format)) { ao->format = AF_FORMAT_FLOAT; p->format = AudioFormat.ENCODING_PCM_FLOAT; } else { @@ -737,18 +738,20 @@ static int init(struct ao *ao) p->timestamp = (*env)->NewGlobalRef(env, timestamp); (*env)->DeleteLocalRef(env, timestamp); + // decide and create buffer of right type if (p->format == AudioFormat.ENCODING_IEC61937) { jshortArray shortarray = (*env)->NewShortArray(env, p->chunksize / 2); p->shortarray = (*env)->NewGlobalRef(env, shortarray); (*env)->DeleteLocalRef(env, shortarray); - } else if (p->format == AudioFormat.ENCODING_PCM_FLOAT) { - jfloatArray floatarray = (*env)->NewFloatArray(env, p->chunksize / sizeof(float)); - p->floatarray = (*env)->NewGlobalRef(env, floatarray); - (*env)->DeleteLocalRef(env, floatarray); } else if (AudioTrack.writeBufferV21) { + MP_VERBOSE(ao, "Using NIO ByteBuffer\n"); jobject bbuf = (*env)->NewDirectByteBuffer(env, p->chunk, p->chunksize); p->bbuf = (*env)->NewGlobalRef(env, bbuf); (*env)->DeleteLocalRef(env, bbuf); + } else if (p->format == AudioFormat.ENCODING_PCM_FLOAT) { + jfloatArray floatarray = (*env)->NewFloatArray(env, p->chunksize / sizeof(float)); + p->floatarray = (*env)->NewGlobalRef(env, floatarray); + (*env)->DeleteLocalRef(env, floatarray); } else { jbyteArray bytearray = (*env)->NewByteArray(env, p->chunksize); p->bytearray = (*env)->NewGlobalRef(env, bytearray); |