Commit 7fec79d9 authored by David Fuhrmann's avatar David Fuhrmann

auhal: rewrite TimeGet function

This fixes stuttering when resuming playback after pause.
Buffer size is increased to avoid packet drops.

Also fixes #8223
parent f27f834d
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* *
* Authors: Derk-Jan Hartman <hartman at videolan dot org> * Authors: Derk-Jan Hartman <hartman at videolan dot org>
* Felix Paul Kühne <fkuehne at videolan dot org> * Felix Paul Kühne <fkuehne at videolan dot org>
* David Fuhrmann <david dot fuhrmann at googlemail dot com>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by * under the terms of the GNU Lesser General Public License as published by
...@@ -56,7 +57,8 @@ ...@@ -56,7 +57,8 @@
#define AOUT_VAR_SPDIF_FLAG 0xf00000 #define AOUT_VAR_SPDIF_FLAG 0xf00000
#define kBufferLength 2048 * 8 * 8 * 4 #define AUDIO_BUFFER_SIZE_IN_SECONDS (AOUT_MAX_ADVANCE_TIME / CLOCK_FREQ)
#define AOUT_VOLUME_DEFAULT 256 #define AOUT_VOLUME_DEFAULT 256
#define AOUT_VOLUME_MAX 512 #define AOUT_VOLUME_MAX 512
...@@ -103,8 +105,7 @@ struct aout_sys_t ...@@ -103,8 +105,7 @@ struct aout_sys_t
bool b_got_first_sample; /* did the aout core provide something to render? */ bool b_got_first_sample; /* did the aout core provide something to render? */
int i_rate; /* media sample rate */ int i_rate; /* media sample rate */
mtime_t i_played_length; /* how much did we play already */ int i_bytes_per_sample;
mtime_t i_last_sample_time; /* last sample time played by the AudioUnit */
struct audio_device_t *devices; struct audio_device_t *devices;
...@@ -239,6 +240,7 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt) ...@@ -239,6 +240,7 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
p_sys->i_stream_index = -1; p_sys->i_stream_index = -1;
p_sys->b_revert = false; p_sys->b_revert = false;
p_sys->b_changed_mixing = false; p_sys->b_changed_mixing = false;
p_sys->i_bytes_per_sample = 0;
aout_FormatPrint(p_aout, "VLC is looking for:", fmt); aout_FormatPrint(p_aout, "VLC is looking for:", fmt);
...@@ -633,11 +635,10 @@ static int StartAnalog(audio_output_t *p_aout, audio_sample_format_t *fmt) ...@@ -633,11 +635,10 @@ static int StartAnalog(audio_output_t *p_aout, audio_sample_format_t *fmt)
p_sys->clock_diff += mdate(); p_sys->clock_diff += mdate();
/* setup circular buffer */ /* setup circular buffer */
TPCircularBufferInit(&p_sys->circular_buffer, kBufferLength); TPCircularBufferInit(&p_sys->circular_buffer, AUDIO_BUFFER_SIZE_IN_SECONDS *
fmt->i_rate * fmt->i_bytes_per_frame);
p_sys->b_got_first_sample = false; p_sys->b_got_first_sample = false;
p_sys->i_played_length = 0;
p_sys->i_last_sample_time = 0;
/* Set volume for output unit */ /* Set volume for output unit */
float volume = var_InheritInteger(p_aout, "auhal-volume") / (float)AOUT_VOLUME_DEFAULT; float volume = var_InheritInteger(p_aout, "auhal-volume") / (float)AOUT_VOLUME_DEFAULT;
...@@ -858,9 +859,7 @@ static int StartSPDIF (audio_output_t * p_aout, audio_sample_format_t *fmt) ...@@ -858,9 +859,7 @@ static int StartSPDIF (audio_output_t * p_aout, audio_sample_format_t *fmt)
} }
/* setup circular buffer */ /* setup circular buffer */
TPCircularBufferInit(&p_sys->circular_buffer, kBufferLength); TPCircularBufferInit(&p_sys->circular_buffer, 200 * AOUT_SPDIF_SIZE);
p_sys->i_played_length = 0;
p_sys->i_last_sample_time = 0;
return true; return true;
} }
...@@ -941,8 +940,7 @@ static void Stop(audio_output_t *p_aout) ...@@ -941,8 +940,7 @@ static void Stop(audio_output_t *p_aout)
msg_Err(p_aout, "Could not release hogmode: [%4.4s]", (char *)&err); msg_Err(p_aout, "Could not release hogmode: [%4.4s]", (char *)&err);
} }
p_sys->i_played_length = 0; p_sys->i_bytes_per_sample = 0;
p_sys->i_last_sample_time = 0;
/* clean-up circular buffer */ /* clean-up circular buffer */
TPCircularBufferCleanup(&p_sys->circular_buffer); TPCircularBufferCleanup(&p_sys->circular_buffer);
...@@ -1195,14 +1193,13 @@ static void Play (audio_output_t * p_aout, block_t * p_block) ...@@ -1195,14 +1193,13 @@ static void Play (audio_output_t * p_aout, block_t * p_block)
VLC_CODEC_FL32); VLC_CODEC_FL32);
} }
/* keep track of the played data */
p_aout->sys->i_played_length += p_block->i_length;
/* move data to buffer */ /* move data to buffer */
if (unlikely(TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer) == 0)) { if (unlikely(TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer) == 0)) {
msg_Warn(p_aout, "Audio buffer was dropped"); msg_Warn(p_aout, "Audio buffer was dropped");
} }
if (!p_sys->i_bytes_per_sample)
p_sys->i_bytes_per_sample = p_block->i_buffer / p_block->i_nb_samples;
} }
block_Release(p_block); block_Release(p_block);
...@@ -1236,25 +1233,21 @@ static void Flush(audio_output_t *p_aout, bool wait) ...@@ -1236,25 +1233,21 @@ static void Flush(audio_output_t *p_aout, bool wait)
/* flush circular buffer */ /* flush circular buffer */
AudioOutputUnitStop(p_aout->sys->au_unit); AudioOutputUnitStop(p_aout->sys->au_unit);
TPCircularBufferClear(&p_aout->sys->circular_buffer); TPCircularBufferClear(&p_aout->sys->circular_buffer);
p_sys->i_played_length = 0;
p_sys->i_last_sample_time = 0;
} }
static int TimeGet(audio_output_t *p_aout, mtime_t *delay) static int TimeGet(audio_output_t *p_aout, mtime_t *delay)
{ {
struct aout_sys_t * p_sys = p_aout->sys; struct aout_sys_t * p_sys = p_aout->sys;
vlc_mutex_lock(&p_sys->lock); if (!p_sys->i_bytes_per_sample)
mtime_t i_pos = p_sys->i_last_sample_time * CLOCK_FREQ / p_sys->i_rate;
vlc_mutex_unlock(&p_sys->lock);
if (i_pos > 0) {
*delay = p_aout->sys->i_played_length - i_pos;
return 0;
}
else
return -1; return -1;
int32_t availableBytes;
TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
*delay = (availableBytes / p_sys->i_bytes_per_sample) * CLOCK_FREQ / p_sys->i_rate;
return 0;
} }
/***************************************************************************** /*****************************************************************************
...@@ -1292,9 +1285,6 @@ static OSStatus RenderCallbackAnalog(vlc_object_t *p_obj, ...@@ -1292,9 +1285,6 @@ static OSStatus RenderCallbackAnalog(vlc_object_t *p_obj,
memcpy(targetBuffer, buffer, __MIN(bytesToCopy, availableBytes)); memcpy(targetBuffer, buffer, __MIN(bytesToCopy, availableBytes));
TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes)); TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
VLC_UNUSED(inNumberFrames); VLC_UNUSED(inNumberFrames);
vlc_mutex_lock(&p_sys->lock);
p_sys->i_last_sample_time = inTimeStamp->mSampleTime;
vlc_mutex_unlock(&p_sys->lock);
} }
return noErr; return noErr;
...@@ -1315,6 +1305,7 @@ static OSStatus RenderCallbackSPDIF (AudioDeviceID inDevice, ...@@ -1315,6 +1305,7 @@ static OSStatus RenderCallbackSPDIF (AudioDeviceID inDevice,
VLC_UNUSED(inDevice); VLC_UNUSED(inDevice);
VLC_UNUSED(inInputData); VLC_UNUSED(inInputData);
VLC_UNUSED(inInputTime); VLC_UNUSED(inInputTime);
VLC_UNUSED(inOutputTime);
audio_output_t * p_aout = (audio_output_t *)threadGlobals; audio_output_t * p_aout = (audio_output_t *)threadGlobals;
struct aout_sys_t * p_sys = p_aout->sys; struct aout_sys_t * p_sys = p_aout->sys;
...@@ -1333,9 +1324,6 @@ static OSStatus RenderCallbackSPDIF (AudioDeviceID inDevice, ...@@ -1333,9 +1324,6 @@ static OSStatus RenderCallbackSPDIF (AudioDeviceID inDevice,
} else { } else {
memcpy(targetBuffer, buffer, __MIN(bytesToCopy, availableBytes)); memcpy(targetBuffer, buffer, __MIN(bytesToCopy, availableBytes));
TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes)); TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
vlc_mutex_lock(&p_sys->lock);
p_sys->i_last_sample_time = inOutputTime->mSampleTime;
vlc_mutex_unlock(&p_sys->lock);
} }
return noErr; return noErr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment