forked from mia/Aegisub
Fix ram audio provider: this uses mutex.h (from google) in libaegisub and switches to use agi::io. The progress code has been stubbed out as well as a few path methods. There's no reason to guess at fixing them the only way to do it is after it's actually put into use.
Originally committed to SVN as r5310.
This commit is contained in:
parent
2edbc8c8c1
commit
4968fc2b55
3 changed files with 61 additions and 44 deletions
|
@ -30,6 +30,7 @@ SRC = \
|
|||
audio/dummy_audio.cpp \
|
||||
audio/pcm.cpp \
|
||||
cache/audio_ram.cpp \
|
||||
cache/audio_hd.cpp \
|
||||
cache/video_cache.cpp \
|
||||
$(SRC_OPT)
|
||||
|
||||
|
|
86
aegisub/libmedia/cache/audio_hd.cpp
vendored
86
aegisub/libmedia/cache/audio_hd.cpp
vendored
|
@ -37,17 +37,21 @@
|
|||
#include "config.h"
|
||||
|
||||
#ifndef AGI_PRE
|
||||
#include <wx/filefn.h>
|
||||
#include <wx/filename.h>
|
||||
//#include <wx/filefn.h>
|
||||
//#include <wx/filename.h>
|
||||
#endif
|
||||
|
||||
#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"
|
||||
#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 <libaegisub/io.h>
|
||||
|
||||
namespace media {
|
||||
|
||||
/// @brief Constructor
|
||||
/// @param source
|
||||
|
@ -63,23 +67,26 @@ HDAudioProvider::HDAudioProvider(AudioProvider *src) {
|
|||
samples_native_endian = source->AreSamplesNativeEndian();
|
||||
|
||||
// Check free space
|
||||
wxLongLong freespace;
|
||||
if (wxGetDiskSpace(DiskCachePath(), NULL, &freespace)) {
|
||||
if (num_samples * channels * bytes_per_sample > freespace) {
|
||||
throw AudioOpenError("Not enough free disk space in " + STD_STR(DiskCachePath()) + " to cache the audio");
|
||||
}
|
||||
}
|
||||
uint64_t freespace;
|
||||
// XXX: fixme (add diskspace method to agi::util)
|
||||
// if (wxGetDiskSpace(DiskCachePath(), NULL, &freespace)) {
|
||||
// if (num_samples * channels * bytes_per_sample > freespace) {
|
||||
// throw AudioOpenError("Not enough free disk space in " + STD_STR(DiskCachePath()) + " to cache the audio");
|
||||
// }
|
||||
// }
|
||||
|
||||
// Open output file
|
||||
diskCacheFilename = DiskCacheName();
|
||||
file_cache.Create(diskCacheFilename,true,wxS_DEFAULT);
|
||||
file_cache.Open(diskCacheFilename,wxFile::read_write);
|
||||
if (!file_cache.IsOpened()) throw AudioOpenError("Unable to write to audio disk cache.");
|
||||
// file_cache.Create(diskCacheFilename,true,wxS_DEFAULT);
|
||||
io::Save file(diskCacheFilename);
|
||||
std::ofstream& file_cache = file.Get();
|
||||
// file_cache.Open(diskCacheFilename,wxFile::read_write);
|
||||
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();
|
||||
// DialogProgress *progress = new DialogProgress(AegisubApp::Get()->frame,_T("Load audio"),&canceled,_T("Reading to Hard Disk cache"),0,num_samples);
|
||||
// progress->Show();
|
||||
|
||||
// Write to disk
|
||||
int block = 4096;
|
||||
|
@ -87,25 +94,24 @@ HDAudioProvider::HDAudioProvider(AudioProvider *src) {
|
|||
for (int64_t i=0;i<num_samples && !canceled; i+=block) {
|
||||
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);
|
||||
file_cache.write(data,block * channels * bytes_per_sample);
|
||||
// progress->SetProgress(i,num_samples);
|
||||
}
|
||||
file_cache.Seek(0);
|
||||
file_cache.seekp(0);
|
||||
|
||||
// Finish
|
||||
if (canceled) {
|
||||
file_cache.Close();
|
||||
// file_cache.Close();
|
||||
delete[] data;
|
||||
throw agi::UserCancelException("Audio loading cancelled by user");
|
||||
}
|
||||
progress->Destroy();
|
||||
// progress->Destroy();
|
||||
}
|
||||
|
||||
/// @brief Destructor
|
||||
///
|
||||
HDAudioProvider::~HDAudioProvider() {
|
||||
file_cache.Close();
|
||||
wxRemoveFile(diskCacheFilename);
|
||||
//XXX wxRemoveFile(diskCacheFilename);
|
||||
delete[] data;
|
||||
}
|
||||
|
||||
|
@ -137,36 +143,44 @@ void HDAudioProvider::GetAudio(void *buf, int64_t start, int64_t count) const {
|
|||
}
|
||||
|
||||
if (count) {
|
||||
wxMutexLocker disklock(diskmutex);
|
||||
file_cache.Seek(start*bytes_per_sample);
|
||||
file_cache.Read((char*)buf,count*bytes_per_sample*channels);
|
||||
diskmutex.Lock();
|
||||
file_cache.seekp(start*bytes_per_sample);
|
||||
file_cache.read((char*)buf,count*bytes_per_sample*channels);
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Get disk cache path
|
||||
/// @return
|
||||
///
|
||||
wxString HDAudioProvider::DiskCachePath() {
|
||||
std::string HDAudioProvider::DiskCachePath() {
|
||||
// Default
|
||||
wxString path = lagi_wxString(OPT_GET("Audio/Cache/HD/Location")->GetString());
|
||||
/*
|
||||
std::string path = lagi_wxString(OPT_GET("Audio/Cache/HD/Location")->GetString());
|
||||
if (path == _T("default")) return StandardPaths::DecodePath(_T("?temp/"));
|
||||
|
||||
// Specified
|
||||
return DecodeRelativePath(path,StandardPaths::DecodePath(_T("?user/")));
|
||||
*/
|
||||
return "XXX: fixme";
|
||||
}
|
||||
|
||||
/// @brief Get disk cache filename
|
||||
///
|
||||
wxString HDAudioProvider::DiskCacheName() {
|
||||
std::string HDAudioProvider::DiskCacheName() {
|
||||
/*
|
||||
XXX: fixme
|
||||
// Get pattern
|
||||
wxString pattern = lagi_wxString(OPT_GET("Audio/Cache/HD/Name")->GetString());
|
||||
std::string pattern = lagi_wxString(OPT_GET("Audio/Cache/HD/Name")->GetString());
|
||||
if (pattern.Find(_T("%02i")) == wxNOT_FOUND) pattern = _T("audio%02i.tmp");
|
||||
|
||||
|
||||
// Try from 00 to 99
|
||||
for (int i=0;i<100;i++) {
|
||||
// File exists?
|
||||
wxString curStringTry = DiskCachePath() + wxString::Format(pattern.c_str(),i);
|
||||
if (!wxFile::Exists(curStringTry)) return curStringTry;
|
||||
}
|
||||
return L"";
|
||||
*/
|
||||
return "";
|
||||
}
|
||||
|
||||
} // namespace media
|
||||
|
|
18
aegisub/libmedia/cache/audio_hd.h
vendored
18
aegisub/libmedia/cache/audio_hd.h
vendored
|
@ -35,12 +35,12 @@
|
|||
///
|
||||
|
||||
#ifndef AGI_PRE
|
||||
#include <wx/file.h>
|
||||
#include <wx/thread.h>
|
||||
#endif
|
||||
|
||||
#include "include/aegisub/audio_provider.h"
|
||||
#include <libaegisub/mutex.h>
|
||||
#include "libmedia/audio.h"
|
||||
|
||||
namespace media {
|
||||
/// DOCME
|
||||
/// @class HDAudioProvider
|
||||
/// @brief DOCME
|
||||
|
@ -48,13 +48,13 @@
|
|||
/// DOCME
|
||||
class HDAudioProvider : public AudioProvider {
|
||||
/// DOCME
|
||||
mutable wxMutex diskmutex;
|
||||
mutable agi::Mutex diskmutex;
|
||||
|
||||
/// DOCME
|
||||
mutable wxFile file_cache;
|
||||
mutable std::fstream file_cache;
|
||||
|
||||
/// DOCME
|
||||
wxString diskCacheFilename;
|
||||
std::string diskCacheFilename;
|
||||
|
||||
/// DOCME
|
||||
bool samples_native_endian;
|
||||
|
@ -62,8 +62,8 @@ class HDAudioProvider : public AudioProvider {
|
|||
/// DOCME
|
||||
char *data;
|
||||
|
||||
static wxString DiskCachePath();
|
||||
static wxString DiskCacheName();
|
||||
static std::string DiskCachePath();
|
||||
static std::string DiskCacheName();
|
||||
|
||||
public:
|
||||
HDAudioProvider(AudioProvider *source);
|
||||
|
@ -73,3 +73,5 @@ public:
|
|||
|
||||
void GetAudio(void *buf, int64_t start, int64_t count) const;
|
||||
};
|
||||
|
||||
} // namespace media
|
||||
|
|
Loading…
Reference in a new issue