JackAudioIODevice (const String& deviceName, const String& inId, const String& outId) : AudioIODevice (deviceName, "JACK"), inputId (inId), outputId (outId), deviceIsOpen (false), callback (nullptr), totalNumberOfInputChannels (0), totalNumberOfOutputChannels (0) { jassert (deviceName.isNotEmpty()); jack_status_t status; client = juce::jack_client_open (JUCE_JACK_CLIENT_NAME, JackNoStartServer, &status); if (client == nullptr) { JUCE_JACK_LOG_STATUS (status); } else { juce::jack_set_error_function (errorCallback); // open input ports const StringArray inputChannels (getInputChannelNames()); for (int i = 0; i < inputChannels.size(); ++i) { String inputName; inputName << "in_" << ++totalNumberOfInputChannels; inputPorts.add (juce::jack_port_register (client, inputName.toUTF8(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0)); } // open output ports const StringArray outputChannels (getOutputChannelNames()); for (int i = 0; i < outputChannels.size(); ++i) { String outputName; outputName << "out_" << ++totalNumberOfOutputChannels; outputPorts.add (juce::jack_port_register (client, outputName.toUTF8(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)); } inChans.calloc (totalNumberOfInputChannels + 2); outChans.calloc (totalNumberOfOutputChannels + 2); } }
void scanForDevices() { hasScanned = true; inputNames.clear(); inputIds.clear(); outputNames.clear(); outputIds.clear(); if (juce_libjackHandle == nullptr) { juce_libjackHandle = dlopen ("libjack.so", RTLD_LAZY); if (juce_libjackHandle == nullptr) return; } jack_status_t status; // open a dummy client if (jack_client_t* const client = juce::jack_client_open ("JuceJackDummy", JackNoStartServer, &status)) { // scan for output devices for (JackPortIterator i (client, false); i.next();) { if (i.clientName != (JUCE_JACK_CLIENT_NAME) && ! inputNames.contains (i.clientName)) { inputNames.add (i.clientName); inputIds.add (i.ports [i.index]); } } // scan for input devices for (JackPortIterator i (client, true); i.next();) { if (i.clientName != (JUCE_JACK_CLIENT_NAME) && ! outputNames.contains (i.clientName)) { outputNames.add (i.clientName); outputIds.add (i.ports [i.index]); } } juce::jack_client_close (client); } else { JUCE_JACK_LOG_STATUS (status); } }