mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-15 15:49:36 +02:00
Removal of all the stuff marked as 'Experimental CLEANSPEECH' about a year ago.
This commit is contained in:
parent
4ca5984081
commit
1af35d4168
@ -62,10 +62,6 @@ from there. Audacity will look for a file called "Pause.png".
|
||||
DEFINE_IMAGE( bmpFFwdDisabled, wxImage( 16, 16 ), wxT("FFwdDisabled"));
|
||||
DEFINE_IMAGE( bmpRecord, wxImage( 16, 16 ), wxT("Record"));
|
||||
DEFINE_IMAGE( bmpRecordDisabled, wxImage( 16, 16 ), wxT("RecordDisabled"));
|
||||
#ifdef CLEANSPEECH
|
||||
DEFINE_IMAGE( bmpCleanSpeech, wxImage( 16, 16 ), wxT("CleanSpeech"));
|
||||
DEFINE_IMAGE( bmpCleanSpeechDisabled, wxImage( 16, 16 ), wxT("CleanSpeechDisabled"));
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
SET_THEME_FLAGS( resFlagNewLine );
|
||||
DEFINE_IMAGE( bmpUpButtonLarge, wxImage( 48, 48 ), wxT("UpButtonLarge"));
|
||||
|
@ -985,13 +985,6 @@ bool AudacityApp::OnInit()
|
||||
wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, 1 );
|
||||
#endif
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
//MERGE:
|
||||
//Everything now uses Audacity name for preferences.
|
||||
//(Audacity and CleanSpeech the same program and use
|
||||
//the same preferences file).
|
||||
//
|
||||
#endif // CLEANSPEECH
|
||||
// LL: Moved here from InitPreferences() to ensure VST effect
|
||||
// discovery writes configuration to the correct directory
|
||||
// on OSX with case-sensitive file systems.
|
||||
@ -1053,9 +1046,6 @@ bool AudacityApp::OnInit()
|
||||
//
|
||||
|
||||
wxString home = wxGetHomeDir();
|
||||
#ifdef CLEANSPEECH
|
||||
mAppHomeDir = home;
|
||||
#endif // CLEANSPEECH
|
||||
theTheme.EnsureInitialised();
|
||||
|
||||
// AColor depends on theTheme.
|
||||
@ -1156,18 +1146,6 @@ bool AudacityApp::OnInit()
|
||||
if (lang == wxT(""))
|
||||
lang = GetSystemLanguageCode();
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
#ifdef NOT_RQD
|
||||
//TIDY-ME: (CleanSpeech) Language prompt??
|
||||
// The prompt for language only happens ONCE on a system.
|
||||
// I don't think we should disable it JKC
|
||||
wxString lang = gPrefs->Read(wxT("/Locale/Language"), "en"); //lda
|
||||
|
||||
// Pop up a dialog the first time the program is run
|
||||
//lda if (lang == "")
|
||||
//lda lang = ChooseLanguage(NULL);
|
||||
#endif
|
||||
#endif // CLEANSPEECH
|
||||
mLocale = NULL;
|
||||
InitLang( lang );
|
||||
|
||||
@ -1180,9 +1158,6 @@ bool AudacityApp::OnInit()
|
||||
}
|
||||
|
||||
// More initialization
|
||||
#ifdef CLEANSPEECH
|
||||
InitCleanSpeech();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
InitDitherers();
|
||||
InitAudioIO();
|
||||
@ -1447,56 +1422,6 @@ void AudacityApp::OnReceiveCommand(AppCommandEvent &event)
|
||||
mCmdHandler->OnReceiveCommand(event);
|
||||
}
|
||||
|
||||
#ifdef CLEANSPEECH //is this actually useful?
|
||||
bool AudacityApp::InitCleanSpeech()
|
||||
{
|
||||
wxString userdatadir = FileNames::DataDir();
|
||||
wxString presetsFromPrefs = gPrefs->Read(wxT("/Directories/PresetsDir"), wxT(""));
|
||||
wxString presets = wxT("");
|
||||
|
||||
#ifdef __WXGTK__
|
||||
if (presetsFromPrefs.Length() > 0 && presetsFromPrefs[0] != wxT('/'))
|
||||
presetsFromPrefs = wxT("");
|
||||
#endif //__WXGTK__
|
||||
|
||||
wxString presetsDefaultLoc =
|
||||
wxFileName(userdatadir, wxT("presets")).GetFullPath();
|
||||
|
||||
// Stop wxWidgets from printing its own error messages (not used ... does this really do anything?)
|
||||
wxLogNull logNo;
|
||||
|
||||
// Try temp dir that was stored in prefs first
|
||||
if (presetsFromPrefs != wxT("")) {
|
||||
if (wxDirExists(presetsFromPrefs))
|
||||
presets = presetsFromPrefs;
|
||||
else if (wxMkdir(presetsFromPrefs))
|
||||
presets = presetsFromPrefs;
|
||||
}
|
||||
|
||||
// If that didn't work, try the default location
|
||||
if ((presets == wxT("")) && (presetsDefaultLoc != wxT(""))) {
|
||||
if (wxDirExists(presetsDefaultLoc))
|
||||
presets = presetsDefaultLoc;
|
||||
else if (wxMkdir(presetsDefaultLoc))
|
||||
presets = presetsDefaultLoc;
|
||||
}
|
||||
|
||||
if (presets == wxT("")) {
|
||||
// Failed
|
||||
wxMessageBox(wxT("Audacity could not find a place to store\n.csp CleanSpeech preset files\nAudacity is now going to exit. \nInstallation may be corrupt."));
|
||||
return false;
|
||||
}
|
||||
|
||||
// The permissions don't always seem to be set on
|
||||
// some platforms. Hopefully this fixes it...
|
||||
#ifdef __UNIX__
|
||||
chmod(OSFILENAME(presets), 0755);
|
||||
#endif
|
||||
|
||||
return (gPrefs->Write(wxT("/Directories/PresetsDir"), presets) && gPrefs->Flush());
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
bool AudacityApp::InitTempDir()
|
||||
{
|
||||
// We need to find a temp directory location.
|
||||
|
@ -98,14 +98,6 @@ class AudacityApp:public wxApp {
|
||||
virtual int OnExit(void);
|
||||
virtual void OnFatalException();
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
//LDA - Until we have a better way to save/restore binary data.
|
||||
float* GetCleanSpeechNoiseGate() { return mCleanSpeechNoiseGate; }
|
||||
int GetCleanSpeechNoiseGateExpectedCount() { return mCleanSpeechNoiseGateExpectedCount; }
|
||||
void SetCleanSpeechNoiseGate(float* pNG) { mCleanSpeechNoiseGate = pNG; }
|
||||
void SetCleanSpeechNoiseGateExpectedCount(int count) { mCleanSpeechNoiseGateExpectedCount = count; }
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
void InitLang( const wxString & lang );
|
||||
|
||||
// These are currently only used on Mac OS, where it's
|
||||
@ -227,24 +219,6 @@ class AudacityApp:public wxApp {
|
||||
/* utility method for printing the command line help message */
|
||||
void PrintCommandLineHelp(void);
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
//LDA - Until we have a better way to save/restore binary data.
|
||||
// ToDo: ... look into how wxConfig works.
|
||||
// ToDo: NoiseGate is an array of 1024 floats that is the "persistent result"
|
||||
// of Step-1 of NoiseRemoval. Not sure if different size if
|
||||
// other than 256 FFT size???
|
||||
float* mCleanSpeechNoiseGate;
|
||||
int mCleanSpeechNoiseGateExpectedCount;
|
||||
bool InitCleanSpeech();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
//LDA - Keep track of where Presets are stored ... for app, not just project
|
||||
// ... ToDo: flawed for Linux/unix with restricted end-user privilege
|
||||
// .... depends on whether [AudacityDir]\presets can be written
|
||||
#ifdef CLEANSPEECH
|
||||
wxString mAppHomeDir;
|
||||
wxString mPresetsDir;
|
||||
#endif // CLEANSPEECH
|
||||
bool mWindowRectAlreadySaved;
|
||||
|
||||
#if defined(__WXMSW__)
|
||||
|
@ -64,9 +64,6 @@ wxString SpecialCommands[] = {
|
||||
};
|
||||
// end CLEANSPEECH remnant
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
static const wxString CleanSpeech = wxT("CleanSpeech");
|
||||
#endif // CLEANSPEECH
|
||||
static const wxString MP3Conversion = wxT("MP3 Conversion");
|
||||
|
||||
BatchCommands::BatchCommands()
|
||||
@ -74,13 +71,6 @@ BatchCommands::BatchCommands()
|
||||
ResetChain();
|
||||
|
||||
wxArrayString names = GetNames();
|
||||
#ifdef CLEANSPEECH // possibly the rest of this fn
|
||||
if (names.Index(CleanSpeech) == wxNOT_FOUND) {
|
||||
AddChain(CleanSpeech);
|
||||
RestoreChain(CleanSpeech);
|
||||
WriteChain(CleanSpeech);
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
if (names.Index(MP3Conversion) == wxNOT_FOUND) {
|
||||
AddChain(MP3Conversion);
|
||||
@ -252,26 +242,6 @@ bool BatchCommands::RenameChain(const wxString & oldchain, const wxString & newc
|
||||
return wxRenameFile(oname.GetFullPath(), nname.GetFullPath());
|
||||
}
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
void BatchCommands::SetCleanSpeechChain()
|
||||
{
|
||||
ResetChain();
|
||||
|
||||
// TIDY-ME: Effects change their name with localisation.
|
||||
// Commands (at least currently) don't. Messy.
|
||||
|
||||
/* i18n-hint: Effect name translations must agree with those used elsewhere, or batch won't find them */
|
||||
AddToChain( wxT("StereoToMono") );
|
||||
AddToChain( wxT("Normalize") );
|
||||
AddToChain( wxT("ExportMP3_56k_before") );
|
||||
AddToChain( wxT("NoiseRemoval") );
|
||||
AddToChain( wxT("TruncateSilence") );
|
||||
AddToChain( wxT("Leveller") );
|
||||
AddToChain( wxT("Normalize") );
|
||||
AddToChain( wxT("ExportMP3") );
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
void BatchCommands::SetWavToMp3Chain() // a function per default chain? This is flawed design! MJS
|
||||
{
|
||||
ResetChain();
|
||||
@ -302,10 +272,6 @@ wxArrayString BatchCommands::GetAllCommands()
|
||||
// end CLEANSPEECH remnant
|
||||
|
||||
int additionalEffects=ADVANCED_EFFECT;
|
||||
#ifdef CLEANSPEECH
|
||||
if( project->GetCleanSpeechMode() )
|
||||
additionalEffects = 0;
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
effects = EffectManager::Get().GetEffects(PROCESS_EFFECT | BUILTIN_EFFECT | PLUGIN_EFFECT | additionalEffects);
|
||||
for(i=0; i<effects->GetCount(); i++) {
|
||||
@ -746,14 +712,8 @@ wxArrayString BatchCommands::GetNames()
|
||||
|
||||
bool BatchCommands::IsFixed(const wxString & name)
|
||||
{
|
||||
#ifdef CLEANSPEECH // probably the rest of this fn as well
|
||||
if (name == CleanSpeech || name == MP3Conversion) {
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
if (name == MP3Conversion)
|
||||
return true;
|
||||
#endif // CLEANSPEECH
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -762,19 +722,8 @@ void BatchCommands::RestoreChain(const wxString & name)
|
||||
// TIDY-ME: Effects change their name with localisation.
|
||||
// Commands (at least currently) don't. Messy.
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
/* i18n-hint: Effect name translations must agree with those used elsewhere, or batch won't find them */
|
||||
|
||||
if (name == CleanSpeech) {
|
||||
SetCleanSpeechChain();
|
||||
}
|
||||
else if (name == MP3Conversion) {
|
||||
SetWavToMp3Chain();
|
||||
}
|
||||
#else
|
||||
if (name == MP3Conversion)
|
||||
SetWavToMp3Chain();
|
||||
#endif // CLEANSPEECH
|
||||
}
|
||||
|
||||
void BatchCommands::Split(const wxString & str, wxString & command, wxString & param)
|
||||
|
@ -61,9 +61,6 @@ class BatchCommands {
|
||||
int GetCount();
|
||||
|
||||
void SetWavToMp3Chain();
|
||||
#ifdef CLEANSPEECH
|
||||
void SetCleanSpeechChain();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
bool IsFixed(const wxString & name);
|
||||
|
||||
|
@ -66,16 +66,6 @@ BatchProcessDialog::BatchProcessDialog(wxWindow * parent):
|
||||
{
|
||||
AudacityProject * p = GetActiveProject();
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (p->GetCleanSpeechMode())
|
||||
{
|
||||
/*i18n-hint: CleanSpeech is the name of a mode Audacity can operate
|
||||
* in that was invented to process lots of sermons, remove long
|
||||
* pauses and background noise.*/
|
||||
SetTitle(_("CleanSpeech Batch Processing"));
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
SetLabel(_("Apply Chain")); // Provide visual label
|
||||
SetName(_("Apply Chain")); // Provide audible label
|
||||
Populate();
|
||||
@ -128,11 +118,7 @@ void BatchProcessDialog::PopulateOrExchange(ShuttleGui &S)
|
||||
}
|
||||
|
||||
// Get and validate the currently active chain
|
||||
#ifdef CLEANSPEECH
|
||||
wxString name = gPrefs->Read(wxT("/Batch/ActiveChain"), wxT("CleanSpeech"));
|
||||
#else
|
||||
wxString name = gPrefs->Read(wxT("/Batch/ActiveChain"), wxT(""));
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
int item = mChains->FindItem(-1, name);
|
||||
if (item == -1) {
|
||||
@ -218,14 +204,7 @@ void BatchProcessDialog::OnApplyToFiles(wxCommandEvent &event)
|
||||
}
|
||||
|
||||
wxString path = gPrefs->Read(wxT("/DefaultOpenPath"), ::wxGetCwd());
|
||||
#ifdef CLEANSPEECH
|
||||
wxString prompt = project->GetCleanSpeechMode() ?
|
||||
_("Select vocal file(s) for batch CleanSpeech Chain...") :
|
||||
_("Select file(s) for batch processing...");
|
||||
// CleanSpeech used to hard-code a restricted file type list here
|
||||
#else
|
||||
wxString prompt = _("Select file(s) for batch processing...");
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
FormatList l;
|
||||
wxString filter;
|
||||
@ -442,11 +421,7 @@ void EditChainsDialog::Populate()
|
||||
// ----------------------- End of main section --------------
|
||||
|
||||
// Get and validate the currently active chain
|
||||
#ifdef CLEANSPEECH
|
||||
mActiveChain = gPrefs->Read(wxT("/Batch/ActiveChain"), wxT("CleanSpeech"));
|
||||
#else
|
||||
mActiveChain = gPrefs->Read(wxT("/Batch/ActiveChain"), wxT(""));
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
// Go populate the chains list.
|
||||
PopulateChains();
|
||||
|
@ -154,8 +154,3 @@
|
||||
#define EXPERIMENTAL_TRUNC_SILENCE
|
||||
|
||||
#endif
|
||||
|
||||
//MJS: make the CleanSpeech stuff experimental, rather than deleting it directly
|
||||
// Normally disabled, for now.
|
||||
// CleanSpeech should be done somehow else and not be polluting the code
|
||||
//#define CLEANSPEECH 1
|
||||
|
606
src/Menus.cpp
606
src/Menus.cpp
@ -175,11 +175,6 @@ void AudacityProjectCommandFunctor::operator()(int index )
|
||||
/// changes in configured preferences - for example changes in key-bindings
|
||||
/// affect the short-cut key legend that appears beside each command,
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
/// and changes in 'CleanSpeech Mode' customise the menus to a restricted
|
||||
/// subset
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
void AudacityProject::CreateMenusAndCommands()
|
||||
{
|
||||
CommandManager *c = &mCommandManager;
|
||||
@ -217,8 +212,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
|
||||
c->AddItem(wxT("Close"), _("&Close"), FN(OnClose), wxT("Ctrl+W"));
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (!mCleanSpeechMode) { // CLEANSPEECH
|
||||
c->AddItem(wxT("Save"), _("&Save Project"), FN(OnSave), wxT("Ctrl+S"),
|
||||
AudioIONotBusyFlag | UnsavedChangesFlag,
|
||||
AudioIONotBusyFlag | UnsavedChangesFlag);
|
||||
@ -226,16 +219,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
#ifdef USE_LIBVORBIS
|
||||
c->AddItem(wxT("SaveCompressed"), _("Save Compressed Copy of Project..."), FN(OnSaveCompressed));
|
||||
#endif
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
c->AddItem(wxT("Save"), _("&Save Project"), FN(OnSave), wxT("Ctrl+S"),
|
||||
AudioIONotBusyFlag | UnsavedChangesFlag,
|
||||
AudioIONotBusyFlag | UnsavedChangesFlag);
|
||||
c->AddItem(wxT("SaveAs"), _("Save Project &As..."), FN(OnSaveAs));
|
||||
#ifdef USE_LIBVORBIS
|
||||
c->AddItem(wxT("SaveCompressed"), _("Save Compressed Copy of Project..."), FN(OnSaveCompressed));
|
||||
#endif
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
c->AddItem(wxT("CheckDeps"), _("Chec&k Dependencies..."), FN(OnCheckDependencies));
|
||||
|
||||
@ -247,8 +230,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (!mCleanSpeechMode) { // CLEANSPEECH
|
||||
c->BeginSubMenu(_("&Import"));
|
||||
|
||||
c->AddItem(wxT("ImportAudio"), _("&Audio..."), FN(OnImport), wxT("Ctrl+Shift+I"));
|
||||
@ -261,21 +242,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
c->EndSubMenu();
|
||||
|
||||
c->AddSeparator();
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
c->BeginSubMenu(_("&Import"));
|
||||
|
||||
c->AddItem(wxT("ImportAudio"), _("&Audio..."), FN(OnImport), wxT("Ctrl+Shift+I"));
|
||||
c->AddItem(wxT("ImportLabels"), _("&Labels..."), FN(OnImportLabels));
|
||||
#ifdef USE_MIDI
|
||||
c->AddItem(wxT("ImportMIDI"), _("&MIDI..."), FN(OnImportMIDI));
|
||||
#endif // USE_MIDI
|
||||
c->AddItem(wxT("ImportRaw"), _("&Raw Data..."), FN(OnImportRaw));
|
||||
|
||||
c->EndSubMenu();
|
||||
|
||||
c->AddSeparator();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -289,8 +255,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
AudioIONotBusyFlag | TimeSelectedFlag | WaveTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | TimeSelectedFlag | WaveTracksSelectedFlag);
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (!mCleanSpeechMode) { // CLEANSPEECH
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("ExportLabels"), _("Export &Labels..."), FN(OnExportLabels),
|
||||
@ -305,36 +269,12 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
AudioIONotBusyFlag | NoteTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | NoteTracksSelectedFlag);
|
||||
#endif
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("ExportLabels"), _("Export &Labels..."), FN(OnExportLabels),
|
||||
AudioIONotBusyFlag | LabelTracksExistFlag,
|
||||
AudioIONotBusyFlag | LabelTracksExistFlag);
|
||||
// Enable Export audio commands only when there are audio tracks.
|
||||
c->AddItem(wxT("ExportMultiple"), _("Export &Multiple..."), FN(OnExportMultiple), wxT("Ctrl+Shift+L"),
|
||||
AudioIONotBusyFlag | WaveTracksExistFlag,
|
||||
AudioIONotBusyFlag | WaveTracksExistFlag);
|
||||
#if defined(USE_MIDI)
|
||||
c->AddItem(wxT("ExportMIDI"), _("Export MIDI..."), FN(OnExportMIDI),
|
||||
AudioIONotBusyFlag | NoteTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | NoteTracksSelectedFlag);
|
||||
#endif
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
c->AddItem(wxT("ApplyChain"), _("Appl&y Chain..."), FN(OnApplyChain),
|
||||
AudioIONotBusyFlag,
|
||||
AudioIONotBusyFlag);
|
||||
c->AddItem(wxT("EditChains"), _("Edit C&hains..."), FN(OnEditChains));
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (mCleanSpeechMode) {
|
||||
c->AddItem(wxT("ExportCcSettings"), _("Export CleanSpeech &Presets..."), FN(OnExportCleanSpeechPresets));
|
||||
c->AddItem(wxT("ImportCcSettings"), _("I&mport CleanSpeech Presets..."), FN(OnImportCleanSpeechPresets));
|
||||
}
|
||||
else {
|
||||
|
||||
#ifdef EXPERIMENTAL_FTP
|
||||
c->AddSeparator();
|
||||
c->AddItem(wxT("Upload File"), _("&Upload File..."), FN(OnUpload));
|
||||
@ -349,23 +289,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
c->AddItem(wxT("Print"), _("&Print..."), FN(OnPrint),
|
||||
AudioIONotBusyFlag | TracksExistFlag,
|
||||
AudioIONotBusyFlag | TracksExistFlag);
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
#ifdef EXPERIMENTAL_FTP
|
||||
c->AddSeparator();
|
||||
c->AddItem(wxT("Upload File"), _("&Upload File..."), FN(OnUpload));
|
||||
#endif
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("PageSetup"), _("Pa&ge Setup..."), FN(OnPageSetup),
|
||||
AudioIONotBusyFlag | TracksExistFlag,
|
||||
AudioIONotBusyFlag | TracksExistFlag);
|
||||
/* i18n-hint: (verb) It's item on a menu. */
|
||||
c->AddItem(wxT("Print"), _("&Print..."), FN(OnPrint),
|
||||
AudioIONotBusyFlag | TracksExistFlag,
|
||||
AudioIONotBusyFlag | TracksExistFlag);
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
@ -461,16 +384,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
/* i18n-hint: (verb)*/
|
||||
c->AddItem(wxT("Duplicate"), _("Duplic&ate"), FN(OnDuplicate), wxT("Ctrl+D"));
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
// An anomaly... StereoToMono is added here for CleanSpeech,
|
||||
// which doesn't have a Tracks menu, but is under Tracks for normal Audacity.
|
||||
if (mCleanSpeechMode) {
|
||||
c->AddItem(wxT("Stereo to Mono"), _("Stereo Trac&k to Mono"), FN(OnStereoToMono),
|
||||
AudioIONotBusyFlag | StereoRequiredFlag | WaveTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | StereoRequiredFlag | WaveTracksSelectedFlag);
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@ -762,9 +675,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
#endif
|
||||
c->AddItem(wxT("RescanDevices"), _("R&escan Audio Devices"), FN(OnRescanDevices));
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (!mCleanSpeechMode) { // CLEANSPEECH
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Tracks Menu (formerly Project Menu)
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@ -787,213 +697,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
// StereoToMono moves to the Edit menu when in CleanSpeech mode. CLEANSPEECH
|
||||
// It belongs here normally, because it is a kind of mix-down. CLEANSPEECH
|
||||
c->AddItem(wxT("Stereo to Mono"), _("Stereo Trac&k to Mono"), FN(OnStereoToMono),
|
||||
AudioIONotBusyFlag | StereoRequiredFlag | WaveTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | StereoRequiredFlag | WaveTracksSelectedFlag);
|
||||
c->AddItem(wxT("MixAndRender"), _("Mi&x and Render"), FN(OnMixAndRender),
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag);
|
||||
c->AddCommand(wxT("MixAndRenderToNewTrack"), _("Mix and Render to New Track"), FN(OnMixAndRenderToNewTrack), wxT("Ctrl+Shift+M"),
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag);
|
||||
c->AddItem(wxT("Resample"), _("&Resample..."), FN(OnResample),
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag);
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("RemoveTracks"), _("Remo&ve Tracks"), FN(OnRemoveTracks),
|
||||
AudioIONotBusyFlag | TracksSelectedFlag,
|
||||
AudioIONotBusyFlag | TracksSelectedFlag);
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("MuteAllTracks"), _("&Mute All Tracks"), FN(OnMuteAllTracks), wxT("Ctrl+U"),
|
||||
WaveTracksExistFlag,
|
||||
WaveTracksExistFlag);
|
||||
c->AddItem(wxT("UnMuteAllTracks"), _("&Unmute All Tracks"), FN(OnUnMuteAllTracks), wxT("Ctrl+Shift+U"),
|
||||
WaveTracksExistFlag,
|
||||
WaveTracksExistFlag);
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
wxArrayString alignLabels;
|
||||
alignLabels.Add(_("Align with &Zero"));
|
||||
alignLabels.Add(_("Align with &Cursor"));
|
||||
alignLabels.Add(_("Align with Selection &Start"));
|
||||
alignLabels.Add(_("Align with Selection &End"));
|
||||
alignLabels.Add(_("Align End with Cu&rsor"));
|
||||
alignLabels.Add(_("Align End with Selection Star&t"));
|
||||
alignLabels.Add(_("Align End with Selection En&d"));
|
||||
alignLabels.Add(_("Align Tracks To&gether"));
|
||||
|
||||
c->SetDefaultFlags(WaveTracksExistFlag, WaveTracksExistFlag);
|
||||
c->BeginSubMenu(_("&Align Tracks"));
|
||||
|
||||
c->AddItemList(wxT("Align"), alignLabels, FN(OnAlign));
|
||||
c->SetCommandFlags(wxT("Align"),
|
||||
AudioIONotBusyFlag | TracksSelectedFlag,
|
||||
AudioIONotBusyFlag | TracksSelectedFlag);
|
||||
|
||||
c->EndSubMenu();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
alignLabels.RemoveAt(7); // Can't align together and move cursor
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
c->BeginSubMenu(_("Ali&gn and Move Cursor"));
|
||||
|
||||
c->AddItemList(wxT("AlignMove"), alignLabels, FN(OnAlignMoveSel));
|
||||
c->SetCommandFlags(wxT("AlignMove"),
|
||||
AudioIONotBusyFlag | TracksSelectedFlag,
|
||||
AudioIONotBusyFlag | TracksSelectedFlag);
|
||||
|
||||
c->EndSubMenu();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef EXPERIMENTAL_SCOREALIGN
|
||||
c->AddItem(wxT("ScoreAlign"), _("Synchronize MIDI with Audio"), FN(OnScoreAlign),
|
||||
AudioIONotBusyFlag | NoteTracksSelectedFlag | WaveTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | NoteTracksSelectedFlag | WaveTracksSelectedFlag);
|
||||
#endif // EXPERIMENTAL_SCOREALIGN
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
#ifdef EXPERIMENTAL_SYNC_LOCK
|
||||
c->AddCheck(wxT("SyncLock"), _("Sync-&Lock Tracks"), FN(OnSyncLock), 0);
|
||||
|
||||
c->AddSeparator();
|
||||
#endif
|
||||
|
||||
c->AddItem(wxT("AddLabel"), _("Add Label At &Selection"), FN(OnAddLabel), wxT("Ctrl+B"),
|
||||
AlwaysEnabledFlag, AlwaysEnabledFlag);
|
||||
c->AddItem(wxT("AddLabelPlaying"), _("Add Label At &Playback Position"),
|
||||
FN(OnAddLabelPlaying),
|
||||
#ifdef __WXMAC__
|
||||
wxT("Ctrl+."),
|
||||
#else
|
||||
wxT("Ctrl+M"),
|
||||
#endif
|
||||
0, AudioIONotBusyFlag);
|
||||
c->AddItem(wxT("EditLabels"), _("&Edit Labels..."), FN(OnEditLabels));
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
c->BeginSubMenu(_("S&ort Tracks"));
|
||||
|
||||
c->AddItem(wxT("SortByTime"), _("by &Start time"), FN(OnSortTime),
|
||||
TracksExistFlag,
|
||||
TracksExistFlag);
|
||||
c->AddItem(wxT("SortByName"), _("by &Name"), FN(OnSortName),
|
||||
TracksExistFlag,
|
||||
TracksExistFlag);
|
||||
|
||||
c->EndSubMenu();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
c->EndMenu();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Generate Menu
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
c->BeginMenu(_("&Generate"));
|
||||
c->SetDefaultFlags(AudioIONotBusyFlag, AudioIONotBusyFlag);
|
||||
|
||||
#ifndef EFFECT_CATEGORIES
|
||||
|
||||
effects = em.GetEffects(INSERT_EFFECT | BUILTIN_EFFECT);
|
||||
if (effects->GetCount()) {
|
||||
names.Clear();
|
||||
for (size_t i = 0; i < effects->GetCount(); i++) {
|
||||
names.Add((*effects)[i]->GetEffectName());
|
||||
}
|
||||
c->AddItemList(wxT("Generate"), names, FN(OnGenerateEffect));
|
||||
}
|
||||
delete effects;
|
||||
|
||||
effects = em.GetEffects(INSERT_EFFECT | PLUGIN_EFFECT);
|
||||
if (effects->GetCount()) {
|
||||
c->AddSeparator();
|
||||
names.Clear();
|
||||
for (size_t i = 0; i < effects->GetCount(); i++) {
|
||||
names.Add((*effects)[i]->GetEffectName());
|
||||
}
|
||||
c->AddItemList(wxT("GeneratePlugin"), names, FN(OnGeneratePlugin), true);
|
||||
}
|
||||
delete effects;
|
||||
|
||||
#else
|
||||
|
||||
int flags;
|
||||
|
||||
flags = INSERT_EFFECT | BUILTIN_EFFECT | PLUGIN_EFFECT;
|
||||
EffectCategory* ac =
|
||||
em.LookupCategory(wxT("http://lv2plug.in/ns/lv2core#GeneratorPlugin"));
|
||||
CategorySet roots = ac->GetSubCategories();
|
||||
EffectSet generators = ac->GetEffects();
|
||||
EffectSet topLevel = CreateEffectSubmenus(c, roots, flags, 0);
|
||||
std::copy(generators.begin(), generators.end(),
|
||||
std::insert_iterator<EffectSet>(topLevel, topLevel.begin()));
|
||||
AddEffectsToMenu(c, topLevel);
|
||||
|
||||
// Add all uncategorised effects in a special submenu
|
||||
EffectSet unsorted =
|
||||
em.GetUnsortedEffects(flags);
|
||||
if (unsorted.size() > 0) {
|
||||
c->AddSeparator();
|
||||
c->BeginSubMenu(_("Unsorted"));
|
||||
names.Clear();
|
||||
indices.Clear();
|
||||
EffectSet::const_iterator iter;
|
||||
for (iter = unsorted.begin(); iter != unsorted.end(); ++iter) {
|
||||
names.Add((*iter)->GetEffectName());
|
||||
indices.Add((*iter)->GetID());
|
||||
}
|
||||
c->AddItemList(wxT("Generate"), names,
|
||||
FNI(OnProcessAny, indices), true);
|
||||
c->EndSubMenu();
|
||||
}
|
||||
|
||||
#endif // EFFECT_CATEGORIES
|
||||
|
||||
c->EndMenu();
|
||||
} // end of CLEANSPEECH 'if'
|
||||
#else // CLEANSPEECH
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Tracks Menu (formerly Project Menu)
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
c->BeginMenu(_("&Tracks"));
|
||||
c->SetDefaultFlags(AudioIONotBusyFlag, AudioIONotBusyFlag);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
c->BeginSubMenu(_("Add &New"));
|
||||
|
||||
c->AddItem(wxT("NewAudioTrack"), _("&Audio Track"), FN(OnNewWaveTrack), wxT("Ctrl+Shift+N"));
|
||||
c->AddItem(wxT("NewStereoTrack"), _("&Stereo Track"), FN(OnNewStereoTrack));
|
||||
c->AddItem(wxT("NewLabelTrack"), _("&Label Track"), FN(OnNewLabelTrack));
|
||||
c->AddItem(wxT("NewTimeTrack"), _("&Time Track"), FN(OnNewTimeTrack));
|
||||
|
||||
c->EndSubMenu();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
// StereoToMono moves to the Edit menu when in CleanSpeech mode. CLEANSPEECH
|
||||
// It belongs here normally, because it is a kind of mix-down. CLEANSPEECH
|
||||
#endif // CLEANSPEECH
|
||||
c->AddItem(wxT("Stereo to Mono"), _("Stereo Trac&k to Mono"), FN(OnStereoToMono),
|
||||
AudioIONotBusyFlag | StereoRequiredFlag | WaveTracksSelectedFlag,
|
||||
AudioIONotBusyFlag | StereoRequiredFlag | WaveTracksSelectedFlag);
|
||||
@ -1167,7 +870,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
#endif // EFFECT_CATEGORIES
|
||||
|
||||
c->EndMenu();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Effect Menu
|
||||
@ -1190,12 +892,7 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
// Cleanspeech doesn't have advanced effects
|
||||
int additionalEffects = mCleanSpeechMode ? 0 : ADVANCED_EFFECT;
|
||||
#else
|
||||
int additionalEffects = ADVANCED_EFFECT;
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
// this is really ugly but we need to keep all the old code to get any
|
||||
// effects at all in the menu when EFFECT_CATEGORIES is undefined
|
||||
@ -1212,8 +909,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
}
|
||||
delete effects;
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (!mCleanSpeechMode) { // CLEANSPEECH
|
||||
effects = em.GetEffects(PROCESS_EFFECT | PLUGIN_EFFECT);
|
||||
if (effects->GetCount()) {
|
||||
c->AddSeparator();
|
||||
@ -1224,33 +919,11 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
c->AddItemList(wxT("EffectPlugin"), names, FN(OnProcessPlugin), true);
|
||||
}
|
||||
delete effects;
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
effects = em.GetEffects(PROCESS_EFFECT | PLUGIN_EFFECT);
|
||||
if (effects->GetCount()) {
|
||||
c->AddSeparator();
|
||||
names.Clear();
|
||||
for (size_t i = 0; i < effects->GetCount(); i++) {
|
||||
names.Add((*effects)[i]->GetEffectName());
|
||||
}
|
||||
c->AddItemList(wxT("EffectPlugin"), names, FN(OnProcessPlugin), true);
|
||||
}
|
||||
delete effects;
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
c->EndMenu();
|
||||
|
||||
#else
|
||||
#ifdef CLEANSPEECH
|
||||
// We want plugins and builtins in the same menus, but we don't want plugins
|
||||
// or "advanced" effects if we are building CleanSpeech
|
||||
int flags = PROCESS_EFFECT | BUILTIN_EFFECT;
|
||||
if (!mCleanSpeechMode) {
|
||||
flags |= PLUGIN_EFFECT | ADVANCED_EFFECT;
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
int flags = PROCESS_EFFECT | BUILTIN_EFFECT | PLUGIN_EFFECT | ADVANCED_EFFECT;
|
||||
#endif // CLEANSPEECH
|
||||
// The categories form a DAG, so we start at the roots (the categories
|
||||
// without incoming links)
|
||||
CategorySet roots = em.GetRootCategories();
|
||||
@ -1277,9 +950,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (!mCleanSpeechMode) { // CLEANSPEECH
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Analyze Menu
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@ -1349,78 +1019,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
#endif // EFFECT_CATEGORIES
|
||||
|
||||
c->EndMenu();
|
||||
} // end of CLEANSPEECH if
|
||||
#else // CLEANSPEECH
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Analyze Menu
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
c->BeginMenu(_("&Analyze"));
|
||||
|
||||
c->AddItem(wxT("ContrastAnalyser"), _("Contrast..."), FN(OnContrast), wxT("Ctrl+Shift+T"),
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag | TimeSelectedFlag,
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag | TimeSelectedFlag);
|
||||
c->AddItem(wxT("PlotSpectrum"), _("Plot Spectrum..."), FN(OnPlotSpectrum),
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag | TimeSelectedFlag,
|
||||
AudioIONotBusyFlag | WaveTracksSelectedFlag | TimeSelectedFlag);
|
||||
|
||||
#ifndef EFFECT_CATEGORIES
|
||||
|
||||
effects = em.GetEffects(ANALYZE_EFFECT | BUILTIN_EFFECT);
|
||||
if (effects->GetCount()) {
|
||||
names.Clear();
|
||||
for (size_t i = 0; i < effects->GetCount(); i++) {
|
||||
names.Add((*effects)[i]->GetEffectName());
|
||||
}
|
||||
c->AddItemList(wxT("Analyze"), names, FN(OnAnalyzeEffect));
|
||||
}
|
||||
delete effects;
|
||||
|
||||
effects = em.GetEffects(ANALYZE_EFFECT | PLUGIN_EFFECT);
|
||||
if (effects->GetCount()) {
|
||||
c->AddSeparator();
|
||||
names.Clear();
|
||||
for (size_t i = 0; i < effects->GetCount(); i++) {
|
||||
names.Add((*effects)[i]->GetEffectName());
|
||||
}
|
||||
c->AddItemList(wxT("AnalyzePlugin"), names, FN(OnAnalyzePlugin), true);
|
||||
}
|
||||
delete effects;
|
||||
|
||||
#else
|
||||
|
||||
flags = ANALYZE_EFFECT | BUILTIN_EFFECT | PLUGIN_EFFECT;
|
||||
EffectCategory* ac =
|
||||
em.LookupCategory(wxT("http://lv2plug.in/ns/lv2core#AnalyserPlugin"));
|
||||
CategorySet roots = ac->GetSubCategories();
|
||||
EffectSet analyzers = ac->GetEffects();
|
||||
EffectSet topLevel = CreateEffectSubmenus(c, roots, flags, 0);
|
||||
std::copy(analyzers.begin(), analyzers.end(),
|
||||
std::insert_iterator<EffectSet>(topLevel, topLevel.begin()));
|
||||
AddEffectsToMenu(c, topLevel);
|
||||
|
||||
// Add all uncategorised effects in a special submenu
|
||||
EffectSet unsorted =
|
||||
em.GetUnsortedEffects(flags);
|
||||
if (unsorted.size() > 0) {
|
||||
c->AddSeparator();
|
||||
c->BeginSubMenu(_("Unsorted"));
|
||||
names.Clear();
|
||||
indices.Clear();
|
||||
EffectSet::const_iterator iter;
|
||||
for (iter = unsorted.begin(); iter != unsorted.end(); ++iter) {
|
||||
names.Add((*iter)->GetEffectName());
|
||||
indices.Add((*iter)->GetID());
|
||||
}
|
||||
c->AddItemList(wxT("Analyze"), names,
|
||||
FNI(OnProcessAny, indices), true);
|
||||
c->EndSubMenu();
|
||||
}
|
||||
|
||||
#endif // EFFECT_CATEGORIES
|
||||
|
||||
c->EndMenu();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Help Menu
|
||||
@ -1433,23 +1031,11 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
c->BeginMenu(_("&Help"));
|
||||
c->SetDefaultFlags(AlwaysEnabledFlag, AlwaysEnabledFlag);
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (mCleanSpeechMode) {
|
||||
c->AddItem(wxT("About"), _("&About Audacity CleanSpeech..."), FN(OnAbout));
|
||||
}
|
||||
else {
|
||||
c->AddItem(wxT("About"), _("&About Audacity..."), FN(OnAbout));
|
||||
}
|
||||
#else
|
||||
c->AddItem(wxT("About"), _("&About Audacity..."), FN(OnAbout));
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
c->AddItem(wxT("QuickHelp"), _("&Quick Help (in web browser)"), FN(OnQuickHelp));
|
||||
c->AddItem(wxT("Manual"), _("&Manual (in web browser)"), FN(OnManual));
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (!mCleanSpeechMode) { // CLEANSPEECH
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("Screenshot"), _("&Screenshot Tools..."), FN(OnScreenshot));
|
||||
@ -1466,25 +1052,6 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
|
||||
c->AddItem(wxT("DeviceInfo"), _("Au&dio Device Info..."), FN(OnAudioDeviceInfo));
|
||||
c->AddItem(wxT("Log"), _("Show &Log..."), FN(OnShowLog));
|
||||
} // end of CLEANSPEECH if
|
||||
#else // CLEANSPEECH
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("Screenshot"), _("&Screenshot Tools..."), FN(OnScreenshot));
|
||||
|
||||
#if IS_BETA
|
||||
// TODO: What should we do here? Make benchmark a plug-in?
|
||||
// Easy enough to do. We'd call it mod-self-test.
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("Benchmark"), _("&Run Benchmark..."), FN(OnBenchmark));
|
||||
#endif
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
c->AddItem(wxT("DeviceInfo"), _("Au&dio Device Info..."), FN(OnAudioDeviceInfo));
|
||||
c->AddItem(wxT("Log"), _("Show &Log..."), FN(OnShowLog));
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
c->EndMenu();
|
||||
|
||||
@ -3226,11 +2793,6 @@ void AudacityProject::OnProcessAny(int index)
|
||||
void AudacityProject::OnProcessEffect(int index)
|
||||
{
|
||||
int additionalEffects=ADVANCED_EFFECT;
|
||||
#ifdef CLEANSPEECH
|
||||
// set additionalEffects to zero to exclude the advanced effects.
|
||||
if( mCleanSpeechMode )
|
||||
additionalEffects = 0;
|
||||
#endif // CLEANSPEECH
|
||||
OnEffect(BUILTIN_EFFECT | PROCESS_EFFECT | additionalEffects, index);
|
||||
}
|
||||
|
||||
@ -6038,174 +5600,6 @@ void AudacityProject::OnEditLabels()
|
||||
// #define PRESET_COUNT 16
|
||||
#define PRESET_COUNT 14
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
void AudacityProject::OnExportCleanSpeechPresets()
|
||||
{
|
||||
wxString userdatadir = FileNames::DataDir();
|
||||
#ifdef __WXMSW__
|
||||
wxString presetsDefaultLoc = userdatadir + wxT("\\presets");
|
||||
#else
|
||||
wxString presetsDefaultLoc = userdatadir + wxT("/presets");
|
||||
#endif
|
||||
wxString path = gPrefs->Read(wxT("/Directories/PresetsDir"), presetsDefaultLoc);
|
||||
|
||||
wxString nameOnly;
|
||||
wxString fName;
|
||||
wxString extension = wxT(".csp");
|
||||
bool fileOkay;
|
||||
|
||||
do {
|
||||
fileOkay = true;
|
||||
|
||||
fName = FileSelector(_("Save CleanSpeech Preset File As:"),
|
||||
path,
|
||||
wxT("*.csp"), // default file extension
|
||||
extension,
|
||||
_("CleanSpeech Presets (*.csp)|*.csp"),
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxRESIZE_BORDER);
|
||||
|
||||
if (fName.empty()) { // if cancel selected
|
||||
return;
|
||||
}
|
||||
if (fName.Length() >= 256) {
|
||||
wxMessageBox(_("Sorry, pathnames longer than 256 characters not supported."));
|
||||
fileOkay = false;
|
||||
continue;
|
||||
}
|
||||
::wxSplitPath(fName, &path, &nameOnly, &extension);
|
||||
wxFFile presetsFile(fName, wxT("wb"));
|
||||
|
||||
bool flag = presetsFile.IsOpened();
|
||||
|
||||
if (flag == true) {
|
||||
int preset[PRESET_COUNT];
|
||||
preset[0] = PRESET_FORMAT;
|
||||
preset[1] = PRESET_COUNT;
|
||||
|
||||
preset[2] = gPrefs->Read(wxT("/CsPresets/ClickThresholdLevel"), 200L);
|
||||
preset[3] = gPrefs->Read(wxT("/CsPresets/ClickWidth"), 20L);
|
||||
preset[4] = gPrefs->Read(wxT("/CsPresets/LevellerDbChoiceIndex"), 10L);
|
||||
preset[5] = gPrefs->Read(wxT("/CsPresets/LevellerNumPasses"), 2L);
|
||||
preset[6] = gPrefs->Read(wxT("/CsPresets/Noise_Level"), 3L);
|
||||
preset[7] = gPrefs->Read(wxT("/CsPresets/Norm_AmpDbGain"), 1L);
|
||||
preset[8] = gPrefs->Read(wxT("/CsPresets/Norm_RemoveDcOffset"), 1L);
|
||||
preset[9] = gPrefs->Read(wxT("/CsPresets/SpikeDbChoiceIndex"), 13L);
|
||||
preset[10] = gPrefs->Read(wxT("/CsPresets/SpikeMaxDurationMs"), SKIP_EFFECT_MILLISECOND);
|
||||
preset[11] = gPrefs->Read(wxT("/Effects/TruncateSilence/DbChoiceIndex"), 8L);
|
||||
preset[12] = gPrefs->Read(wxT("/Effects/TruncateSilence/LongestAllowedSilentMs"), 1000L);
|
||||
// preset[14] = gPrefs->Read(wxT("/GUI/Save128HqMasterAfter"), 0L);
|
||||
// preset[15] = gPrefs->Read(wxT("/GUI/Save128HqMasterBefore"), 0L);
|
||||
|
||||
int expectedCount = wxGetApp().GetCleanSpeechNoiseGateExpectedCount();
|
||||
float* pNoiseGate = wxGetApp().GetCleanSpeechNoiseGate();
|
||||
double noiseGateSum = 0.0;
|
||||
int lenNoiseGate = expectedCount / sizeof(float);
|
||||
for (int i = 0; i < lenNoiseGate; ++i) {
|
||||
noiseGateSum += fabs(pNoiseGate[i]);
|
||||
}
|
||||
int noiseCheckSum = abs((int)noiseGateSum);
|
||||
preset[13] = noiseCheckSum;
|
||||
gPrefs->Write(wxT("/Validate/NoiseGateSum"), noiseCheckSum);
|
||||
gPrefs->Flush();
|
||||
|
||||
int lenPreset = sizeof(preset);
|
||||
int count = presetsFile.Write(preset, lenPreset);
|
||||
// ANSWER-ME: Vigilant Sentry notes "count" is unused after this assignment.
|
||||
// Should be checked against expectedCount -- but CleanSpeech is going away!!! ;-)
|
||||
count = presetsFile.Write(pNoiseGate, expectedCount);
|
||||
|
||||
presetsFile.Close();
|
||||
}
|
||||
else {
|
||||
wxMessageBox(_("Problem encountered exporting presets."),
|
||||
_("Unable to Export"),
|
||||
wxOK | wxICON_WARNING);
|
||||
fileOkay = false;
|
||||
continue;
|
||||
}
|
||||
} while(!fileOkay);
|
||||
}
|
||||
|
||||
void AudacityProject::OnImportCleanSpeechPresets()
|
||||
{
|
||||
wxString userdatadir = FileNames::DataDir();
|
||||
#ifdef __WXMSW__
|
||||
wxString presetsDefaultLoc = userdatadir + wxT("\\presets");
|
||||
#else
|
||||
wxString presetsDefaultLoc = userdatadir + wxT("/presets");
|
||||
#endif
|
||||
|
||||
wxString path = gPrefs->Read(wxT("/Directories/PresetsDir"), presetsDefaultLoc);
|
||||
wxString extension = wxT(".csp");
|
||||
wxString fName;
|
||||
bool fileOkay;
|
||||
|
||||
do {
|
||||
fileOkay = true;
|
||||
|
||||
fName = FileSelector(wxT("Open CleanSpeech Preset File:"),
|
||||
path,
|
||||
wxT("*.csp"), // default file name
|
||||
extension,
|
||||
wxT("CleanSpeech Presets (*.csp)|*.csp"),
|
||||
wxFD_OPEN | wxRESIZE_BORDER);
|
||||
|
||||
if (fName.empty()) { // if cancel selected
|
||||
return;
|
||||
}
|
||||
wxFFile presetsFile(fName, wxT("rb"));
|
||||
bool flag = presetsFile.IsOpened();
|
||||
if (flag == true) {
|
||||
int preset[PRESET_COUNT];
|
||||
int lenPreset = sizeof(preset);
|
||||
int count = presetsFile.Read(preset, lenPreset);
|
||||
if (preset[0] != PRESET_FORMAT) {
|
||||
wxMessageBox(wxString::Format(wxT("Preset may be invalid or corrupted.\nExpected format %d ... found %d"), PRESET_FORMAT, preset[0]),
|
||||
wxT("Error opening preset"),
|
||||
wxOK | wxCENTRE | wxICON_WARNING, this);
|
||||
return;
|
||||
}
|
||||
int expectedCount = wxGetApp().GetCleanSpeechNoiseGateExpectedCount();
|
||||
float* pNoiseGate = wxGetApp().GetCleanSpeechNoiseGate();
|
||||
// ANSWER-ME: Vigilant Sentry notes "count" is unused after this assignment.
|
||||
// Should be checked against expectedCount -- but CleanSpeech is going away!!! ;-)
|
||||
count = presetsFile.Read(pNoiseGate, expectedCount);
|
||||
|
||||
gPrefs->Write(wxT("/CsPresets/ClickThresholdLevel"), preset[2]);
|
||||
gPrefs->Write(wxT("/CsPresets/ClickWidth"), preset[3]);
|
||||
gPrefs->Write(wxT("/CsPresets/LevellerDbChoiceIndex"), preset[4]);
|
||||
gPrefs->Write(wxT("/CsPresets/LevellerNumPasses"), preset[5]);
|
||||
gPrefs->Write(wxT("/CsPresets/Noise_Level"), preset[6]);
|
||||
gPrefs->Write(wxT("/CsPresets/Norm_AmpDbGain"), preset[7]);
|
||||
gPrefs->Write(wxT("/CsPresets/Norm_RemoveDcOffset"), preset[8]);
|
||||
gPrefs->Write(wxT("/CsPresets/SpikeDbChoiceIndex"), preset[9]);
|
||||
gPrefs->Write(wxT("/CsPresets/SpikeMaxDurationMs"), preset[10]);
|
||||
gPrefs->Write(wxT("/Effects/TruncateSilence/DbChoiceIndex"), preset[11]);
|
||||
gPrefs->Write(wxT("/Effects/TruncateSilence/LongestAllowedSilentMs"), preset[12]);
|
||||
// gPrefs->Write(wxT("/GUI/Save128HqMasterAfter"), preset[14]);
|
||||
// gPrefs->Write(wxT("/GUI/Save128HqMasterBefore"), preset[15]);
|
||||
gPrefs->Flush();
|
||||
|
||||
double noiseGateSum = 0.0;
|
||||
int lenNoiseGate = expectedCount / sizeof(float);
|
||||
for (int i = 0; i < lenNoiseGate; ++i) {
|
||||
noiseGateSum += fabs(pNoiseGate[i]);
|
||||
}
|
||||
preset[13] = abs((int)noiseGateSum);
|
||||
|
||||
presetsFile.Close();
|
||||
}
|
||||
else {
|
||||
wxMessageBox(wxT("Problem encountered importing presets."),
|
||||
wxT("Unable to import"),
|
||||
wxOK | wxICON_WARNING);
|
||||
fileOkay = false;
|
||||
continue;
|
||||
}
|
||||
} while(!fileOkay);
|
||||
}
|
||||
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
void AudacityProject::OnApplyChain()
|
||||
{
|
||||
|
@ -354,17 +354,8 @@ void OnProcessEffect(int index);
|
||||
void OnProcessPlugin(int index);
|
||||
void OnAnalyzeEffect(int index);
|
||||
void OnAnalyzePlugin(int index);
|
||||
|
||||
//lda CleanSpeech Menu //CLEANSPEECH
|
||||
|
||||
void OnApplyChain();
|
||||
void OnEditChains();
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
void OnImportCleanSpeechPresets();
|
||||
void OnExportCleanSpeechPresets();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
void OnStereoToMono(int index);
|
||||
wxString BuildCleanFileName(wxString fileName, wxString extension);
|
||||
|
||||
|
@ -740,9 +740,6 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
|
||||
mAudioIOToken(-1),
|
||||
mIsDeleting(false),
|
||||
mTracksFitVerticallyZoomed(false), //lda
|
||||
#ifdef CLEANSPEECH
|
||||
mCleanSpeechMode(false), //lda
|
||||
#endif // CLEANSPEECH
|
||||
mShowId3Dialog(true), //lda
|
||||
mLastFocusedWindow(NULL),
|
||||
mKeyboardCaptured(NULL),
|
||||
@ -1020,12 +1017,6 @@ void AudacityProject::UpdatePrefsVariables()
|
||||
{
|
||||
gPrefs->Read(wxT("/AudioFiles/ShowId3Dialog"), &mShowId3Dialog, true);
|
||||
gPrefs->Read(wxT("/AudioFiles/NormalizeOnLoad"),&mNormalizeOnLoad, false);
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
//gPrefs->Read(wxT("/Batch/CleanSpeechMode"), &mCleanSpeechMode, false);
|
||||
mCleanSpeechMode = false;
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
gPrefs->Read(wxT("/GUI/AutoScroll"), &mViewInfo.bUpdateTrackIndicator, true);
|
||||
gPrefs->Read(wxT("/GUI/EmptyCanBeDirty"), &mEmptyCanBeDirty, true );
|
||||
gPrefs->Read(wxT("/GUI/Help"), &mHelpPref, wxT("InBrowser") );
|
||||
@ -1166,11 +1157,7 @@ void AudacityProject::SetProjectTitle()
|
||||
wxString name = GetName();
|
||||
if( name.IsEmpty() )
|
||||
{
|
||||
#ifdef CLEANSPEECH
|
||||
name = mCleanSpeechMode ? wxT("Audacity CleanSpeech") : wxT("Audacity");
|
||||
#else
|
||||
name = wxT("Audacity");
|
||||
#endif // CLEANSPEECH
|
||||
}
|
||||
|
||||
if (mIsRecovered)
|
||||
@ -3102,20 +3089,6 @@ bool AudacityProject::Save(bool overwrite /* = true */ ,
|
||||
return false;
|
||||
mImportedDependencies = false; // do not show again
|
||||
}
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
//TIDY-ME: CleanSpeechMode could be split into a number of prefs?
|
||||
// For example, this could be a preference to only work
|
||||
// with wav files.
|
||||
//
|
||||
// CleanSpeechMode tries hard to ignore project files
|
||||
// and just work with .Wav, so does an export on a save.
|
||||
if( mCleanSpeechMode )
|
||||
{
|
||||
Exporter e;
|
||||
return e.Process(this, false, 0.0, mTracks->GetEndTime());
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
}
|
||||
|
||||
//
|
||||
@ -3530,25 +3503,10 @@ bool AudacityProject::SaveAs(bool bWantSaveCompressed /*= false*/)
|
||||
wxString path = wxPathOnly(mFileName);
|
||||
wxString fName;
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
wxString ext = mCleanSpeechMode ? wxT(".wav") : wxT(".aup");
|
||||
#else // CLEANSPEECH
|
||||
wxString ext = wxT(".aup");
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
fName = GetName().Len()? GetName() + ext : wxString(wxT(""));
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if( mCleanSpeechMode )
|
||||
{
|
||||
fName = FileSelector(_("Save Speech As:"),
|
||||
path, fName, wxT(""),
|
||||
/* i18n-hint: Do not translate PCM.*/
|
||||
_("Windows PCM Audio file (*.wav)|*.wav"), //lda
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxRESIZE_BORDER, this);
|
||||
}
|
||||
else
|
||||
{
|
||||
wxString sProjName = this->GetName();
|
||||
if (sProjName.IsEmpty())
|
||||
sProjName = _("<untitled>");
|
||||
@ -3575,35 +3533,6 @@ bool AudacityProject::SaveAs(bool bWantSaveCompressed /*= false*/)
|
||||
// We disallow overwrite because we would have to delete the many
|
||||
// smaller files too, or prompt to move them.
|
||||
wxFD_SAVE | wxRESIZE_BORDER, this);
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
wxString sProjName = this->GetName();
|
||||
if (sProjName.IsEmpty())
|
||||
sProjName = _("<untitled>");
|
||||
wxString sDialogTitle;
|
||||
if (bWantSaveCompressed)
|
||||
{
|
||||
ShowWarningDialog(this, wxT("FirstProjectSave"),
|
||||
_("Audacity compressed project files (.aup) save your work in a smaller, compressed (.ogg) format. \nCompressed project files are a good way to transmit your project online, because they are much smaller. \nTo open a compressed project takes longer than usual, as it imports each compressed track. \n\nMost other programs can't open Audacity project files.\nWhen you want to save a file that can be opened by other programs, select one of the\nExport commands."));
|
||||
sDialogTitle.Printf(_("Save Compressed Project \"%s\" As..."), sProjName.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowWarningDialog(this, wxT("FirstProjectSave"),
|
||||
_("You are saving an Audacity project file (.aup).\n\nSaving a project creates a file that only Audacity can open.\n\nTo save an audio file for other programs, use one of the \"File > Export\" commands.\n"));
|
||||
sDialogTitle.Printf(_("Save Project \"%s\" As..."), sProjName.c_str());
|
||||
}
|
||||
|
||||
fName = FileSelector(
|
||||
sDialogTitle,
|
||||
path, fName, wxT(""),
|
||||
_("Audacity projects") + static_cast<wxString>(wxT(" (*.aup)|*.aup")),
|
||||
// JKC: I removed 'wxFD_OVERWRITE_PROMPT' because we are checking
|
||||
// for overwrite ourselves later, and we disallow it.
|
||||
// We disallow overwrite because we would have to delete the many
|
||||
// smaller files too, or prompt to move them.
|
||||
wxFD_SAVE | wxRESIZE_BORDER, this);
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
if (fName == wxT(""))
|
||||
return false;
|
||||
|
@ -222,11 +222,6 @@ class AUDACITY_DLL_API AudacityProject: public wxFrame,
|
||||
bool GetShowId3Dialog() { return mShowId3Dialog; } //lda
|
||||
void SetShowId3Dialog(bool flag) { mShowId3Dialog = flag; } //lda
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
bool GetCleanSpeechMode() { return mCleanSpeechMode; } //lda
|
||||
void SetCleanSpeechMode(bool flag) { mCleanSpeechMode = flag; } //lda
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
bool GetNormalizeOnLoad() { return mNormalizeOnLoad; } //lda
|
||||
void SetNormalizeOnLoad(bool flag) { mNormalizeOnLoad = flag; } //lda
|
||||
|
||||
@ -516,9 +511,6 @@ class AUDACITY_DLL_API AudacityProject: public wxFrame,
|
||||
bool mIsDeleting;
|
||||
bool mTracksFitVerticallyZoomed; //lda
|
||||
bool mNormalizeOnLoad; //lda
|
||||
#ifdef CLEANSPEECH
|
||||
bool mCleanSpeechMode; //lda
|
||||
#endif // CLEANSPEECH
|
||||
bool mShowId3Dialog; //lda
|
||||
bool mEmptyCanBeDirty;
|
||||
bool mSelectAllOnNone;
|
||||
|
@ -75,18 +75,6 @@ EffectClickRemoval::~EffectClickRemoval()
|
||||
|
||||
bool EffectClickRemoval::Init()
|
||||
{
|
||||
#ifdef CLEANSPEECH
|
||||
mThresholdLevel = gPrefs->Read(wxT("/CsPresets/ClickThresholdLevel"), 200);
|
||||
if ((mThresholdLevel < MIN_THRESHOLD) || (mThresholdLevel > MAX_THRESHOLD)) { // corrupted Prefs?
|
||||
mThresholdLevel = 0; //Off-skip
|
||||
gPrefs->Write(wxT("/CsPresets/ClickThresholdLevel"), mThresholdLevel);
|
||||
}
|
||||
mClickWidth = gPrefs->Read(wxT("/CsPresets/ClickWidth"), 20);
|
||||
if ((mClickWidth < MIN_CLICK_WIDTH) || (mClickWidth > MAX_CLICK_WIDTH)) { // corrupted Prefs?
|
||||
mClickWidth = 0; //Off-skip
|
||||
gPrefs->Write(wxT("/CsPresets/ClickWidth"), mClickWidth);
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
mThresholdLevel = gPrefs->Read(wxT("/Effects/ClickRemoval/ClickThresholdLevel"), 200);
|
||||
if ((mThresholdLevel < MIN_THRESHOLD) || (mThresholdLevel > MAX_THRESHOLD)) { // corrupted Prefs?
|
||||
mThresholdLevel = 0; //Off-skip
|
||||
@ -97,7 +85,6 @@ bool EffectClickRemoval::Init()
|
||||
mClickWidth = 0; //Off-skip
|
||||
gPrefs->Write(wxT("/Effects/ClickRemoval/ClickWidth"), mClickWidth);
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
return gPrefs->Flush();
|
||||
}
|
||||
|
||||
@ -123,13 +110,8 @@ bool EffectClickRemoval::PromptUser()
|
||||
mThresholdLevel = dlog.mThresh;
|
||||
mClickWidth = dlog.mWidth;
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
gPrefs->Write(wxT("/CsPresets/ClickThresholdLevel"), mThresholdLevel);
|
||||
gPrefs->Write(wxT("/CsPresets/ClickWidth"), mClickWidth);
|
||||
#else // CLEANSPEECH
|
||||
gPrefs->Write(wxT("/Effects/ClickRemoval/ClickThresholdLevel"), mThresholdLevel);
|
||||
gPrefs->Write(wxT("/Effects/ClickRemoval/ClickWidth"), mClickWidth);
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
return gPrefs->Flush();
|
||||
}
|
||||
|
@ -34,10 +34,10 @@ class TimeWarper;
|
||||
// ADVANCED_EFFECT was introduced for Lynn Allan's 'CleanSpeech'
|
||||
// it allows the list of effects to be filtered to exclude
|
||||
// the advanced effects.
|
||||
// Left in when CLEANSPEECH is removed, as it may be useful at some point.
|
||||
// Left in when CLEANSPEECH was removed, as it may be useful at some point.
|
||||
#define ADVANCED_EFFECT 0x0004
|
||||
// HIDDEN_EFFECT allows an item to be excluded from the effects
|
||||
// menu in both CleanSpeech and in normal builds. // CLEANSPEECH ??
|
||||
// menu
|
||||
#define HIDDEN_EFFECT 0x0008
|
||||
|
||||
#define INSERT_EFFECT 0x0010
|
||||
|
@ -47,18 +47,6 @@ EffectLeveller::EffectLeveller()
|
||||
|
||||
bool EffectLeveller::Init()
|
||||
{
|
||||
#ifdef CLEANSPEECH
|
||||
mLevellerNumPasses = gPrefs->Read(wxT("/CsPresets/LevellerNumPasses"), 2L) ;
|
||||
if ((mLevellerNumPasses <= 0) || (mLevellerNumPasses > NUM_PASSES_CHOICES)) { // corrupted Prefs?
|
||||
mLevellerNumPasses = 1;
|
||||
gPrefs->Write(wxT("/CsPresets/LevellerNumPasses"), 1);
|
||||
}
|
||||
mLevellerDbChoiceIndex = gPrefs->Read(wxT("/CsPresets/LevellerDbChoiceIndex"), 10L);
|
||||
if ((mLevellerDbChoiceIndex < 0) || (mLevellerDbChoiceIndex >= Enums::NumDbChoices)) { // corrupted Prefs?
|
||||
mLevellerDbChoiceIndex = 0; //Least dB
|
||||
gPrefs->Write(wxT("/CsPresets/LevellerDbChoiceIndex"), mLevellerDbChoiceIndex);
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
mLevellerNumPasses = gPrefs->Read(wxT("/Effects/Leveller/LevellerNumPasses"), 2L) ;
|
||||
if ((mLevellerNumPasses <= 0) || (mLevellerNumPasses > NUM_PASSES_CHOICES)) { // corrupted Prefs?
|
||||
mLevellerNumPasses = 1;
|
||||
@ -69,7 +57,6 @@ bool EffectLeveller::Init()
|
||||
mLevellerDbChoiceIndex = 0; //Least dB
|
||||
gPrefs->Write(wxT("/Effects/Leveller/LevellerDbChoiceIndex"), mLevellerDbChoiceIndex);
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
gPrefs->Flush();
|
||||
|
||||
mLevellerDbSilenceThreshold = Enums::Db2Signal[mLevellerDbChoiceIndex];
|
||||
@ -145,13 +132,9 @@ bool EffectLeveller::PromptUser()
|
||||
mLevellerNumPasses = dlog.mLevellerNumPassesChoicIndex+1;
|
||||
mLevellerDbChoiceIndex = dlog.mLevellerDbChoiceIndex;
|
||||
mLevellerDbSilenceThreshold = Enums::Db2Signal[mLevellerDbChoiceIndex];
|
||||
#ifdef CLEANSPEECH
|
||||
gPrefs->Write(wxT("/CsPresets/LevellerDbChoiceIndex"), mLevellerDbChoiceIndex);
|
||||
gPrefs->Write(wxT("/CsPresets/LevellerNumPasses"), mLevellerNumPasses);
|
||||
#else // CLEANSPEECH
|
||||
|
||||
gPrefs->Write(wxT("/Effects/Leveller/LevellerDbChoiceIndex"), mLevellerDbChoiceIndex);
|
||||
gPrefs->Write(wxT("/Effects/Leveller/LevellerNumPasses"), mLevellerNumPasses);
|
||||
#endif // CLEANSPEECH
|
||||
gPrefs->Flush();
|
||||
|
||||
CalcLevellerFactors();
|
||||
|
@ -81,18 +81,6 @@ EffectNoiseRemoval::EffectNoiseRemoval()
|
||||
mWindowSize = 2048;
|
||||
mSpectrumSize = 1 + mWindowSize / 2;
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
gPrefs->Read(wxT("/CsPresets/NoiseSensitivity"),
|
||||
&mSensitivity, 0.0);
|
||||
gPrefs->Read(wxT("/CsPresets/NoiseGain"),
|
||||
&mNoiseGain, -24.0);
|
||||
gPrefs->Read(wxT("/CsPresets/NoiseFreqSmoothing"),
|
||||
&mFreqSmoothingHz, 150.0);
|
||||
gPrefs->Read(wxT("/CsPresets/NoiseAttackDecayTime"),
|
||||
&mAttackDecayTime, 0.15);
|
||||
gPrefs->Read(wxT("/CsPresets/NoiseLeaveNoise"),
|
||||
&mbLeaveNoise, false);
|
||||
#else // CLEANSPEECH
|
||||
gPrefs->Read(wxT("/Effects/NoiseRemoval/NoiseSensitivity"),
|
||||
&mSensitivity, 0.0);
|
||||
gPrefs->Read(wxT("/Effects/NoiseRemoval/NoiseGain"),
|
||||
@ -103,7 +91,6 @@ EffectNoiseRemoval::EffectNoiseRemoval()
|
||||
&mAttackDecayTime, 0.15);
|
||||
gPrefs->Read(wxT("/Effects/NoiseRemoval/NoiseLeaveNoise"),
|
||||
&mbLeaveNoise, false);
|
||||
#endif // CLEANSPEECH
|
||||
// mbLeaveNoise = false;
|
||||
|
||||
|
||||
@ -113,14 +100,6 @@ EffectNoiseRemoval::EffectNoiseRemoval()
|
||||
|
||||
mNoiseThreshold = new float[mSpectrumSize];
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
// This sequence is safe, even if not in CleanSpeechMode
|
||||
wxGetApp().SetCleanSpeechNoiseGate(mNoiseThreshold);
|
||||
wxGetApp().SetCleanSpeechNoiseGateExpectedCount(
|
||||
mSpectrumSize * sizeof(float));
|
||||
CleanSpeechMayReadNoisegate();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
Init();
|
||||
}
|
||||
|
||||
@ -129,115 +108,14 @@ EffectNoiseRemoval::~EffectNoiseRemoval()
|
||||
delete [] mNoiseThreshold;
|
||||
}
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
void EffectNoiseRemoval::CleanSpeechMayReadNoisegate()
|
||||
{
|
||||
int halfWindowSize = mWindowSize / 2;
|
||||
|
||||
//lda-131a always try to get noisegate.nrp if in CleanSpeechMode
|
||||
// and it exists
|
||||
AudacityProject * project = GetActiveProject();
|
||||
if (project == NULL) {
|
||||
//int mode = gPrefs->Read(wxT("/Batch/CleanSpeechMode"), 0L);
|
||||
int mode = 0;
|
||||
if (mode == 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Try to open the file.
|
||||
if( !wxDirExists( FileNames::NRPDir() ))
|
||||
return;
|
||||
|
||||
// if file doesn't exist, return quietly.
|
||||
wxString fileName = FileNames::NRPFile();
|
||||
if( !wxFileExists( fileName ))
|
||||
return;
|
||||
|
||||
wxFFile noiseGateFile(fileName, wxT("rb"));
|
||||
bool flag = noiseGateFile.IsOpened();
|
||||
if (flag != true)
|
||||
return;
|
||||
|
||||
// Now get its data.
|
||||
int expectedCount = halfWindowSize * sizeof(float);
|
||||
int count = noiseGateFile.Read(mNoiseThreshold, expectedCount);
|
||||
noiseGateFile.Close();
|
||||
if (count == expectedCount) {
|
||||
for (int i = halfWindowSize; i < mSpectrumSize; ++i) {
|
||||
mNoiseThreshold[i] = float(0.0); // only partly filled by Read?
|
||||
}
|
||||
mHasProfile = true;
|
||||
mDoProfile = false;
|
||||
}
|
||||
}
|
||||
|
||||
void EffectNoiseRemoval::CleanSpeechMayWriteNoiseGate()
|
||||
{
|
||||
AudacityProject * project = GetActiveProject();
|
||||
if( !project || !project->GetCleanSpeechMode() )
|
||||
return;
|
||||
|
||||
// code borrowed from ThemeBase::SaveComponents() - MJS
|
||||
// IF directory doesn't exist THEN create it
|
||||
if( !wxDirExists( FileNames::NRPDir() ))
|
||||
{
|
||||
/// \bug 1 in wxWidgets documentation; wxMkDir returns false if
|
||||
/// directory didn't exist, even if it successfully creates it.
|
||||
/// so we create and then test if it exists instead.
|
||||
/// \bug 2 in wxWidgets documentation; wxMkDir has only one argument
|
||||
/// under MSW
|
||||
#ifdef __WXMSW__
|
||||
wxMkDir( FileNames::NRPDir().fn_str() );
|
||||
#else
|
||||
wxMkDir( FileNames::NRPDir().fn_str(), 0700 );
|
||||
#endif
|
||||
if( !wxDirExists( FileNames::NRPDir() ))
|
||||
{
|
||||
wxMessageBox(
|
||||
wxString::Format(
|
||||
_("Could not create directory:\n %s"),
|
||||
FileNames::NRPDir().c_str() ));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
wxString fileName = FileNames::NRPFile();
|
||||
fileName = PlatformCompatibility::GetLongFileName(fileName);
|
||||
wxFFile noiseGateFile(fileName, wxT("wb"));
|
||||
bool flag = noiseGateFile.IsOpened();
|
||||
if (flag == true) {
|
||||
int expectedCount = (mWindowSize / 2) * sizeof(float);
|
||||
// FIX-ME: Should we check return value on Write?
|
||||
noiseGateFile.Write(mNoiseThreshold, expectedCount);
|
||||
noiseGateFile.Close();
|
||||
}
|
||||
else {
|
||||
wxMessageBox(
|
||||
wxString::Format(
|
||||
_("Could not open file:\n %s"), fileName.c_str() ));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
#define MAX_NOISE_LEVEL 30
|
||||
bool EffectNoiseRemoval::Init()
|
||||
{
|
||||
#ifdef CLEANSPEECH
|
||||
mLevel = gPrefs->Read(wxT("/CsPresets/Noise_Level"), 3L);
|
||||
if ((mLevel < 0) || (mLevel > MAX_NOISE_LEVEL)) { // corrupted Prefs?
|
||||
mLevel = 0; //Off-skip
|
||||
gPrefs->Write(wxT("/CsPresets/Noise_Level"), mLevel);
|
||||
}
|
||||
#else // CLEANSPEECH
|
||||
mLevel = gPrefs->Read(wxT("/Effects/NoiseRemoval/Noise_Level"), 3L);
|
||||
if ((mLevel < 0) || (mLevel > MAX_NOISE_LEVEL)) { // corrupted Prefs?
|
||||
mLevel = 0; //Off-skip
|
||||
gPrefs->Write(wxT("/Effects/NoiseRemoval/Noise_Level"), mLevel);
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
return gPrefs->Flush();
|
||||
}
|
||||
|
||||
@ -258,15 +136,6 @@ bool EffectNoiseRemoval::PromptUser()
|
||||
dlog.mKeepSignal->SetValue(!mbLeaveNoise);
|
||||
dlog.mKeepNoise->SetValue(mbLeaveNoise);
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if( !mHasProfile )
|
||||
{
|
||||
AudacityProject * p = GetActiveProject();
|
||||
if (p->GetCleanSpeechMode())
|
||||
CleanSpeechMayReadNoisegate();
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
// We may want to twiddle the levels if we are setting
|
||||
// from an automation dialog, the only case in which we can
|
||||
// get here without any wavetracks.
|
||||
@ -294,19 +163,12 @@ bool EffectNoiseRemoval::PromptUser()
|
||||
mFreqSmoothingHz = dlog.mFreq;
|
||||
mAttackDecayTime = dlog.mTime;
|
||||
mbLeaveNoise = dlog.mbLeaveNoise;
|
||||
#ifdef CLEANSPEECH
|
||||
gPrefs->Write(wxT("/CsPresets/NoiseSensitivity"), mSensitivity);
|
||||
gPrefs->Write(wxT("/CsPresets/NoiseGain"), mNoiseGain);
|
||||
gPrefs->Write(wxT("/CsPresets/NoiseFreqSmoothing"), mFreqSmoothingHz);
|
||||
gPrefs->Write(wxT("/CsPresets/NoiseAttackDecayTime"), mAttackDecayTime);
|
||||
gPrefs->Write(wxT("/CsPresets/NoiseLeaveNoise"), mbLeaveNoise);
|
||||
#else // CLEANSPEECH
|
||||
|
||||
gPrefs->Write(wxT("/Effects/NoiseRemoval/NoiseSensitivity"), mSensitivity);
|
||||
gPrefs->Write(wxT("/Effects/NoiseRemoval/NoiseGain"), mNoiseGain);
|
||||
gPrefs->Write(wxT("/Effects/NoiseRemoval/NoiseFreqSmoothing"), mFreqSmoothingHz);
|
||||
gPrefs->Write(wxT("/Effects/NoiseRemoval/NoiseAttackDecayTime"), mAttackDecayTime);
|
||||
gPrefs->Write(wxT("/Effects/NoiseRemoval/NoiseLeaveNoise"), mbLeaveNoise);
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
mDoProfile = (dlog.GetReturnCode() == 1);
|
||||
return gPrefs->Flush();
|
||||
@ -322,19 +184,6 @@ bool EffectNoiseRemoval::TransferParameters( Shuttle & shuttle )
|
||||
|
||||
bool EffectNoiseRemoval::Process()
|
||||
{
|
||||
#ifdef CLEANSPEECH
|
||||
if (!mDoProfile && !mHasProfile)
|
||||
CleanSpeechMayReadNoisegate();
|
||||
|
||||
// If we still don't have a profile we have a problem.
|
||||
// This should only happen in CleanSpeech.
|
||||
if(!mDoProfile && !mHasProfile) {
|
||||
wxMessageBox(
|
||||
_("Attempt to run Noise Removal without a noise profile.\n"));
|
||||
return false;
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
Initialize();
|
||||
|
||||
// This same code will both remove noise and profile it,
|
||||
@ -367,9 +216,6 @@ bool EffectNoiseRemoval::Process()
|
||||
}
|
||||
|
||||
if (bGoodResult && mDoProfile) {
|
||||
#ifdef CLEANSPEECH
|
||||
CleanSpeechMayWriteNoiseGate();
|
||||
#endif // CLEANSPEECH
|
||||
mHasProfile = true;
|
||||
mDoProfile = false;
|
||||
}
|
||||
@ -890,45 +736,10 @@ void NoiseRemovalDialog::PopulateOrExchange(ShuttleGui & S)
|
||||
wxString step2Label;
|
||||
wxString step2Prompt;
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
bool bCleanSpeechMode = false;
|
||||
|
||||
AudacityProject * project = GetActiveProject();
|
||||
if( project && project->GetCleanSpeechMode() ) {
|
||||
bCleanSpeechMode = true;
|
||||
}
|
||||
|
||||
if (bCleanSpeechMode) {
|
||||
// We're not marking these as translatable because most people
|
||||
// don't use CleanSpeech so it'd be a waste of time for most
|
||||
// translators
|
||||
step1Label = wxT("Preparation Step");
|
||||
step1Prompt = wxT("Listen carefully to section with some speech "
|
||||
wxT("and some silence to check before/after.\n")
|
||||
wxT("Select a few seconds of just noise ('thinner' ")
|
||||
wxT("part of wave pattern usually between\nspoken ")
|
||||
wxT("phrases or during pauses) so Audacity knows ")
|
||||
wxT("what to filter out, then click"));
|
||||
step2Label = wxT("Actually Remove Noise");
|
||||
step2Prompt = wxT("Select what part of the audio you want filtered "
|
||||
wxT("(Ctrl-A = All), chose how much noise\nyou want ")
|
||||
wxT("filtered out with sliders below, and then click ")
|
||||
wxT("'OK' to remove noise.\nFind best setting with ")
|
||||
wxT("Ctrl-Z to Undo, Select All, and change ")
|
||||
wxT("the slider positions."));
|
||||
}
|
||||
else {
|
||||
step1Label = _("Step 1");
|
||||
step1Prompt = _("Select a few seconds of just noise so Audacity knows what to filter out,\nthen click Get Noise Profile:");
|
||||
step2Label = _("Step 2");
|
||||
step2Prompt = _("Select all of the audio you want filtered, choose how much noise you want\nfiltered out, and then click 'OK' to remove noise.\n");
|
||||
}
|
||||
#else
|
||||
step1Label = _("Step 1");
|
||||
step1Prompt = _("Select a few seconds of just noise so Audacity knows what to filter out,\nthen click Get Noise Profile:");
|
||||
step2Label = _("Step 2");
|
||||
step2Prompt = _("Select all of the audio you want filtered, choose how much noise you want\nfiltered out, and then click 'OK' to remove noise.\n");
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
S.StartHorizontalLay(wxCENTER, false);
|
||||
{
|
||||
|
@ -62,10 +62,6 @@ public:
|
||||
virtual bool Process();
|
||||
|
||||
private:
|
||||
#ifdef CLEANSPEECH
|
||||
void CleanSpeechMayReadNoisegate();
|
||||
void CleanSpeechMayWriteNoiseGate();
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
bool mDoProfile;
|
||||
bool mHasProfile;
|
||||
|
@ -44,12 +44,6 @@
|
||||
BEGIN_EVENT_TABLE(BatchPrefs, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
enum { CleanSpeechID,
|
||||
MP3ConversionID,
|
||||
};
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
/// Constructor
|
||||
BatchPrefs::BatchPrefs(wxWindow * parent):
|
||||
PrefsPanel(parent, _("Batch"))
|
||||
@ -80,10 +74,6 @@ void BatchPrefs::PopulateOrExchange( ShuttleGui & S )
|
||||
S.TieCheckBox( _("&Don't apply effects in batch mode"),
|
||||
wxT("/Batch/Debug"), false);
|
||||
#endif
|
||||
#ifdef CLEANSPEECH
|
||||
// S.TieCheckBox( _("Cl&eanSpeech Mode (Customized GUI)"),
|
||||
// wxT("/Batch/CleanSpeechMode"), false);
|
||||
#endif // CLEANSPEECH
|
||||
}
|
||||
S.EndStatic();
|
||||
S.EndHorizontalLay();
|
||||
@ -91,36 +81,12 @@ void BatchPrefs::PopulateOrExchange( ShuttleGui & S )
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
// This commented out code might be useful as a first step if we want an immediate response to
|
||||
// switching in and out of CleanSpeech mode.
|
||||
// As things currently stand, the batch commands available will NOT reflect changes in
|
||||
// CleanSpeech mode until we close and reopen the preferences dialog.
|
||||
#if 0
|
||||
int mode;
|
||||
AudacityProject *proj = GetActiveProject();
|
||||
mode = gPrefs->Read(wxT("/Batch/CleanSpeechMode"), 1L);
|
||||
proj->GetControlToolBar()->SetCleanSpeechMode(mode == 1);
|
||||
#endif
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
/// Send changed values back to Prefs, and update Audacity.
|
||||
bool BatchPrefs::Apply()
|
||||
{
|
||||
ShuttleGui S( this, eIsSavingToPrefs );
|
||||
PopulateOrExchange( S );
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
unsigned mode;
|
||||
//mode = gPrefs->Read(wxT("/Batch/CleanSpeechMode"), 1L);
|
||||
mode = 0;
|
||||
for(unsigned i=0; i<gAudacityProjects.GetCount(); i++)
|
||||
if(gAudacityProjects[i])
|
||||
{
|
||||
gAudacityProjects[i]->SetCleanSpeechMode(mode == 1);
|
||||
gAudacityProjects[i]->mToolManager->LayoutToolBars(); // Just to add/remove the CleanSpeech button.
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -133,21 +133,6 @@ void GUIPrefs::PopulateOrExchange(ShuttleGui & S)
|
||||
false);
|
||||
}
|
||||
S.EndStatic();
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
S.StartStatic(_("Modes"));
|
||||
{
|
||||
S.TieCheckBox(_("Clea&nSpeech Mode (Customized GUI)"),
|
||||
wxT("/Batch/CleanSpeechMode"),
|
||||
false);
|
||||
#ifdef __WXDEBUG__
|
||||
S.TieCheckBox(_("Don't a&pply effects in batch mode"),
|
||||
wxT("/Batch/Debug"),
|
||||
false);
|
||||
#endif
|
||||
}
|
||||
S.EndStatic();
|
||||
#endif // CLEANSPEECH
|
||||
}
|
||||
|
||||
bool GUIPrefs::Apply()
|
||||
|
@ -94,10 +94,6 @@ ControlToolBar::ControlToolBar()
|
||||
mCutPreviewTracks = NULL;
|
||||
|
||||
gPrefs->Read(wxT("/GUI/ErgonomicTransportButtons"), &mErgonomicTransportButtons, true);
|
||||
#ifdef CLEANSPEECH
|
||||
// gPrefs->Read(wxT("/Batch/CleanSpeechMode"), &mCleanSpeechMode, false);
|
||||
mCleanSpeechMode = false;
|
||||
#endif // CLEANSPEECH
|
||||
}
|
||||
|
||||
ControlToolBar::~ControlToolBar()
|
||||
@ -195,12 +191,6 @@ void ControlToolBar::Populate()
|
||||
mRecord = MakeButton(bmpRecord, bmpRecord, bmpRecordDisabled,
|
||||
ID_RECORD_BUTTON, true, _("Record"));
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
/* i18n-hint: (verb)*/
|
||||
// mBatch = MakeButton(bmpCleanSpeech, bmpCleanSpeech, bmpCleanSpeechDisabled,
|
||||
// ID_BATCH_BUTTON, false, _("Clean Speech"));
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
#if wxUSE_TOOLTIPS
|
||||
RegenerateToolsTooltips();
|
||||
wxToolTip::Enable(true);
|
||||
@ -237,17 +227,6 @@ void ControlToolBar::UpdatePrefs()
|
||||
updated = true;
|
||||
}
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
//gPrefs->Read( wxT("/Batch/CleanSpeechMode"), &active, false );
|
||||
|
||||
active = false;
|
||||
if( mCleanSpeechMode != active )
|
||||
{
|
||||
mCleanSpeechMode = active;
|
||||
updated = true;
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
if( updated )
|
||||
{
|
||||
ReCreateButtons();
|
||||
@ -309,12 +288,6 @@ void ControlToolBar::ArrangeButtons()
|
||||
mSizer->Add( mFF, 0, flags, 5 );
|
||||
}
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
// Add and possible hide the CleanSpeech button
|
||||
// mSizer->Add( mBatch, 0, flags | wxLEFT, 5 );
|
||||
// mSizer->Show( mBatch, mCleanSpeechMode );
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
// Layout the sizer
|
||||
mSizer->Layout();
|
||||
|
||||
@ -381,16 +354,6 @@ void ControlToolBar::EnableDisableButtons()
|
||||
mPlay->SetEnabled((!recording) || (tracks && !busy));
|
||||
mRecord->SetEnabled(!busy && !playing);
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
if (p && GetActiveProject()->GetCleanSpeechMode()) {
|
||||
bool canRecord = !tracks;
|
||||
canRecord &= !busy;
|
||||
canRecord &= ((numProjects == 0) || ((numProjects == 1) && !tracks));
|
||||
mRecord->SetEnabled(canRecord);
|
||||
//mBatch->SetEnabled(!busy && !recording);
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
mStop->SetEnabled(busy);
|
||||
mRewind->SetEnabled(tracks && !busy);
|
||||
mFF->SetEnabled(tracks && !busy);
|
||||
@ -772,20 +735,6 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
|
||||
return;
|
||||
}
|
||||
AudacityProject *p = GetActiveProject();
|
||||
#ifdef CLEANSPEECH
|
||||
if (p && p->GetCleanSpeechMode()) {
|
||||
size_t numProjects = gAudacityProjects.Count();
|
||||
if (!p->GetTracks()->IsEmpty() || (numProjects > 1)) {
|
||||
wxMessageBox(_("Recording in CleanSpeech mode is not possible when a track, or more than one project, is already open."),
|
||||
_("Recording not permitted"),
|
||||
wxOK | wxICON_INFORMATION,
|
||||
this);
|
||||
mRecord->PopUp();
|
||||
mRecord->Disable();
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
if( evt.GetInt() == 1 ) // used when called by keyboard shortcut. Default (0) ignored.
|
||||
mRecord->SetShift(true);
|
||||
|
@ -123,11 +123,6 @@ class ControlToolBar:public ToolBar {
|
||||
// Activate ergonomic order for transport buttons
|
||||
bool mErgonomicTransportButtons;
|
||||
|
||||
#ifdef CLEANSPEECH
|
||||
// Show/hide cleanspeech button
|
||||
bool mCleanSpeechMode;
|
||||
#endif // CLEANSPEECH
|
||||
|
||||
//wxBoxSizer *mBatchGroup;
|
||||
wxBoxSizer *mSizer;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user