19 #include "../Audacity.h"
26 #include <wx/wxcrtvararg.h>
28 #include <wx/thread.h>
31 #include "../DirManager.h"
32 #include "../FileFormats.h"
34 #include "../ondemand/ODManager.h"
48 size_t aliasLen,
int aliasChannel)
50 aliasStart, aliasLen, aliasChannel,
false }
52 mSummaryAvailable = mSummaryBeingComputed = mHasBeenSaved =
false;
60 size_t aliasLen,
int aliasChannel,
61 float min,
float max,
float rms,
bool summaryAvailable)
62 :
PCMAliasBlockFile(std::move(existingSummaryFileName), std::move(aliasedFileName),
64 aliasChannel,
min, max, rms)
83 wxFFile summaryFile(mFileName.GetFullPath());
84 ret= summaryFile.Length();
99 PCMAliasBlockFile::Lock();
107 PCMAliasBlockFile::Lock();
116 PCMAliasBlockFile::Unlock();
122 size_t start,
size_t len,
bool mayThrow)
const ->
MinMaxRMS
124 if(IsSummaryAvailable())
126 return PCMAliasBlockFile::GetMinMaxRMS(start, len, mayThrow);
136 -JUST_BELOW_MAX_AUDIO,
137 JUST_BELOW_MAX_AUDIO,
146 if(IsSummaryAvailable())
148 return PCMAliasBlockFile::GetMinMaxRMS(mayThrow);
158 -JUST_BELOW_MAX_AUDIO,
159 JUST_BELOW_MAX_AUDIO,
171 return PCMAliasBlockFile::Read256(buffer,start,len);
187 return PCMAliasBlockFile::Read64K(buffer,start,len);
203 BlockFilePtr newBlockFile;
206 auto locker = LockForRead();
213 newBlockFile = make_blockfile<PCMAliasBlockFile>
215 mAliasStart, mLen, mAliasChannel, mMin, mMax, mRMS);
221 newBlockFile = make_blockfile<ODPCMAliasBlockFile>
223 mAliasStart, mLen, mAliasChannel, mMin, mMax, mRMS,
240 auto locker = LockForRead();
248 xmlFile.
StartTag(wxT(
"odpcmaliasblockfile"));
252 auto suspension = locker.Suspend();
254 xmlFile.
WriteAttr(wxT(
"summaryfile"), mFileName.GetFullName());
257 xmlFile.
WriteAttr(wxT(
"aliasfile"), mAliasedFileName.GetFullPath());
259 mAliasStart.as_long_long());
260 xmlFile.
WriteAttr(wxT(
"aliaslen"), mLen);
261 xmlFile.
WriteAttr(wxT(
"aliaschannel"), mAliasChannel);
263 xmlFile.
EndTag(wxT(
"odpcmaliasblockfile"));
284 const wxChar *attr = *attrs++;
285 const wxChar *value = *attrs++;
289 const wxString strValue = value;
290 if (!wxStricmp(attr, wxT(
"summaryfile")) &&
295 if (!dm.AssignFile(summaryFileName, strValue,
false))
297 summaryFileName.Clear();
299 else if( !wxStricmp(attr, wxT(
"aliasfile")) )
302 aliasFileName.Assign(strValue);
305 aliasFileName.Assign(dm.GetProjectDataDir(), strValue);
310 aliasFileName.Assign(strValue);
312 else if ( !wxStricmp(attr, wxT(
"aliasstart")) )
315 strValue.ToLongLong(&nnValue) && (nnValue >= 0))
316 aliasStart = nnValue;
320 if (!wxStricmp(attr, wxT(
"aliaslen")) && (nValue >= 0))
323 aliasChannel = nValue;
327 return make_blockfile<ODPCMAliasBlockFile>
328 (std::move(summaryFileName), std::move(aliasFileName),
329 aliasStart, aliasLen, aliasChannel, 0, 0, 0,
false);
363 mFileName = std::move(
name);
397 wxString sFullPath = mFileName.GetFullPath();
398 fileNameChar.
reinit( strlen(sFullPath.mb_str(wxConvFile)) + 1 );
399 strcpy(fileNameChar.get(), sFullPath.mb_str(wxConvFile));
400 summaryFile = fopen(fileNameChar.get(),
"wb");
409 wxPrintf(
"Unable to write summary data to file: %s", fileNameChar.get());
420 fwrite(summaryData, 1, mSummaryInfo.totalSummaryBytes, summaryFile);
453 cleanup.
reinit(mSummaryInfo.totalSummaryBytes);
454 char* localFullSummary = cleanup.get();
458 float *summary64K = (
float *)(localFullSummary + mSummaryInfo.offset64K);
459 float *summary256 = (
float *)(localFullSummary + mSummaryInfo.offset256);
467 fbuffer = (
float*)buffer;
472 fbuffer = floats.get();
477 BlockFile::CalcSummaryFromBuffer(fbuffer, len, summary256, summary64K);
479 return localFullSummary;
494 size_t start,
size_t len,
bool mayThrow)
const
497 auto locker = LockForRead();
499 if(!mAliasedFileName.IsOk()){
504 return CommonReadData( mayThrow,
505 mAliasedFileName, mSilentAliasLog,
this, mAliasStart, mAliasChannel,
506 data,
format, start, len);
517 data.
reinit( mSummaryInfo.totalSummaryBytes );
520 wxFFile summaryFile(mFileName.GetFullPath(), wxT(
"rb"));
522 if( !summaryFile.IsOpened() ) {
525 memset(data.get(), 0, mSummaryInfo.totalSummaryBytes);
538 auto read = summaryFile.Read(data.get(), mSummaryInfo.totalSummaryBytes);
540 if (read != mSummaryInfo.totalSummaryBytes) {
541 memset(data.get(), 0, mSummaryInfo.totalSummaryBytes);
545 FixSummary(data.get());
562 "odpcmaliasblockfile",
563 []( DirManager &dm,
const wxChar **attrs ){