From dc6aa3f1614f6a5fe6a1321c7b0ec84bfaca7019 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sat, 19 Jan 2008 02:38:31 +0000 Subject: [PATCH] Avisynth audio provider will now never deliver audio under 32 kHz, fixing the dsound playback bug. Originally committed to SVN as r1776. --- aegisub/audio_provider.cpp | 6 +++--- aegisub/audio_provider_avs.cpp | 2 ++ aegisub/audio_provider_convert.cpp | 12 +++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/aegisub/audio_provider.cpp b/aegisub/audio_provider.cpp index 3c422a64c..af6ee865b 100644 --- a/aegisub/audio_provider.cpp +++ b/aegisub/audio_provider.cpp @@ -220,6 +220,9 @@ AudioProvider *AudioProviderFactory::GetAudioProvider(wxString filename, int cac // Failed if (!provider) throw error; + // Give it a conversor if needed + if (provider->GetBytesPerSample() != 2) provider = new ConvertAudioProvider(provider); + // Change provider to RAM/HD cache if needed if (cache == -1) cache = Options.AsInt(_T("Audio Cache")); if (cache) { @@ -238,9 +241,6 @@ AudioProvider *AudioProviderFactory::GetAudioProvider(wxString filename, int cac } } - // Give it a conversor if needed - if (provider && provider->GetBytesPerSample() != 2) provider = new ConvertAudioProvider(provider); - // Return return provider; } diff --git a/aegisub/audio_provider_avs.cpp b/aegisub/audio_provider_avs.cpp index aa13e0ffe..a0a8df7c4 100644 --- a/aegisub/audio_provider_avs.cpp +++ b/aegisub/audio_provider_avs.cpp @@ -175,9 +175,11 @@ void AvisynthAudioProvider::LoadFromClip(AVSValue _clip) { // Convert to 16 bits per sample script = env->Invoke("ConvertAudioTo16bit", script); + vi = script.AsClip()->GetVideoInfo(); // Convert sample rate int setsample = Options.AsInt(_T("Audio Sample Rate")); + if (vi.SamplesPerSecond() < 32000) setsample = 44100; if (setsample != 0) { AVSValue args[2] = { script, setsample }; script = env->Invoke("ResampleAudio", AVSValue(args,2)); diff --git a/aegisub/audio_provider_convert.cpp b/aegisub/audio_provider_convert.cpp index 56130dc36..0eb778f32 100644 --- a/aegisub/audio_provider_convert.cpp +++ b/aegisub/audio_provider_convert.cpp @@ -63,8 +63,11 @@ ConvertAudioProvider::~ConvertAudioProvider() { ///////////// // Get audio void ConvertAudioProvider::GetAudio(void *destination, int64_t start, int64_t count) { + // Bits per sample + int srcBps = source->GetBytesPerSample(); + // Convert from 8-bit to 16-bit - if (source->GetBytesPerSample() == 1) { + if (srcBps == 1) { unsigned char *buffer = new unsigned char[count]; source->GetAudio(buffer,start,count); short temp; @@ -73,5 +76,12 @@ void ConvertAudioProvider::GetAudio(void *destination, int64_t start, int64_t co temp = (short) buffer[i]; dst[i] = (temp-128)*256+temp; } + delete [] buffer; } + + // No conversion needed + else if (srcBps == 2) source->GetAudio(destination,start,count); + + // Unsupported + else throw _T("Unknown bits per sample value."); }