git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1845 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.70
| @@ -17,6 +17,10 @@ Tim Blechmann | |||
| Jackdmp changes log | |||
| --------------------------- | |||
| 2008-02-11 Stephane Letz <letz@grame.fr> | |||
| * Use SetAlias for port naming. Use jackd midi port naming scheme. | |||
| 2008-02-08 Stephane Letz <letz@grame.fr> | |||
| * More robust external API. | |||
| @@ -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); | |||
| @@ -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]; | |||
| @@ -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); | |||
| @@ -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; | |||
| @@ -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; | |||
| @@ -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 | |||
| @@ -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(); | |||
| @@ -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; | |||
| } | |||
| @@ -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); | |||
| @@ -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); | |||