Audacity 3.2.0
Legacy.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 Legacy.cpp
6
7 Dominic Mazzoni
8
9*******************************************************************//****************************************************************//*******************************************************************/
27
28
29
30#include "Legacy.h"
31
32#include <stdlib.h>
33#include <string.h>
34
35#include <wx/defs.h>
36#include <wx/ffile.h>
37#include <wx/filefn.h>
38#include <wx/textfile.h>
39
40#include "AudacityMessageBox.h"
41#include "XMLWriter.h"
42
43static bool ConvertLegacyTrack(wxTextFile *f, XMLFileWriter &xmlFile)
44// may throw
45{
46 wxString line;
47 wxString kind;
48
49 kind = (*f)[f->GetCurrentLine()];
50
51 if (kind == wxT("WaveTrack")) {
52 xmlFile.StartTag(wxT("wavetrack"));
53 xmlFile.WriteAttr(wxT("name"), f->GetNextLine());
54
55 wxString channel = f->GetNextLine();
56 if (channel == wxT("left")) {
57 xmlFile.WriteAttr(wxT("channel"), 0);
58 line = f->GetNextLine();
59 }
60 else if (channel == wxT("right")) {
61 xmlFile.WriteAttr(wxT("channel"), 1);
62 line = f->GetNextLine();
63 }
64 else if (channel == wxT("mono")) {
65 xmlFile.WriteAttr(wxT("channel"), 2);
66 line = f->GetNextLine();
67 }
68 else {
69 xmlFile.WriteAttr(wxT("channel"), 2);
70 line = channel;
71 }
72
73 if (line == wxT("linked")) {
74 xmlFile.WriteAttr(wxT("linked"), 1);
75 line = f->GetNextLine();
76 }
77
78 if (line != wxT("offset"))
79 return false;
80 xmlFile.WriteAttr(wxT("offset"), f->GetNextLine());
81
82 long envLen;
83
84 if (f->GetNextLine() != wxT("EnvNumPoints"))
85 return false;
86 line = f->GetNextLine();
87 line.ToLong(&envLen);
88 if (envLen < 0 || envLen > 10000)
89 return false;
90
91 size_t envStart = f->GetCurrentLine();
92 if (f->GetLineCount() < envStart+(2*envLen)+1)
93 return false;
94
95 f->GoToLine(envStart+(2*envLen));
96 if (f->GetNextLine() != wxT("EnvEnd"))
97 return false;
98 if (f->GetNextLine() != wxT("numSamples"))
99 return false;
100
101 wxString numSamples = f->GetNextLine();
102
103 if (f->GetNextLine() != wxT("rate"))
104 return false;
105
106 xmlFile.WriteAttr(wxT("rate"), f->GetNextLine());
107
108 if (envLen > 0) {
109 xmlFile.StartTag(wxT("envelope"));
110 xmlFile.WriteAttr(wxT("numpoints"), envLen);
111
112 long i;
113 for(i=0; i<envLen; i++) {
114 xmlFile.StartTag(wxT("controlpoint"));
115 xmlFile.WriteAttr(wxT("t"), f->GetLine(envStart + 2*i + 1));
116 xmlFile.WriteAttr(wxT("val"), f->GetLine(envStart + 2*i + 2));
117 xmlFile.EndTag(wxT("controlpoint"));
118 }
119
120 xmlFile.EndTag(wxT("envelope"));
121 }
122
123 if (f->GetNextLine() != wxT("numBlocks"))
124 return false;
125 long numBlocks;
126 line = f->GetNextLine();
127 line.ToLong(&numBlocks);
128
129 if (numBlocks < 0 || numBlocks > 131072)
130 return false;
131
132 xmlFile.StartTag(wxT("sequence"));
133 xmlFile.WriteAttr(wxT("maxsamples"), 524288);
134 xmlFile.WriteAttr(wxT("sampleformat"), 131073);
135 xmlFile.WriteAttr(wxT("numsamples"), numSamples);
136
137 long b;
138 for(b=0; b<numBlocks; b++) {
139 wxString start;
140 wxString len;
141 wxString name;
142
143 if (f->GetNextLine() != wxT("Block start"))
144 return false;
145 start = f->GetNextLine();
146 if (f->GetNextLine() != wxT("Block len"))
147 return false;
148 len = f->GetNextLine();
149 if (f->GetNextLine() != wxT("Block info"))
150 return false;
151 name = f->GetNextLine();
152
153 xmlFile.StartTag(wxT("waveblock"));
154 xmlFile.WriteAttr(wxT("start"), start);
155
156 xmlFile.StartTag(wxT("legacyblockfile"));
157 if (name == wxT("Alias")) {
158 wxString aliasPath = f->GetNextLine();
159 wxString localLen = f->GetNextLine();
160 wxString aliasStart = f->GetNextLine();
161 wxString aliasLen = f->GetNextLine();
162 wxString aliasChannel = f->GetNextLine();
163 wxString localName = f->GetNextLine();
164
165 xmlFile.WriteAttr(wxT("name"), localName);
166 xmlFile.WriteAttr(wxT("alias"), 1);
167 xmlFile.WriteAttr(wxT("aliaspath"), aliasPath);
168
169 // This was written but not read again?
170 xmlFile.WriteAttr(wxT("aliasstart"), aliasStart);
171
172 xmlFile.WriteAttr(wxT("aliaslen"), aliasLen);
173 xmlFile.WriteAttr(wxT("aliaschannel"), aliasChannel);
174 xmlFile.WriteAttr(wxT("summarylen"), localLen);
175 xmlFile.WriteAttr(wxT("norms"), 1);
176 }
177 else {
178 xmlFile.WriteAttr(wxT("name"), name);
179 xmlFile.WriteAttr(wxT("len"), len);
180 xmlFile.WriteAttr(wxT("summarylen"), 8244);
181 xmlFile.WriteAttr(wxT("norms"), 1);
182 }
183 xmlFile.EndTag(wxT("legacyblockfile"));
184
185 xmlFile.EndTag(wxT("waveblock"));
186 }
187
188 xmlFile.EndTag(wxT("sequence"));
189 xmlFile.EndTag(wxT("wavetrack"));
190
191 return true;
192 }
193 else if (kind == wxT("LabelTrack")) {
194 line = f->GetNextLine();
195 if (line != wxT("NumMLabels"))
196 return false;
197
198 long numLabels, l;
199
200 line = f->GetNextLine();
201 line.ToLong(&numLabels);
202 if (numLabels < 0 || numLabels > 1000000)
203 return false;
204
205 xmlFile.StartTag(wxT("labeltrack"));
206 xmlFile.WriteAttr(wxT("name"), wxT("Labels"));
207 xmlFile.WriteAttr(wxT("numlabels"), numLabels);
208
209 for(l=0; l<numLabels; l++) {
210 wxString t, title;
211
212 t = f->GetNextLine();
213 title = f->GetNextLine();
214
215 xmlFile.StartTag(wxT("label"));
216 xmlFile.WriteAttr(wxT("t"), t);
217 xmlFile.WriteAttr(wxT("title"), title);
218 xmlFile.EndTag(wxT("label"));
219 }
220
221 xmlFile.EndTag(wxT("labeltrack"));
222
223 line = f->GetNextLine();
224 if (line != wxT("MLabelsEnd"))
225 return false;
226
227 return true;
228 }
229 else if (kind == wxT("NoteTrack")) {
230 // Just skip over it - they didn't even work in version 1.0!
231
232 do {
233 line = f->GetNextLine();
234 if (line == wxT("WaveTrack") ||
235 line == wxT("NoteTrack") ||
236 line == wxT("LabelTrack") ||
237 line == wxT("EndTracks")) {
238 f->GoToLine(f->GetCurrentLine()-1);
239 return true;
240 }
241 } while (f->GetCurrentLine() < f->GetLineCount());
242
243 return false;
244 }
245 else
246 return false;
247}
248
249bool ConvertLegacyProjectFile(const wxFileName &filename)
250{
251 wxTextFile f;
252
253 const wxString name = filename.GetFullPath();
254 f.Open( name );
255 if (!f.IsOpened())
256 return false;
257
258 return GuardedCall< bool >( [&] {
259 XMLFileWriter xmlFile{ name, XO("Error Converting Legacy Project File") };
260
261 xmlFile.Write(wxT("<?xml version=\"1.0\"?>\n"));
262
263 wxString label;
264 wxString value;
265
266 if (f.GetFirstLine() != wxT("AudacityProject"))
267 return false;
268 if (f.GetNextLine() != wxT("Version"))
269 return false;
270 if (f.GetNextLine() != wxT("0.95"))
271 return false;
272 if (f.GetNextLine() != wxT("projName"))
273 return false;
274
275 xmlFile.StartTag(wxT("audacityproject"));
276 xmlFile.WriteAttr(wxT("projname"), f.GetNextLine());
277 xmlFile.WriteAttr(wxT("version"), wxT("1.1.0"));
278 xmlFile.WriteAttr(wxT("audacityversion"),AUDACITY_VERSION_STRING);
279
280 label = f.GetNextLine();
281 while (label != wxT("BeginTracks")) {
282 xmlFile.WriteAttr(label, f.GetNextLine());
283 label = f.GetNextLine();
284 }
285
286 label = f.GetNextLine();
287 while (label != wxT("EndTracks")) {
288 bool success = ConvertLegacyTrack(&f, xmlFile);
289 if (!success)
290 return false;
291 label = f.GetNextLine();
292 }
293
294 // Close original before Commit() tries to overwrite it.
295 f.Close();
296
297 xmlFile.EndTag(wxT("audacityproject"));
298 xmlFile.Commit();
299
301 XO(
302"Converted a 1.0 project file to the new format.\nThe old file has been saved as '%s'")
303 .Format( xmlFile.GetBackupName() ),
304 XO("Opening Audacity Project"));
305
306 return true;
307 } );
308}
wxT("CloseDown"))
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
const TranslatableString name
Definition: Distortion.cpp:76
XO("Cut/Copy/Paste")
static bool ConvertLegacyTrack(wxTextFile *f, XMLFileWriter &xmlFile)
Definition: Legacy.cpp:43
bool ConvertLegacyProjectFile(const wxFileName &filename)
Update Audacity 1.0 file in-place to XML format.
Definition: Legacy.cpp:249
static const auto title
TranslatableString label
Definition: TagsEditor.cpp:165
Abstract base class used in importing a file.
Wrapper to output XML data to files.
Definition: XMLWriter.h:84
virtual void StartTag(const wxString &name)
Definition: XMLWriter.cpp:79
void WriteAttr(const wxString &name, const Identifier &value)
Definition: XMLWriter.h:36
virtual void EndTag(const wxString &name)
Definition: XMLWriter.cpp:102