1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-15 15:49:36 +02:00

Changes to the Effect dialog based on QA suggestions

Solves the problem of what the "Settings" button should say
by converting it to a bitmap button.

Adds the missing "bypass effect" button.

The Ok/Cancel buttons are now Apply/Close buttons and the
dialog stays open after the apply is done.

Record is no longer disabled when an RTP effect is open as
the RTP effect now monitors when recording starts and disables
its buttons as needed.

Added "Play", "Skip forward", and "Skip backward" buttons.
While the other stuff is required, this last one is in to
get a feel for its usefulness.  We'll need to get feedback
on it pretty quickly so we can rip it out if need be.
This commit is contained in:
lllucius 2014-12-02 08:55:02 +00:00
parent 60605e6507
commit 4d76e14794
12 changed files with 410 additions and 33 deletions

View File

@ -88,7 +88,6 @@ enum
IsNotSyncLockedFlag = 0x04000000, //awd
IsSyncLockedFlag = 0x08000000, //awd
IsRealtimeNotActiveFlag= 0x10000000, //lll
IsNotRecordingFlag = 0x20000000, //lll
NoFlagsSpecifed = 0xffffffff
};

View File

@ -326,6 +326,9 @@ using std::min;
AudioIO *gAudioIO;
DEFINE_EVENT_TYPE(EVT_AUDIOIO_PLAYBACK);
DEFINE_EVENT_TYPE(EVT_AUDIOIO_CAPTURE);
// static
int AudioIO::mNextStreamToken = 0;
int AudioIO::mCachedPlaybackIndex = -1;
@ -1419,6 +1422,20 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
}
}
if (mNumPlaybackChannels > 0)
{
wxCommandEvent e(EVT_AUDIOIO_PLAYBACK);
e.SetInt(true);
wxTheApp->ProcessEvent(e);
}
if (mNumCaptureChannels > 0)
{
wxCommandEvent e(EVT_AUDIOIO_CAPTURE);
e.SetInt(true);
wxTheApp->ProcessEvent(e);
}
mAudioThreadFillBuffersLoopRunning = true;
#ifdef EXPERIMENTAL_MIDI_OUT
// If audio is not running, mNumFrames will not be incremented and
@ -1685,6 +1702,20 @@ void AudioIO::StopStream()
mPortStreamV19 = NULL;
}
if (mNumPlaybackChannels > 0)
{
wxCommandEvent e(EVT_AUDIOIO_PLAYBACK);
e.SetInt(false);
wxTheApp->ProcessEvent(e);
}
if (mNumCaptureChannels > 0)
{
wxCommandEvent e(EVT_AUDIOIO_CAPTURE);
e.SetInt(false);
wxTheApp->ProcessEvent(e);
}
#ifdef EXPERIMENTAL_MIDI_OUT
/* Stop Midi playback */

View File

