[vlc-devel] [PATCH 1/2] audiotrack: use device native sample rate
Thomas Guillem
thomas at gllm.fr
Tue Apr 7 11:40:12 CEST 2015
VLC resampler > android resampler
---
modules/audio_output/audiotrack.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/modules/audio_output/audiotrack.c b/modules/audio_output/audiotrack.c
index 06842bd..bb79d46 100644
--- a/modules/audio_output/audiotrack.c
+++ b/modules/audio_output/audiotrack.c
@@ -111,6 +111,7 @@ static struct
jmethodID getPlaybackHeadPosition;
jmethodID getTimestamp;
jmethodID getMinBufferSize;
+ jmethodID getNativeOutputSampleRate;
jint STATE_INITIALIZED;
jint MODE_STREAM;
jint ERROR;
@@ -237,6 +238,8 @@ InitJNIFields( audio_output_t *p_aout )
GET_ID( GetStaticMethodID, AudioTrack.getMinBufferSize, "getMinBufferSize",
"(III)I", true );
+ GET_ID( GetStaticMethodID, AudioTrack.getNativeOutputSampleRate,
+ "getNativeOutputSampleRate", "(I)I", true );
GET_CONST_INT( AudioTrack.STATE_INITIALIZED, "STATE_INITIALIZED", true );
GET_CONST_INT( AudioTrack.MODE_STREAM, "MODE_STREAM", true );
GET_CONST_INT( AudioTrack.ERROR, "ERROR", true );
@@ -628,7 +631,9 @@ 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, i_bytes_per_frame;
+ int i_nb_channels, i_audiotrack_size, i_bytes_per_frame,
+ i_native_rate;
+ unsigned int i_rate;
if( !( env = jni_get_env( THREAD_NAME ) ) )
return VLC_EGENERIC;
@@ -639,8 +644,13 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
p_sys->fmt.i_original_channels = p_sys->fmt.i_physical_channels;
- /* 4000 <= frequency <= 48000 */
- p_sys->fmt.i_rate = VLC_CLIP( p_sys->fmt.i_rate, 4000, 48000 );
+ i_native_rate = JNI_AT_CALL_STATIC_INT( getNativeOutputSampleRate,
+ jfields.AudioManager.STREAM_MUSIC );
+ if( i_native_rate <= 0 )
+ {
+ msg_Warn( p_aout, "negative native rate ? Should not happen !" );
+ i_native_rate = VLC_CLIP( p_sys->fmt.i_rate, 4000, 48000 );
+ }
/* We can only accept U8, S16N, FL32, and AC3 */
switch( p_sys->fmt.i_format )
@@ -690,12 +700,15 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
{
i_bytes_per_frame = i_nb_channels *
aout_BitsPerSample( p_sys->fmt.i_format ) / 8;
+ i_rate = p_sys->fmt.i_format == VLC_CODEC_SPDIFB ?
+ VLC_CLIP( p_sys->fmt.i_rate, 32000, 48000 )
+ : (unsigned int) i_native_rate;
/* 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
* channels. */
- p_audiotrack = AudioTrack_New( env, p_aout, p_sys->fmt.i_rate,
+ p_audiotrack = AudioTrack_New( env, p_aout, i_rate,
p_sys->fmt.i_format,
p_sys->fmt.i_physical_channels,
i_bytes_per_frame,
@@ -737,6 +750,7 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
if( !p_sys->p_audiotrack )
return VLC_EGENERIC;
+ p_sys->fmt.i_rate = i_rate;
p_sys->b_spdif = p_sys->fmt.i_format == VLC_CODEC_SPDIFB;
if( p_sys->b_spdif )
{
--
2.1.3
More information about the vlc-devel
mailing list