[vlc-commits] audiotrack: use same buffer for successive WriteV21 calls
Thomas Guillem
git at videolan.org
Thu Jul 23 10:56:16 CEST 2015
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Jul 9 16:27:40 2015 +0200| [35f30c598b625a2e1a2fac8505d6ad1a9da7db9b] | committer: Thomas Guillem
audiotrack: use same buffer for successive WriteV21 calls
We can use the same buffer since the buffer position is moved by the AudioTrack
write call.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=35f30c598b625a2e1a2fac8505d6ad1a9da7db9b
---
modules/audio_output/audiotrack.c | 61 ++++++++++++-------------------------
1 file changed, 20 insertions(+), 41 deletions(-)
diff --git a/modules/audio_output/audiotrack.c b/modules/audio_output/audiotrack.c
index 49f613b..2c50529 100644
--- a/modules/audio_output/audiotrack.c
+++ b/modules/audio_output/audiotrack.c
@@ -532,12 +532,6 @@ AudioTrack_Reset( JNIEnv *env, audio_output_t *p_aout )
{
aout_sys_t *p_sys = p_aout->sys;
- if( p_sys->p_bytebuffer )
- {
- (*env)->DeleteGlobalRef( env, p_sys->p_bytebuffer );
- p_sys->p_bytebuffer = NULL;
- }
-
AudioTrack_ResetPositions( env, p_aout );
AudioTrack_ResetPlaybackHeadPosition( env, p_aout );
p_sys->i_samples_written = 0;
@@ -1172,39 +1166,10 @@ AudioTrack_WriteV21( JNIEnv *env, audio_output_t *p_aout, block_t *p_buffer,
size_t i_buffer_offset )
{
aout_sys_t *p_sys = p_aout->sys;
- int i_ret;
- size_t i_data = p_buffer->i_buffer - i_buffer_offset;
- uint8_t *p_data = p_buffer->p_buffer + i_buffer_offset;
-
- if( !p_sys->p_bytebuffer )
- {
- jobject p_bytebuffer;
-
- p_bytebuffer = (*env)->NewDirectByteBuffer( env, p_data, i_data );
- if( !p_bytebuffer )
- return jfields.AudioTrack.ERROR_BAD_VALUE;
-
- p_sys->p_bytebuffer = (*env)->NewGlobalRef( env, p_bytebuffer );
- (*env)->DeleteLocalRef( env, p_bytebuffer );
-
- if( !p_sys->p_bytebuffer || (*env)->ExceptionOccurred( env ) )
- {
- p_sys->p_bytebuffer = NULL;
- (*env)->ExceptionClear( env );
- return jfields.AudioTrack.ERROR_BAD_VALUE;
- }
- }
- i_ret = JNI_AT_CALL_INT( writeV21, p_sys->p_bytebuffer, i_data,
- jfields.AudioTrack.WRITE_NON_BLOCKING );
- if( i_ret > 0 )
- {
- /* don't delete the bytebuffer if we wrote nothing, keep it for next
- * call */
- (*env)->DeleteGlobalRef( env, p_sys->p_bytebuffer );
- p_sys->p_bytebuffer = NULL;
- }
- return i_ret;
+ return JNI_AT_CALL_INT( writeV21, p_sys->p_bytebuffer,
+ p_buffer->i_buffer - i_buffer_offset,
+ jfields.AudioTrack.WRITE_NON_BLOCKING );
}
/**
@@ -1305,6 +1270,17 @@ AudioTrack_PreparePlay( JNIEnv *env, audio_output_t *p_aout,
break;
}
case WRITE_V21:
+ /* No need to get a global ref, this object will be only used from the
+ * same Play call */
+ p_sys->p_bytebuffer = (*env)->NewDirectByteBuffer( env,
+ p_buffer->p_buffer,
+ p_buffer->i_buffer );
+ if( !p_sys->p_bytebuffer )
+ {
+ if( (*env)->ExceptionOccurred( env ) )
+ (*env)->ExceptionClear( env );
+ return VLC_EGENERIC;
+ }
break;
}
@@ -1371,7 +1347,7 @@ AudioTrack_Play( JNIEnv *env, audio_output_t *p_aout,
static void
Play( audio_output_t *p_aout, block_t *p_buffer )
{
- JNIEnv *env;
+ JNIEnv *env = NULL;
size_t i_buffer_offset = 0;
mtime_t i_last_time_blocked = 0;
mtime_t i_play_wait = 0;
@@ -1426,6 +1402,11 @@ Play( audio_output_t *p_aout, block_t *p_buffer )
}
bailout:
+ if( p_sys->p_bytebuffer && env )
+ {
+ (*env)->DeleteLocalRef( env, p_sys->p_bytebuffer );
+ p_sys->p_bytebuffer = NULL;
+ }
block_Release( p_buffer );
}
@@ -1577,8 +1558,6 @@ Close( vlc_object_t *obj )
(*env)->DeleteGlobalRef( env, p_sys->p_bytearray );
if( p_sys->p_floatarray )
(*env)->DeleteGlobalRef( env, p_sys->p_floatarray );
- if( p_sys->p_bytebuffer )
- (*env)->DeleteGlobalRef( env, p_sys->p_bytebuffer );
}
free( p_sys );
More information about the vlc-commits
mailing list