diff --git a/aegisub/audio_provider_lavc.cpp b/aegisub/audio_provider_lavc.cpp index 2d46211d9..06afb7322 100644 --- a/aegisub/audio_provider_lavc.cpp +++ b/aegisub/audio_provider_lavc.cpp @@ -58,8 +58,8 @@ extern "C" { -#include -#include +#include +#include } #include "mkv_wrap.h" #include "lavc_file.h" @@ -141,7 +141,9 @@ LAVCAudioProvider::LAVCAudioProvider(Aegisub::String _filename) buffer = (int16_t *)malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); if (!buffer) - throw _T("Out of memory"); + throw _T("Failed to allocate %d bytes for audio decoding buffer, out of memory?", AVCODEC_MAX_AUDIO_FRAME_SIZE); + + leftover_samples = 0; } catch (...) { Destroy(); @@ -204,9 +206,10 @@ void LAVCAudioProvider::GetAudio(void *buf, int64_t start, int64_t count) /* do the actual resampling */ decoded_samples = audio_resample(rsct, _buf, buffer, decoded_samples / codecContext->channels); - /* make some noise if we somehow ended up with more samples than we wanted (will cause audio skew) */ - if (decoded_samples > samples_to_decode) + if (decoded_samples > samples_to_decode) { wxLogMessage(wxString::Format(_T("Warning: decoder output more samples than requested, audio skew highly likely! (Wanted %d, got %d)"), (int)samples_to_decode, decoded_samples)); + } + } else { /* no resampling needed, just copy to the buffer, but first make noise if we got an overflow */ if (decoded_samples > samples_to_decode) diff --git a/aegisub/audio_provider_lavc.h b/aegisub/audio_provider_lavc.h index aede32294..cfd6fb89e 100644 --- a/aegisub/audio_provider_lavc.h +++ b/aegisub/audio_provider_lavc.h @@ -52,13 +52,14 @@ */ extern "C" { -#include -#include +#include +#include } #include "mkv_wrap.h" #include "lavc_file.h" #include "include/aegisub/audio_provider.h" #include "lavc_file.h" +#include /////////////////////// @@ -74,6 +75,9 @@ private: int audStream; int16_t *buffer; + std::vector overshoot_buffer; + + int leftover_samples; void Destroy(); diff --git a/aegisub/lavc_file.h b/aegisub/lavc_file.h index 155421943..21e8ab8ca 100644 --- a/aegisub/lavc_file.h +++ b/aegisub/lavc_file.h @@ -41,8 +41,8 @@ #endif #include extern "C" { -#include -#include +#include +#include } #include "include/aegisub/aegisub.h" diff --git a/aegisub/video_provider_lavc.h b/aegisub/video_provider_lavc.h index ece462f7c..8bb8e7ce1 100644 --- a/aegisub/video_provider_lavc.h +++ b/aegisub/video_provider_lavc.h @@ -43,9 +43,9 @@ #define EMULATE_INTTYPES #endif extern "C" { -#include -#include -#include +#include +#include +#include } #include "include/aegisub/video_provider.h" #include "include/aegisub/aegisub.h"