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;
162 void PopulateSampleRateList(HWND hwndDlg, RtAudio::DeviceInfo* pInputDevInfo, RtAudio::DeviceInfo* pOutputDevInfo);
163 void PopulateAudioInputList(HWND hwndDlg, RtAudio::DeviceInfo* pInfo);
164 void PopulateAudioOutputList(HWND hwndDlg, RtAudio::DeviceInfo* pInfo);
165 void PopulateDriverSpecificControls(HWND hwndDlg);
166 void PopulateAudioDialogs(HWND hwndDlg);
167 bool PopulateMidiDialogs(HWND hwndDlg);
168 void PopulatePreferencesDialog(HWND hwndDlg);
173 bool OpenWindow(HWND pParent);
199 bool InitAudio(uint32_t inId, uint32_t outId, uint32_t sr, uint32_t iovs);
203 bool TryToChangeAudioDriverType();
204 bool TryToChangeAudio();
205 bool SelectMIDIDevice(
ERoute direction,
const char* portName);
207 static int AudioCallback(
void* pOutputBuffer,
void* pInputBuffer, uint32_t nFrames,
double streamTime, RtAudioStreamStatus status,
void* pUserData);
208 static void MIDICallback(
double deltatime, std::vector<uint8_t>* pMsg,
void* pUserData);
209 static void ErrorCallback(RtAudioErrorType type,
const std::string& errorText);
211 static WDL_DLGRET PreferencesDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
212 static WDL_DLGRET MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
214 IPlugAPP* GetPlug() {
return mIPlug.get(); }
216 std::unique_ptr<IPlugAPP> mIPlug =
nullptr;
217 std::unique_ptr<RtAudio> mDAC =
nullptr;
218 std::unique_ptr<RtMidiIn> mMidiIn =
nullptr;
219 std::unique_ptr<RtMidiOut> mMidiOut =
nullptr;
220 int mMidiOutChannel = -1;
221 int mMidiInChannel = -1;
227 AppState mActiveState;
229 double mSampleRate = 44100.;
230 uint32_t mSamplesElapsed = 0;
231 uint32_t mVecWait = 0;
232 uint32_t mBufferSize = 512;
233 uint32_t mBufIndex = 0;
234 bool mExiting =
false;
235 bool mAudioEnding =
false;
236 bool mAudioDone =
false;
239 std::optional<uint32_t> mDefaultInputDev;
241 std::optional<uint32_t> mDefaultOutputDev;
245 std::vector<uint32_t> mAudioInputDevIDs;
246 std::vector<uint32_t> mAudioOutputDevIDs;
247 std::vector<std::string> mMidiInputDevNames;
248 std::vector<std::string> mMidiOutputDevNames;
250 WDL_PtrList<double> mInputBufPtrs;
251 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.
int GetMIDIPortNumber(ERoute direction, const char *name) const
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.
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.