FIXME comments in (almost) all audio players, neither handle time reporting fully correct: they report number of samples they have played plus start sample, instead of current sample being heard, ie. they don't take into account that the current position might get changed in mid-stream by the video player to resync audio to video.
Originally committed to SVN as r1175.
This commit is contained in:
parent
e46b57ca86
commit
b9298b61e4
4 changed files with 9 additions and 0 deletions
|
@ -397,6 +397,8 @@ __int64 AlsaPlayer::GetEndPosition()
|
||||||
// Get current position
|
// Get current position
|
||||||
__int64 AlsaPlayer::GetCurrentPosition()
|
__int64 AlsaPlayer::GetCurrentPosition()
|
||||||
{
|
{
|
||||||
|
// FIXME: this should be based on not duration played but actual sample being heard
|
||||||
|
// (during vidoeo playback, cur_frame might get changed to resync)
|
||||||
snd_pcm_sframes_t delay = 0;
|
snd_pcm_sframes_t delay = 0;
|
||||||
snd_pcm_delay(pcm_handle, &delay); // don't bother catching errors here
|
snd_pcm_delay(pcm_handle, &delay); // don't bother catching errors here
|
||||||
return cur_frame - delay;
|
return cur_frame - delay;
|
||||||
|
|
|
@ -395,6 +395,8 @@ __int64 DirectSoundPlayer::GetCurrentPosition() {
|
||||||
// Check if buffer is loaded
|
// Check if buffer is loaded
|
||||||
if (!buffer || !playing) return 0;
|
if (!buffer || !playing) return 0;
|
||||||
|
|
||||||
|
// FIXME: this should be based on not duration played but actual sample being heard
|
||||||
|
// (during vidoeo playback, cur_frame might get changed to resync)
|
||||||
DWORD curtime = GetTickCount();
|
DWORD curtime = GetTickCount();
|
||||||
__int64 tdiff = curtime - startTime;
|
__int64 tdiff = curtime - startTime;
|
||||||
return startPos + tdiff * provider->GetSampleRate() / 1000;
|
return startPos + tdiff * provider->GetSampleRate() / 1000;
|
||||||
|
|
|
@ -384,6 +384,8 @@ __int64 OpenALPlayer::GetEndPosition()
|
||||||
// Get current position
|
// Get current position
|
||||||
__int64 OpenALPlayer::GetCurrentPosition()
|
__int64 OpenALPlayer::GetCurrentPosition()
|
||||||
{
|
{
|
||||||
|
// FIXME: this should be based on not duration played but actual sample being heard
|
||||||
|
// (during vidoeo playback, cur_frame might get changed to resync)
|
||||||
long extra = playback_segment_timer.Time();
|
long extra = playback_segment_timer.Time();
|
||||||
return buffers_played * buffer_length + start_frame + extra * samplerate / 1000;
|
return buffers_played * buffer_length + start_frame + extra * samplerate / 1000;
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,6 +395,9 @@ __int64 PulseAudioPlayer::GetCurrentPosition()
|
||||||
{
|
{
|
||||||
if (!is_playing) return 0;
|
if (!is_playing) return 0;
|
||||||
|
|
||||||
|
// FIXME: this should be based on not duration played but actual sample being heard
|
||||||
|
// (during vidoeo playback, cur_frame might get changed to resync)
|
||||||
|
|
||||||
// Calculation duration we have played, in microseconds
|
// Calculation duration we have played, in microseconds
|
||||||
pa_usec_t play_cur_time;
|
pa_usec_t play_cur_time;
|
||||||
pa_stream_get_time(stream, &play_cur_time);
|
pa_stream_get_time(stream, &play_cur_time);
|
||||||
|
|
Loading…
Reference in a new issue