From c0cf0c6a069eca710d303c97bfc5aaf7ed3ccf95 Mon Sep 17 00:00:00 2001 From: Amar Takhar Date: Fri, 11 Feb 2011 03:47:18 +0000 Subject: [PATCH] Add progress support back to HD Audio Cache with the new ProgressSink from libaegisub. Currently AudioProviderFactory::GetProvider() takes the ProgressSinkFactory however this should probably be moved up to the constructor for AudioProviderFactory. We'll see what the best option is when the others come around it's trivial to change. Originally committed to SVN as r5347. --- aegisub/libmedia/cache/audio_hd.cpp | 26 +++++++++-------------- aegisub/libmedia/cache/audio_hd.h | 3 ++- aegisub/libmedia/common/audio_manager.cpp | 4 ++-- aegisub/libmedia/include/libmedia/audio.h | 3 ++- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/aegisub/libmedia/cache/audio_hd.cpp b/aegisub/libmedia/cache/audio_hd.cpp index 23fc9ca0b..0fb009782 100644 --- a/aegisub/libmedia/cache/audio_hd.cpp +++ b/aegisub/libmedia/cache/audio_hd.cpp @@ -37,26 +37,19 @@ #include "config.h" #ifndef AGI_PRE -//#include -//#include #endif -#include "audio_hd.h" -//#include "compat.h" -//#include "dialog_progress.h" -//#include "frame_main.h" -//#include "main.h" -//#include "standard_paths.h" -//#include "utils.h" - #include +#include "audio_hd.h" + + namespace media { /// @brief Constructor /// @param source /// -HDAudioProvider::HDAudioProvider(AudioProvider *src) { +HDAudioProvider::HDAudioProvider(AudioProvider *src, agi::ProgressSinkFactory *progress_factory) { std::auto_ptr source(src); // Copy parameters bytes_per_sample = source->GetBytesPerSample(); @@ -84,9 +77,9 @@ HDAudioProvider::HDAudioProvider(AudioProvider *src) { if (!file_cache.is_open()) throw AudioOpenError("Unable to write to audio disk cache."); // Start progress - volatile bool canceled = false; -// DialogProgress *progress = new DialogProgress(AegisubApp::Get()->frame,_T("Load audio"),&canceled,_T("Reading to Hard Disk cache"),0,num_samples); -// progress->Show(); + ProgressSink *progress = progress_factory->create_progress_sink("Reading to Hard Disk cache"); + + volatile bool canceled = progress->get_cancelled(); // Write to disk int block = 4096; @@ -95,7 +88,7 @@ HDAudioProvider::HDAudioProvider(AudioProvider *src) { if (block+i > num_samples) block = num_samples - i; source->GetAudio(data,i,block); file_cache.write(data,block * channels * bytes_per_sample); -// progress->SetProgress(i,num_samples); + progress->set_progress(i,num_samples); } file_cache.seekp(0); @@ -105,7 +98,8 @@ HDAudioProvider::HDAudioProvider(AudioProvider *src) { delete[] data; throw agi::UserCancelException("Audio loading cancelled by user"); } -// progress->Destroy(); + + delete progress; } /// @brief Destructor diff --git a/aegisub/libmedia/cache/audio_hd.h b/aegisub/libmedia/cache/audio_hd.h index b9a83cb9f..2d398fc5c 100644 --- a/aegisub/libmedia/cache/audio_hd.h +++ b/aegisub/libmedia/cache/audio_hd.h @@ -38,6 +38,7 @@ #endif #include + #include "libmedia/audio.h" namespace media { @@ -66,7 +67,7 @@ class HDAudioProvider : public AudioProvider { static std::string DiskCacheName(); public: - HDAudioProvider(AudioProvider *source); + HDAudioProvider(AudioProvider *source, agi::ProgressSinkFactory *progress_factory); ~HDAudioProvider(); bool AreSamplesNativeEndian() const { return samples_native_endian; } diff --git a/aegisub/libmedia/common/audio_manager.cpp b/aegisub/libmedia/common/audio_manager.cpp index dcb27275c..b07654043 100644 --- a/aegisub/libmedia/common/audio_manager.cpp +++ b/aegisub/libmedia/common/audio_manager.cpp @@ -108,7 +108,7 @@ void AudioProvider::GetAudioWithVolume(void *buf, int64_t start, int64_t count, /// @param cache /// @return /// -AudioProvider *AudioProviderFactory::GetProvider(std::string filename, int cache) { +AudioProvider *AudioProviderFactory::GetProvider(std::string filename, agi::ProgressSinkFactory *progress_factory, int cache) { AudioProvider *provider = NULL; bool found = false; std::string msg; @@ -172,7 +172,7 @@ AudioProvider *AudioProviderFactory::GetProvider(std::string filename, int cache if (cache == 1) return new RAMAudioProvider(provider); // Convert to HD - if (cache == 2) return new HDAudioProvider(provider); + if (cache == 2) return new HDAudioProvider(provider, progress_factory); throw AudioOpenError("Unknown caching method"); } diff --git a/aegisub/libmedia/include/libmedia/audio.h b/aegisub/libmedia/include/libmedia/audio.h index 9f6b53ed9..de5cbdf67 100644 --- a/aegisub/libmedia/include/libmedia/audio.h +++ b/aegisub/libmedia/include/libmedia/audio.h @@ -37,6 +37,7 @@ #pragma once #include +#include #include namespace media { @@ -98,7 +99,7 @@ public: class AudioProviderFactory : public Factory1 { public: static void RegisterProviders(); - static AudioProvider *GetProvider(std::string filename, int cache=-1); + static AudioProvider *GetProvider(std::string filename, agi::ProgressSinkFactory *progress_factory, int cache=-1); }; DEFINE_BASE_EXCEPTION_NOINNER(AudioProviderError, agi::Exception);