From ca1d42ba551e95570156af3020c0bcea202b06cc Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sat, 19 Jan 2008 02:18:08 +0000 Subject: [PATCH] Added a conversion audio provider to convert 8-bit audio into 16-bit. Originally committed to SVN as r1774. --- aegisub/Makefile.am | 1 + aegisub/audio_provider.cpp | 6 +- aegisub/audio_provider_convert.cpp | 77 ++++++++++++++++++++++ aegisub/audio_provider_convert.h | 57 ++++++++++++++++ aegisub/auto4_perl_console.h | 2 +- build/aegisub_vs2005/aegisub_vs2005.vcproj | 8 +++ 6 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 aegisub/audio_provider_convert.cpp create mode 100644 aegisub/audio_provider_convert.h diff --git a/aegisub/Makefile.am b/aegisub/Makefile.am index 989ebbdba..6156e3788 100644 --- a/aegisub/Makefile.am +++ b/aegisub/Makefile.am @@ -120,6 +120,7 @@ aegisub_SOURCES = \ audio_display.cpp \ audio_karaoke.cpp \ audio_provider.cpp \ + audio_provider_convert.cpp \ audio_provider_hd.cpp \ audio_provider_ram.cpp \ audio_provider_pcm.cpp \ diff --git a/aegisub/audio_provider.cpp b/aegisub/audio_provider.cpp index 6c138f2cb..39ac8af77 100644 --- a/aegisub/audio_provider.cpp +++ b/aegisub/audio_provider.cpp @@ -41,6 +41,7 @@ #include "audio_provider_ram.h" #include "audio_provider_hd.h" #include "audio_provider_pcm.h" +#include "audio_provider_convert.h" #include "options.h" #include "audio_display.h" @@ -190,7 +191,10 @@ AudioProvider *AudioProviderFactory::GetAudioProvider(wxString filename, int cac // Try a PCM provider first provider = CreatePCMAudioProvider(filename); - if (provider) return provider; + if (provider) { + if (provider->GetBytesPerSample() == 2) return provider; + return new ConvertAudioProvider(provider); + } // List of providers wxArrayString list = GetFactoryList(Options.AsText(_T("Audio provider"))); diff --git a/aegisub/audio_provider_convert.cpp b/aegisub/audio_provider_convert.cpp new file mode 100644 index 000000000..56130dc36 --- /dev/null +++ b/aegisub/audio_provider_convert.cpp @@ -0,0 +1,77 @@ +// Copyright (c) 2008, Rodrigo Braz Monteiro +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +#pragma once + + +/////////// +// Headers +#include "audio_provider_convert.h" + + +/////////////// +// Constructor +ConvertAudioProvider::ConvertAudioProvider(AudioProvider *src) { + source = src; + channels = 1; + num_samples = source->GetNumSamples(); + sample_rate = source->GetSampleRate(); + bytes_per_sample = 2; +} + + +////////////// +// Destructor +ConvertAudioProvider::~ConvertAudioProvider() { + delete source; +} + + +///////////// +// Get audio +void ConvertAudioProvider::GetAudio(void *destination, int64_t start, int64_t count) { + // Convert from 8-bit to 16-bit + if (source->GetBytesPerSample() == 1) { + unsigned char *buffer = new unsigned char[count]; + source->GetAudio(buffer,start,count); + short temp; + short *dst = (short*) destination; + for (int64_t i=0;iGetFilename(); } +}; diff --git a/aegisub/auto4_perl_console.h b/aegisub/auto4_perl_console.h index f6c97c644..d40ebc628 100644 --- a/aegisub/auto4_perl_console.h +++ b/aegisub/auto4_perl_console.h @@ -81,7 +81,7 @@ namespace Automation4 { virtual bool Validate(AssFile *subs, const std::vector &selected, int active) { return true; } virtual void Process(AssFile *subs, std::vector &selected, int active, wxWindow * const progress_parent); - static wxString Evaluate(const wxString &str) { if(registered) return registered->evaluate(str); } + static wxString Evaluate(const wxString &str) { if(registered) return registered->evaluate(str); else return _T(""); } }; XS(register_console); diff --git a/build/aegisub_vs2005/aegisub_vs2005.vcproj b/build/aegisub_vs2005/aegisub_vs2005.vcproj index f1472034d..3de9972a9 100644 --- a/build/aegisub_vs2005/aegisub_vs2005.vcproj +++ b/build/aegisub_vs2005/aegisub_vs2005.vcproj @@ -332,6 +332,14 @@ RelativePath="..\..\aegisub\audio_provider_avs.cpp" > + + + +