diff --git a/aegisub/libmedia/Makefile b/aegisub/libmedia/Makefile index eb0e92341..c61528c91 100644 --- a/aegisub/libmedia/Makefile +++ b/aegisub/libmedia/Makefile @@ -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) diff --git a/aegisub/libmedia/cache/audio_hd.cpp b/aegisub/libmedia/cache/audio_hd.cpp index c88664aec..23fc9ca0b 100644 --- a/aegisub/libmedia/cache/audio_hd.cpp +++ b/aegisub/libmedia/cache/audio_hd.cpp @@ -37,17 +37,21 @@ #include "config.h" #ifndef AGI_PRE -#include -#include +//#include +//#include #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 + +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) 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 diff --git a/aegisub/libmedia/cache/audio_hd.h b/aegisub/libmedia/cache/audio_hd.h index f62af2396..b9a83cb9f 100644 --- a/aegisub/libmedia/cache/audio_hd.h +++ b/aegisub/libmedia/cache/audio_hd.h @@ -35,12 +35,12 @@ /// #ifndef AGI_PRE -#include -#include #endif -#include "include/aegisub/audio_provider.h" +#include +#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