mirror of
https://github.com/cookiengineer/audacity
synced 2025-07-19 14:17:41 +02:00
Bug1349 again: Fix export and import of no-name labels
This commit is contained in:
parent
9aff1ff6c6
commit
f1799521aa
@ -1217,21 +1217,23 @@ void LabelStruct::MoveLabel( int iEdge, double fNewTime)
|
|||||||
updated = true;
|
updated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
LabelStruct LabelStruct::Import(wxTextFile &file, int index)
|
LabelStruct LabelStruct::Import(wxTextFile &file, int &index)
|
||||||
{
|
{
|
||||||
wxString currentLine = file.GetLine(index);
|
|
||||||
|
|
||||||
// Assume tab is an impossible character within the exported text
|
|
||||||
// of the label, so can be only a delimiter. But other white space may
|
|
||||||
// be part of the label text.
|
|
||||||
wxStringTokenizer toker { currentLine, wxT("\t") };
|
|
||||||
|
|
||||||
//get the timepoint of the left edge of the label.
|
|
||||||
auto token = toker.GetNextToken();
|
|
||||||
|
|
||||||
SelectedRegion sr;
|
SelectedRegion sr;
|
||||||
|
wxString title;
|
||||||
|
static const wxString continuation{ wxT("\\") };
|
||||||
|
|
||||||
|
wxString firstLine = file.GetLine(index++);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
// Assume tab is an impossible character within the exported text
|
||||||
|
// of the label, so can be only a delimiter. But other white space may
|
||||||
|
// be part of the label text.
|
||||||
|
wxStringTokenizer toker { firstLine, wxT("\t") };
|
||||||
|
|
||||||
|
//get the timepoint of the left edge of the label.
|
||||||
|
auto token = toker.GetNextToken();
|
||||||
|
|
||||||
double t0;
|
double t0;
|
||||||
if (!Internat::CompatibleToDouble(token, &t0))
|
if (!Internat::CompatibleToDouble(token, &t0))
|
||||||
throw BadFormatException{};
|
throw BadFormatException{};
|
||||||
@ -1246,13 +1248,31 @@ LabelStruct LabelStruct::Import(wxTextFile &file, int index)
|
|||||||
token = toker.GetNextToken();
|
token = toker.GetNextToken();
|
||||||
|
|
||||||
sr.setTimes( t0, t1 );
|
sr.setTimes( t0, t1 );
|
||||||
|
|
||||||
|
title = token;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString title = token;
|
// Newer selection fields are written on additional lines beginning with
|
||||||
|
// '\' which is an impossible numerical character that older versions of
|
||||||
|
// audacity will ignore. Test for the presence of such a line and then
|
||||||
|
// parse it if we can.
|
||||||
|
|
||||||
|
// There may also be additional continuation lines from future formats that
|
||||||
|
// we ignore.
|
||||||
|
|
||||||
|
// Advance index over all continuation lines first, before we might throw
|
||||||
|
// any exceptions.
|
||||||
|
int index2 = index;
|
||||||
|
while (index < file.GetLineCount() &&
|
||||||
|
file.GetLine(index).StartsWith(continuation))
|
||||||
|
++index;
|
||||||
|
|
||||||
|
if (index2 < index) {
|
||||||
|
wxStringTokenizer toker { file.GetLine(index2++), wxT("\t") };
|
||||||
|
auto token = toker.GetNextToken();
|
||||||
|
if (token != continuation)
|
||||||
|
throw BadFormatException{};
|
||||||
|
|
||||||
// Newer selection fields are written after the title, for historical
|
|
||||||
// reasons.
|
|
||||||
if (toker.HasMoreTokens()) {
|
|
||||||
token = toker.GetNextToken();
|
token = toker.GetNextToken();
|
||||||
double f0;
|
double f0;
|
||||||
if (!Internat::CompatibleToDouble(token, &f0))
|
if (!Internat::CompatibleToDouble(token, &f0))
|
||||||
@ -1271,13 +1291,27 @@ LabelStruct LabelStruct::Import(wxTextFile &file, int index)
|
|||||||
|
|
||||||
void LabelStruct::Export(wxTextFile &file) const
|
void LabelStruct::Export(wxTextFile &file) const
|
||||||
{
|
{
|
||||||
file.AddLine(wxString::Format(wxT("%f\t%f\t%s\t%f\t%f"),
|
file.AddLine(wxString::Format(wxT("%f\t%f\t%s"),
|
||||||
getT0(),
|
getT0(),
|
||||||
getT1(),
|
getT1(),
|
||||||
title.c_str(),
|
title.c_str()
|
||||||
selectedRegion.f0(),
|
|
||||||
selectedRegion.f1()
|
|
||||||
));
|
));
|
||||||
|
|
||||||
|
// Do we need more lines?
|
||||||
|
auto f0 = selectedRegion.f0();
|
||||||
|
auto f1 = selectedRegion.f1();
|
||||||
|
if (f0 == SelectedRegion::UndefinedFrequency &&
|
||||||
|
f1 == SelectedRegion::UndefinedFrequency)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Write a \ character at the start of a second line,
|
||||||
|
// so that earlier versions of Audacity ignore it.
|
||||||
|
file.AddLine(wxString::Format(wxT("\\\t%f\t%f"),
|
||||||
|
f0,
|
||||||
|
f1
|
||||||
|
));
|
||||||
|
|
||||||
|
// Additional lines in future formats should also start with '\'.
|
||||||
}
|
}
|
||||||
|
|
||||||
auto LabelStruct::RegionRelation(
|
auto LabelStruct::RegionRelation(
|
||||||
@ -2119,8 +2153,9 @@ void LabelTrack::Import(wxTextFile & in)
|
|||||||
//Currently, we expect a tag file to have two values and a label
|
//Currently, we expect a tag file to have two values and a label
|
||||||
//on each line. If the second token is not a number, we treat
|
//on each line. If the second token is not a number, we treat
|
||||||
//it as a single-value label.
|
//it as a single-value label.
|
||||||
for (int index = 0; index < lines; index++) {
|
for (int index = 0; index < lines;) {
|
||||||
try {
|
try {
|
||||||
|
// Let LabelStruct::Import advance index
|
||||||
LabelStruct l { LabelStruct::Import(in, index) };
|
LabelStruct l { LabelStruct::Import(in, index) };
|
||||||
mLabels.push_back(l);
|
mLabels.push_back(l);
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ public:
|
|||||||
void MoveLabel( int iEdge, double fNewTime);
|
void MoveLabel( int iEdge, double fNewTime);
|
||||||
|
|
||||||
struct BadFormatException {};
|
struct BadFormatException {};
|
||||||
static LabelStruct Import(wxTextFile &file, int index);
|
static LabelStruct Import(wxTextFile &file, int &index);
|
||||||
|
|
||||||
void Export(wxTextFile &file) const;
|
void Export(wxTextFile &file) const;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user