static int _client_name_size(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj* const *objv) { _t *dp = (_t *)clientData; if (argc != 2) return fw_error_str(interp, "jack-client client-name-size"); Tcl_SetObjResult(interp, Tcl_NewIntObj(jack_client_name_size())); return TCL_OK; }
/** * Open and initialize connection to the JACK system. * * @param Parameters - optional parameters * @throws AudioOutputException on error * @see AcquireChannels() */ AudioOutputDeviceJack::AudioOutputDeviceJack(std::map<String,DeviceCreationParameter*> Parameters) : AudioOutputDevice(Parameters) { if (((DeviceCreationParameterString*)Parameters["NAME"])->ValueAsString().size() >= jack_client_name_size()) throw Exception("JACK client name too long"); if ((hJackClient = jack_client_new(((DeviceCreationParameterString*)Parameters["NAME"])->ValueAsString().c_str())) == 0) throw AudioOutputException("Seems Jack server not running."); existingJackDevices++; jack_set_process_callback(hJackClient, __libjack_process_callback, this); jack_on_shutdown(hJackClient, __libjack_shutdown_callback, this); if (jack_activate(hJackClient)) throw AudioOutputException("Jack: Cannot activate Jack client."); uiMaxSamplesPerCycle = jack_get_buffer_size(hJackClient); // create audio channels AcquireChannels(((DeviceCreationParameterInt*)Parameters["CHANNELS"])->ValueAsInt()); // finally activate device if desired if (((DeviceCreationParameterBool*)Parameters["ACTIVE"])->ValueAsBool()) Play(); }
int main(int argc, char *argv[]) { parse_arguments(argc, argv); jack_session_command_t *retval; int k,i,j; /* become a JACK client */ if ((client = jack_client_open(package, JackNullOption, NULL)) == 0) { fprintf(stderr, "JACK server not running?\n"); exit(1); } signal(SIGQUIT, signal_handler); signal(SIGTERM, signal_handler); signal(SIGHUP, signal_handler); signal(SIGINT, signal_handler); jack_on_shutdown(client, jack_shutdown, 0); jack_activate(client); retval = jack_session_notify( client, NULL, notify_type, save_path ); for(i=0; retval[i].uuid; i++ ) { printf( "export SESSION_DIR=\"%s%s/\"\n", save_path, retval[i].client_name ); printf( "%s &\n", retval[i].command ); add_uuid_mapping(retval[i].uuid); } printf( "sleep 10\n" ); for(k=0; retval[k].uuid; k++ ) { char* port_regexp = alloca( jack_client_name_size()+3 ); char* client_name = jack_get_client_name_by_uuid( client, retval[k].uuid ); snprintf( port_regexp, jack_client_name_size()+3, "%s:.*", client_name ); jack_free(client_name); const char **ports = jack_get_ports( client, port_regexp, NULL, 0 ); if( !ports ) { continue; } for (i = 0; ports[i]; ++i) { const char **connections; if ((connections = jack_port_get_all_connections (client, jack_port_by_name(client, ports[i]))) != 0) { for (j = 0; connections[j]; j++) { char *src = map_port_name_to_uuid_port( ports[i] ); char *dst = map_port_name_to_uuid_port( connections[j] ); printf( "jack_connect -u \"%s\" \"%s\"\n", src, dst ); } jack_free (connections); } } jack_free(ports); } jack_session_commands_free(retval); jack_client_close(client); return 0; }
int Port::max_name ( void ) { return jack_port_name_size() - jack_client_name_size() - 6; }
PUBLIC int csoundModuleCreate(CSOUND *csound) { RtJackGlobals *p; int i, j; OPARMS oparms; csound->GetOParms(csound, &oparms); /* allocate and initialise globals */ if (oparms.msglevel & 0x400) csound->Message(csound, Str("JACK real-time audio module for Csound " "by Istvan Varga\n")); if (csound->CreateGlobalVariable(csound, "_rtjackGlobals", sizeof(RtJackGlobals)) != 0) { csound->ErrorMsg(csound, Str(" *** rtjack: error allocating globals")); return -1; } p = (RtJackGlobals*) csound->QueryGlobalVariableNoCheck(csound, "_rtjackGlobals"); p->csound = csound; p->jackState = -1; strcpy(&(p->clientName[0]), "csound6"); strcpy(&(p->inputPortName[0]), "input"); strcpy(&(p->outputPortName[0]), "output"); p->sleepTime = 1000; /* this is not actually used */ p->inDevName = (char*) NULL; p->outDevName = (char*) NULL; p->client = (jack_client_t*) NULL; p->inPorts = (jack_port_t**) NULL; p->inPortBufs = (jack_default_audio_sample_t**) NULL; p->outPorts = (jack_port_t**) NULL; p->outPortBufs = (jack_default_audio_sample_t**) NULL; p->bufs = (RtJackBuffer**) NULL; /* register options: */ /* client name */ i = jack_client_name_size(); if (i > (MAX_NAME_LEN + 1)) i = (MAX_NAME_LEN + 1); csound->CreateConfigurationVariable(csound, "jack_client", (void*) &(p->clientName[0]), CSOUNDCFG_STRING, 0, NULL, &i, Str("JACK client name (default: csound6)"), NULL); /* input port name */ i = jack_port_name_size() - 3; if (i > (MAX_NAME_LEN + 1)) i = (MAX_NAME_LEN + 1); csound->CreateConfigurationVariable(csound, "jack_inportname", (void*) &(p->inputPortName[0]), CSOUNDCFG_STRING, 0, NULL, &i, Str("JACK input port name prefix " "(default: input)"), NULL); /* output port name */ i = jack_port_name_size() - 3; if (i > (MAX_NAME_LEN + 1)) i = (MAX_NAME_LEN + 1); csound->CreateConfigurationVariable(csound, "jack_outportname", (void*) &(p->outputPortName[0]), CSOUNDCFG_STRING, 0, NULL, &i, Str("JACK output port name prefix" " (default: output)"), NULL); /* sleep time */ i = 250; j = 25000; /* min/max value */ csound->CreateConfigurationVariable(csound, "jack_sleep_time", (void*) &(p->sleepTime), CSOUNDCFG_INTEGER, 0, &i, &j, Str("Deprecated"), NULL); /* done */ p->listclient = NULL; return 0; }
AudioDevJack::AudioDevJack(QObject *parent): AudioDev(parent) { this->m_curChannels = 0; this->m_curSampleRate = 0; this->m_maxBufferSize = 0; this->m_isInput = false; this->m_client = NULL; this->m_descriptions = { {":jackinput:" , "JACK Audio Connection Kit Input" }, {":jackoutput:", "JACK Audio Connection Kit Output"}, }; auto appName = QCoreApplication::applicationName() + QString("_%1").arg(Ak::id()); int maxNameSize = jack_client_name_size() - 1; if (appName.size() > maxNameSize) appName = appName.mid(0, maxNameSize); jack_status_t status; this->m_client = jack_client_open(appName.toStdString().c_str(), JackNullOption, &status); if (!this->m_client) { this->m_error = jackErrorCodes->value(status); Q_EMIT this->errorChanged(this->m_error); return; } // Setup callbacks jack_set_process_callback(this->m_client, AudioDevJack::onProcessCallback, this); jack_on_shutdown(this->m_client, AudioDevJack::onShutdownCallback, this); AkAudioCaps audioCaps; audioCaps.isValid() = true; audioCaps.format() = AkAudioCaps::SampleFormat_flt; audioCaps.bps() = AkAudioCaps::bitsPerSample(audioCaps.format()); audioCaps.rate() = int(jack_get_sample_rate(this->m_client)); audioCaps.layout() = AkAudioCaps::defaultChannelLayout(audioCaps.channels()); audioCaps.align() = false; QMap<QString, JackPortFlags> portTypeMap = { {":jackinput:" , JackPortIsOutput}, {":jackoutput:", JackPortIsInput } }; // Query the number orr channels for (auto deviceId: portTypeMap.keys()) { auto ports = jack_get_ports(this->m_client, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical | portTypeMap[deviceId]); int channels = 0; for (auto portName = ports; portName && *portName; portName++, channels++) this->m_devicePorts[deviceId] << *portName; if (ports) jack_free(ports); if (channels > 0) { audioCaps.channels() = channels; this->m_caps[deviceId] = audioCaps; } } }
int JackClient::nameSize() { return jack_client_name_size(); }