diff --git a/ChangeLog b/ChangeLog index 2b010408..09976557 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,6 +17,10 @@ Tim Blechmann Jackdmp changes log --------------------------- +2008-02-11 Stephane Letz + + * Use SetAlias for port naming. Use jackd midi port naming scheme. + 2008-02-08 Stephane Letz * More robust external API. diff --git a/common/JackAudioDriver.cpp b/common/JackAudioDriver.cpp index b132568b..caed77db 100644 --- a/common/JackAudioDriver.cpp +++ b/common/JackAudioDriver.cpp @@ -86,20 +86,22 @@ int JackAudioDriver::Attach() { JackPort* port; jack_port_id_t port_index; - char buf[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; + char name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; + char alias[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; unsigned long port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; int i; JackLog("JackAudioDriver::Attach fBufferSize = %ld fSampleRate = %ld\n", fEngineControl->fBufferSize, fEngineControl->fSampleRate); for (i = 0; i < fCaptureChannels; i++) { - snprintf(buf, sizeof(buf) - 1, "%s:%s:out%d", fClientControl->fName, fCaptureDriverName, i + 1); - if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { - jack_error("driver: cannot register port for %s", buf); + snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", fClientControl->fName, fCaptureDriverName, i + 1); + snprintf(name, sizeof(name) - 1, "system:capture_%d", i + 1); + if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { + jack_error("driver: cannot register port for %s", alias); return -1; } port = fGraphManager->GetPort(port_index); - port->Rename("system:capture_%d", i + 1); + port->SetAlias(alias); port->SetLatency(fEngineControl->fBufferSize + fCaptureLatency); fCapturePortList[i] = port_index; JackLog("JackAudioDriver::Attach fCapturePortList[i] port_index = %ld\n", port_index); @@ -108,13 +110,14 @@ int JackAudioDriver::Attach() port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; for (i = 0; i < fPlaybackChannels; i++) { - snprintf(buf, sizeof(buf) - 1, "%s:%s:in%d", fClientControl->fName, fPlaybackDriverName, i + 1); - if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { - jack_error("driver: cannot register port for %s", buf); + snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", fClientControl->fName, fPlaybackDriverName, i + 1); + snprintf(name, sizeof(name) - 1, "system:playback_%d", i + 1); + if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, alias, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { + jack_error("driver: cannot register port for %s", alias); return -1; } port = fGraphManager->GetPort(port_index); - port->Rename("system:playback_%d", i + 1); + port->SetAlias(alias); port->SetLatency(fEngineControl->fBufferSize + fPlaybackLatency); fPlaybackPortList[i] = port_index; JackLog("JackAudioDriver::Attach fPlaybackPortList[i] port_index = %ld\n", port_index); @@ -122,9 +125,9 @@ int JackAudioDriver::Attach() // Monitor ports if (fWithMonitorPorts) { JackLog("Create monitor port \n"); - snprintf(buf, sizeof(buf) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); - if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, fEngineControl->fBufferSize)) == NO_PORT) { - jack_error("Cannot register monitor port for %s", buf); + snprintf(name, sizeof(name) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); + if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, fEngineControl->fBufferSize)) == NO_PORT) { + jack_error("Cannot register monitor port for %s", name); return -1; } else { port = fGraphManager->GetPort(port_index); diff --git a/common/JackPort.cpp b/common/JackPort.cpp index cbf65869..fb8888d7 100644 --- a/common/JackPort.cpp +++ b/common/JackPort.cpp @@ -193,12 +193,6 @@ int JackPort::SetName(const char* new_name) return 0; } -void JackPort::Rename(const char* name, int index) -{ - SetAlias(GetName()); - snprintf(fName, sizeof(fName) - 1, name, index); -} - bool JackPort::NameEquals(const char* target) { char buf[JACK_PORT_NAME_SIZE + 1]; diff --git a/common/JackPort.h b/common/JackPort.h index 098891bf..e92a0afd 100644 --- a/common/JackPort.h +++ b/common/JackPort.h @@ -81,7 +81,6 @@ class JackPort const char* GetName() const; const char* GetShortName() const; int SetName(const char* name); - void Rename(const char* name, int index); int GetAliases(char* const aliases[2]); int SetAlias(const char* alias); diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index 5da5b940..7bdf7a73 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -2369,6 +2369,11 @@ void* JackAlsaDriver::port_get_buffer(int port, jack_nframes_t nframes) return fGraphManager->GetBuffer(port, nframes); } +int JackAlsaDriver::port_set_alias(int port, const char* name) +{ + return fGraphManager->GetPort(port)->SetAlias(name); +} + jack_nframes_t JackAlsaDriver::get_sample_rate() const { return fEngineControl->fSampleRate; diff --git a/linux/alsa/JackAlsaDriver.h b/linux/alsa/JackAlsaDriver.h index 2bd6ba92..9cd69843 100644 --- a/linux/alsa/JackAlsaDriver.h +++ b/linux/alsa/JackAlsaDriver.h @@ -163,6 +163,7 @@ class JackAlsaDriver : public JackAudioDriver int port_register(const char *port_name, const char *port_type, unsigned long flags, unsigned long buf_size); int port_unregister(int port); void* port_get_buffer(int port, jack_nframes_t nframes); + int port_set_alias(int port, const char* name); jack_nframes_t get_sample_rate() const; jack_nframes_t frame_time() const; diff --git a/linux/alsa/alsa_midi_impl.h b/linux/alsa/alsa_midi_impl.h index 3d851435..fc1b90fb 100644 --- a/linux/alsa/alsa_midi_impl.h +++ b/linux/alsa/alsa_midi_impl.h @@ -34,6 +34,7 @@ int JACK_client_create_thread(jack_client_t *client, pthread_t *thread, int prio jack_port_t* JACK_port_register(jack_client_t *client, const char *port_name, const char *port_type, unsigned long flags, unsigned long buffer_size); int JACK_port_unregister(jack_client_t *, jack_port_t*); void* JACK_port_get_buffer(jack_port_t*, jack_nframes_t); +int JACK_port_set_alias(jack_port_t* port, const char* name); jack_nframes_t JACK_get_sample_rate(jack_client_t *); jack_nframes_t JACK_frame_time(jack_client_t *); @@ -45,6 +46,7 @@ jack_nframes_t JACK_last_frame_time(jack_client_t *); #define jack_port_register JACK_port_register #define jack_port_unregister JACK_port_unregister #define jack_port_get_buffer JACK_port_get_buffer +#define jack_port_set_alias JACK_port_set_alias #define jack_get_sample_rate JACK_get_sample_rate #define jack_frame_time JACK_frame_time diff --git a/linux/alsa/alsa_midi_jackmp.cpp b/linux/alsa/alsa_midi_jackmp.cpp index 3f8914da..ad06270b 100644 --- a/linux/alsa/alsa_midi_jackmp.cpp +++ b/linux/alsa/alsa_midi_jackmp.cpp @@ -44,6 +44,12 @@ void* JACK_port_get_buffer(jack_port_t *port, jack_nframes_t nframes) return real->driver->port_get_buffer(real->port_id, nframes); } +int JACK_port_set_alias(jack_port_t *port, const char* name) +{ + fake_port_t* real = (fake_port_t*)port; + return real->driver->port_set_alias(real->port_id, name); +} + jack_nframes_t JACK_get_sample_rate(jack_client_t *client) { return ((JackAlsaDriver*)client)->get_sample_rate(); diff --git a/linux/alsa/alsa_rawmidi.c b/linux/alsa/alsa_rawmidi.c index 683eef68..befe1536 100644 --- a/linux/alsa/alsa_rawmidi.c +++ b/linux/alsa/alsa_rawmidi.c @@ -176,6 +176,8 @@ struct alsa_rawmidi_t { midi_stream_t in; midi_stream_t out; + int midi_in_cnt; + int midi_out_cnt; }; static int input_port_init(alsa_rawmidi_t *midi, midi_port_t *port); @@ -264,6 +266,8 @@ alsa_midi_t* alsa_rawmidi_new(jack_client_t *jack) midi->ops.stop = alsa_rawmidi_stop; midi->ops.read = alsa_rawmidi_read; midi->ops.write = alsa_rawmidi_write; + midi->midi_in_cnt = 0; + midi->midi_out_cnt = 0; return &midi->ops; fail_3: @@ -417,10 +421,20 @@ void midi_port_init(const alsa_rawmidi_t *midi, midi_port_t *port, snd_rawmidi_i } static -inline int midi_port_open_jack(const alsa_rawmidi_t *midi, midi_port_t *port, int type, const char *name) +inline int midi_port_open_jack(const alsa_rawmidi_t *midi, midi_port_t *port, int type, const char *alias) { + char name[64]; + + if (type & JackPortIsOutput) + snprintf(name, sizeof(name) - 1, "system:midi_capture_%d", ++midi->midi_in_cnt); + else + snprintf(name, sizeof(name) - 1, "system:midi_playback_%d", ++midi->midi_out_cnt); + port->jack = jack_port_register(midi->client, name, JACK_DEFAULT_MIDI_TYPE, type | JackPortIsPhysical|JackPortIsTerminal, 0); + + if (port->jack) + jack_port_set_alias(port->jack_port,alias); return port->jack == NULL; } diff --git a/linux/alsa/alsa_seqmidi.c b/linux/alsa/alsa_seqmidi.c index f6586e75..91b1b667 100644 --- a/linux/alsa/alsa_seqmidi.c +++ b/linux/alsa/alsa_seqmidi.c @@ -106,6 +106,8 @@ typedef struct alsa_seqmidi { stream_t stream[2]; char alsa_name[32]; + int midi_in_cnt; + int midi_out_cnt; } alsa_seqmidi_t; struct alsa_midi_event { @@ -225,6 +227,8 @@ alsa_midi_t* alsa_seqmidi_new(jack_client_t *client, const char* alsa_name) stream_init(self, PORT_INPUT); stream_init(self, PORT_OUTPUT); + self->midi_in_cnt = 0; + self->midi_out_cnt = 0; self->ops.destroy = alsa_seqmidi_delete; self->ops.attach = alsa_seqmidi_attach; self->ops.detach = alsa_seqmidi_detach; @@ -455,25 +459,34 @@ port_t* port_create(alsa_seqmidi_t *self, int type, snd_seq_addr_t addr, const s port_t *port; char *c; int err; + char name[64]; port = calloc(1, sizeof(port_t)); if (!port) return NULL; port->remote = addr; - + + if (port_type[type].jack_caps & JackPortIsOutput) + snprintf(name, sizeof(name) - 1, "system:midi_capture_%d", ++self->midi_in_cnt); + else + snprintf(name, sizeof(name) - 1, "system:midi_playback_%d", ++self->midi_out_cnt); + snprintf(port->name, sizeof(port->name), "%s-%d-%d-%s", port_type[type].name, addr.client, addr.port, snd_seq_port_info_get_name(info)); - + // replace all offending characters by - for (c = port->name; *c; ++c) if (!isalnum(*c)) *c = '-'; port->jack_port = jack_port_register(self->jack, - port->name, JACK_DEFAULT_MIDI_TYPE, port_type[type].jack_caps, 0); + name, JACK_DEFAULT_MIDI_TYPE, port_type[type].jack_caps, 0); + if (!port->jack_port) goto failed; + + jack_port_set_alias(port->jack_port, port->name); if (type == PORT_INPUT) err = alsa_connect_from(self, port->remote.client, port->remote.port); diff --git a/macosx/JackCoreAudioDriver.cpp b/macosx/JackCoreAudioDriver.cpp index e4a9473f..892e492d 100644 --- a/macosx/JackCoreAudioDriver.cpp +++ b/macosx/JackCoreAudioDriver.cpp @@ -951,7 +951,8 @@ int JackCoreAudioDriver::Attach() UInt32 size; Boolean isWritable; char channel_name[64]; - char buf[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; + char name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; + char alias[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; unsigned long port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; JackLog("JackCoreAudioDriver::Attach fBufferSize %ld fSampleRate %ld\n", fEngineControl->fBufferSize, fEngineControl->fSampleRate); @@ -965,13 +966,15 @@ int JackCoreAudioDriver::Attach() err = AudioDeviceGetProperty(fDeviceID, i + 1, true, kAudioDevicePropertyChannelName, &size, channel_name); if (err != noErr) JackLog("AudioDeviceGetProperty kAudioDevicePropertyChannelName error \n"); - snprintf(buf, sizeof(buf) - 1, "%s:%s:out_%s%u", fClientControl->fName, fCaptureDriverName, channel_name, i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:out_%s%u", fClientControl->fName, fCaptureDriverName, channel_name, i + 1); } else { - snprintf(buf, sizeof(buf) - 1, "%s:%s:out%u", fClientControl->fName, fCaptureDriverName, i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:out%u", fClientControl->fName, fCaptureDriverName, i + 1); } - - if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { - jack_error("Cannot register port for %s", buf); + + snprintf(name, sizeof(name) - 1, "system:capture_%d", i + 1); + + if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { + jack_error("Cannot register port for %s", name); return -1; } @@ -986,7 +989,7 @@ int JackCoreAudioDriver::Attach() JackLog("AudioDeviceGetProperty kAudioDevicePropertySafetyOffset error \n"); port = fGraphManager->GetPort(port_index); - port->Rename("system:capture_%d", i + 1); + port->SetAlias(alias); port->SetLatency(fEngineControl->fBufferSize + value1 + value2 + fCaptureLatency); fCapturePortList[i] = port_index; } @@ -1002,13 +1005,15 @@ int JackCoreAudioDriver::Attach() err = AudioDeviceGetProperty(fDeviceID, i + 1, false, kAudioDevicePropertyChannelName, &size, channel_name); if (err != noErr) JackLog("AudioDeviceGetProperty kAudioDevicePropertyChannelName error \n"); - snprintf(buf, sizeof(buf) - 1, "%s:%s:in_%s%u", fClientControl->fName, fPlaybackDriverName, channel_name, i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:in_%s%u", fClientControl->fName, fPlaybackDriverName, channel_name, i + 1); } else { - snprintf(buf, sizeof(buf) - 1, "%s:%s:in%u", fClientControl->fName, fPlaybackDriverName, i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:in%u", fClientControl->fName, fPlaybackDriverName, i + 1); } + + snprintf(name, sizeof(name) - 1, "system:playback_%d", i + 1); - if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { - jack_error("Cannot register port for %s", buf); + if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { + jack_error("Cannot register port for %s", name); return -1; } @@ -1023,16 +1028,16 @@ int JackCoreAudioDriver::Attach() JackLog("AudioDeviceGetProperty kAudioDevicePropertySafetyOffset error \n"); port = fGraphManager->GetPort(port_index); - port->Rename("system:playback_%d", i + 1); + port->SetAlias(alias); port->SetLatency(fEngineControl->fBufferSize + value1 + value2 + fPlaybackLatency); fPlaybackPortList[i] = port_index; // Monitor ports if (fWithMonitorPorts) { JackLog("Create monitor port \n"); - snprintf(buf, sizeof(buf) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); - if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, fEngineControl->fBufferSize)) == NO_PORT) { - jack_error("Cannot register monitor port for %s", buf); + snprintf(name, sizeof(name) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); + if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, fEngineControl->fBufferSize)) == NO_PORT) { + jack_error("Cannot register monitor port for %s", name); return -1; } else { port = fGraphManager->GetPort(port_index);