Skip to content

Commit 56d3ee1

Browse files
committed
better automatic audio device selection for dsp engine
1 parent 761a210 commit 56d3ee1

File tree

2 files changed

+42
-9
lines changed

2 files changed

+42
-9
lines changed

src/ofxVisualProgramming.cpp

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,11 @@ ofxVisualProgramming::ofxVisualProgramming(){
9090
audioNumBuffers = 4;
9191
audioGUIINIndex = -1;
9292
audioGUIOUTIndex = -1;
93+
audioGUIINChannels = 0;
94+
audioGUIOUTChannels = 0;
9395
bpm = 120;
96+
isInputDeviceAvailable = false;
97+
isOutputDeviceAvailable = false;
9498
dspON = false;
9599
audioINDev = 0;
96100
audioOUTDev = 0;
@@ -1312,41 +1316,66 @@ void ofxVisualProgramming::loadPatch(string patchFile){
13121316
audioGUIINIndex = -1;
13131317
audioGUIOUTIndex = -1;
13141318

1319+
audioGUIINChannels = 0;
1320+
audioGUIOUTChannels = 0;
1321+
13151322
for(size_t i=0;i<audioDevicesID_IN.size();i++){
13161323
if(audioDevicesID_IN.at(i) == audioINDev){
13171324
audioGUIINIndex = i;
13181325
break;
13191326
}
13201327
}
1321-
if(audioGUIINIndex == -1){
1328+
if(audioGUIINIndex == -1){ // no input devices available
1329+
isInputDeviceAvailable = false;
13221330
audioGUIINIndex = 0;
13231331
audioINDev = audioDevicesID_IN.at(audioGUIINIndex);
1332+
}else{
1333+
isInputDeviceAvailable = true;
13241334
}
1335+
13251336
for(size_t i=0;i<audioDevicesID_OUT.size();i++){
13261337
if(audioDevicesID_OUT.at(i) == audioOUTDev){
13271338
audioGUIOUTIndex = i;
13281339
break;
13291340
}
13301341
}
1331-
if(audioGUIOUTIndex == -1){
1342+
if(audioGUIOUTIndex == -1){ // no output devices available
1343+
isOutputDeviceAvailable = false;
13321344
audioGUIOUTIndex = 0;
13331345
audioOUTDev = audioDevicesID_OUT.at(audioGUIOUTIndex);
1346+
}else{
1347+
isOutputDeviceAvailable = false;
13341348
}
13351349

1336-
audioSampleRate = audioDevices[audioOUTDev].sampleRates[0];
13371350

1338-
if(audioSampleRate < 44100){
1339-
audioSampleRate = 44100;
1351+
1352+
if(isInputDeviceAvailable){
1353+
audioGUIINChannels = static_cast<int>(audioDevices[audioINDev].inputChannels);
1354+
audioSampleRate = audioDevices[audioINDev].sampleRates[0];
1355+
}else{
1356+
audioGUIINChannels = 0;
13401357
}
13411358

1359+
if(isOutputDeviceAvailable){
1360+
audioGUIOUTChannels = static_cast<int>(audioDevices[audioOUTDev].outputChannels);
1361+
audioSampleRate = audioDevices[audioOUTDev].sampleRates[0];
1362+
}else{
1363+
audioGUIOUTChannels = 0;
1364+
}
1365+
1366+
/*if(audioSampleRate < 44100){
1367+
audioSampleRate = 44100;
1368+
}*/
1369+
13421370
XML.setValue("sample_rate_in",audioSampleRate);
13431371
XML.setValue("sample_rate_out",audioSampleRate);
1344-
XML.setValue("input_channels",static_cast<int>(audioDevices[audioINDev].inputChannels));
1345-
XML.setValue("output_channels",static_cast<int>(audioDevices[audioOUTDev].outputChannels));
1372+
XML.setValue("input_channels",audioGUIINChannels);
1373+
XML.setValue("output_channels",audioGUIOUTChannels);
13461374
XML.saveFile();
13471375

1348-
if(dspON){
1349-
engine->setChannels(audioDevices[audioINDev].inputChannels, audioDevices[audioOUTDev].outputChannels);
1376+
// at least we need one audio device available (input or output) to start the engine
1377+
if(dspON && (isInputDeviceAvailable || isOutputDeviceAvailable)){
1378+
engine->setChannels(audioGUIINChannels, audioGUIOUTChannels);
13501379
this->setChannels(audioDevices[audioINDev].inputChannels,0);
13511380

13521381
for(unsigned int in=0;in<audioDevices[audioINDev].inputChannels;in++){

src/ofxVisualProgramming.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,14 @@ class ofxVisualProgramming : public pdsp::Wrapper {
184184
int audioOUTDev;
185185
int audioGUIINIndex;
186186
int audioGUIOUTIndex;
187+
int audioGUIINChannels;
188+
int audioGUIOUTChannels;
187189
int audioSampleRate;
188190
int audioBufferSize;
189191
int audioNumBuffers;
190192
int bpm;
193+
bool isInputDeviceAvailable;
194+
bool isOutputDeviceAvailable;
191195
bool dspON;
192196

193197
// MEMORY

0 commit comments

Comments
 (0)