diff --git a/aegisub/audio_provider.cpp b/aegisub/audio_provider.cpp index debf69074..795841480 100644 --- a/aegisub/audio_provider.cpp +++ b/aegisub/audio_provider.cpp @@ -42,6 +42,12 @@ #include "audio_provider_hd.h" #include "audio_provider_pcm.h" #include "audio_provider_convert.h" +#ifdef WITH_AVISYNTH +#include "audio_provider_avs.h" +#endif +#ifdef WITH_FFMPEG +#include "audio_provider_avs.h" +#endif #include "options.h" #include "audio_display.h" @@ -186,6 +192,12 @@ void AudioProvider::GetAudioWithVolume(void *buf, int64_t start, int64_t count, //////////////// // Get provider AudioProvider *AudioProviderFactory::GetAudioProvider(wxString filename, int cache) { + // Initialize providers + // HACK: fixme + static bool init = false; + if (!init) RegisterProviders(); + init = true; + // Prepare provider AudioProvider *provider = NULL; @@ -246,6 +258,18 @@ AudioProvider *AudioProviderFactory::GetAudioProvider(wxString filename, int cac } +/////////////////////////// +// Register all providers +void AudioProviderFactory::RegisterProviders() { +#ifdef WITH_AVISYNTH + new AvisynthAudioProviderFactory(); +#endif +#ifdef WITH_FFMPEG + new LAVCAudioProviderFactory(); +#endif +} + + ////////// // Static template std::map* AegisubFactory::factories=NULL; diff --git a/aegisub/audio_provider.h b/aegisub/audio_provider.h index 622fce34b..6a1d39b83 100644 --- a/aegisub/audio_provider.h +++ b/aegisub/audio_provider.h @@ -92,4 +92,5 @@ protected: public: virtual ~AudioProviderFactory() {} static AudioProvider *GetAudioProvider(wxString filename, int cache=-1); + static void RegisterProviders(); }; diff --git a/aegisub/audio_provider_avs.cpp b/aegisub/audio_provider_avs.cpp index 262ec2b3b..fb35856ab 100644 --- a/aegisub/audio_provider_avs.cpp +++ b/aegisub/audio_provider_avs.cpp @@ -41,45 +41,12 @@ #include #include #include -#include "audio_provider.h" -#include "avisynth_wrap.h" +#include "audio_provider_avs.h" #include "utils.h" #include "options.h" #include "standard_paths.h" -//////////////////////// -// Audio provider class -class AvisynthAudioProvider : public AudioProvider, public AviSynthWrapper { -private: - wxString filename; - PClip clip; - - void LoadFromClip(AVSValue clip); - void OpenAVSAudio(); - void SetFile(); - void Unload(); - -public: - AvisynthAudioProvider(wxString _filename); - ~AvisynthAudioProvider(); - - wxString GetFilename(); - - void GetAudio(void *buf, int64_t start, int64_t count); - void GetWaveForm(int *min,int *peak,int64_t start,int w,int h,int samples,float scale); -}; - - -/////////// -// Factory -class AvisynthAudioProviderFactory : public AudioProviderFactory { -public: - AudioProvider *CreateProvider(wxString file) { return new AvisynthAudioProvider(file); } - AvisynthAudioProviderFactory() : AudioProviderFactory(_T("avisynth")) {} -} registerAVSaudio; - - ////////////// // Constructor AvisynthAudioProvider::AvisynthAudioProvider(wxString _filename) { diff --git a/aegisub/audio_provider_avs.h b/aegisub/audio_provider_avs.h new file mode 100644 index 000000000..1699f8e42 --- /dev/null +++ b/aegisub/audio_provider_avs.h @@ -0,0 +1,77 @@ +// Copyright (c) 2005-2006, Rodrigo Braz Monteiro, Fredrik Mellbin +// 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 +// + + +/////////// +// Headers +#include +#ifdef WITH_AVISYNTH +#include +#include "audio_provider.h" +#include "avisynth_wrap.h" + + +//////////////////////// +// Audio provider class +class AvisynthAudioProvider : public AudioProvider, public AviSynthWrapper { +private: + wxString filename; + PClip clip; + + void LoadFromClip(AVSValue clip); + void OpenAVSAudio(); + void SetFile(); + void Unload(); + +public: + AvisynthAudioProvider(wxString _filename); + ~AvisynthAudioProvider(); + + wxString GetFilename(); + + void GetAudio(void *buf, int64_t start, int64_t count); + void GetWaveForm(int *min,int *peak,int64_t start,int w,int h,int samples,float scale); +}; + + +/////////// +// Factory +class AvisynthAudioProviderFactory : public AudioProviderFactory { +public: + AudioProvider *CreateProvider(wxString file) { return new AvisynthAudioProvider(file); } + AvisynthAudioProviderFactory() : AudioProviderFactory(_T("avisynth")) {} +}; + +#endif diff --git a/aegisub/audio_provider_lavc.cpp b/aegisub/audio_provider_lavc.cpp index 341fc7868..b25d21949 100644 --- a/aegisub/audio_provider_lavc.cpp +++ b/aegisub/audio_provider_lavc.cpp @@ -63,38 +63,6 @@ extern "C" { #include "options.h" -/////////////////////// -// LAVC Audio Provider -class LAVCAudioProvider : public AudioProvider { -private: - LAVCFile *lavcfile; - - AVCodecContext *codecContext; - ReSampleContext *rsct; - float resample_ratio; - AVStream *stream; - int audStream; - - int16_t *buffer; - - void Destroy(); - -public: - LAVCAudioProvider(wxString _filename); - virtual ~LAVCAudioProvider(); - virtual void GetAudio(void *buf, int64_t start, int64_t count); -}; - - -/////////// -// Factory -class LAVCAudioProviderFactory : public AudioProviderFactory { -public: - AudioProvider *CreateProvider(wxString file) { return new LAVCAudioProvider(file); } - LAVCAudioProviderFactory() : AudioProviderFactory(_T("lavc")) {} -} registerLAVCaudio; - - /////////////// // Constructor LAVCAudioProvider::LAVCAudioProvider(wxString _filename) diff --git a/aegisub/audio_provider_lavc.h b/aegisub/audio_provider_lavc.h new file mode 100644 index 000000000..15d50778f --- /dev/null +++ b/aegisub/audio_provider_lavc.h @@ -0,0 +1,95 @@ +// Copyright (c) 2005-2006, Rodrigo Braz Monteiro, Fredrik Mellbin +// 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 +// + + +/////////// +// Headers +#ifdef WITH_FFMPEG + +#ifdef WIN32 +#define EMULATE_INTTYPES +#endif +#include + +/* avcodec.h uses INT64_C in a *single* place. This prolly breaks on Win32, + * but, well. Let's at least fix it for Linux. + * +#define __STDC_CONSTANT_MACROS 1 +#include + * - done in posix/defines.h + */ + +extern "C" { +#include +#include +} +#include "mkv_wrap.h" +#include "lavc_file.h" +#include "audio_provider.h" +#include "lavc_file.h" + + +/////////////////////// +// LAVC Audio Provider +class LAVCAudioProvider : public AudioProvider { +private: + LAVCFile *lavcfile; + + AVCodecContext *codecContext; + ReSampleContext *rsct; + float resample_ratio; + AVStream *stream; + int audStream; + + int16_t *buffer; + + void Destroy(); + +public: + LAVCAudioProvider(wxString _filename); + virtual ~LAVCAudioProvider(); + virtual void GetAudio(void *buf, int64_t start, int64_t count); +}; + + +/////////// +// Factory +class LAVCAudioProviderFactory : public AudioProviderFactory { +public: + AudioProvider *CreateProvider(wxString file) { return new LAVCAudioProvider(file); } + LAVCAudioProviderFactory() : AudioProviderFactory(_T("lavc")) {} +}; + +#endif diff --git a/build/aegisub_vs2008/aegisub_vs2008.vcproj b/build/aegisub_vs2008/aegisub_vs2008.vcproj index a872bfdb4..7c7ec2777 100644 --- a/build/aegisub_vs2008/aegisub_vs2008.vcproj +++ b/build/aegisub_vs2008/aegisub_vs2008.vcproj @@ -524,6 +524,10 @@ RelativePath="..\..\aegisub\audio_provider_avs.cpp" > + + @@ -552,6 +556,10 @@ RelativePath="..\..\aegisub\audio_provider_lavc.cpp" > + +