1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 08:09:32 +02:00

270 lines
6.5 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
Nyquist.h
Dominic Mazzoni
**********************************************************************/
#ifndef __AUDACITY_EFFECT_NYQUIST__
#define __AUDACITY_EFFECT_NYQUIST__
#include <wx/button.h>
#include <wx/datetime.h>
#include <wx/dialog.h>
#include <wx/filename.h>
#include <wx/intl.h>
#include <wx/sizer.h>
#include <wx/slider.h>
#include <wx/stattext.h>
#include <wx/textctrl.h>
#include <wx/tokenzr.h>
#include "../Effect.h"
#include "nyx.h"
#include <string>
class NyqControl
{
public:
wxString var;
wxString name;
int type;
wxString label;
wxString valStr;
wxString lowStr;
wxString highStr;
double val;
double low;
double high;
int ticks;
};
#define NYQ_CTRL_INT 0
#define NYQ_CTRL_REAL 1
#define NYQ_CTRL_STRING 2
#define NYQ_CTRL_CHOICE 3
WX_DECLARE_USER_EXPORTED_OBJARRAY(NyqControl, NyqControlArray, AUDACITY_DLL_API);
class AUDACITY_DLL_API EffectNyquist:public Effect
{
public:
/** @param fName File name of the Nyquist script defining this effect. If
* an empty string, then prompt the user for the Nyquist code to interpret.
*/
EffectNyquist(wxString fName);
virtual ~EffectNyquist();
bool SetXlispPath();
bool LoadedNyFile() {
return mOK;
}
void Continue();
void Break();
void Stop();
void SetCommand(wxString cmd);
wxString GetOutput();
/** Get the name of the effect (taken from the script that is loaded). Note
* that this name is currently not translated because the translations system
* doesn't see the lisp files containing the Nyquist effect scripts.
* @return The name of the effect */
virtual wxString GetEffectName() {
return mName;
}
virtual std::set<wxString> GetEffectCategories() {
std::set<wxString> cats;
for (size_t i = 0; i < mCategories.GetCount(); i++) {
cats.insert(mCategories[i]);
}
return cats;
}
virtual wxString GetEffectIdentifier() {
if (mInteractive) {
// Disabled for now...
return wxT("");
}
wxStringTokenizer st(mName, wxT(" "));
wxString id;
// CamelCase the name
while (st.HasMoreTokens()) {
wxString tok = st.GetNextToken();
id += tok.Left(1).MakeUpper() + tok.Mid(1);
}
return id;
}
virtual wxString GetEffectAction() {
return mAction;
}
virtual bool PromptUser();
virtual bool Process();
private:
bool ProcessOne();
static int StaticGetCallback(float *buffer, int channel,
long start, long len, long totlen,
void *userdata);
static int StaticPutCallback(float *buffer, int channel,
long start, long len, long totlen,
void *userdata);
static void StaticOutputCallback(int c, void *userdata);
static void StaticOSCallback(void *userdata);
int GetCallback(float *buffer, int channel,
long start, long len, long totlen);
int PutCallback(float *buffer, int channel,
long start, long len, long totlen);
void OutputCallback(int c);
void OSCallback();
void Parse(wxString line);
void ParseFile();
wxString UnQuote(wxString s);
double GetCtrlValue(wxString s);
private:
wxString mXlispPath;
wxFileName mFileName; ///< Name of the Nyquist script file this effect is loaded from
wxDateTime mFileModified; ///< When the script was last modified on disk
bool mStop;
bool mBreak;
bool mCont;
bool mCompiler;
bool mIsSal;
bool mExternal;
/** True if the code to execute is obtained interactively from the user via
* the "Nyquist Prompt", false for all other effects (lisp code read from
* files)
*/
bool mInteractive;
bool mOK;
wxString mCmd;
wxString mName; ///< Name of the Effect
wxString mAction;
wxString mInfo;
bool mDebug;
std::string mDebugOutput;
NyqControlArray mControls;
int mCurNumChannels;
WaveTrack *mCurTrack[2];
sampleCount mCurStart[2];
sampleCount mCurLen;
bool mFirstInGroup;
double mOutputTime;
int mCount;
double mProgressIn;
double mProgressOut;
double mProgressTot;
double mScale;
samplePtr mCurBuffer[2];
sampleCount mCurBufferStart[2];
sampleCount mCurBufferLen[2];
WaveTrack *mOutputTrack[2];
wxArrayString mCategories;
};
class NyquistDialog:public wxDialog
{
public:
// constructors and destructors
NyquistDialog(wxWindow * parent, wxWindowID id,
const wxString & title,
wxString info,
NyqControlArray *controlArray);
private:
NyqControlArray *mControls;
bool mInHandler;
void OnText(wxCommandEvent & event);
void OnSlider(wxCommandEvent & event);
void OnChoice( wxCommandEvent &event );
void OnOk(wxCommandEvent & event);
void OnDebug(wxCommandEvent & event);
void OnCancel(wxCommandEvent & event);
private:
DECLARE_EVENT_TABLE()
};
class NyquistInputDialog:public wxDialog
{
public:
NyquistInputDialog(wxWindow * parent, wxWindowID id,
const wxString & title,
const wxString & prompt,
wxString initialCommand);
wxString GetCommand();
private:
wxTextCtrl *mCommandText;
void OnOk(wxCommandEvent & event);
void OnDebug(wxCommandEvent & event);
void OnCancel(wxCommandEvent & event);
private:
DECLARE_EVENT_TABLE()
};
class NyquistOutputDialog:public wxDialog
{
public:
NyquistOutputDialog(wxWindow * parent, wxWindowID id,
const wxString & title,
const wxString & prompt,
wxString message);
private:
void OnOk(wxCommandEvent & event);
private:
DECLARE_EVENT_TABLE()
};
#endif
// Indentation settings for Vim and Emacs and unique identifier for Arch, a
// version control system. Please do not modify past this point.
//
// Local Variables:
// c-basic-offset: 3
// indent-tabs-mode: nil
// End:
//
// vim: et sts=3 sw=3
// arch-tag: 869e264a-73b8-4c7b-ad9a-c66168e57ee5