void Tags::WriteXML(XMLWriter &xmlFile) { int j; xmlFile.StartTag(wxT("tags")); xmlFile.WriteAttr(wxT("title"), mTitle); xmlFile.WriteAttr(wxT("artist"), mArtist); xmlFile.WriteAttr(wxT("album"), mAlbum); xmlFile.WriteAttr(wxT("track"), mTrackNum); xmlFile.WriteAttr(wxT("year"), mYear); xmlFile.WriteAttr(wxT("genre"), mGenre); xmlFile.WriteAttr(wxT("comments"), mComments); xmlFile.WriteAttr(wxT("id3v2"), mID3V2); if (mExtraNames.GetCount() == 0) { xmlFile.EndTag(wxT("tags")); return; } for(j=0; j<(int)mExtraNames.GetCount(); j++) { xmlFile.StartTag(wxT("tag")); xmlFile.WriteAttr(wxT("name"), mExtraNames[j]); xmlFile.WriteAttr(wxT("value"), mExtraValues[j]); xmlFile.EndTag(wxT("tag")); } xmlFile.EndTag(wxT("tags")); }
void Tags::WriteXML(XMLWriter &xmlFile) { xmlFile.StartTag(wxT("tags")); wxString n, v; for (bool cont = GetFirst(n, v); cont; cont = GetNext(n, v)) { xmlFile.StartTag(wxT("tag")); xmlFile.WriteAttr(wxT("name"), n); xmlFile.WriteAttr(wxT("value"), v); xmlFile.EndTag(wxT("tag")); } xmlFile.EndTag(wxT("tags")); }
/// Writes the xml as a PCMAliasBlockFile if we can (if we have a summary file) /// Otherwise writes XML as a subset of attributes with 'odpcmaliasblockfile as the start tag. /// Most notably, the summaryfile attribute refers to a file that does not yet exist, so when the project file is read back in /// and this object reconstructed, it needs to avoid trying to open it as well as schedule itself for OD loading void ODPCMAliasBlockFile::SaveXML(XMLWriter &xmlFile) // may throw { //we lock this so that mAliasedFileName doesn't change. auto locker = LockForRead(); if(IsSummaryAvailable()) { PCMAliasBlockFile::SaveXML(xmlFile); mHasBeenSaved = true; } else { xmlFile.StartTag(wxT("odpcmaliasblockfile")); //unlock to prevent deadlock and resume lock after. { auto suspension = locker.Suspend(); ODLocker locker2 { &mFileNameMutex }; xmlFile.WriteAttr(wxT("summaryfile"), mFileName.GetFullName()); } xmlFile.WriteAttr(wxT("aliasfile"), mAliasedFileName.GetFullPath()); xmlFile.WriteAttr(wxT("aliasstart"), mAliasStart.as_long_long()); xmlFile.WriteAttr(wxT("aliaslen"), mLen); xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel); xmlFile.EndTag(wxT("odpcmaliasblockfile")); } }
/// Writes the xml as a SimpleBlockFile if we can (if we have a summary file) /// Otherwise writes XML as a subset of attributes with 'odpcmaliasblockfile as the start tag. /// Most notably, the summaryfile attribute refers to a file that does not yet, so when the project file is read back in /// and this object reconstructed, it needs to avoid trying to open it as well as schedule itself for OD loading void ODDecodeBlockFile::SaveXML(XMLWriter &xmlFile) { LockRead(); if(IsSummaryAvailable()) { SimpleBlockFile::SaveXML(xmlFile); } else { xmlFile.StartTag(wxT("oddecodeblockfile")); //unlock to prevent deadlock and resume lock after. UnlockRead(); mFileNameMutex.Lock(); xmlFile.WriteAttr(wxT("summaryfile"), mFileName.GetFullName()); mFileNameMutex.Unlock(); LockRead(); xmlFile.WriteAttr(wxT("audiofile"), mAudioFileName.GetFullPath()); xmlFile.WriteAttr(wxT("aliasstart"), mAliasStart); xmlFile.WriteAttr(wxT("aliaslen"), mLen); xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel); xmlFile.WriteAttr(wxT("decodetype"), (size_t)mType); xmlFile.EndTag(wxT("oddecodeblockfile")); } UnlockRead(); }
/// Writes the xml as a PCMAliasBlockFile if we can (if we have a summary file) /// Otherwise writes XML as a subset of attributes with 'odpcmaliasblockfile as the start tag. /// Most notably, the summaryfile attribute refers to a file that does not yet, so when the project file is read back in /// and this object reconstructed, it needs to avoid trying to open it as well as schedule itself for OD loading void ODPCMAliasBlockFile::SaveXML(XMLWriter &xmlFile) { //we lock this so that mAliasedFileName doesn't change. mReadDataMutex.Lock(); if(IsSummaryAvailable()) { PCMAliasBlockFile::SaveXML(xmlFile); mHasBeenSaved = true; } else { xmlFile.StartTag(wxT("odpcmaliasblockfile")); //unlock to prevent deadlock and resume lock after. mReadDataMutex.Unlock(); mFileNameMutex.Lock(); xmlFile.WriteAttr(wxT("summaryfile"), mFileName.GetFullName()); mFileNameMutex.Unlock(); mReadDataMutex.Lock(); xmlFile.WriteAttr(wxT("aliasfile"), mAliasedFileName.GetFullPath()); xmlFile.WriteAttr(wxT("aliasstart"), mAliasStart); xmlFile.WriteAttr(wxT("aliaslen"), mLen); xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel); //these have not been computed yet. //xmlFile.WriteAttr(wxT("min"), mMin); //xmlFile.WriteAttr(wxT("max"), mMax); // xmlFile.WriteAttr(wxT("rms"), mRMS); xmlFile.EndTag(wxT("odpcmaliasblockfile")); } mReadDataMutex.Unlock(); }
void Tags::WriteXML(XMLWriter &xmlFile) const // may throw { xmlFile.StartTag(wxT("tags")); for (const auto &pair : GetRange()) { const auto &n = pair.first; const auto &v = pair.second; xmlFile.StartTag(wxT("tag")); xmlFile.WriteAttr(wxT("name"), n); xmlFile.WriteAttr(wxT("value"), v); xmlFile.EndTag(wxT("tag")); } xmlFile.EndTag(wxT("tags")); }
void Envelope::WriteXML(XMLWriter &xmlFile) { unsigned int ctrlPt; xmlFile.StartTag(wxT("envelope")); xmlFile.WriteAttr(wxT("numpoints"), mEnv.GetCount()); for (ctrlPt = 0; ctrlPt < mEnv.GetCount(); ctrlPt++) { xmlFile.StartTag(wxT("controlpoint")); xmlFile.WriteAttr(wxT("t"), mEnv[ctrlPt]->GetT(), 12); xmlFile.WriteAttr(wxT("val"), mEnv[ctrlPt]->GetVal(), 12); xmlFile.EndTag(wxT("controlpoint")); } xmlFile.EndTag(wxT("envelope")); }
/// Writes the xml as a PCMAliasBlockFile if we can (if we have a summary file) /// Otherwise writes XML as a subset of attributes with 'odpcmaliasblockfile as the start tag. /// Most notably, the summaryfile attribute refers to a file that does not yet, so when the project file is read back in /// and this object reconstructed, it needs to avoid trying to open it as well as schedule itself for OD loading void ODPCMAliasBlockFile::SaveXML(XMLWriter &xmlFile) { //we lock this so that mAliasedFileName doesn't change. LockRead(); if(IsSummaryAvailable()) { PCMAliasBlockFile::SaveXML(xmlFile); mHasBeenSaved = true; } else { xmlFile.StartTag(wxT("odpcmaliasblockfile")); //unlock to prevent deadlock and resume lock after. UnlockRead(); mFileNameMutex.Lock(); xmlFile.WriteAttr(wxT("summaryfile"), mFileName.GetFullName()); mFileNameMutex.Unlock(); LockRead(); xmlFile.WriteAttr(wxT("aliasfile"), mAliasedFileName.GetFullPath()); xmlFile.WriteAttr(wxT("aliasstart"), mAliasStart); xmlFile.WriteAttr(wxT("aliaslen"), mLen); xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel); xmlFile.EndTag(wxT("odpcmaliasblockfile")); } UnlockRead(); }
/// Writes the xml as a SimpleBlockFile if we can (if we have a summary file) /// Otherwise writes XML as a subset of attributes with 'odpcmaliasblockfile as the start tag. /// Most notably, the summaryfile attribute refers to a file that does not yet, so when the project file is read back in /// and this object reconstructed, it needs to avoid trying to open it as well as schedule itself for OD loading void ODDecodeBlockFile::SaveXML(XMLWriter &xmlFile) // may throw { auto locker = LockForRead(); if(IsSummaryAvailable()) { SimpleBlockFile::SaveXML(xmlFile); } else { xmlFile.StartTag(wxT("oddecodeblockfile")); { //unlock to prevent deadlock and resume lock after. auto suspension = locker.Suspend(); ODLocker locker2{ &mFileNameMutex }; xmlFile.WriteAttr(wxT("summaryfile"), mFileName.GetFullName()); } xmlFile.WriteAttr(wxT("audiofile"), mAudioFileName.GetFullPath()); xmlFile.WriteAttr(wxT("aliasstart"), mAliasStart.as_long_long()); xmlFile.WriteAttr(wxT("aliaslen"), mLen); xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel); xmlFile.WriteAttr(wxT("decodetype"), (size_t)mType); xmlFile.EndTag(wxT("oddecodeblockfile")); } }
void SilentBlockFile::SaveXML(XMLWriter &xmlFile) // may throw { xmlFile.StartTag(wxT("silentblockfile")); xmlFile.WriteAttr(wxT("len"), mLen); xmlFile.EndTag(wxT("silentblockfile")); }
void CommandManager::WriteXML(XMLWriter &xmlFile) { unsigned int j; xmlFile.StartTag(wxT("audacitykeyboard")); xmlFile.WriteAttr(wxT("audacityversion"), AUDACITY_VERSION_STRING); for(j=0; j<mCommandList.GetCount(); j++) { wxString label = mCommandList[j]->label; label = wxMenuItem::GetLabelFromText(label.BeforeFirst(wxT('\t'))); xmlFile.StartTag(wxT("command")); xmlFile.WriteAttr(wxT("name"), mCommandList[j]->name); xmlFile.WriteAttr(wxT("label"), label); xmlFile.WriteAttr(wxT("key"), mCommandList[j]->key); xmlFile.EndTag(wxT("command")); } xmlFile.EndTag(wxT("audacitykeyboard")); }
void TimeTrack::WriteXML(XMLWriter &xmlFile) { xmlFile.StartTag(wxT("timetrack")); xmlFile.WriteAttr(wxT("name"), mName); xmlFile.WriteAttr(wxT("channel"), mChannel); xmlFile.WriteAttr(wxT("offset"), mOffset, 8); mEnvelope->WriteXML(xmlFile); xmlFile.EndTag(wxT("timetrack")); }
void FFmpegPresets::WriteXML(XMLWriter &xmlFile) { xmlFile.StartTag(wxT("ffmpeg_presets")); xmlFile.WriteAttr(wxT("version"),wxT("1.0")); FFmpegPresetList::iterator iter; for (iter = mPresets->begin(); iter != mPresets->end(); ++iter) { FFmpegPreset *preset = *iter; xmlFile.StartTag(wxT("preset")); xmlFile.WriteAttr(wxT("name"),*preset->mPresetName); for (long i = FEFirstID + 1; i < FELastID; i++) { xmlFile.StartTag(wxT("setctrlstate")); xmlFile.WriteAttr(wxT("id"),wxString(FFmpegExportCtrlIDNames[i - FEFirstID])); xmlFile.WriteAttr(wxT("state"),preset->mControlState->Item(i - FEFirstID)); xmlFile.EndTag(wxT("setctrlstate")); } xmlFile.EndTag(wxT("preset")); } xmlFile.EndTag(wxT("ffmpeg_presets")); }
void WaveClip::WriteXML(XMLWriter &xmlFile) { xmlFile.StartTag(wxT("waveclip")); xmlFile.WriteAttr(wxT("offset"), mOffset, 8); mSequence->WriteXML(xmlFile); mEnvelope->WriteXML(xmlFile); for (WaveClipList::compatibility_iterator it=mCutLines.GetFirst(); it; it=it->GetNext()) it->GetData()->WriteXML(xmlFile); xmlFile.EndTag(wxT("waveclip")); }
void Sequence::WriteXML(XMLWriter &xmlFile) { unsigned int b; xmlFile.StartTag(wxT("sequence")); xmlFile.WriteAttr(wxT("maxsamples"), mMaxSamples); xmlFile.WriteAttr(wxT("sampleformat"), mSampleFormat); xmlFile.WriteAttr(wxT("numsamples"), mNumSamples); for (b = 0; b < mBlock->Count(); b++) { SeqBlock *bb = mBlock->Item(b); xmlFile.StartTag(wxT("waveblock")); xmlFile.WriteAttr(wxT("start"), bb->start); bb->f->SaveXML(xmlFile); xmlFile.EndTag(wxT("waveblock")); } xmlFile.EndTag(wxT("sequence")); }
void TimeTrack::WriteXML(XMLWriter &xmlFile) { xmlFile.StartTag(wxT("timetrack")); xmlFile.WriteAttr(wxT("name"), mName); xmlFile.WriteAttr(wxT("channel"), mChannel); xmlFile.WriteAttr(wxT("offset"), mOffset, 8); xmlFile.WriteAttr(wxT("height"), this->GetActualHeight()); xmlFile.WriteAttr(wxT("minimized"), this->GetMinimized()); mEnvelope->WriteXML(xmlFile); xmlFile.EndTag(wxT("timetrack")); }
void PCMAliasBlockFile::SaveXML(XMLWriter &xmlFile) { xmlFile.StartTag(wxT("pcmaliasblockfile")); xmlFile.WriteAttr(wxT("summaryfile"), mFileName.GetFullName()); xmlFile.WriteAttr(wxT("aliasfile"), mAliasedFileName.GetFullPath()); xmlFile.WriteAttr(wxT("aliasstart"), mAliasStart); xmlFile.WriteAttr(wxT("aliaslen"), mLen); xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel); xmlFile.WriteAttr(wxT("min"), mMin); xmlFile.WriteAttr(wxT("max"), mMax); xmlFile.WriteAttr(wxT("rms"), mRMS); xmlFile.EndTag(wxT("pcmaliasblockfile")); }
void LegacyAliasBlockFile::SaveXML(XMLWriter &xmlFile) { xmlFile.StartTag(wxT("legacyblockfile")); xmlFile.WriteAttr(wxT("alias"), 1); xmlFile.WriteAttr(wxT("name"), mFileName.GetFullName()); xmlFile.WriteAttr(wxT("aliaspath"), mAliasedFileName.GetFullPath()); xmlFile.WriteAttr(wxT("aliasstart"), mAliasStart); xmlFile.WriteAttr(wxT("aliaslen"), mLen); xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel); xmlFile.WriteAttr(wxT("summarylen"), mSummaryInfo.totalSummaryBytes); if (mSummaryInfo.fields < 3) xmlFile.WriteAttr(wxT("norms"), 1); xmlFile.EndTag(wxT("legacyblockfile")); }
void TimeTrack::WriteXML(XMLWriter &xmlFile) { xmlFile.StartTag(wxT("timetrack")); xmlFile.WriteAttr(wxT("name"), mName); //xmlFile.WriteAttr(wxT("channel"), mChannel); //xmlFile.WriteAttr(wxT("offset"), mOffset, 8); xmlFile.WriteAttr(wxT("height"), GetActualHeight()); xmlFile.WriteAttr(wxT("minimized"), GetMinimized()); xmlFile.WriteAttr(wxT("rangelower"), mRangeLower, 12); xmlFile.WriteAttr(wxT("rangeupper"), mRangeUpper, 12); xmlFile.WriteAttr(wxT("displaylog"), GetDisplayLog()); xmlFile.WriteAttr(wxT("interpolatelog"), GetInterpolateLog()); mEnvelope->WriteXML(xmlFile); xmlFile.EndTag(wxT("timetrack")); }
void NoteTrack::WriteXML(XMLWriter &xmlFile) { std::ostringstream data; // Normally, Duplicate is called in pairs -- once to put NoteTrack // on the Undo stack, and again to move from the Undo stack to an // "active" editable state. For efficiency, we do not do a "real" // Duplicate followed by serialization into a binary blob. Instead, // we combine the Duplicate with serialization or unserialization. // Serialization and Unserialization happen on alternate calls to // Duplicate and (usually) produce the right results at the right // time. // It turns out that this optimized Duplicate is a little too // clever. There is at least one case where a track can be duplicated // and then AutoSave'd. (E.g. do an "Insert Silence" effect on a // NoteTrack.) In this case, mSeq will be NULL. To avoid a crash // and perform WriteXML, we may need to restore NoteTracks from binary // blobs to regular data structures (with an Alg_seq member). NoteTrack *saveme = this; if (!mSeq) { // replace saveme with an (unserialized) duplicate saveme = (NoteTrack *) this->Duplicate(); assert(saveme->mSeq); } saveme->mSeq->write(data, true); xmlFile.StartTag(wxT("notetrack")); xmlFile.WriteAttr(wxT("name"), saveme->mName); xmlFile.WriteAttr(wxT("offset"), saveme->GetOffset()); xmlFile.WriteAttr(wxT("visiblechannels"), saveme->mVisibleChannels); xmlFile.WriteAttr(wxT("height"), saveme->GetActualHeight()); xmlFile.WriteAttr(wxT("minimized"), saveme->GetMinimized()); xmlFile.WriteAttr(wxT("isSelected"), this->GetSelected()); #ifdef EXPERIMENTAL_MIDI_OUT xmlFile.WriteAttr(wxT("velocity"), (double) saveme->mGain); #endif xmlFile.WriteAttr(wxT("bottomnote"), saveme->mBottomNote); xmlFile.WriteAttr(wxT("data"), wxString(data.str().c_str(), wxConvUTF8)); xmlFile.EndTag(wxT("notetrack")); if (this != saveme) { delete saveme; // delete the duplicate } }
/// Writes the xml as a PCMAliasBlockFile if we can (if we have a summary file) /// Otherwise writes XML as a subset of attributes with 'odpcmaliasblockfile as the start tag. /// Most notably, the summaryfile attribute refers to a file that does not yet, so when the project file is read back in /// and this object reconstructed, it needs to avoid trying to open it as well as schedule itself for OD loading void ODPCMAliasBlockFile::SaveXML(XMLWriter &xmlFile) { if(IsSummaryAvailable()) { PCMAliasBlockFile::SaveXML(xmlFile); } else { xmlFile.StartTag(wxT("odpcmaliasblockfile")); xmlFile.WriteAttr(wxT("summaryfile"), mFileName.GetFullName()); xmlFile.WriteAttr(wxT("aliasfile"), mAliasedFileName.GetFullPath()); xmlFile.WriteAttr(wxT("aliasstart"), mAliasStart); xmlFile.WriteAttr(wxT("aliaslen"), mLen); xmlFile.WriteAttr(wxT("aliaschannel"), mAliasChannel); //these have not been computed yet. //xmlFile.WriteAttr(wxT("min"), mMin); //xmlFile.WriteAttr(wxT("max"), mMax); // xmlFile.WriteAttr(wxT("rms"), mRMS); xmlFile.EndTag(wxT("odpcmaliasblockfile")); } }