String open (const BigInteger& inputChannels, const BigInteger& outputChannels, double /* sampleRate */, int /* bufferSizeSamples */) override { if (client == nullptr) { lastError = "No JACK client running"; return lastError; } lastError.clear(); close(); xruns = 0; juce::jack_set_process_callback (client, processCallback, this); juce::jack_set_port_connect_callback (client, portConnectCallback, this); juce::jack_on_shutdown (client, shutdownCallback, this); juce::jack_set_xrun_callback (client, xrunCallback, this); juce::jack_activate (client); deviceIsOpen = true; if (! inputChannels.isZero()) { for (JackPortIterator i (client, true); i.next();) { if (inputChannels [i.index] && i.clientName == getName()) { int error = juce::jack_connect (client, i.ports[i.index], juce::jack_port_name ((jack_port_t*) inputPorts[i.index])); if (error != 0) JUCE_JACK_LOG ("Cannot connect input port " + String (i.index) + " (" + i.name + "), error " + String (error)); } } } if (! outputChannels.isZero()) { for (JackPortIterator i (client, false); i.next();) { if (outputChannels [i.index] && i.clientName == getName()) { int error = juce::jack_connect (client, juce::jack_port_name ((jack_port_t*) outputPorts[i.index]), i.ports[i.index]); if (error != 0) JUCE_JACK_LOG ("Cannot connect output port " + String (i.index) + " (" + i.name + "), error " + String (error)); } } } updateActivePorts(); return lastError; }
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); } }
StringArray getChannelNames (bool forInput) const { StringArray names; for (JackPortIterator i (client, forInput); i.next();) if (i.clientName == getName()) names.add (i.name.fromFirstOccurrenceOf (":", false, false)); return names; }