51 #define DEFAULT_INPUT_DEV "Default Device"
52 #define DEFAULT_OUTPUT_DEV "Default Device"
54 #include "IPlugSWELL.h"
55 #define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) )
56 #define DEFAULT_INPUT_DEV "Built-in Input"
57 #define DEFAULT_OUTPUT_DEV "Built-in Output"
58#elif defined(OS_LINUX)
59 #include "IPlugSWELL.h"
68extern HINSTANCE gHINSTANCE;
72const int kNumBufferSizeOptions = 11;
73const std::string kBufferSizeOptions[kNumBufferSizeOptions] = {
"32",
"64",
"96",
"128",
"192",
"256",
"512",
"1024",
"2048",
"4096",
"8192" };
74const int kDeviceDS = 0;
const int kDeviceCoreAudio = 0;
const int kDeviceAlsa = 0;
75const int kDeviceASIO = 1;
const int kDeviceJack = 1;
76extern UINT gSCROLLMSG;
88 WDL_String mAudioInDev;
89 WDL_String mAudioOutDev;
90 WDL_String mMidiInDev;
91 WDL_String mMidiOutDev;
92 uint32_t mAudioDriverType;
96 uint32_t mMidiOutChan;
98 uint32_t mAudioInChanL;
99 uint32_t mAudioInChanR;
100 uint32_t mAudioOutChanL;
101 uint32_t mAudioOutChanR;
104 : mAudioInDev(DEFAULT_INPUT_DEV)
105 , mAudioOutDev(DEFAULT_OUTPUT_DEV)
106 , mMidiInDev(OFF_TEXT)
107 , mMidiOutDev(OFF_TEXT)
108 , mAudioDriverType(0)
122 : mAudioInDev(obj.mAudioInDev.Get())
123 , mAudioOutDev(obj.mAudioOutDev.Get())
124 , mMidiInDev(obj.mMidiInDev.Get())
125 , mMidiOutDev(obj.mMidiOutDev.Get())
126 , mAudioDriverType(obj.mAudioDriverType)
127 , mBufferSize(obj.mBufferSize)
128 , mAudioSR(obj.mAudioSR)
129 , mMidiInChan(obj.mMidiInChan)
130 , mMidiOutChan(obj.mMidiOutChan)
132 , mAudioInChanL(obj.mAudioInChanL)
133 , mAudioInChanR(obj.mAudioInChanR)
134 , mAudioOutChanL(obj.mAudioInChanL)
135 , mAudioOutChanR(obj.mAudioInChanR)
139 bool operator==(
const AppState& rhs)
const {
140 return (rhs.mAudioDriverType == mAudioDriverType &&
141 rhs.mBufferSize == mBufferSize &&
142 rhs.mAudioSR == mAudioSR &&
143 rhs.mMidiInChan == mMidiInChan &&
144 rhs.mMidiOutChan == mMidiOutChan &&
145 (strcmp(rhs.mAudioInDev.Get(), mAudioInDev.Get()) == 0) &&
146 (strcmp(rhs.mAudioOutDev.Get(), mAudioOutDev.Get()) == 0) &&
147 (strcmp(rhs.mMidiInDev.Get(), mMidiInDev.Get()) == 0) &&
148 (strcmp(rhs.mMidiOutDev.Get(), mMidiOutDev.Get()) == 0) &&
150 rhs.mAudioInChanL == mAudioInChanL &&
151 rhs.mAudioInChanR == mAudioInChanR &&
152 rhs.mAudioOutChanL == mAudioOutChanL &&
153 rhs.mAudioOutChanR == mAudioOutChanR
157 bool operator!=(
const AppState& rhs)
const {
return !operator==(rhs); }
161 static std::unique_ptr<IPlugAPPHost> sInstance;
163 void PopulateSampleRateList(HWND hwndDlg, RtAudio::DeviceInfo* pInputDevInfo, RtAudio::DeviceInfo* pOutputDevInfo);
164 void PopulateAudioInputList(HWND hwndDlg, RtAudio::DeviceInfo* pInfo);
165 void PopulateAudioOutputList(HWND hwndDlg, RtAudio::DeviceInfo* pInfo);
166 void PopulateDriverSpecificControls(HWND hwndDlg);
167 void PopulateAudioDialogs(HWND hwndDlg);
168 bool PopulateMidiDialogs(HWND hwndDlg);
169 void PopulatePreferencesDialog(HWND hwndDlg);
174 bool OpenWindow(HWND pParent);
202 bool InitAudio(uint32_t inId, uint32_t outId, uint32_t sr, uint32_t iovs);
206 bool TryToChangeAudioDriverType();
207 bool TryToChangeAudio();
208 bool SelectMIDIDevice(
ERoute direction,
const char* portName);
210 static int AudioCallback(
void* pOutputBuffer,
void* pInputBuffer, uint32_t nFrames,
double streamTime, RtAudioStreamStatus status,
void* pUserData);
211 static void MIDICallback(
double deltatime, std::vector<uint8_t>* pMsg,
void* pUserData);
212 static void ErrorCallback(RtAudioError::Type type,
const std::string& errorText);
214 static WDL_DLGRET PreferencesDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
215 static WDL_DLGRET MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
217 IPlugAPP* GetPlug() {
return mIPlug.get(); }
219 std::unique_ptr<IPlugAPP> mIPlug =
nullptr;
220 std::unique_ptr<RtAudio> mDAC =
nullptr;
221 std::unique_ptr<RtMidiIn> mMidiIn =
nullptr;
222 std::unique_ptr<RtMidiOut> mMidiOut =
nullptr;
223 int mMidiOutChannel = -1;
224 int mMidiInChannel = -1;
231 AppState mActiveState;
233 double mSampleRate = 44100.;
234 uint32_t mSamplesElapsed = 0;
235 uint32_t mVecWait = 0;
236 uint32_t mBufferSize = 512;
237 uint32_t mBufIndex = 0;
238 bool mExiting =
false;
239 bool mAudioEnding =
false;
240 bool mAudioDone =
false;
243 int32_t mDefaultInputDev = -1;
245 int32_t mDefaultOutputDev = -1;
249 std::vector<uint32_t> mAudioInputDevs;
250 std::vector<uint32_t> mAudioOutputDevs;
251 std::vector<std::string> mAudioIDDevNames;
252 std::vector<std::string> mMidiInputDevNames;
253 std::vector<std::string> mMidiOutputDevNames;
255 WDL_PtrList<double> mInputBufPtrs;
256 WDL_PtrList<double> mOutputBufPtrs;
IPlug Constant definitions, Types, magic numbers.
A class that hosts an IPlug as a standalone app and provides Audio/Midi I/O.
void ProbeAudioIO()
find out which devices have input channels & which have output channels, add their ids to the lists
int GetMIDIPortNumber(ERoute direction, const char *name) const
int GetAudioDeviceIdx(const char *name) const
Returns the audio device index linked to a particular name.
std::string GetAudioDeviceName(int idx) const
Returns the name of the audio device at idx.
Standalone application base class for an IPlug plug-in.
ERoute
Used to identify whether a bus/channel connection is an input or an output.
Used to manage changes to app i/o.