@ -70,6 +70,9 @@ class AudioIOListener;
#define AILA_DEF_NUMBER_ANALYSIS 5
#endif
DECLARE_EXPORTED_EVENT_TYPE(AUDACITY_DLL_API, EVT_AUDIOIO_PLAYBACK, -1);
DECLARE_EXPORTED_EVENT_TYPE(AUDACITY_DLL_API, EVT_AUDIOIO_CAPTURE, -1);
class AUDACITY_DLL_API AudioIO {
public:

View File

@ -808,15 +808,9 @@ void AudacityProject::CreateMenusAndCommands()
c->AddSeparator();
/* i18n-hint: (verb)*/
c->AddItem(wxT("Record"), _("&Record"), FN(OnRecord), wxT("R"),
AudioIONotBusyFlag | IsRealtimeNotActiveFlag,
AlwaysEnabledFlag | IsRealtimeNotActiveFlag);
c->AddItem(wxT("TimerRecord"), _("&Timer Record..."), FN(OnTimerRecord), wxT("Shift+T"),
AudioIONotBusyFlag | IsRealtimeNotActiveFlag,
AlwaysEnabledFlag | IsRealtimeNotActiveFlag);
c->AddItem(wxT("RecordAppend"), _("Appen&d Record"), FN(OnRecordAppend), wxT("Shift+R"),
AudioIONotBusyFlag | IsRealtimeNotActiveFlag,
AlwaysEnabledFlag | IsRealtimeNotActiveFlag);
c->AddItem(wxT("Record"), _("&Record"), FN(OnRecord), wxT("R"));
c->AddItem(wxT("TimerRecord"), _("&Timer Record..."), FN(OnTimerRecord), wxT("Shift+T"));
c->AddItem(wxT("RecordAppend"), _("Appen&d Record"), FN(OnRecordAppend), wxT("Shift+R"));
c->AddSeparator();
@ -1047,7 +1041,7 @@ void AudacityProject::CreateMenusAndCommands()
PopulateEffectsMenu(c,
EffectTypeProcess,
AudioIONotBusyFlag | TimeSelectedFlag | WaveTracksSelectedFlag,
TracksExistFlag | IsRealtimeNotActiveFlag | IsNotRecordingFlag);
TracksExistFlag | IsRealtimeNotActiveFlag);
#else
int flags = PROCESS_EFFECT | BUILTIN_EFFECT | PLUGIN_EFFECT | ADVANCED_EFFECT;
// The categories form a DAG, so we start at the roots (the categories
@ -1094,7 +1088,7 @@ void AudacityProject::CreateMenusAndCommands()
PopulateEffectsMenu(c,
EffectTypeAnalyze,
AudioIONotBusyFlag | TimeSelectedFlag | WaveTracksSelectedFlag,
TracksExistFlag | IsRealtimeNotActiveFlag | IsNotRecordingFlag);
TracksExistFlag | IsRealtimeNotActiveFlag);
#else
flags = ANALYZE_EFFECT | BUILTIN_EFFECT | PLUGIN_EFFECT;
@ -1789,9 +1783,6 @@ wxUint32 AudacityProject::GetUpdateFlags()
else
flags |= AudioIOBusyFlag;
if (!GetControlToolBar()->IsRecordDown())
flags |= IsNotRecordingFlag;
if (!mViewInfo.selectedRegion.isPoint())
flags |= TimeSelectedFlag;

View File

@ -2127,7 +2127,7 @@ AttachableScrollBar * ShuttleGui::AddAttachableScrollBar( long style )
return pAttachableScrollBar;
}
wxSizer *CreateStdButtonSizer(wxWindow *parent, long buttons, wxButton *extra)
wxSizer *CreateStdButtonSizer(wxWindow *parent, long buttons, wxWindow *extra)
{
wxButton *b = new wxButton( parent, 0, wxEmptyString );
int margin;
@ -2173,9 +2173,15 @@ wxSizer *CreateStdButtonSizer(wxWindow *parent, long buttons, wxButton *extra)
if( buttons & eApplyButton )
{
b = new wxButton( parent, wxID_APPLY );
b->SetDefault();
bs->AddButton( b );
}
if( buttons & eCloseButton )
{
bs->AddButton( new wxButton( parent, wxID_CANCEL, _("&Close") ) );
}
if( buttons & eHelpButton )
{
bs->AddButton( new wxButton( parent, wxID_HELP ) );

View File

@ -337,6 +337,7 @@ enum
eSettingsButton= 0x0080,
ePreviewDryButton = 0x0100,
eApplyButton = 0x0200,
eCloseButton = 0x0400,
};
enum
@ -344,12 +345,13 @@ enum
ePreviewID = wxID_LOWEST - 1,
eDebugID = wxID_LOWEST - 2,
eSettingsID = wxID_LOWEST - 3,
ePreviewDryID = wxID_LOWEST - 4
ePreviewDryID = wxID_LOWEST - 4,
eCloseID = wxID_CANCEL
};
AUDACITY_DLL_API wxSizer *CreateStdButtonSizer( wxWindow *parent,
long buttons = eOkButton | eCancelButton,
wxButton *extra = NULL );
wxWindow *extra = NULL );
// ShuttleGui extends ShuttleGuiBase with Audacity specific extensions.
class AUDACITY_DLL_API ShuttleGui : public ShuttleGuiBase

