From b47bcb548e7866c1a44a4600ffbeff0ae0445516 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 5 Aug 2016 00:39:13 -0400 Subject: [PATCH] Remove some naked new amd delete in: AudioIO --- src/AudacityApp.cpp | 2 -- src/AudioIO.cpp | 54 +++++++++++++++++---------------------------- src/AudioIO.h | 11 +++++---- 3 files changed, 25 insertions(+), 42 deletions(-) diff --git a/src/AudacityApp.cpp b/src/AudacityApp.cpp index 3651b8e65..176196fc4 100644 --- a/src/AudacityApp.cpp +++ b/src/AudacityApp.cpp @@ -2017,8 +2017,6 @@ int AudacityApp::OnExit() DeinitFFT(); - DeinitAudioIO(); - // Terminate the PluginManager (must be done before deleting the locale) PluginManager::Get().Terminate(); diff --git a/src/AudioIO.cpp b/src/AudioIO.cpp index f51d38f4b..d1d46329d 100644 --- a/src/AudioIO.cpp +++ b/src/AudioIO.cpp @@ -326,7 +326,8 @@ writing audio. using std::max; using std::min; -AudioIO *gAudioIO; +std::unique_ptr ugAudioIO; +AudioIO *gAudioIO{}; DEFINE_EVENT_TYPE(EVT_AUDIOIO_PLAYBACK); DEFINE_EVENT_TYPE(EVT_AUDIOIO_CAPTURE); @@ -913,7 +914,8 @@ class MidiThread final : public AudioThread { void InitAudioIO() { - gAudioIO = new AudioIO(); + ugAudioIO.reset(safenew AudioIO()); + gAudioIO = ugAudioIO.get(); gAudioIO->mThread->Run(); #ifdef EXPERIMENTAL_MIDI_OUT gAudioIO->mMidiThread->Run(); @@ -941,11 +943,6 @@ void InitAudioIO() gPrefs->Flush(); } -void DeinitAudioIO() -{ - delete gAudioIO; -} - wxString DeviceName(const PaDeviceInfo* info) { wxString infoName = wxSafeConvertMB2WX(info->name); @@ -1046,12 +1043,12 @@ AudioIO::AudioIO() // Same logic for PortMidi as described above for PortAudio } - mMidiThread = new MidiThread(); + mMidiThread = std::make_unique(); mMidiThread->Create(); #endif // Start thread - mThread = new AudioThread(); + mThread = std::make_unique(); mThread->Create(); #if defined(USE_PORTMIXER) @@ -1092,8 +1089,12 @@ AudioIO::~AudioIO() #ifdef EXPERIMENTAL_MIDI_OUT Pm_Terminate(); + + /* Delete is a "graceful" way to stop the thread. + (Kill is the not-graceful way.) */ + mMidiThread->Delete(); - delete mMidiThread; + mMidiThread.reset(); #endif /* Delete is a "graceful" way to stop the thread. @@ -1103,13 +1104,9 @@ AudioIO::~AudioIO() // wxTheApp->Yield(); mThread->Delete(); + mThread.reset(); - delete mThread; - -#ifdef EXPERIMENTAL_SCRUBBING_SUPPORT - delete mScrubQueue; -#endif - + gAudioIO = nullptr; } void AudioIO::SetMixer(int inputSource) @@ -1974,19 +1971,18 @@ int AudioIO::StartStream(const WaveTrackArray &playbackTracks, } #ifdef EXPERIMENTAL_SCRUBBING_SUPPORT - delete mScrubQueue; if (scrubbing) { const auto &scrubOptions = *options.pScrubbingOptions; mScrubQueue = - new ScrubQueue(mT0, mT1, scrubOptions.startClockTimeMillis, + std::make_unique(mT0, mT1, scrubOptions.startClockTimeMillis, sampleRate, 2 * scrubOptions.minStutter, scrubOptions); mScrubDuration = 0; mSilentScrub = false; } else - mScrubQueue = NULL; + mScrubQueue.reset(); #endif // We signal the audio thread to call FillBuffers, to prime the RingBuffers @@ -2117,11 +2113,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers) } #ifdef EXPERIMENTAL_SCRUBBING_SUPPORT - if (mScrubQueue) - { - delete mScrubQueue; - mScrubQueue = 0; - } + mScrubQueue.reset(); #endif @@ -2146,7 +2138,7 @@ void AudioIO::PrepareMidiIterator(bool send, double offset) int nTracks = mMidiPlaybackTracks.size(); // instead of initializing with an Alg_seq, we use begin_seq() // below to add ALL Alg_seq's. - mIterator = new Alg_iterator(NULL, false); + mIterator = std::make_unique(nullptr, false); // Iterator not yet intialized, must add each track... for (i = 0; i < nTracks; i++) { NoteTrack *t = mMidiPlaybackTracks[i]; @@ -2405,8 +2397,7 @@ void AudioIO::StopStream() seq->set_in_use(false); } - delete mIterator; - mIterator = NULL; // just in case someone tries to reference it + mIterator.reset(); // just in case someone tries to reference it mMidiPlaySpeed = 1.0; } #endif @@ -2546,11 +2537,7 @@ void AudioIO::StopStream() mNumPlaybackChannels = 0; #ifdef EXPERIMENTAL_SCRUBBING_SUPPORT - if (mScrubQueue) - { - delete mScrubQueue; - mScrubQueue = 0; - } + mScrubQueue.reset(); #endif if (mListener) { @@ -3858,8 +3845,7 @@ void AudioIO::GetNextEvent() mNextEventTime = mT1 + mMidiLoopOffset - ALG_EPS; mNextIsNoteOn = true; // do not look at duration mIterator->end(); - delete mIterator; - mIterator = NULL; // debugging aid + mIterator.reset(); // debugging aid } } diff --git a/src/AudioIO.h b/src/AudioIO.h index 6f6564077..91a166557 100644 --- a/src/AudioIO.h +++ b/src/AudioIO.h @@ -17,6 +17,7 @@ #include "Audacity.h" #include "Experimental.h" +#include "MemoryX.h" #include #ifdef USE_MIDI @@ -61,7 +62,6 @@ using WaveTrackArray = std::vector < WaveTrack* >; extern AUDACITY_DLL_API AudioIO *gAudioIO; void InitAudioIO(); -void DeinitAudioIO(); wxString DeviceName(const PaDeviceInfo* info); wxString HostName(const PaDeviceInfo* info); bool ValidateDeviceNames(); @@ -515,7 +515,7 @@ private: // begins. Alg_seq_ptr mSeq; - Alg_iterator_ptr mIterator; + std::unique_ptr mIterator; Alg_event_ptr mNextEvent; // the next event to play (or null) double mNextEventTime; // the time of the next event // (note that this could be a note's time+duration) @@ -548,9 +548,9 @@ private: unsigned short mAILALastChangeType; //0 - no change, 1 - increase change, 2 - decrease change #endif - AudioThread *mThread; + std::unique_ptr mThread; #ifdef EXPERIMENTAL_MIDI_OUT - AudioThread *mMidiThread; + std::unique_ptr mMidiThread; #endif Resample **mResample; RingBuffer **mCaptureBuffers; @@ -638,7 +638,6 @@ private: #endif friend void InitAudioIO(); - friend void DeinitAudioIO(); TimeTrack *mTimeTrack; @@ -685,7 +684,7 @@ private: #ifdef EXPERIMENTAL_SCRUBBING_SUPPORT struct ScrubQueue; - ScrubQueue *mScrubQueue; + std::unique_ptr mScrubQueue; bool mSilentScrub; long mScrubDuration;