diff --git a/src/NoteTrack.cpp b/src/NoteTrack.cpp index 22582919f..5e6f97d82 100644 --- a/src/NoteTrack.cpp +++ b/src/NoteTrack.cpp @@ -110,7 +110,6 @@ Track(projDirManager) SetName(GetDefaultName()); mSeq = NULL; - mSerializationBuffer = NULL; mSerializationLength = 0; #ifdef EXPERIMENTAL_MIDI_OUT @@ -125,9 +124,6 @@ Track(projDirManager) NoteTrack::~NoteTrack() { - if (mSerializationBuffer) { - delete [] mSerializationBuffer; - } } Track::Holder NoteTrack::Duplicate() const @@ -143,13 +139,15 @@ Track::Holder NoteTrack::Duplicate() const SonifyBeginSerialize(); assert(!mSerializationBuffer); // serialize from this to duplicate's mSerializationBuffer - mSeq->serialize((void**)&duplicate->mSerializationBuffer, + void *buffer; + mSeq->serialize(&buffer, &duplicate->mSerializationLength); + duplicate->mSerializationBuffer.reset( (char*)buffer ); SonifyEndSerialize(); } else if (mSerializationBuffer) { SonifyBeginUnserialize(); assert(!mSeq); - std::unique_ptr alg_track{ Alg_seq::unserialize(mSerializationBuffer, + std::unique_ptr alg_track{ Alg_seq::unserialize(mSerializationBuffer.get(), mSerializationLength) }; assert(alg_track->get_type() == 's'); duplicate->mSeq.reset(static_cast(alg_track.release())); @@ -198,9 +196,8 @@ void NoteTrack::WarpAndTransposeNotes(double t0, double t1, const auto nt = static_cast(unt.get()); wxASSERT(!mSeq && nt->mSeq && !nt->mSerializationBuffer); // swap mSeq and Buffer between this and nt - nt->mSerializationBuffer = mSerializationBuffer; + nt->mSerializationBuffer = std::move(mSerializationBuffer); nt->mSerializationLength = mSerializationLength; - mSerializationBuffer = NULL; mSerializationLength = 0; mSeq = std::move(nt->mSeq); } diff --git a/src/NoteTrack.h b/src/NoteTrack.h index c51d7ade7..fafdb6dff 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -198,7 +198,7 @@ class AUDACITY_DLL_API NoteTrack final : public Track { // mSeq variable. (TrackArtist should check to make sure this // flip-flop from mSeq to mSerializationBuffer happened an // even number of times, otherwise mSeq will be NULL). - mutable char *mSerializationBuffer; // NULL means no buffer + mutable std::unique_ptr mSerializationBuffer; // NULL means no buffer long mSerializationLength; #ifdef EXPERIMENTAL_MIDI_OUT diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index 6838ae735..e29b0b1f5 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -2829,12 +2829,11 @@ void TrackArtist::DrawNoteTrack(const NoteTrack *track, // JKC: Previously this indirected via seq->, a NULL pointer. // This was actually OK, since unserialize is a static function. // Alg_seq:: is clearer. - std::unique_ptr alg_track{ Alg_seq::unserialize(track->mSerializationBuffer, + std::unique_ptr alg_track{ Alg_seq::unserialize(track->mSerializationBuffer.get(), track->mSerializationLength) }; assert(alg_track->get_type() == 's'); const_cast(track)->mSeq.reset(seq = static_cast(alg_track.release())); - free(track->mSerializationBuffer); - track->mSerializationBuffer = NULL; + track->mSerializationBuffer.reset(); } assert(seq); int visibleChannels = track->mVisibleChannels;