diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp
index f1d74e55a..dda321445 100644
--- a/src/toolbars/ControlToolBar.cpp
+++ b/src/toolbars/ControlToolBar.cpp
@@ -738,6 +738,9 @@ void ControlToolBar::OnKeyEvent(wxKeyEvent & event)
 
 void ControlToolBar::OnPlay(wxCommandEvent & WXUNUSED(evt))
 {
+   auto doubleClicked = mPlay->IsDoubleClicked();
+   mPlay->ClearDoubleClicked();
+
    if (!CanStopAudioStream())
       return;
 
diff --git a/src/toolbars/TranscriptionToolBar.cpp b/src/toolbars/TranscriptionToolBar.cpp
index 0e49a775f..90ed5dc80 100644
--- a/src/toolbars/TranscriptionToolBar.cpp
+++ b/src/toolbars/TranscriptionToolBar.cpp
@@ -474,10 +474,15 @@ void TranscriptionToolBar::PlayAtSpeed(bool looped, bool cutPreview)
 // Come here from button clicks only
 void TranscriptionToolBar::OnPlaySpeed(wxCommandEvent & WXUNUSED(event))
 {
+   auto button = mButtons[TTB_PlaySpeed];
+
+   auto doubleClicked = button->IsDoubleClicked();
+   button->ClearDoubleClicked();
+
    // Let control have precedence over shift
    const bool cutPreview = mButtons[TTB_PlaySpeed]->WasControlDown();
    const bool looped = !cutPreview &&
-      mButtons[TTB_PlaySpeed]->WasShiftDown();
+      button->WasShiftDown();
    PlayAtSpeed(looped, cutPreview);
 }
 
diff --git a/src/widgets/AButton.cpp b/src/widgets/AButton.cpp
index 58c336771..6d1b4d5ee 100644
--- a/src/widgets/AButton.cpp
+++ b/src/widgets/AButton.cpp
@@ -407,6 +407,8 @@ void AButton::OnMouseEvent(wxMouseEvent & event)
    if (mEnabled && event.IsButton()) {
       if (event.ButtonIsDown(wxMOUSE_BTN_ANY)) {
          mIsClicking = true;
+         if (event.ButtonDClick())
+            mIsDoubleClicked = true;
          if( !HasCapture() )
             CaptureMouse();
       }
diff --git a/src/widgets/AButton.h b/src/widgets/AButton.h
index bf06bd5ff..6858e7df8 100644
--- a/src/widgets/AButton.h
+++ b/src/widgets/AButton.h
@@ -109,6 +109,11 @@ class AButton final : public wxWindow {
    bool WasControlDown(); // returns true if control was held down
                                   // the last time the button was clicked
    bool IsDown(){ return mButtonIsDown;}
+
+   // Double click is detected, but not automatically cleared.
+   bool IsDoubleClicked() const { return mIsDoubleClicked; }
+   void ClearDoubleClicked() { mIsDoubleClicked = false; }
+
    void SetButtonToggles( bool toggler ){ mToggle = toggler;}
    void Toggle(){ mButtonIsDown ? PopUp() : PushDown();}
    void Click();
@@ -157,6 +162,7 @@ class AButton final : public wxWindow {
    bool mIsClicking;
    bool mEnabled;
    bool mUseDisabledAsDownHiliteImage;
+   bool mIsDoubleClicked {};
 
    struct ImageArr { ImageRoll mArr[4]; };
    std::vector<ImageArr> mImages;