Box& Box::loadSettings(QSettings &settings) { setHelpString(settings.value("help").toString()); readPtrListSettings(inputPorts(), settings, "inputs"); readPtrListSettings(outputPorts(), settings, "outputs"); readListSettings<BoxProperty>(this, std::mem_fun(&Box::setBoxProperties), settings, "properties"); return *this; }
int main(int argc, char* argv[]) { int testsignal = 0; bool runSpeedTest = false; bool connectAudio = false; std::vector<std::string> midiConnections; std::map<unsigned, unsigned> patchFromCmdline; struct option longopts[] = { { "testsignal", 1, 0, 't' }, { "speedtest", 0, 0, 's' }, { "connect-audio", 0, 0, 'C' }, { "connect-midi", 1, 0, 'M' }, { "patch", 1, 0, 'p' }, { "help", no_argument, 0, 'h' }, { 0, 0, 0, 0 } }; int opt; while ((opt = getopt_long(argc, argv, "st:CM:p:h", longopts, 0)) != -1) { switch (opt) { case 't': testsignal = atoi(optarg); break; case 's': runSpeedTest = true; break; case 'C': connectAudio = true; break; case 'M': midiConnections.push_back(optarg); break; case 'p': unsigned channel, program; sscanf(optarg, "%u:%u", &channel, &program); patchFromCmdline[channel] = program; break; default: case 'h': printHelp(); return 0; } } if (testsignal) { TGlobal::SampleRate = 44100; TGlobal::NyquistFrequency = TGlobal::SampleRate / 2; TAudioFileWriter fileWriter("testsignal.wav", 2, TGlobal::SampleRate); TFileAudioPort inputPortL("", TFileAudioPort::INPUT); TFileAudioPort inputPortR("", TFileAudioPort::INPUT); TAudioPortCollection inputPorts( { &inputPortL, &inputPortR }); TFileAudioPort intOutPort1("/dev/null", TFileAudioPort::OUTPUT); TFileAudioPort intOutPort2("/dev/null", TFileAudioPort::OUTPUT); TFileAudioPort intOutPort3("/dev/null", TFileAudioPort::OUTPUT); TFileAudioPort intOutPort4("/dev/null", TFileAudioPort::OUTPUT); TAudioPortCollection intOutPorts( { &intOutPort1, &intOutPort2, &intOutPort3, &intOutPort4 }); TAudioPortCollection outputPorts = fileWriter.GetPorts(); TJackSynth synth(inputPorts, outputPorts, intOutPorts); switch (testsignal) { case 1: testSignalSawSweep(synth); break; case 2: testSignalFilterSweep(synth); break; case 3: testSignalDelay(synth); break; case 4: testSignalReverb(synth); break; } } else if (runSpeedTest) { speedTest(); } else { signal(SIGINT, sigterm); signal(SIGTERM, sigterm); runInJack(connectAudio, midiConnections, patchFromCmdline); } return 0; }
void runInJack(bool connectAudio, std::vector<std::string> midiConnections, std::map<unsigned, unsigned> patchFromCmdline) { Client = jack_client_open("jacksynth", JackNullOption, 0); if (!Client) { std::cerr << "Cannot connect to JACK" << std::endl; abort(); } std::cout << "Connected to JACK:" << std::endl << " Sample rate " << jack_get_sample_rate(Client) << " Hz" << std::endl << " Buffer size " << jack_get_buffer_size(Client) << " frames" << std::endl << " Sample size " << sizeof(TSample) << " bytes" << std::endl; TJackAudioPort inputPortL("leftin", Client, TJackAudioPort::INPUT); TJackAudioPort inputPortR("rightin", Client, TJackAudioPort::INPUT); TJackAudioPort outputPortL("left", Client, TJackAudioPort::OUTPUT); TJackAudioPort outputPortR("right", Client, TJackAudioPort::OUTPUT); TJackAudioPort intOutPort1("int1", Client, TJackAudioPort::OUTPUT); TJackAudioPort intOutPort2("int2", Client, TJackAudioPort::OUTPUT); TJackAudioPort intOutPort3("int3", Client, TJackAudioPort::OUTPUT); TJackAudioPort intOutPort4("int4", Client, TJackAudioPort::OUTPUT); MidiIn = jack_port_register(Client, "MIDI-IN", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0); MidiOut = jack_port_register(Client, "MIDI-OUT", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); TGlobal::SampleRate = jack_get_sample_rate(Client); TGlobal::NyquistFrequency = TGlobal::SampleRate / 2; TAudioPortCollection inputPorts( { &inputPortL, &inputPortR }); TAudioPortCollection outputPorts( { &outputPortL, &outputPortR }); TAudioPortCollection intermediateOutPorts( { &intOutPort1, &intOutPort2, &intOutPort3, &intOutPort4 }); TJackSynth synth(inputPorts, outputPorts, intermediateOutPorts); synth.SetMidiSendCallback(send_midi); jack_set_process_callback(Client, process, &synth); if (jack_activate(Client)) { std::cerr << "Cannot start jackiness" << std::endl; abort(); } if (connectAudio) { inputPortL.Connect("system:capture_1"); inputPortR.Connect("system:capture_2"); outputPortL.Connect("system:playback_1"); outputPortR.Connect("system:playback_2"); } for (auto con : midiConnections) { const char* me = jack_port_name(MidiIn); jack_connect(Client, con.c_str(), me); } for (auto patch : patchFromCmdline) { uint8_t channel = 0xc0 | (patch.first - 1); uint8_t pgm = patch.second - 1; synth.HandleMidi({ channel, pgm }); } while (!die) sleep(1); jack_client_close(Client); }