mirror of https://github.com/odrling/Aegisub
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.
This commit is contained in:
parent
a9dc1f045d
commit
dfef9191f9
|
@ -52,6 +52,8 @@
|
||||||
#include "audio_provider_pcm.h"
|
#include "audio_provider_pcm.h"
|
||||||
#include "audio_provider_ram.h"
|
#include "audio_provider_ram.h"
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
|
#include "dialog_progress.h"
|
||||||
|
#include "frame_main.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
/// @brief Constructor
|
/// @brief Constructor
|
||||||
|
@ -161,11 +163,13 @@ AudioProvider *AudioProviderFactory::GetProvider(wxString filename, int cache) {
|
||||||
return provider;
|
return provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DialogProgress progress(AegisubApp::Get()->frame, _("Load audio"));
|
||||||
|
|
||||||
// Convert to RAM
|
// Convert to RAM
|
||||||
if (cache == 1) return new RAMAudioProvider(provider);
|
if (cache == 1) return new RAMAudioProvider(provider, &progress);
|
||||||
|
|
||||||
// Convert to HD
|
// Convert to HD
|
||||||
if (cache == 2) return new HDAudioProvider(provider);
|
if (cache == 2) return new HDAudioProvider(provider, &progress);
|
||||||
|
|
||||||
throw AudioOpenError("Unknown caching method");
|
throw AudioOpenError("Unknown caching method");
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,18 +41,16 @@
|
||||||
#include <wx/filename.h>
|
#include <wx/filename.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/background_runner.h>
|
||||||
|
|
||||||
#include "audio_provider_hd.h"
|
#include "audio_provider_hd.h"
|
||||||
|
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include "dialog_progress.h"
|
|
||||||
#include "frame_main.h"
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
HDAudioProvider::HDAudioProvider(AudioProvider *src, agi::BackgroundRunner *br) {
|
||||||
|
|
||||||
|
|
||||||
HDAudioProvider::HDAudioProvider(AudioProvider *src) {
|
|
||||||
std::auto_ptr<AudioProvider> source(src);
|
std::auto_ptr<AudioProvider> source(src);
|
||||||
// Copy parameters
|
// Copy parameters
|
||||||
bytes_per_sample = source->GetBytesPerSample();
|
bytes_per_sample = source->GetBytesPerSample();
|
||||||
|
@ -76,8 +74,7 @@ HDAudioProvider::HDAudioProvider(AudioProvider *src) {
|
||||||
file_cache.Open(diskCacheFilename,wxFile::read_write);
|
file_cache.Open(diskCacheFilename,wxFile::read_write);
|
||||||
if (!file_cache.IsOpened()) throw AudioOpenError("Unable to write to audio disk cache.");
|
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");
|
br->Run(bind(&HDAudioProvider::FillCache, this, src, std::tr1::placeholders::_1));
|
||||||
progress.Run(bind(&HDAudioProvider::FillCache, this, src, std::tr1::placeholders::_1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HDAudioProvider::~HDAudioProvider() {
|
HDAudioProvider::~HDAudioProvider() {
|
||||||
|
@ -87,6 +84,8 @@ HDAudioProvider::~HDAudioProvider() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void HDAudioProvider::FillCache(AudioProvider *src, agi::ProgressSink *ps) {
|
void HDAudioProvider::FillCache(AudioProvider *src, agi::ProgressSink *ps) {
|
||||||
|
ps->SetMessage(STD_STR(_("Reading to Hard Disk cache")));
|
||||||
|
|
||||||
int64_t block = 4096;
|
int64_t block = 4096;
|
||||||
data = new char[block * channels * bytes_per_sample];
|
data = new char[block * channels * bytes_per_sample];
|
||||||
for (int64_t i = 0; i < num_samples; i += block) {
|
for (int64_t i = 0; i < num_samples; i += block) {
|
||||||
|
|
|
@ -41,7 +41,10 @@
|
||||||
|
|
||||||
#include "include/aegisub/audio_provider.h"
|
#include "include/aegisub/audio_provider.h"
|
||||||
|
|
||||||
namespace agi { class ProgressSink; }
|
namespace agi {
|
||||||
|
class BackgroundRunner;
|
||||||
|
class ProgressSink;
|
||||||
|
}
|
||||||
|
|
||||||
/// DOCME
|
/// DOCME
|
||||||
/// @class HDAudioProvider
|
/// @class HDAudioProvider
|
||||||
|
@ -70,7 +73,7 @@ class HDAudioProvider : public AudioProvider {
|
||||||
void FillCache(AudioProvider *src, agi::ProgressSink *ps);
|
void FillCache(AudioProvider *src, agi::ProgressSink *ps);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HDAudioProvider(AudioProvider *source);
|
HDAudioProvider(AudioProvider *source, agi::BackgroundRunner *br);
|
||||||
~HDAudioProvider();
|
~HDAudioProvider();
|
||||||
|
|
||||||
bool AreSamplesNativeEndian() const { return samples_native_endian; }
|
bool AreSamplesNativeEndian() const { return samples_native_endian; }
|
||||||
|
|
|
@ -36,9 +36,11 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <libaegisub/background_runner.h>
|
||||||
|
|
||||||
#include "audio_provider_ram.h"
|
#include "audio_provider_ram.h"
|
||||||
#include "dialog_progress.h"
|
|
||||||
#include "frame_main.h"
|
#include "compat.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
@ -46,7 +48,7 @@
|
||||||
|
|
||||||
#define CacheBlockSize ((1 << CacheBits))
|
#define CacheBlockSize ((1 << CacheBits))
|
||||||
|
|
||||||
RAMAudioProvider::RAMAudioProvider(AudioProvider *src) {
|
RAMAudioProvider::RAMAudioProvider(AudioProvider *src, agi::BackgroundRunner *br) {
|
||||||
std::auto_ptr<AudioProvider> source(src);
|
std::auto_ptr<AudioProvider> source(src);
|
||||||
|
|
||||||
samples_native_endian = source->AreSamplesNativeEndian();
|
samples_native_endian = source->AreSamplesNativeEndian();
|
||||||
|
@ -55,7 +57,7 @@ RAMAudioProvider::RAMAudioProvider(AudioProvider *src) {
|
||||||
int64_t ssize = source->GetNumSamples() * source->GetBytesPerSample();
|
int64_t ssize = source->GetNumSamples() * source->GetBytesPerSample();
|
||||||
blockcount = (ssize + CacheBlockSize - 1) >> CacheBits;
|
blockcount = (ssize + CacheBlockSize - 1) >> CacheBits;
|
||||||
blockcache = new char*[blockcount];
|
blockcache = new char*[blockcount];
|
||||||
memset(blockcache, blockcount * sizeof(char*), 0);
|
memset(blockcache, 0, blockcount * sizeof(char*));
|
||||||
|
|
||||||
// Allocate cache blocks
|
// Allocate cache blocks
|
||||||
try {
|
try {
|
||||||
|
@ -75,8 +77,7 @@ RAMAudioProvider::RAMAudioProvider(AudioProvider *src) {
|
||||||
sample_rate = source->GetSampleRate();
|
sample_rate = source->GetSampleRate();
|
||||||
filename = source->GetFilename();
|
filename = source->GetFilename();
|
||||||
|
|
||||||
DialogProgress progress(AegisubApp::Get()->frame, _("Load audio"), _("Reading into RAM"));
|
br->Run(std::tr1::bind(&RAMAudioProvider::FillCache, this, src, std::tr1::placeholders::_1));
|
||||||
progress.Run(std::tr1::bind(&RAMAudioProvider::FillCache, this, src, std::tr1::placeholders::_1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RAMAudioProvider::~RAMAudioProvider() {
|
RAMAudioProvider::~RAMAudioProvider() {
|
||||||
|
@ -84,6 +85,8 @@ RAMAudioProvider::~RAMAudioProvider() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RAMAudioProvider::FillCache(AudioProvider *source, agi::ProgressSink *ps) {
|
void RAMAudioProvider::FillCache(AudioProvider *source, agi::ProgressSink *ps) {
|
||||||
|
ps->SetMessage(STD_STR(_("Reading into RAM")));
|
||||||
|
|
||||||
int64_t readsize = CacheBlockSize / source->GetBytesPerSample();
|
int64_t readsize = CacheBlockSize / source->GetBytesPerSample();
|
||||||
for (int i = 0; i < blockcount; i++) {
|
for (int i = 0; i < blockcount; i++) {
|
||||||
source->GetAudio((char*)blockcache[i], i * readsize, std::min(readsize, num_samples - i * readsize));
|
source->GetAudio((char*)blockcache[i], i * readsize, std::min(readsize, num_samples - i * readsize));
|
||||||
|
|
|
@ -36,7 +36,10 @@
|
||||||
|
|
||||||
#include "include/aegisub/audio_provider.h"
|
#include "include/aegisub/audio_provider.h"
|
||||||
|
|
||||||
namespace agi { class ProgressSink; }
|
namespace agi {
|
||||||
|
class BackgroundRunner;
|
||||||
|
class ProgressSink;
|
||||||
|
}
|
||||||
|
|
||||||
/// DOCME
|
/// DOCME
|
||||||
/// @class RAMAudioProvider
|
/// @class RAMAudioProvider
|
||||||
|
@ -57,7 +60,7 @@ class RAMAudioProvider : public AudioProvider {
|
||||||
void FillCache(AudioProvider *source, agi::ProgressSink *ps);
|
void FillCache(AudioProvider *source, agi::ProgressSink *ps);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RAMAudioProvider(AudioProvider *source);
|
RAMAudioProvider(AudioProvider *source, agi::BackgroundRunner *br);
|
||||||
~RAMAudioProvider();
|
~RAMAudioProvider();
|
||||||
|
|
||||||
bool AreSamplesNativeEndian() const { return samples_native_endian; }
|
bool AreSamplesNativeEndian() const { return samples_native_endian; }
|
||||||
|
|
Loading…
Reference in New Issue