diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index f08eb48dd..78ad375e6 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -1133,7 +1133,7 @@ double LabelTrack::GetEndTime() const return end; } -Track *LabelTrack::Duplicate() +Track *LabelTrack::Duplicate() const { return new LabelTrack(*this); } diff --git a/src/LabelTrack.h b/src/LabelTrack.h index 23ecb4655..849e0d1fc 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -139,7 +139,7 @@ class AUDACITY_DLL_API LabelTrack : public Track virtual double GetStartTime() const; virtual double GetEndTime() const; - virtual Track *Duplicate(); + virtual Track *Duplicate() const; virtual void SetSelected(bool s); diff --git a/src/NoteTrack.cpp b/src/NoteTrack.cpp index 44fcaec8f..be970063f 100644 --- a/src/NoteTrack.cpp +++ b/src/NoteTrack.cpp @@ -135,7 +135,7 @@ NoteTrack::~NoteTrack() } } -Track *NoteTrack::Duplicate() +Track *NoteTrack::Duplicate() const { NoteTrack *duplicate = new NoteTrack(mDirManager); duplicate->Init(*this); diff --git a/src/NoteTrack.h b/src/NoteTrack.h index d77c74d08..1e890ff78 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -57,7 +57,7 @@ class AUDACITY_DLL_API NoteTrack:public Track { NoteTrack(DirManager * projDirManager); virtual ~NoteTrack(); - virtual Track *Duplicate(); + virtual Track *Duplicate() const; virtual int GetKind() const { return Note; } diff --git a/src/Tags.cpp b/src/Tags.cpp index 4bd735f98..372c51769 100644 --- a/src/Tags.cpp +++ b/src/Tags.cpp @@ -371,27 +371,33 @@ int Tags::GetGenre(const wxString & name) return 255; } -bool Tags::HasTag(const wxString & name) +bool Tags::HasTag(const wxString & name) const { wxString key = name; key.UpperCase(); - TagMap::iterator iter = mXref.find(key); + auto iter = mXref.find(key); return (iter != mXref.end()); } -wxString Tags::GetTag(const wxString & name) +wxString Tags::GetTag(const wxString & name) const { wxString key = name; key.UpperCase(); - TagMap::iterator iter = mXref.find(key); + auto iter = mXref.find(key); if (iter == mXref.end()) { return wxEmptyString; } - return mMap[iter->second]; + auto iter2 = mMap.find(iter->second); + if (iter2 == mMap.end()) { + wxASSERT(false); + return wxEmptyString; + } + else + return iter2->second; } Tags::Iterators Tags::GetRange() const diff --git a/src/Tags.h b/src/Tags.h index 9373c54ec..bb7521702 100644 --- a/src/Tags.h +++ b/src/Tags.h @@ -97,8 +97,8 @@ class AUDACITY_DLL_API Tags: public XMLTagHandler { wxString GetGenre(int value); int GetGenre(const wxString & name); - bool HasTag(const wxString & name); - wxString GetTag(const wxString & name); + bool HasTag(const wxString & name) const; + wxString GetTag(const wxString & name) const; using IterPair = std::pair; struct Iterators : public IterPair { diff --git a/src/TimeTrack.cpp b/src/TimeTrack.cpp index 6d20fe7b8..ab8bb1b8c 100644 --- a/src/TimeTrack.cpp +++ b/src/TimeTrack.cpp @@ -64,7 +64,7 @@ TimeTrack::TimeTrack(DirManager *projDirManager, const ZoomInfo *zoomInfo): blankPen.SetColour(214, 214, 214); } -TimeTrack::TimeTrack(TimeTrack &orig): +TimeTrack::TimeTrack(const TimeTrack &orig): Track(orig) , mZoomInfo(orig.mZoomInfo) { @@ -109,7 +109,7 @@ TimeTrack::~TimeTrack() delete mRuler; } -Track *TimeTrack::Duplicate() +Track *TimeTrack::Duplicate() const { return new TimeTrack(*this); } diff --git a/src/TimeTrack.h b/src/TimeTrack.h index c148fb503..89747936b 100644 --- a/src/TimeTrack.h +++ b/src/TimeTrack.h @@ -35,7 +35,7 @@ class TimeTrack: public Track { * copy-constructor to encapsulate this. * @param orig The original track to copy from */ - TimeTrack(TimeTrack &orig); + TimeTrack(const TimeTrack &orig); virtual ~TimeTrack(); @@ -131,7 +131,7 @@ class TimeTrack: public Track { * @param orig the TimeTrack to copy from */ void Init(const TimeTrack &orig); - virtual Track *Duplicate(); + virtual Track *Duplicate() const; friend class TrackFactory; diff --git a/src/Track.h b/src/Track.h index a2540da00..9950fbbad 100644 --- a/src/Track.h +++ b/src/Track.h @@ -145,7 +145,7 @@ class AUDACITY_DLL_API Track: public XMLTagHandler virtual ~ Track(); void Init(const Track &orig); - virtual Track *Duplicate() = 0; + virtual Track *Duplicate() const = 0; // Called when this track is merged to stereo with another, and should // take on some paramaters of its partner. @@ -239,6 +239,30 @@ class AUDACITY_DLL_API TrackListIterator TrackListNode *cur; }; +class AUDACITY_DLL_API TrackListConstIterator +{ +public: + TrackListConstIterator(const TrackList * val = NULL) + : mIter(const_cast(val)) + {} + ~TrackListConstIterator() {} + + // Iterate functions + const Track *First(const TrackList * val = NULL) + { return mIter.First(const_cast(val)); } + const Track *StartWith(const Track * val) + { return mIter.StartWith(const_cast(val)); } + const Track *Next(bool skiplinked = false) + { return mIter.Next(skiplinked); } + const Track *Prev(bool skiplinked = false) + { return mIter.Prev(skiplinked); } + const Track *Last(bool skiplinked = false) + { return mIter.Last(skiplinked); } + +private: + TrackListIterator mIter; +}; + // TrackListCondIterator (base class for iterators that iterate over all tracks) // that meet a condition) class AUDACITY_DLL_API TrackListCondIterator: public TrackListIterator diff --git a/src/UndoManager.cpp b/src/UndoManager.cpp index 68c8726f1..2255949f7 100644 --- a/src/UndoManager.cpp +++ b/src/UndoManager.cpp @@ -182,7 +182,7 @@ bool UndoManager::RedoAvailable() return (current < (int)stack.size() - 1); } -void UndoManager::ModifyState(TrackList * l, +void UndoManager::ModifyState(const TrackList * l, const SelectedRegion &selectedRegion) { if (current == wxNOT_FOUND) { @@ -195,8 +195,8 @@ void UndoManager::ModifyState(TrackList * l, // Duplicate auto tracksCopy = std::make_unique(true); - TrackListIterator iter(l); - Track *t = iter.First(); + TrackListConstIterator iter(l); + const Track *t = iter.First(); while (t) { tracksCopy->Add(t->Duplicate()); t = iter.Next(); @@ -208,7 +208,7 @@ void UndoManager::ModifyState(TrackList * l, SonifyEndModifyState(); } -void UndoManager::PushState(TrackList * l, +void UndoManager::PushState(const TrackList * l, const SelectedRegion &selectedRegion, const wxString &longDescription, const wxString &shortDescription, @@ -237,8 +237,8 @@ void UndoManager::PushState(TrackList * l, } auto tracksCopy = std::make_unique(true); - TrackListIterator iter(l); - Track *t = iter.First(); + TrackListConstIterator iter(l); + const Track *t = iter.First(); while (t) { tracksCopy->Add(t->Duplicate()); t = iter.Next(); diff --git a/src/UndoManager.h b/src/UndoManager.h index 6cc6c1b8f..6073e1888 100644 --- a/src/UndoManager.h +++ b/src/UndoManager.h @@ -99,11 +99,11 @@ class AUDACITY_DLL_API UndoManager { UndoManager(); ~UndoManager(); - void PushState(TrackList * l, + void PushState(const TrackList * l, const SelectedRegion &selectedRegion, const wxString &longDescription, const wxString &shortDescription, UndoPush flags = UndoPush::AUTOSAVE); - void ModifyState(TrackList * l, + void ModifyState(const TrackList * l, const SelectedRegion &selectedRegion); void ClearStates(); void RemoveStates(int num); // removes the 'num' oldest states diff --git a/src/WaveTrack.cpp b/src/WaveTrack.cpp index 0a78fd175..bc07c2e94 100644 --- a/src/WaveTrack.cpp +++ b/src/WaveTrack.cpp @@ -116,7 +116,7 @@ WaveTrack::WaveTrack(DirManager *projDirManager, sampleFormat format, double rat mAutoSaveIdent = 0; } -WaveTrack::WaveTrack(WaveTrack &orig): +WaveTrack::WaveTrack(const WaveTrack &orig): Track(orig) , mpSpectrumSettings(orig.mpSpectrumSettings ? new SpectrogramSettings(*orig.mpSpectrumSettings) : 0 @@ -362,7 +362,7 @@ void WaveTrack::SetSpectrumBounds(float min, float max) mSpectrumMax = max; } -Track *WaveTrack::Duplicate() +Track *WaveTrack::Duplicate() const { return new WaveTrack(*this); } diff --git a/src/WaveTrack.h b/src/WaveTrack.h index 0c6476e30..957efd1aa 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -72,10 +72,10 @@ class AUDACITY_DLL_API WaveTrack : public Track { WaveTrack(DirManager * projDirManager, sampleFormat format = (sampleFormat)0, double rate = 0); - WaveTrack(WaveTrack &orig); + WaveTrack(const WaveTrack &orig); void Init(const WaveTrack &orig); - virtual Track *Duplicate(); + virtual Track *Duplicate() const; #ifdef EXPERIMENTAL_OUTPUT_DISPLAY void VirtualStereoInit(); #endif diff --git a/src/export/Export.h b/src/export/Export.h index c3b6e2a5f..eb5e98ca9 100644 --- a/src/export/Export.h +++ b/src/export/Export.h @@ -110,7 +110,7 @@ public: double t0, double t1, MixerSpec *mixerSpec = NULL, - Tags *metadata = NULL, + const Tags *metadata = NULL, int subformat = 0) = 0; protected: diff --git a/src/export/ExportCL.cpp b/src/export/ExportCL.cpp index fe85c6a3e..a8fec1bd0 100644 --- a/src/export/ExportCL.cpp +++ b/src/export/ExportCL.cpp @@ -291,7 +291,7 @@ public: double t0, double t1, MixerSpec *mixerSpec = NULL, - Tags *metadata = NULL, + const Tags *metadata = NULL, int subformat = 0) override; }; @@ -318,7 +318,7 @@ int ExportCL::Export(AudacityProject *project, double t0, double t1, MixerSpec *mixerSpec, - Tags *WXUNUSED(metadata), + const Tags *WXUNUSED(metadata), int WXUNUSED(subformat)) { wxString output; diff --git a/src/export/ExportFFmpeg.cpp b/src/export/ExportFFmpeg.cpp index 886aeb62e..b74a77f13 100644 --- a/src/export/ExportFFmpeg.cpp +++ b/src/export/ExportFFmpeg.cpp @@ -101,16 +101,16 @@ public: bool CheckFileName(wxFileName &filename, int format = 0); /// Format intialization - bool Init(const char *shortname, AudacityProject *project, Tags *metadata, int subformat); + bool Init(const char *shortname, AudacityProject *project, const Tags *metadata, int subformat); /// Codec intialization bool InitCodecs(AudacityProject *project); /// Writes metadata - bool AddTags(Tags *metadata); + bool AddTags(const Tags *metadata); /// Sets individual metadata values - void SetMetadata(Tags *tags, const char *name, const wxChar *tag); + void SetMetadata(const Tags *tags, const char *name, const wxChar *tag); /// Encodes audio bool EncodeAudioFrame(int16_t *pFrame, int frameSize); @@ -145,7 +145,7 @@ public: double t0, double t1, MixerSpec *mixerSpec = NULL, - Tags *metadata = NULL, + const Tags *metadata = NULL, int subformat = 0) override; private: @@ -256,7 +256,7 @@ bool ExportFFmpeg::CheckFileName(wxFileName & WXUNUSED(filename), int WXUNUSED(f return result; } -bool ExportFFmpeg::Init(const char *shortname, AudacityProject *project, Tags *metadata, int subformat) +bool ExportFFmpeg::Init(const char *shortname, AudacityProject *project, const Tags *metadata, int subformat) { int err; //FFmpegLibsInst->LoadLibs(NULL,true); //Loaded at startup or from Prefs now @@ -792,7 +792,7 @@ bool ExportFFmpeg::EncodeAudioFrame(int16_t *pFrame, int frameSize) int ExportFFmpeg::Export(AudacityProject *project, int channels, const wxString &fName, - bool selectionOnly, double t0, double t1, MixerSpec *mixerSpec, Tags *metadata, int subformat) + bool selectionOnly, double t0, double t1, MixerSpec *mixerSpec, const Tags *metadata, int subformat) { if (!CheckFFmpegPresence()) return false; @@ -873,7 +873,7 @@ void AddStringTagANSI(char field[], int size, wxString value) memcpy(field,value.mb_str(),(int)strlen(value.mb_str()) > size -1 ? size -1 : strlen(value.mb_str())); } -bool ExportFFmpeg::AddTags(Tags *tags) +bool ExportFFmpeg::AddTags(const Tags *tags) { if (tags == NULL) { @@ -891,7 +891,7 @@ bool ExportFFmpeg::AddTags(Tags *tags) return true; } -void ExportFFmpeg::SetMetadata(Tags *tags, const char *name, const wxChar *tag) +void ExportFFmpeg::SetMetadata(const Tags *tags, const char *name, const wxChar *tag) { if (tags->HasTag(tag)) { diff --git a/src/export/ExportFLAC.cpp b/src/export/ExportFLAC.cpp index 3fa6a5a13..e25057443 100644 --- a/src/export/ExportFLAC.cpp +++ b/src/export/ExportFLAC.cpp @@ -190,12 +190,12 @@ public: double t0, double t1, MixerSpec *mixerSpec = NULL, - Tags *metadata = NULL, + const Tags *metadata = NULL, int subformat = 0) override; private: - bool GetMetadata(AudacityProject *project, Tags *tags); + bool GetMetadata(AudacityProject *project, const Tags *tags); FLAC__StreamMetadata *mMetadata; }; @@ -225,7 +225,7 @@ int ExportFLAC::Export(AudacityProject *project, double t0, double t1, MixerSpec *mixerSpec, - Tags *metadata, + const Tags *metadata, int WXUNUSED(subformat)) { double rate = project->GetRate(); @@ -380,7 +380,7 @@ wxWindow *ExportFLAC::OptionsCreate(wxWindow *parent, int format) // expects that array to be valid until the stream is initialized. // // This has been fixed in 1.1.4. -bool ExportFLAC::GetMetadata(AudacityProject *project, Tags *tags) +bool ExportFLAC::GetMetadata(AudacityProject *project, const Tags *tags) { // Retrieve tags if needed if (tags == NULL) diff --git a/src/export/ExportMP2.cpp b/src/export/ExportMP2.cpp index b870225ae..345f14cc2 100644 --- a/src/export/ExportMP2.cpp +++ b/src/export/ExportMP2.cpp @@ -181,12 +181,12 @@ public: double t0, double t1, MixerSpec *mixerSpec = NULL, - Tags *metadata = NULL, + const Tags *metadata = NULL, int subformat = 0) override; private: - int AddTags(AudacityProject *project, char **buffer, bool *endOfFile, Tags *tags); + int AddTags(AudacityProject *project, char **buffer, bool *endOfFile, const Tags *tags); #ifdef USE_LIBID3TAG void AddFrame(struct id3_tag *tp, const wxString & n, const wxString & v, const char *name); #endif @@ -211,7 +211,7 @@ void ExportMP2::Destroy() int ExportMP2::Export(AudacityProject *project, int channels, const wxString &fName, - bool selectionOnly, double t0, double t1, MixerSpec *mixerSpec, Tags *metadata, + bool selectionOnly, double t0, double t1, MixerSpec *mixerSpec, const Tags *metadata, int WXUNUSED(subformat)) { bool stereo = (channels == 2); @@ -339,7 +339,7 @@ wxWindow *ExportMP2::OptionsCreate(wxWindow *parent, int format) } // returns buffer len; caller frees -int ExportMP2::AddTags(AudacityProject * WXUNUSED(project), char **buffer, bool *endOfFile, Tags *tags) +int ExportMP2::AddTags(AudacityProject * WXUNUSED(project), char **buffer, bool *endOfFile, const Tags *tags) { #ifdef USE_LIBID3TAG struct id3_tag *tp = id3_tag_new(); diff --git a/src/export/ExportMP3.cpp b/src/export/ExportMP3.cpp index b2ac3c32b..4aad85f83 100644 --- a/src/export/ExportMP3.cpp +++ b/src/export/ExportMP3.cpp @@ -1569,7 +1569,7 @@ public: double t0, double t1, MixerSpec *mixerSpec = NULL, - Tags *metadata = NULL, + const Tags *metadata = NULL, int subformat = 0) override; private: @@ -1577,7 +1577,7 @@ private: int FindValue(CHOICES *choices, int cnt, int needle, int def); wxString FindName(CHOICES *choices, int cnt, int needle); int AskResample(int bitrate, int rate, int lowrate, int highrate); - int AddTags(AudacityProject *project, char **buffer, bool *endOfFile, Tags *tags); + int AddTags(AudacityProject *project, char **buffer, bool *endOfFile, const Tags *tags); #ifdef USE_LIBID3TAG void AddFrame(struct id3_tag *tp, const wxString & n, const wxString & v, const char *name); #endif @@ -1624,7 +1624,7 @@ int ExportMP3::Export(AudacityProject *project, double t0, double t1, MixerSpec *mixerSpec, - Tags *metadata, + const Tags *metadata, int WXUNUSED(subformat)) { int rate = lrint(project->GetRate()); @@ -1965,7 +1965,7 @@ int ExportMP3::AskResample(int bitrate, int rate, int lowrate, int highrate) } // returns buffer len; caller frees -int ExportMP3::AddTags(AudacityProject *WXUNUSED(project), char **buffer, bool *endOfFile, Tags *tags) +int ExportMP3::AddTags(AudacityProject *WXUNUSED(project), char **buffer, bool *endOfFile, const Tags *tags) { #ifdef USE_LIBID3TAG struct id3_tag *tp = id3_tag_new(); diff --git a/src/export/ExportMultiple.cpp b/src/export/ExportMultiple.cpp index 5d0382eab..7bf7897d2 100644 --- a/src/export/ExportMultiple.cpp +++ b/src/export/ExportMultiple.cpp @@ -911,7 +911,7 @@ int ExportMultiple::DoExport(int channels, bool selectedOnly, double t0, double t1, - Tags tags) + const Tags &tags) { wxLogDebug(wxT("Doing multiple Export: File name \"%s\""), (name.GetFullName()).c_str()); wxLogDebug(wxT("Channels: %i, Start: %lf, End: %lf "), channels, t0, t1); diff --git a/src/export/ExportMultiple.h b/src/export/ExportMultiple.h index 6771a6922..3e3b8bd8b 100644 --- a/src/export/ExportMultiple.h +++ b/src/export/ExportMultiple.h @@ -79,7 +79,7 @@ private: bool selectedOnly, double t0, double t1, - Tags tags); + const Tags &tags); /** \brief Takes an arbitrary text string and converts it to a form that can * be used as a file name, if necessary prompting the user to edit the file * name produced */ diff --git a/src/export/ExportOGG.cpp b/src/export/ExportOGG.cpp index b7f3c885f..f4300b802 100644 --- a/src/export/ExportOGG.cpp +++ b/src/export/ExportOGG.cpp @@ -140,12 +140,12 @@ public: double t0, double t1, MixerSpec *mixerSpec = NULL, - Tags *metadata = NULL, + const Tags *metadata = NULL, int subformat = 0) override; private: - bool FillComment(AudacityProject *project, vorbis_comment *comment, Tags *metadata); + bool FillComment(AudacityProject *project, vorbis_comment *comment, const Tags *metadata); }; ExportOGG::ExportOGG() @@ -171,7 +171,7 @@ int ExportOGG::Export(AudacityProject *project, double t0, double t1, MixerSpec *mixerSpec, - Tags *metadata, + const Tags *metadata, int WXUNUSED(subformat)) { double rate = project->GetRate(); @@ -341,7 +341,7 @@ wxWindow *ExportOGG::OptionsCreate(wxWindow *parent, int format) return safenew ExportOGGOptions(parent, format); } -bool ExportOGG::FillComment(AudacityProject *project, vorbis_comment *comment, Tags *metadata) +bool ExportOGG::FillComment(AudacityProject *project, vorbis_comment *comment, const Tags *metadata) { // Retrieve tags from project if not over-ridden if (metadata == NULL) diff --git a/src/export/ExportPCM.cpp b/src/export/ExportPCM.cpp index 4c57fdfe5..86c822c65 100644 --- a/src/export/ExportPCM.cpp +++ b/src/export/ExportPCM.cpp @@ -320,7 +320,7 @@ public: double t0, double t1, MixerSpec *mixerSpec = NULL, - Tags *metadata = NULL, + const Tags *metadata = NULL, int subformat = 0) override; // optional wxString GetExtension(int index); @@ -329,8 +329,8 @@ public: private: char *AdjustString(const wxString & wxStr, int sf_format); - bool AddStrings(AudacityProject *project, SNDFILE *sf, Tags *tags, int sf_format); - void AddID3Chunk(wxString fName, Tags *tags, int sf_format); + bool AddStrings(AudacityProject *project, SNDFILE *sf, const Tags *tags, int sf_format); + void AddID3Chunk(wxString fName, const Tags *tags, int sf_format); }; @@ -395,7 +395,7 @@ int ExportPCM::Export(AudacityProject *project, double t0, double t1, MixerSpec *mixerSpec, - Tags *metadata, + const Tags *metadata, int subformat) { double rate = project->GetRate(); @@ -664,7 +664,7 @@ char *ExportPCM::AdjustString(const wxString & wxStr, int sf_format) return pDest; } -bool ExportPCM::AddStrings(AudacityProject * WXUNUSED(project), SNDFILE *sf, Tags *tags, int sf_format) +bool ExportPCM::AddStrings(AudacityProject * WXUNUSED(project), SNDFILE *sf, const Tags *tags, int sf_format) { if (tags->HasTag(TAG_TITLE)) { char * ascii7Str = AdjustString(tags->GetTag(TAG_TITLE), sf_format); @@ -741,7 +741,7 @@ bool ExportPCM::AddStrings(AudacityProject * WXUNUSED(project), SNDFILE *sf, Tag return true; } -void ExportPCM::AddID3Chunk(wxString fName, Tags *tags, int sf_format) +void ExportPCM::AddID3Chunk(wxString fName, const Tags *tags, int sf_format) { #ifdef USE_LIBID3TAG struct id3_tag *tp = id3_tag_new();