[vlc-commits] audiotrack: clip buffer size between 250ms and 1000ms
Thomas Guillem
git at videolan.org
Fri Apr 3 12:46:49 CEST 2015
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Apr 3 12:43:41 2015 +0200| [31ff9f18446d57f7a6139418f63f179d11249aca] | committer: Jean-Baptiste Kempf
audiotrack: clip buffer size between 250ms and 1000ms
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=31ff9f18446d57f7a6139418f63f179d11249aca
---
modules/audio_output/audiotrack.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/modules/audio_output/audiotrack.c b/modules/audio_output/audiotrack.c
index f3d3268..06842bd 100644
--- a/modules/audio_output/audiotrack.c
+++ b/modules/audio_output/audiotrack.c
@@ -34,6 +34,9 @@
#include <vlc_plugin.h>
#include <vlc_aout.h>
+#define MIN_AUDIOTRACK_BUFFER_US INT64_C(250000) // 250ms
+#define MAX_AUDIOTRACK_BUFFER_US INT64_C(1000000) // 1000ms
+
static int Open( vlc_object_t * );
static void Close( vlc_object_t * );
static void Stop( audio_output_t * );
@@ -528,6 +531,7 @@ AudioTrack_New( JNIEnv *env, audio_output_t *p_aout,
unsigned int i_rate,
vlc_fourcc_t i_vlc_format,
uint16_t i_physical_channels,
+ int i_bytes_per_frame,
int *p_audiotrack_size )
{
int i_size, i_min_buffer_size, i_channel_config, i_format;
@@ -582,7 +586,19 @@ AudioTrack_New( JNIEnv *env, audio_output_t *p_aout,
if( i_vlc_format == VLC_CODEC_SPDIFB )
i_size = ( i_min_buffer_size / AOUT_SPDIF_SIZE + 1 ) * AOUT_SPDIF_SIZE;
else
+ {
+ /* Optimal buffer size: i_min_buffer_size * 4 but between 250ms and
+ * 1000ms */
+ mtime_t i_time, i_clipped_time;
+
i_size = i_min_buffer_size * 4;
+ i_time = (i_size / i_bytes_per_frame) * CLOCK_FREQ / i_rate;
+
+ i_clipped_time = VLC_CLIP( i_time, MIN_AUDIOTRACK_BUFFER_US,
+ MAX_AUDIOTRACK_BUFFER_US );
+ if( i_clipped_time != i_time )
+ i_size = i_rate * i_clipped_time * i_bytes_per_frame / CLOCK_FREQ;
+ }
/* create AudioTrack object */
p_audiotrack = JNI_AT_NEW( jfields.AudioManager.STREAM_MUSIC, i_rate,
@@ -612,7 +628,7 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
aout_sys_t *p_sys = p_aout->sys;
JNIEnv *env;
jobject p_audiotrack = NULL;
- int i_nb_channels, i_audiotrack_size;
+ int i_nb_channels, i_audiotrack_size, i_bytes_per_frame;
if( !( env = jni_get_env( THREAD_NAME ) ) )
return VLC_EGENERIC;
@@ -672,6 +688,9 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
do
{
+ i_bytes_per_frame = i_nb_channels *
+ aout_BitsPerSample( p_sys->fmt.i_format ) / 8;
+
/* Try to create an AudioTrack with the most advanced channel and
* format configuration. If AudioTrack_New fails, try again with a less
* advanced format (PCM S16N). If it fails again, try again with Stereo
@@ -679,6 +698,7 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
p_audiotrack = AudioTrack_New( env, p_aout, p_sys->fmt.i_rate,
p_sys->fmt.i_format,
p_sys->fmt.i_physical_channels,
+ i_bytes_per_frame,
&i_audiotrack_size );
if( !p_audiotrack )
{
@@ -734,9 +754,7 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
aout_CheckChannelReorder( NULL, p_chans_out,
p_sys->fmt.i_physical_channels,
p_sys->p_chan_table );
- p_sys->i_bytes_per_frame = i_nb_channels *
- aout_BitsPerSample( p_sys->fmt.i_format ) /
- 8;
+ p_sys->i_bytes_per_frame = i_bytes_per_frame;
}
p_sys->i_max_audiotrack_samples = BYTES_TO_FRAMES( i_audiotrack_size );
More information about the vlc-commits
mailing list