From 50f8389615623c711bb533d5c5d8e1eb2c940105 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Thu, 4 Nov 2010 04:58:27 +0000 Subject: [PATCH] Add support for delay in FFmpegSourceAudioProvider as FFMS2 only handles it automatically in the avisynth plugin Originally committed to SVN as r4828. --- aegisub/src/audio_provider_ffmpegsource.cpp | 19 ++++++++++++++++--- aegisub/src/audio_provider_ffmpegsource.h | 11 +++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/aegisub/src/audio_provider_ffmpegsource.cpp b/aegisub/src/audio_provider_ffmpegsource.cpp index 70fd9d086..0fbb109d6 100644 --- a/aegisub/src/audio_provider_ffmpegsource.cpp +++ b/aegisub/src/audio_provider_ffmpegsource.cpp @@ -184,8 +184,9 @@ void FFmpegSourceAudioProvider::LoadAudio(wxString filename) { channels = AudioInfo.Channels; sample_rate = AudioInfo.SampleRate; - num_samples = AudioInfo.NumSamples; - if (channels <= 0 || sample_rate <= 0 || num_samples <= 0) + delay = AudioInfo.FirstTime * sample_rate; + num_samples = AudioInfo.NumSamples + delay; + if (channels <= 0 || sample_rate <= 0 || num_samples <= 0 || delay < 0) throw AudioOpenError("sanity check failed, consult your local psychiatrist"); // FIXME: use the actual sample format too? @@ -222,7 +223,19 @@ void FFmpegSourceAudioProvider::Close() { /// @param Count /// void FFmpegSourceAudioProvider::GetAudio(void *Buf, int64_t Start, int64_t Count) { - if (FFMS_GetAudio(AudioSource, Buf, Start, Count, &ErrInfo)) { + uint8_t *Buf2 = static_cast(Buf); + Start -= delay; + if (Start < 0) { + size_t Bytes = std::min(-Start, Count) * bytes_per_sample * channels; + memset(Buf2, 0, Bytes); + + Count += Start; + if (Count <= 0) return; + + Start = 0; + Buf2 += Bytes; + } + if (FFMS_GetAudio(AudioSource, Buf2, Start, Count, &ErrInfo)) { throw AudioDecodeError(std::string("Failed to get audio samples: ") + ErrInfo.Buffer); } } diff --git a/aegisub/src/audio_provider_ffmpegsource.h b/aegisub/src/audio_provider_ffmpegsource.h index 3cb24e600..6e9314f3e 100644 --- a/aegisub/src/audio_provider_ffmpegsource.h +++ b/aegisub/src/audio_provider_ffmpegsource.h @@ -43,15 +43,18 @@ /// @brief Implements audio loading with the FFMS library. class FFmpegSourceAudioProvider : public AudioProvider, FFmpegSourceProvider { private: - FFMS_AudioSource *AudioSource; /// audio source object - bool COMInited; /// COM initialization state + FFMS_AudioSource *AudioSource; ///< audio source object + bool COMInited; ///< COM initialization state - char FFMSErrMsg[1024]; /// FFMS error message - FFMS_ErrorInfo ErrInfo; /// FFMS error codes/messages + char FFMSErrMsg[1024]; ///< FFMS error message + FFMS_ErrorInfo ErrInfo; ///< FFMS error codes/messages void Close(); void LoadAudio(wxString filename); + /// Audio delay in samples + int64_t delay; + public: FFmpegSourceAudioProvider(wxString filename); virtual ~FFmpegSourceAudioProvider();