View File

@ -28,6 +28,7 @@ greater use in future.
#include <wx/msgdlg.h>
#include <wx/sizer.h>
#include <wx/timer.h>
#include <wx/tglbtn.h>
#include <wx/hashmap.h>
#include "audacity/ConfigInterface.h"
@ -38,6 +39,7 @@ greater use in future.
#include "../Prefs.h"
#include "../Project.h"
#include "../WaveTrack.h"
#include "../widgets/AButton.h"
#include "../widgets/ProgressDialog.h"
#include "../ondemand/ODManager.h"
#include "TimeWarper.h"
@ -2002,6 +2004,15 @@ enum
kDefaultsID = 30004,
kOptionsID = 30005,
kDeleteAllID = 30006,
#if defined(TRY_BUTTONS)
kMenuID = 30100,
kBypassID = 30101,
kPlayID = 30102,
kRewindID = 30103,
kFFwdID = 30104,
kPlaybackID = 30105,
kCaptureID = 30106,
#endif
kUserPresetsID = 31000,
kDeletePresetID = 32000,
kFactoryPresetsID = 33000,
@ -2009,10 +2020,17 @@ enum
BEGIN_EVENT_TABLE(EffectUIHost, wxDialog)
EVT_CLOSE(EffectUIHost::OnClose)
EVT_BUTTON(wxID_OK, EffectUIHost::OnOk)
EVT_BUTTON(wxID_APPLY, EffectUIHost::OnApply)
EVT_BUTTON(wxID_CANCEL, EffectUIHost::OnCancel)
EVT_BUTTON(ePreviewID, EffectUIHost::OnPreview)
EVT_BUTTON(eSettingsID, EffectUIHost::OnSettings)
#if defined(TRY_BUTTONS)
EVT_BUTTON(kMenuID, EffectUIHost::OnMenu)
EVT_BUTTON(kBypassID, EffectUIHost::OnBypass)
EVT_BUTTON(kPlayID, EffectUIHost::OnPlay)
EVT_BUTTON(kRewindID, EffectUIHost::OnRewind)
EVT_BUTTON(kFFwdID, EffectUIHost::OnFFwd)
#endif
EVT_MENU(kSaveAsID, EffectUIHost::OnSaveAs)
EVT_MENU(kImportID, EffectUIHost::OnImport)
EVT_MENU(kExportID, EffectUIHost::OnExport)
@ -2055,6 +2073,42 @@ EffectUIHost::~EffectUIHost()
}
}
#define TRY_BUTTONS 1
#if defined(TRY_BUTTONS)
#include "../../images/Effect.h"
wxBitmap EffectUIHost::CreateBitmap(const char *xpm[], bool up, bool pusher)
{
wxMemoryDC dc;
wxBitmap pic(xpm);
wxBitmap mod(pic.GetWidth() + 6, pic.GetHeight() + 6);
dc.SelectObject(mod);
#if defined( __WXGTK__ )
wxColour newColour = wxSystemSettings::GetColour( wxSYS_COLOUR_BACKGROUND );
#else
wxColour newColour = wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE );
#endif
dc.SetBackground(wxBrush(newColour));
dc.Clear();
int offset = 3;
if (pusher)
{
if (!up)
{
offset += 1;
}
}
dc.DrawBitmap(pic, offset, offset, true);
dc.SelectObject(wxNullBitmap);
return mod;
}
#endif
// ============================================================================
// EffectUIHost implementation
// ============================================================================
@ -2072,7 +2126,74 @@ bool EffectUIHost::Initialize()
w->SetScrollRate(0, 20);
wxSizer *s = CreateStdButtonSizer(this, eSettingsButton | eOkButton | eCancelButton);
#if defined(TRY_BUTTONS)
mPlaying = gAudioIO->IsStreamActive(); // not exactly right, but will suffice
mCapturing = gAudioIO->IsStreamActive() && gAudioIO->GetNumCaptureChannels() > 0;
wxPanel *bar = new wxPanel(this, wxID_ANY);
wxBoxSizer *bs = new wxBoxSizer(wxHORIZONTAL);
bar->SetSizer(bs);
mMenuBtn = new wxBitmapButton(bar, kMenuID, CreateBitmap(effect_menu_xpm, true, false));
mMenuBtn->SetToolTip(_("Mannage effect"));
bs->Add(mMenuBtn);
mOnBM = CreateBitmap(effect_on_xpm, true, false);
mOffBM = CreateBitmap(effect_off_xpm, true, false);
mBypassBtn = new wxBitmapButton(bar, kBypassID, mOnBM);
mBypassBtn->SetToolTip(_("Bypass effect"));
mOnToggle = true;
bs->Add(mBypassBtn);
bs->Add(5, 5);
mPlayBM = CreateBitmap(effect_play_xpm, true, false);
mPlayDisabledBM = CreateBitmap(effect_play_disabled_xpm, true, false);
mStopBM = CreateBitmap(effect_stop_xpm, true, false);
mStopDisabledBM = CreateBitmap(effect_stop_disabled_xpm, true, false);
mPlayBtn = new wxBitmapButton(bar, kPlayID, mPlayBM);
mPlayBtn->SetBitmapDisabled(mPlayDisabledBM);
mPlayBtn->SetToolTip(_("Play/Stop"));
mPlayToggle = true;
bs->Add(mPlayBtn);
mRewindBtn = new wxBitmapButton(bar, kRewindID, CreateBitmap(effect_rewind_xpm, true, true));
mRewindBtn->SetBitmapDisabled(CreateBitmap(effect_rewind_disabled_xpm, true, true));
mRewindBtn->SetToolTip(_("Skip backward"));
bs->Add(mRewindBtn);
mFFwdBtn = new wxBitmapButton(bar, kFFwdID, CreateBitmap(effect_ffwd_xpm, true, true));
mFFwdBtn->SetBitmapDisabled(CreateBitmap(effect_ffwd_disabled_xpm, true, true));
mFFwdBtn->SetToolTip(_("Skip forward"));
bs->Add(mFFwdBtn);
#if defined(__WXMAC__)
mMenuBtn->SetName(_("Manage effect"));
mBypassBtn->SetName(_("Bypass effect"));
mPlayBtn->SetName(_("Play/Stop"));
mRewindBtn->SetName(_("Skip backward"));
mFFwdBtn->SetName(_("Skip forward"));
#else
mMenuBtn->SetLabel(_("Manage effect"));
mBypassBtn->SetLabel(_("Bypass effect"));
mPlayBtn->SetLabel(_("Play/Stop"));
mRewindBtn->SetLabel(_("Skip backward"));
mFFwdBtn->SetLabel(_("Skip forward"));
#endif
bar->SetSizerAndFit(bs);
wxSizer *s = CreateStdButtonSizer(this, eApplyButton | eCloseButton, bar);
mApplyBtn = (wxButton *) FindWindowById(wxID_APPLY);
mCloseBtn = (wxButton *) FindWindowById(wxID_CANCEL);
UpdateControls();
#else
wxSizer *s = CreateStdButtonSizer(this, eSettingsButton | eApplyButton | eCloseButton);
#endif
hs->Add(w, 1, wxEXPAND);
vs->Add(hs, 1, wxEXPAND);
@ -2089,9 +2210,9 @@ bool EffectUIHost::Initialize()
Center();
#if defined(__WXMAC__)
(w->GetChildren().GetCount() > 2 ? w : FindWindowById(wxID_OK))->SetFocus();
(w->GetChildren().GetCount() > 2 ? w : FindWindowById(wxID_APPLY))->SetFocus();
#else
(w->GetChildren().GetCount() > 1 ? w : FindWindowById(wxID_OK))->SetFocus();
(w->GetChildren().GetCount() > 1 ? w : FindWindowById(wxID_APPLY))->SetFocus();
#endif
LoadUserPresets();
@ -2106,6 +2227,18 @@ bool EffectUIHost::Initialize()
EffectManager::Get().RealtimeAddEffect(mEffect);
#if defined(TRY_BUTTONS)
wxTheApp->Connect(EVT_AUDIOIO_PLAYBACK,
wxCommandEventHandler(EffectUIHost::OnPlayback),
NULL,
this);
wxTheApp->Connect(EVT_AUDIOIO_CAPTURE,
wxCommandEventHandler(EffectUIHost::OnCapture),
NULL,
this);
#endif
mInitialized = true;
return true;
@ -2115,9 +2248,22 @@ void EffectUIHost::OnClose(wxCloseEvent & WXUNUSED(evt))
{
if (mInitialized)
{
mInitialized = false;
#if defined(TRY_BUTTONS)
wxTheApp->Disconnect(EVT_AUDIOIO_PLAYBACK,
wxCommandEventHandler(EffectUIHost::OnPlayback),
NULL,
this);
wxTheApp->Disconnect(EVT_AUDIOIO_CAPTURE,
wxCommandEventHandler(EffectUIHost::OnCapture),
NULL,
this);
#endif
EffectManager::Get().RealtimeRemoveEffect(mEffect);
mEffect->RealtimeFinalize();
mInitialized = false;
}
Hide();
@ -2128,7 +2274,7 @@ void EffectUIHost::OnClose(wxCloseEvent & WXUNUSED(evt))
Destroy();
}
void EffectUIHost::OnOk(wxCommandEvent & WXUNUSED(evt))
void EffectUIHost::OnApply(wxCommandEvent & WXUNUSED(evt))
{
if (!mClient->ValidateUI())
{
@ -2139,9 +2285,9 @@ void EffectUIHost::OnOk(wxCommandEvent & WXUNUSED(evt))
if (mInitialized)
{
mInitialized = false;
EffectManager::Get().RealtimeRemoveEffect(mEffect);
mEffect->RealtimeFinalize();
mInitialized = false;
}
if (IsModal())
@ -2158,6 +2304,7 @@ void EffectUIHost::OnOk(wxCommandEvent & WXUNUSED(evt))
mEffect->Apply();
#if defined(CLOSE_ON_APPLY)
if (!mClient->HideUI())
{
return;
@ -2166,6 +2313,7 @@ void EffectUIHost::OnOk(wxCommandEvent & WXUNUSED(evt))
Hide();
Close();
#endif
return;
}
@ -2174,9 +2322,22 @@ void EffectUIHost::OnCancel(wxCommandEvent & WXUNUSED(evt))
{
if (mInitialized)
{
mInitialized = false;
#if defined(TRY_BUTTONS)
wxTheApp->Disconnect(EVT_AUDIOIO_PLAYBACK,
wxCommandEventHandler(EffectUIHost::OnPlayback),
NULL,
this);
wxTheApp->Disconnect(EVT_AUDIOIO_CAPTURE,
wxCommandEventHandler(EffectUIHost::OnCapture),
NULL,
this);
#endif
EffectManager::Get().RealtimeRemoveEffect(mEffect);
mEffect->RealtimeFinalize();
mInitialized = false;
}
if (IsModal())
@ -2204,6 +2365,151 @@ void EffectUIHost::OnPreview(wxCommandEvent & WXUNUSED(evt))
mEffect->Preview();
}
#if defined(TRY_BUTTONS)
void EffectUIHost::OnMenu(wxCommandEvent & evt)
{
wxBitmapButton *b = (wxBitmapButton *)evt.GetEventObject();
wxMenu *menu = new wxMenu();
wxMenu *sub;
LoadUserPresets();
sub = new wxMenu();
for (size_t i = 0, cnt = mUserPresets.GetCount(); i < cnt; i++)
{
sub->Append(kUserPresetsID + i, mUserPresets[i]);
}
menu->Append(0, _("User Presets"), sub);
wxArrayString factory = mClient->GetFactoryPresets();
sub = new wxMenu();
sub->Append(kDefaultsID, _("Defaults"));
if (factory.GetCount() > 0)
{
sub->AppendSeparator();
for (size_t i = 0, cnt = factory.GetCount(); i < cnt; i++)
{
wxString label = factory[i];
if (label.IsEmpty())
{
label = _("None");
}
sub->Append(kFactoryPresetsID + i, label);
}
}
menu->Append(0, _("Factory Presets"), sub);
sub = new wxMenu();
for (size_t i = 0, cnt = mUserPresets.GetCount(); i < cnt; i++)
{
sub->Append(kDeletePresetID + i, mUserPresets[i]);
}
menu->Append(0, _("Delete Preset"), sub);
menu->AppendSeparator();
menu->Append(kSaveAsID, _("Save As..."));
menu->AppendSeparator();
menu->Append(kImportID, _("Import..."));
menu->Append(kExportID, _("Export..."));
menu->AppendSeparator();
menu->Append(kOptionsID, _("Options..."));
menu->AppendSeparator();
sub = new wxMenu();
sub->Append(kDummyID, wxString::Format(_("Type: %s"), mEffect->GetFamily().c_str()));
sub->Append(kDummyID, wxString::Format(_("Name: %s"), mEffect->GetName().c_str()));
sub->Append(kDummyID, wxString::Format(_("Version: %s"), mEffect->GetVersion().c_str()));
sub->Append(kDummyID, wxString::Format(_("Vendor: %s"), mEffect->GetVendor().c_str()));
sub->Append(kDummyID, wxString::Format(_("Description: %s"), mEffect->GetDescription().c_str()));
// sub->Append(kDummyID, wxString::Format(_("Audio In: %d"), mEffect->GetAudioInCount()));
// sub->Append(kDummyID, wxString::Format(_("Audio Out: %d"), mEffect->GetAudioOutCount()));
menu->Append(0, _("About"), sub);
wxRect r = b->GetParent()->GetRect();
PopupMenu(menu, wxPoint(r.GetLeft(), r.GetBottom()));
delete menu;
}
void EffectUIHost::OnBypass(wxCommandEvent & WXUNUSED(evt))
{
EffectManager & em = EffectManager::Get();
if (em.RealtimeIsSuspended())
{
em.RealtimeResume();
}
else
{
em.RealtimeSuspend();
}
UpdateControls();
}
void EffectUIHost::OnPlay(wxCommandEvent & WXUNUSED(evt))
{
if (mPlayToggle)
{
mPlayToggle = false;
GetActiveProject()->OnPlayStop();
}
else
{
mPlayToggle = true;
GetActiveProject()->OnPlayStop();
}
}
void EffectUIHost::OnRewind(wxCommandEvent & WXUNUSED(evt))
{
GetActiveProject()->OnSeekLeftShort();
}
void EffectUIHost::OnFFwd(wxCommandEvent & WXUNUSED(evt))
{
GetActiveProject()->OnSeekRightShort();
}
void EffectUIHost::OnPlayback(wxCommandEvent & evt)
{
mPlaying = evt.GetInt() != 0;
UpdateControls();
}
void EffectUIHost::OnCapture(wxCommandEvent & evt)
{
mCapturing = evt.GetInt() != 0;
mCloseBtn->SetFocus();
UpdateControls();
}
void EffectUIHost::UpdateControls()
{
mApplyBtn->Enable(!mCapturing);
mBypassBtn->Enable(!mCapturing);
mPlayBtn->Enable(!mCapturing);
mRewindBtn->Enable(!mCapturing);
mFFwdBtn->Enable(!mCapturing);
mOnToggle = !EffectManager::Get().RealtimeIsSuspended();
if (mOnToggle && mCapturing)
{
mOnToggle = false;
EffectManager::Get().RealtimeSuspend();
}
mPlayBtn->SetBitmapLabel(mPlaying ? mStopBM : mPlayBM);
mPlayBtn->SetBitmapDisabled(mPlaying ? mStopDisabledBM: mPlayDisabledBM);
mBypassBtn->SetBitmapLabel(mOnToggle ? mOnBM : mOffBM);
}
#endif
void EffectUIHost::OnSettings(wxCommandEvent & evt)
{
wxButton *b = (wxButton *)evt.GetEventObject();

View File

@ -12,8 +12,11 @@
#ifndef __AUDACITY_EFFECT__
#define __AUDACITY_EFFECT__
#define TRY_BUTTONS 1
#include <set>
#include <wx/bmpbuttn.h>
#include <wx/dynarray.h>
#include <wx/intl.h>
#include <wx/string.h>
@ -485,8 +488,20 @@ public:
bool Initialize();
private:
#if defined(TRY_BUTTONS)
void OnMenu(wxCommandEvent & evt);
void OnBypass(wxCommandEvent & evt);
void OnPlay(wxCommandEvent & evt);
void OnRewind(wxCommandEvent & evt);
void OnFFwd(wxCommandEvent & evt);
void OnPlayback(wxCommandEvent & evt);
void OnCapture(wxCommandEvent & evt);
void UpdateControls();
wxBitmap CreateBitmap(const char *xpm[], bool up, bool pusher);
#endif
void OnClose(wxCloseEvent & evt);
void OnOk(wxCommandEvent & evt);
void OnApply(wxCommandEvent & evt);
void OnCancel(wxCommandEvent & evt);
void OnPreview(wxCommandEvent & evt);
void OnSettings(wxCommandEvent & evt);
@ -510,6 +525,29 @@ private:
wxArrayString mUserPresets;
bool mInitialized;
#if defined(TRY_BUTTONS)
wxButton *mApplyBtn;
wxButton *mCloseBtn;
wxBitmapButton *mMenuBtn;
wxBitmapButton *mBypassBtn;
wxBitmapButton *mPlayBtn;
wxBitmapButton *mRewindBtn;
wxBitmapButton *mFFwdBtn;
bool mPlayToggle;
wxBitmap mPlayBM;
wxBitmap mPlayDisabledBM;
wxBitmap mStopBM;
wxBitmap mStopDisabledBM;
bool mOnToggle;
wxBitmap mOnBM;
wxBitmap mOffBM;
bool mPlaying;
bool mCapturing;
#endif
DECLARE_EVENT_TABLE();
};

View File

@ -492,6 +492,11 @@ bool EffectManager::RealtimeIsActive()
return mRealtimeEffects.GetCount() != 0;
}
bool EffectManager::RealtimeIsSuspended()
{
return mRealtimeSuspended;
}
void EffectManager::RealtimeAddEffect(Effect *effect)
{
// Block RealtimeProcess()

View File

@ -98,6 +98,7 @@ class AUDACITY_DLL_API EffectManager
#if defined(EXPERIMENTAL_REALTIME_EFFECTS)
// Realtime effect processing
bool RealtimeIsActive();
bool RealtimeIsSuspended();
void RealtimeAddEffect(Effect *effect);
void RealtimeRemoveEffect(Effect *effect);
void RealtimeSetEffects(const EffectArray & mActive);

View File

@ -1266,11 +1266,6 @@ bool LadspaEffect::ValidateUI()
bool LadspaEffect::HideUI()
{
if (GetType() == EffectTypeAnalyze || mNumOutputControls > 0)
{
return false;
}
return true;
}

View File

@ -379,7 +379,7 @@ void ControlToolBar::EnableDisableButtons()
if (pttb)
pttb->SetEnabled(enablePlay);
mRecord->SetEnabled(!busy && !playing && !EffectManager::Get().RealtimeIsActive());
mRecord->SetEnabled(!busy && !playing);
mStop->SetEnabled(busy);
mRewind->SetEnabled(!busy);