diff --git a/aegisub/src/audio_provider.cpp b/aegisub/src/audio_provider.cpp index 4c230293c..eb3783d8e 100644 --- a/aegisub/src/audio_provider.cpp +++ b/aegisub/src/audio_provider.cpp @@ -52,6 +52,8 @@ #include "audio_provider_pcm.h" #include "audio_provider_ram.h" #include "compat.h" +#include "dialog_progress.h" +#include "frame_main.h" #include "main.h" /// @brief Constructor @@ -161,11 +163,13 @@ AudioProvider *AudioProviderFactory::GetProvider(wxString filename, int cache) { return provider; } + DialogProgress progress(AegisubApp::Get()->frame, _("Load audio")); + // Convert to RAM - if (cache == 1) return new RAMAudioProvider(provider); + if (cache == 1) return new RAMAudioProvider(provider, &progress); // Convert to HD - if (cache == 2) return new HDAudioProvider(provider); + if (cache == 2) return new HDAudioProvider(provider, &progress); throw AudioOpenError("Unknown caching method"); } diff --git a/aegisub/src/audio_provider_hd.cpp b/aegisub/src/audio_provider_hd.cpp index 209afdee6..086cfbff5 100644 --- a/aegisub/src/audio_provider_hd.cpp +++ b/aegisub/src/audio_provider_hd.cpp @@ -41,18 +41,16 @@ #include #endif +#include + #include "audio_provider_hd.h" + #include "compat.h" -#include "dialog_progress.h" -#include "frame_main.h" #include "main.h" #include "standard_paths.h" #include "utils.h" - - - -HDAudioProvider::HDAudioProvider(AudioProvider *src) { +HDAudioProvider::HDAudioProvider(AudioProvider *src, agi::BackgroundRunner *br) { std::auto_ptr source(src); // Copy parameters bytes_per_sample = source->GetBytesPerSample(); @@ -76,8 +74,7 @@ HDAudioProvider::HDAudioProvider(AudioProvider *src) { file_cache.Open(diskCacheFilename,wxFile::read_write); if (!file_cache.IsOpened()) throw AudioOpenError("Unable to write to audio disk cache."); - DialogProgress progress(AegisubApp::Get()->frame, "Load audio", "Reading to Hard Disk cache"); - progress.Run(bind(&HDAudioProvider::FillCache, this, src, std::tr1::placeholders::_1)); + br->Run(bind(&HDAudioProvider::FillCache, this, src, std::tr1::placeholders::_1)); } HDAudioProvider::~HDAudioProvider() { @@ -87,6 +84,8 @@ HDAudioProvider::~HDAudioProvider() { } void HDAudioProvider::FillCache(AudioProvider *src, agi::ProgressSink *ps) { + ps->SetMessage(STD_STR(_("Reading to Hard Disk cache"))); + int64_t block = 4096; data = new char[block * channels * bytes_per_sample]; for (int64_t i = 0; i < num_samples; i += block) { diff --git a/aegisub/src/audio_provider_hd.h b/aegisub/src/audio_provider_hd.h index e2a22d252..681ef8e2b 100644 --- a/aegisub/src/audio_provider_hd.h +++ b/aegisub/src/audio_provider_hd.h @@ -41,7 +41,10 @@ #include "include/aegisub/audio_provider.h" -namespace agi { class ProgressSink; } +namespace agi { + class BackgroundRunner; + class ProgressSink; +} /// DOCME /// @class HDAudioProvider @@ -70,7 +73,7 @@ class HDAudioProvider : public AudioProvider { void FillCache(AudioProvider *src, agi::ProgressSink *ps); public: - HDAudioProvider(AudioProvider *source); + HDAudioProvider(AudioProvider *source, agi::BackgroundRunner *br); ~HDAudioProvider(); bool AreSamplesNativeEndian() const { return samples_native_endian; } diff --git a/aegisub/src/audio_provider_ram.cpp b/aegisub/src/audio_provider_ram.cpp index f17ad2705..ec04e708b 100644 --- a/aegisub/src/audio_provider_ram.cpp +++ b/aegisub/src/audio_provider_ram.cpp @@ -36,9 +36,11 @@ #include "config.h" +#include + #include "audio_provider_ram.h" -#include "dialog_progress.h" -#include "frame_main.h" + +#include "compat.h" #include "main.h" #include "utils.h" @@ -46,7 +48,7 @@ #define CacheBlockSize ((1 << CacheBits)) -RAMAudioProvider::RAMAudioProvider(AudioProvider *src) { +RAMAudioProvider::RAMAudioProvider(AudioProvider *src, agi::BackgroundRunner *br) { std::auto_ptr source(src); samples_native_endian = source->AreSamplesNativeEndian(); @@ -55,7 +57,7 @@ RAMAudioProvider::RAMAudioProvider(AudioProvider *src) { int64_t ssize = source->GetNumSamples() * source->GetBytesPerSample(); blockcount = (ssize + CacheBlockSize - 1) >> CacheBits; blockcache = new char*[blockcount]; - memset(blockcache, blockcount * sizeof(char*), 0); + memset(blockcache, 0, blockcount * sizeof(char*)); // Allocate cache blocks try { @@ -75,8 +77,7 @@ RAMAudioProvider::RAMAudioProvider(AudioProvider *src) { sample_rate = source->GetSampleRate(); filename = source->GetFilename(); - DialogProgress progress(AegisubApp::Get()->frame, _("Load audio"), _("Reading into RAM")); - progress.Run(std::tr1::bind(&RAMAudioProvider::FillCache, this, src, std::tr1::placeholders::_1)); + br->Run(std::tr1::bind(&RAMAudioProvider::FillCache, this, src, std::tr1::placeholders::_1)); } RAMAudioProvider::~RAMAudioProvider() { @@ -84,6 +85,8 @@ RAMAudioProvider::~RAMAudioProvider() { } void RAMAudioProvider::FillCache(AudioProvider *source, agi::ProgressSink *ps) { + ps->SetMessage(STD_STR(_("Reading into RAM"))); + int64_t readsize = CacheBlockSize / source->GetBytesPerSample(); for (int i = 0; i < blockcount; i++) { source->GetAudio((char*)blockcache[i], i * readsize, std::min(readsize, num_samples - i * readsize)); diff --git a/aegisub/src/audio_provider_ram.h b/aegisub/src/audio_provider_ram.h index 0e6c82024..e1404826d 100644 --- a/aegisub/src/audio_provider_ram.h +++ b/aegisub/src/audio_provider_ram.h @@ -36,7 +36,10 @@ #include "include/aegisub/audio_provider.h" -namespace agi { class ProgressSink; } +namespace agi { + class BackgroundRunner; + class ProgressSink; +} /// DOCME /// @class RAMAudioProvider @@ -57,7 +60,7 @@ class RAMAudioProvider : public AudioProvider { void FillCache(AudioProvider *source, agi::ProgressSink *ps); public: - RAMAudioProvider(AudioProvider *source); + RAMAudioProvider(AudioProvider *source, agi::BackgroundRunner *br); ~RAMAudioProvider(); bool AreSamplesNativeEndian() const { return samples_native_endian; }