52 #define DEFAULT_INPUT_DEV "Default Device"
53 #define DEFAULT_OUTPUT_DEV "Default Device"
55 #include "IPlugSWELL.h"
56 #define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) )
57 #define DEFAULT_INPUT_DEV "Built-in Input"
58 #define DEFAULT_OUTPUT_DEV "Built-in Output"
59#elif defined(OS_LINUX)
60 #include "IPlugSWELL.h"
69extern HINSTANCE gHINSTANCE;
73const int kNumBufferSizeOptions = 11;
74const std::string kBufferSizeOptions[kNumBufferSizeOptions] = {
"32",
"64",
"96",
"128",
"192",
"256",
"512",
"1024",
"2048",
"4096",
"8192" };
75const int kDeviceDS = 0;
const int kDeviceCoreAudio = 0;
const int kDeviceAlsa = 0;
76const int kDeviceASIO = 1;
const int kDeviceJack = 1;
77extern UINT gSCROLLMSG;
89 WDL_String mAudioInDev;
90 WDL_String mAudioOutDev;
91 WDL_String mMidiInDev;
92 WDL_String mMidiOutDev;
93 uint32_t mAudioDriverType;
97 uint32_t mMidiOutChan;
99 uint32_t mAudioInChanL;
100 uint32_t mAudioInChanR;
101 uint32_t mAudioOutChanL;
102 uint32_t mAudioOutChanR;
105 : mAudioInDev(DEFAULT_INPUT_DEV)
106 , mAudioOutDev(DEFAULT_OUTPUT_DEV)
107 , mMidiInDev(OFF_TEXT)
108 , mMidiOutDev(OFF_TEXT)
109 , mAudioDriverType(0)
123 : mAudioInDev(obj.mAudioInDev.Get())
124 , mAudioOutDev(obj.mAudioOutDev.Get())
125 , mMidiInDev(obj.mMidiInDev.Get())
126 , mMidiOutDev(obj.mMidiOutDev.Get())
127 , mAudioDriverType(obj.mAudioDriverType)
128 , mBufferSize(obj.mBufferSize)
129 , mAudioSR(obj.mAudioSR)
130 , mMidiInChan(obj.mMidiInChan)
131 , mMidiOutChan(obj.mMidiOutChan)
133 , mAudioInChanL(obj.mAudioInChanL)
134 , mAudioInChanR(obj.mAudioInChanR)
135 , mAudioOutChanL(obj.mAudioOutChanL)
136 , mAudioOutChanR(obj.mAudioOutChanR)
140 bool operator==(
const AppState& rhs)
const {
141 return (rhs.mAudioDriverType == mAudioDriverType &&
142 rhs.mBufferSize == mBufferSize &&
143 rhs.mAudioSR == mAudioSR &&
144 rhs.mMidiInChan == mMidiInChan &&
145 rhs.mMidiOutChan == mMidiOutChan &&
146 (std::string_view(rhs.mAudioInDev.Get()) == mAudioInDev.Get()) &&
147 (std::string_view(rhs.mAudioOutDev.Get()) == mAudioOutDev.Get()) &&
148 (std::string_view(rhs.mMidiInDev.Get()) == mMidiInDev.Get()) &&
149 (std::string_view(rhs.mMidiOutDev.Get()) == mMidiOutDev.Get()) &&
150 rhs.mAudioInChanL == mAudioInChanL &&
151 rhs.mAudioInChanR == mAudioInChanR &&
152 rhs.mAudioOutChanL == mAudioOutChanL &&
153 rhs.mAudioOutChanR == mAudioOutChanR
156 bool operator!=(
const AppState& rhs)
const {
return !operator==(rhs); }
160 static std::unique_ptr<IPlugAPPHost> sInstance;
182 void PopulateSampleRateList(HWND hwndDlg, RtAudio::DeviceInfo* pInputDevInfo, RtAudio::DeviceInfo* pOutputDevInfo);
183 void PopulateAudioInputList(HWND hwndDlg, RtAudio::DeviceInfo* pInfo);
184 void PopulateAudioOutputList(HWND hwndDlg, RtAudio::DeviceInfo* pInfo);
185 void PopulateDriverSpecificControls(HWND hwndDlg);
186 void PopulateAudioDialogs(HWND hwndDlg);
187 bool PopulateMidiDialogs(HWND hwndDlg);
188 void PopulatePreferencesDialog(HWND hwndDlg);
193 bool OpenWindow(HWND pParent);
219 bool InitAudio(uint32_t inId, uint32_t outId, uint32_t sr, uint32_t iovs);
220 bool AudioSettingsInStateAreEqual(AppState& os, AppState& ns);
221 bool MIDISettingsInStateAreEqual(AppState& os, AppState& ns);
223 bool TryToChangeAudioDriverType();
224 bool TryToChangeAudio();
225 bool SelectMIDIDevice(
ERoute direction,
const char* portName);
227 static int AudioCallback(
void* pOutputBuffer,
void* pInputBuffer, uint32_t nFrames,
double streamTime, RtAudioStreamStatus status,
void* pUserData);
228 static void MIDICallback(
double deltatime, std::vector<uint8_t>* pMsg,
void* pUserData);
229 static void ErrorCallback(RtAudioErrorType type,
const std::string& errorText);
231 static WDL_DLGRET PreferencesDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
232 static WDL_DLGRET MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
234 IPlugAPP* GetPlug() {
return mIPlug.get(); }
236 std::unique_ptr<IPlugAPP> mIPlug =
nullptr;
237 std::unique_ptr<RtAudio> mDAC =
nullptr;
238 std::unique_ptr<RtMidiIn> mMidiIn =
nullptr;
239 std::unique_ptr<RtMidiOut> mMidiOut =
nullptr;
240 int mMidiOutChannel = -1;
241 int mMidiInChannel = -1;
247 AppState mActiveState;
249 double mSampleRate = 44100.;
250 uint32_t mSamplesElapsed = 0;
251 uint32_t mVecWait = 0;
252 uint32_t mBufferSize = 512;
253 uint32_t mBufIndex = 0;
254 bool mExiting =
false;
255 bool mAudioEnding =
false;
256 bool mAudioDone =
false;
260 std::optional<uint32_t> mDefaultInputDev;
262 std::optional<uint32_t> mDefaultOutputDev;
265 WDL_String mScreenshotPath;
267 std::vector<uint32_t> mAudioInputDevIDs;
268 std::vector<uint32_t> mAudioOutputDevIDs;
269 std::vector<std::string> mMidiInputDevNames;
270 std::vector<std::string> mMidiOutputDevNames;
272 WDL_PtrList<double> mInputBufPtrs;
273 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 SetScreenshotPath(const char *path)
Set screenshot path for CLI screenshot mode.
int GetMIDIPortNumber(ERoute direction, const char *name) const
const char * GetScreenshotPath() const
Get screenshot path (empty if not in screenshot mode)
void SetNoIO(bool noIO)
Set no-I/O mode (disables audio and MIDI initialization)
bool IsNoIO() const
Check if I/O is disabled.
std::optional< uint32_t > GetAudioDeviceID(const char *name) const
Returns the a validated audio device ID linked to a particular name.
std::string GetAudioDeviceName(uint32_t deviceID) const
Returns the name of the audio device with a given RTAudio device ID.
bool IsScreenshotMode() const
Check if in screenshot mode.
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.