diff --git a/src/effects/EffectUI.cpp b/src/effects/EffectUI.cpp
index 68d90349aff5821408546a571c2099019f075f24..fa71dc69a0b8833a4bc9c00d302cd94c3b7a09d7 100644
--- a/src/effects/EffectUI.cpp
+++ b/src/effects/EffectUI.cpp
@@ -501,6 +501,9 @@ void EffectUIHost::OnPaint(wxPaintEvent & WXUNUSED(evt))
 
 void EffectUIHost::OnClose(wxCloseEvent & WXUNUSED(evt))
 {
+   if (mPlaying)
+      StopPlayback();
+
    DoCancel();
    CleanupRealtime();
 
@@ -530,6 +533,9 @@ void EffectUIHost::OnApply(wxCommandEvent & evt)
    {
       return;
    }
+
+   if (mPlaying)
+      StopPlayback();
    
    // Honor the "select all if none" preference...a little hackish, but whatcha gonna do...
    if (!mIsBatch &&
@@ -735,10 +741,7 @@ void EffectUIHost::OnPlay(wxCommandEvent & WXUNUSED(evt))
    
    if (mPlaying)
    {
-      auto gAudioIO = AudioIO::Get();
-      mPlayPos = gAudioIO->GetStreamTime();
-      auto &projectAudioManager = ProjectAudioManager::Get( mProject );
-      projectAudioManager.Stop();
+      StopPlayback();
    }
    else
    {
@@ -1160,6 +1163,17 @@ void EffectUIHost::CleanupRealtime()
    }
 }
 
+void EffectUIHost::StopPlayback()
+{
+   if (!mPlaying)
+      return;
+   
+   auto gAudioIO = AudioIO::Get();
+   mPlayPos = gAudioIO->GetStreamTime();
+   auto& projectAudioManager = ProjectAudioManager::Get(mProject);
+   projectAudioManager.Stop();
+}
+
 DialogFactoryResults EffectUI::DialogFactory(wxWindow &parent,
    EffectPlugin &host, EffectUIClientInterface &client,
    EffectSettingsAccess &access)
diff --git a/src/effects/EffectUI.h b/src/effects/EffectUI.h
index 09463bbdd4070e7649670082477939d77e34a1a7..74968d961ca288e2125903ed38a0a7fd5731611d 100644
--- a/src/effects/EffectUI.h
+++ b/src/effects/EffectUI.h
@@ -110,6 +110,8 @@ private:
 
    void CleanupRealtime();
 
+   void StopPlayback();
+
 private:
    Observer::Subscription mAudioIOSubscription, mEffectStateSubscription;