From dfef9191f9221a936a5e5fa0802129b78176faef Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Wed, 28 Sep 2011 19:49:37 +0000 Subject: [PATCH] Move the creation of the progress dialog for the audio caches to AudioProvider and just pass the BackgroundRunner to the caches. This still isn't the right place to be creating it, but this removes the UI-dependency for both caches. Originally committed to SVN as r5646. --- aegisub/src/audio_provider.cpp | 8 ++++++-- aegisub/src/audio_provider_hd.cpp | 15 +++++++-------- aegisub/src/audio_provider_hd.h | 7 +++++-- aegisub/src/audio_provider_ram.cpp | 15 +++++++++------ aegisub/src/audio_provider_ram.h | 7 +++++-- 5 files changed, 32 insertions(+), 20 deletions(-) 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; }