Skip to content

Commit c5239db

Browse files
committed
Fix issue #20, add support for ASIO controll pannel on windows stand-alone
1 parent 7c748d1 commit c5239db

File tree

3 files changed

+71
-4
lines changed

3 files changed

+71
-4
lines changed

NeuralRack/standalone/NeuralRack.cc

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include <locale.h>
2222

23+
#include "xpa.h"
2324
#include "engine.h"
2425
#include "ParallelThread.h"
2526
#define STANDALONE
@@ -31,6 +32,9 @@ class NeuralRack : public TextEntry
3132
{
3233
public:
3334
Widget_t* TopWin;
35+
#if defined(HAVE_PA)
36+
XPa* xpa;
37+
#endif
3438

3539
NeuralRack() : engine() {
3640
workToDo.store(false, std::memory_order_release);
@@ -48,6 +52,9 @@ class NeuralRack : public TextEntry
4852
ui->f_index = 0;
4953
title = "NeuralRack";
5054
currentPreset = "Default";
55+
#if defined(HAVE_PA)
56+
xpa = nullptr;
57+
#endif
5158
for(int i = 0;i<CONTROLS;i++)
5259
ui->widget[i] = NULL;
5360
getConfigFilePath();
@@ -61,6 +68,15 @@ class NeuralRack : public TextEntry
6168
//cleanup();
6269
}
6370

71+
#if defined(HAVE_PA)
72+
void setXPa(XPa* xpa_, bool isASIO) {
73+
xpa = xpa_;
74+
#if defined(_WIN32)
75+
if (!isASIO) ASIOPannel->state = 4;
76+
#endif
77+
}
78+
#endif
79+
6480
void startGui() {
6581
main_init(&ui->main);
6682
set_custom_theme(ui);
@@ -78,7 +94,14 @@ class NeuralRack : public TextEntry
7894
ui->win->scale.gravity = NORTHWEST;
7995
plugin_create_controller_widgets(ui,"standalone");
8096

81-
Widget_t* EngineMenu = menubar_add_menu(Menu, "Engine");
97+
EngineMenu = menubar_add_menu(Menu, "Engine");
98+
#if defined(HAVE_PA)
99+
#if defined(_WIN32)
100+
ASIOPannel = menu_add_entry(EngineMenu, "ASIO Pannel");
101+
ASIOPannel->parent_struct = (void*)this;
102+
ASIOPannel->func.button_release_callback = asio_callback;
103+
#endif
104+
#endif
82105
Widget_t* QuitMenu = menu_add_entry(EngineMenu, "Quit");
83106
QuitMenu->parent_struct = (void*)this;
84107
QuitMenu->func.button_release_callback = quit_callback;
@@ -427,6 +450,8 @@ class NeuralRack : public TextEntry
427450
Widget_t* PresetLoadMenu;
428451
Widget_t* ShowValues;
429452
Widget_t* AutoConnect;
453+
Widget_t* EngineMenu;
454+
Widget_t* ASIOPannel;
430455
int processCounter;
431456
bool settingsHaveChanged;
432457
bool disableAutoConnect;
@@ -474,6 +499,18 @@ class NeuralRack : public TextEntry
474499
}
475500
}
476501

502+
#if defined(HAVE_PA)
503+
static void asio_callback(void *w_, void* item_, void* user_data) {
504+
Widget_t *w = (Widget_t*)w_;
505+
if (w->flags & HAS_POINTER){
506+
#if defined(_WIN32)
507+
NeuralRack *self = static_cast<NeuralRack*>(w->parent_struct);
508+
self->xpa->showAsioPannel((HWND) self->TopWin);
509+
#endif
510+
}
511+
}
512+
#endif
513+
477514
static void openSite(std::string url) {
478515
std::string op = "";
479516
#if defined(__linux__) || defined(__FreeBSD__) || \

NeuralRack/standalone/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ int main(int argc, char *argv[]){
116116
r->enableEngine(1);
117117
r->readConfig();
118118
if(!xpa.startStream()) r->quitGui();
119+
r->setXPa(&xpa, xpa.haveASIO);
119120
}
120121
#else
121122
startJack();

NeuralRack/standalone/xpa.h

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444

4545
class XPa {
4646
public:
47+
bool haveASIO;
4748

4849
XPa(const char* cname){
4950
#if defined(__linux__) || defined(__FreeBSD__) || \
@@ -52,16 +53,19 @@ class XPa {
5253
#endif
5354
init();
5455
SampleRate = 0;
56+
process = nullptr;
57+
haveASIO = false;
5558
};
5659

5760
~XPa(){
5861
Pa_Terminate();
5962
};
6063

6164
// open a audio stream for input/output channels and set the audio process callback
62-
bool openStream(uint32_t ichannels, uint32_t ochannels, PaStreamCallback *process, void* arg) {
65+
bool openStream(uint32_t ichannels, uint32_t ochannels, PaStreamCallback *process_, void* arg) {
6366
#if defined(__linux__) || defined(__FreeBSD__) || \
6467
defined(__NetBSD__) || defined(__OpenBSD__)
68+
process = process_;
6569
std::vector<Devices> devices;
6670
int d = Pa_GetDeviceCount();
6771
const PaDeviceInfo *info;
@@ -130,7 +134,6 @@ class XPa {
130134
#else
131135
int d = Pa_GetDeviceCount();
132136
const PaDeviceInfo *info;
133-
bool haveASIO = false;
134137
int index = 0;
135138
long minLatency, maxLatency, preferredLatency, granularity;
136139
for (int i = 0; i<d;i++) {
@@ -140,7 +143,7 @@ class XPa {
140143
&minLatency, &maxLatency, &preferredLatency, &granularity );
141144
haveASIO = true;
142145
SampleRate = info->defaultSampleRate;
143-
index = i;
146+
ASIOIndex = index = i;
144147
break;
145148
}
146149
}
@@ -207,10 +210,36 @@ class XPa {
207210
}
208211
}
209212

213+
#if defined(_WIN32)
214+
void showAsioPannel(HWND win) {
215+
if (haveASIO) {
216+
stopStream();
217+
int d = Pa_GetDeviceCount();
218+
const PaDeviceInfo *info;
219+
for (int i = 0; i<d;i++) {
220+
info = Pa_GetDeviceInfo(i);
221+
if(Pa_GetHostApiInfo(info->hostApi)->type == paASIO) {
222+
ASIOIndex = i;
223+
err = PaAsio_ShowControlPanel(i, (void*) win);
224+
if (err != paNoError) {
225+
std::cerr << "PortAudio error: " << Pa_GetErrorText(err) << std::endl;
226+
break;
227+
}
228+
break;
229+
}
230+
}
231+
openStream(1, 2, process, nullptr);
232+
startStream();
233+
}
234+
}
235+
#endif
236+
210237
private:
211238
PaStream* stream;
239+
PaStreamCallback *process;
212240
PaError err;
213241
uint32_t SampleRate;
242+
int ASIOIndex;
214243

215244
struct Devices {
216245
int order;

0 commit comments

Comments
 (0)