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."); }