Audacity  3.0.3
LegacyAliasBlockFile.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 
3  Audacity: A Digital Audio Editor
4 
5  LegacyAliasBlockFile.cpp
6 
7  Dominic Mazzoni
8 
9 **********************************************************************/
10 
11 #include "../Audacity.h"
12 #include "LegacyAliasBlockFile.h"
13 
14 #include <wx/utils.h>
15 #include <wx/wxcrtvararg.h>
16 
17 #include <sndfile.h>
18 
19 #include "LegacyBlockFile.h"
20 #include "../DirManager.h"
21 #include "../FileFormats.h"
22 #include "../xml/XMLTagHandler.h"
23 
25  wxFileNameWrapper &&aliasedFileName,
26  sampleCount aliasStart,
27  size_t aliasLen,
28  int aliasChannel,
29  size_t summaryLen,
30  bool noRMS)
31 : PCMAliasBlockFile{ std::move(fileName), std::move(aliasedFileName), aliasStart, aliasLen,
32  aliasChannel, 0.0, 0.0, 0.0 }
33 {
35 
36  if (noRMS)
38  else
40 
41  ComputeLegacySummaryInfo(mFileName,
42  summaryLen, format,
43  &mSummaryInfo, noRMS, FALSE,
44  &mMin, &mMax, &mRMS);
45 }
46 
48 {
49 }
50 
55 BlockFilePtr LegacyAliasBlockFile::Copy(wxFileNameWrapper &&newFileName)
56 {
57  auto newBlockFile = make_blockfile<LegacyAliasBlockFile>
58  (std::move(newFileName), wxFileNameWrapper{ mAliasedFileName },
59  mAliasStart, mLen, mAliasChannel,
60  mSummaryInfo.totalSummaryBytes, mSummaryInfo.fields < 3);
61 
62  return newBlockFile;
63 }
64 
66 // may throw
67 {
68  xmlFile.StartTag(wxT("legacyblockfile"));
69 
70  xmlFile.WriteAttr(wxT("alias"), 1);
71  xmlFile.WriteAttr(wxT("name"), mFileName.GetFullName());
72  xmlFile.WriteAttr(wxT("aliaspath"), mAliasedFileName.GetFullPath());
73  xmlFile.WriteAttr(wxT("aliasstart"),
74  mAliasStart.as_long_long() );
75  xmlFile.WriteAttr(wxT("aliaslen"), mLen);
76  xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel);
77  xmlFile.WriteAttr(wxT("summarylen"), mSummaryInfo.totalSummaryBytes);
78  if (mSummaryInfo.fields < 3)
79  xmlFile.WriteAttr(wxT("norms"), 1);
80 
81  xmlFile.EndTag(wxT("legacyblockfile"));
82 }
83 
84 // BuildFromXML methods should always return a BlockFile, not NULL,
85 // even if the result is flawed (e.g., refers to nonexistent file),
86 // as testing will be done in ProjectFSCK().
87 BlockFilePtr LegacyAliasBlockFile::BuildFromXML(const FilePath &projDir, const wxChar **attrs)
88 {
89  wxFileNameWrapper summaryFileName;
90  wxFileNameWrapper aliasFileName;
91  int aliasStart=0, aliasLen=0, aliasChannel=0;
92  int summaryLen=0;
93  bool noRMS = false;
94  long nValue;
95  long long nnValue;
96 
97  while(*attrs)
98  {
99  const wxChar *attr = *attrs++;
100  const wxChar *value = *attrs++;
101  if (!value)
102  break;
103 
104  const wxString strValue = value;
105  if (!wxStricmp(attr, wxT("name")) && XMLValueChecker::IsGoodFileName(strValue, projDir))
106  //v Should this be
107  // dm.AssignFile(summaryFileName, strValue, false);
108  // as in PCMAliasBlockFile::BuildFromXML? Test with an old project.
109  summaryFileName.Assign(projDir, strValue, wxT(""));
110  else if ( !wxStricmp(attr, wxT("aliaspath")) )
111  {
112  if (XMLValueChecker::IsGoodPathName(strValue))
113  aliasFileName.Assign(strValue);
114  else if (XMLValueChecker::IsGoodFileName(strValue, projDir))
115  // Allow fallback of looking for the file name, located in the data directory.
116  aliasFileName.Assign(projDir, strValue);
117  else if (XMLValueChecker::IsGoodPathString(strValue))
118  // If the aliased file is missing, we failed XMLValueChecker::IsGoodPathName()
119  // and XMLValueChecker::IsGoodFileName, because both do existence tests,
120  // but we want to keep the reference to the missing file because it's a good path string.
121  aliasFileName.Assign(strValue);
122  }
123  else if ( !wxStricmp(attr, wxT("aliasstart")) )
124  {
125  if (XMLValueChecker::IsGoodInt64(strValue) &&
126  strValue.ToLongLong(&nnValue) && (nnValue >= 0))
127  aliasStart = nnValue;
128  }
129  else if (XMLValueChecker::IsGoodInt(strValue) && strValue.ToLong(&nValue))
130  { // integer parameters
131  if (!wxStricmp(attr, wxT("aliaslen")) && (nValue >= 0))
132  aliasLen = nValue;
133  else if (!wxStricmp(attr, wxT("aliaschannel")) && XMLValueChecker::IsValidChannel(aliasChannel))
134  aliasChannel = nValue;
135  else if (!wxStricmp(attr, wxT("summarylen")) && (nValue > 0))
136  summaryLen = nValue;
137  else if (!wxStricmp(attr, wxT("norms")))
138  noRMS = (nValue != 0);
139  }
140  }
141 
142  return make_blockfile<LegacyAliasBlockFile>
143  (std::move(summaryFileName), std::move(aliasFileName),
144  aliasStart, aliasLen, aliasChannel, summaryLen, noRMS);
145 }
146 
147 // regenerates the summary info, doesn't deal with missing alias files
149  WriteSummary();
150 }
151 
152 static const auto sFactory = []( DirManager &dm, const wxChar **attrs ){
153 
154  // Support Audacity version 1.1.1 project files
155 
156  int i=0;
157  bool alias = false;
158 
159  while(attrs[i]) {
160  if (!wxStricmp(attrs[i], wxT("alias"))) {
161  if (wxAtoi(attrs[i+1])==1)
162  alias = true;
163  }
164  i++;
165  if (attrs[i])
166  i++;
167  }
168 
169  if (alias)
171  dm.GetProjectDataDir(), attrs);
172  else
173  return LegacyBlockFile::BuildFromXML(dm.GetProjectDataDir(), attrs,
174  dm.GetLoadingBlockLength(),
175  dm.GetLoadingFormat());
176 };
177 
178 static DirManager::RegisteredBlockFileDeserializer sRegistration1 {
179  "blockfile", sFactory
180 };
181 static DirManager::RegisteredBlockFileDeserializer sRegistration2 {
182  "legacyblockfile", sFactory
183 };
XMLWriter
Base class for XMLFileWriter and XMLStringWriter that provides the general functionality for creating...
Definition: XMLWriter.h:23
XMLWriter::EndTag
virtual void EndTag(const wxString &name)
Definition: XMLWriter.cpp:99
sRegistration1
static DirManager::RegisteredBlockFileDeserializer sRegistration1
Definition: LegacyAliasBlockFile.cpp:178
wxFileNameWrapper
Definition: wxFileNameWrapper.h:21
XMLValueChecker::IsGoodInt
static bool IsGoodInt(const wxString &strInt)
Check that the supplied string can be converted to a long (32bit) integer.
Definition: XMLTagHandler.cpp:157
XMLValueChecker::IsGoodPathName
static bool IsGoodPathName(const FilePath &strPathName)
Definition: XMLTagHandler.cpp:98
LegacyBlockFile.h
PCMAliasBlockFile
An AliasBlockFile that references uncompressed data in an existing file.
Definition: PCMAliasBlockFile.h:20
XMLValueChecker::IsGoodInt64
static bool IsGoodInt64(const wxString &strInt)
Check that the supplied string can be converted to a 64bit integer.
Definition: XMLTagHandler.cpp:163
LegacyAliasBlockFile::LegacyAliasBlockFile
LegacyAliasBlockFile(wxFileNameWrapper &&fileName, wxFileNameWrapper &&aliasedFileName, sampleCount aliasStart, size_t aliasLen, int aliasChannel, size_t summaryLen, bool noRMS)
Constructs a LegacyAliasBlockFile, writing the summary to disk.
Definition: LegacyAliasBlockFile.cpp:24
LegacyAliasBlockFile::Copy
BlockFilePtr Copy(wxFileNameWrapper &&fileName) override
Definition: LegacyAliasBlockFile.cpp:55
floatSample
@ floatSample
Definition: SampleFormat.h:34
FilePath
wxString FilePath
Definition: Project.h:20
int16Sample
@ int16Sample
Definition: SampleFormat.h:32
XMLValueChecker::IsGoodFileName
static bool IsGoodFileName(const FilePath &strFileName, const FilePath &strDirName={})
Definition: XMLTagHandler.cpp:58
format
int format
Definition: ExportPCM.cpp:56
sRegistration2
static DirManager::RegisteredBlockFileDeserializer sRegistration2
Definition: LegacyAliasBlockFile.cpp:181
LegacyAliasBlockFile.h
ComputeLegacySummaryInfo
void ComputeLegacySummaryInfo(const wxFileName &fileName, size_t summaryLen, sampleFormat format, SummaryInfo *info, bool noRMS, bool Silent, float *min, float *max, float *rms)
Definition: LegacyBlockFile.cpp:38
LegacyAliasBlockFile::SaveXML
void SaveXML(XMLWriter &xmlFile) override
Definition: LegacyAliasBlockFile.cpp:65
sFactory
static const auto sFactory
Definition: LegacyAliasBlockFile.cpp:152
sampleFormat
sampleFormat
Definition: SampleFormat.h:29
LegacyAliasBlockFile::Recover
void Recover() override
Definition: LegacyAliasBlockFile.cpp:148
LegacyAliasBlockFile::BuildFromXML
static BlockFilePtr BuildFromXML(const FilePath &projDir, const wxChar **attrs)
Definition: LegacyAliasBlockFile.cpp:87
anonymous_namespace{WaveTrack.cpp}::IsValidChannel
bool IsValidChannel(const int nValue)
Definition: WaveTrack.cpp:1706
sampleCount
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:18
XMLWriter::WriteAttr
void WriteAttr(const wxString &name, const Identifier &value)
Definition: XMLWriter.h:34
XMLValueChecker::IsGoodPathString
static bool IsGoodPathString(const FilePath &str)
Definition: XMLTagHandler.cpp:105
LegacyBlockFile::BuildFromXML
static BlockFilePtr BuildFromXML(const FilePath &dir, const wxChar **attrs, size_t len, sampleFormat format)
static
Definition: LegacyBlockFile.cpp:223
XMLWriter::StartTag
virtual void StartTag(const wxString &name)
Definition: XMLWriter.cpp:76
LegacyAliasBlockFile::~LegacyAliasBlockFile
virtual ~LegacyAliasBlockFile()
Definition: LegacyAliasBlockFile.cpp:47