diff options
Diffstat (limited to 'drivers/alsa/alsa_driver.c')
-rw-r--r-- | drivers/alsa/alsa_driver.c | 581 |
1 files changed, 272 insertions, 309 deletions
diff --git a/drivers/alsa/alsa_driver.c b/drivers/alsa/alsa_driver.c index bd8fd85..93b1633 100644 --- a/drivers/alsa/alsa_driver.c +++ b/drivers/alsa/alsa_driver.c @@ -1017,9 +1017,6 @@ alsa_driver_start (alsa_driver_t *driver) malloc (sizeof (struct pollfd) * (driver->playback_nfds + driver->capture_nfds + 2)); - if (driver->midi && !driver->xrun_recovery) - (driver->midi->start)(driver->midi); - if (driver->playback_handle) { /* fill playback buffer with zeroes, and mark all fragments as having data. @@ -1124,9 +1121,6 @@ alsa_driver_stop (alsa_driver_t *driver) driver->hw->set_input_monitor_mask (driver->hw, 0); } - if (driver->midi && !driver->xrun_recovery) - (driver->midi->stop)(driver->midi); - return 0; } @@ -1140,9 +1134,6 @@ alsa_driver_restart (alsa_driver_t *driver) res = driver->nt_start((struct _jack_driver_nt *) driver); driver->xrun_recovery = 0; - if (res && driver->midi) - (driver->midi->stop)(driver->midi); - return res; } @@ -1565,9 +1556,6 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes) return 0; } - if (driver->midi) - (driver->midi->read)(driver->midi, nframes); - if (!driver->capture_handle) { return 0; } @@ -1640,9 +1628,6 @@ alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes) return -1; } - if (driver->midi) - (driver->midi->write)(driver->midi, nframes); - nwritten = 0; contiguous = 0; orig_nframes = nframes; @@ -1852,13 +1837,6 @@ alsa_driver_attach (alsa_driver_t *driver) } } - if (driver->midi) { - int err = (driver->midi->attach)(driver->midi); - if (err) - jack_error("ALSA: cannot attach midi: %d", err); - } - - return jack_activate (driver->client); } @@ -1871,278 +1849,276 @@ alsa_driver_detach (alsa_driver_t *driver) return 0; } - if (driver->midi) - (driver->midi->detach)(driver->midi); - - for (node = driver->capture_ports; node; - node = jack_slist_next (node)) { - jack_port_unregister (driver->client, - ((jack_port_t *) node->data)); - } - - jack_slist_free (driver->capture_ports); - driver->capture_ports = 0; - - for (node = driver->playback_ports; node; - node = jack_slist_next (node)) { - jack_port_unregister (driver->client, - ((jack_port_t *) node->data)); - } - - jack_slist_free (driver->playback_ports); - driver->playback_ports = 0; - - if (driver->monitor_ports) { - for (node = driver->monitor_ports; node; - node = jack_slist_next (node)) { - jack_port_unregister (driver->client, - ((jack_port_t *) node->data)); - } - - jack_slist_free (driver->monitor_ports); - driver->monitor_ports = 0; - } - - return 0; -} - -#if 0 -static int /* UNUSED */ -alsa_driver_change_sample_clock (alsa_driver_t *driver, SampleClockMode mode) - -{ - return driver->hw->change_sample_clock (driver->hw, mode); -} - -static void /* UNUSED */ -alsa_driver_request_all_monitor_input (alsa_driver_t *driver, int yn) - -{ - if (driver->hw_monitoring) { - if (yn) { - driver->hw->set_input_monitor_mask (driver->hw, ~0U); - } else { - driver->hw->set_input_monitor_mask ( - driver->hw, driver->input_monitor_mask); - } - } - - driver->all_monitor_in = yn; -} - -static void /* UNUSED */ -alsa_driver_set_hw_monitoring (alsa_driver_t *driver, int yn) -{ - if (yn) { - driver->hw_monitoring = TRUE; - - if (driver->all_monitor_in) { - driver->hw->set_input_monitor_mask (driver->hw, ~0U); - } else { - driver->hw->set_input_monitor_mask ( - driver->hw, driver->input_monitor_mask); - } - } else { - driver->hw_monitoring = FALSE; - driver->hw->set_input_monitor_mask (driver->hw, 0); - } -} - -static ClockSyncStatus /* UNUSED */ -alsa_driver_clock_sync_status (channel_t chn) -{ - return Lock; -} -#endif - -static void -alsa_driver_delete (alsa_driver_t *driver) -{ - JSList *node; - - if (driver->midi) - (driver->midi->destroy)(driver->midi); - - for (node = driver->clock_sync_listeners; node; - node = jack_slist_next (node)) { - free (node->data); - } - jack_slist_free (driver->clock_sync_listeners); - - if (driver->ctl_handle) { - snd_ctl_close (driver->ctl_handle); - driver->ctl_handle = 0; - } - - if (driver->capture_handle) { - snd_pcm_close (driver->capture_handle); - driver->capture_handle = 0; - } - - if (driver->playback_handle) { - snd_pcm_close (driver->playback_handle); - driver->capture_handle = 0; - } - - if (driver->capture_hw_params) { - snd_pcm_hw_params_free (driver->capture_hw_params); - driver->capture_hw_params = 0; - } - - if (driver->playback_hw_params) { - snd_pcm_hw_params_free (driver->playback_hw_params); - driver->playback_hw_params = 0; - } - - if (driver->capture_sw_params) { - snd_pcm_sw_params_free (driver->capture_sw_params); - driver->capture_sw_params = 0; - } - - if (driver->playback_sw_params) { - snd_pcm_sw_params_free (driver->playback_sw_params); - driver->playback_sw_params = 0; - } - - if (driver->pfd) { - free (driver->pfd); - } - - if (driver->hw) { - driver->hw->release (driver->hw); - driver->hw = 0; - } - free(driver->alsa_name_playback); - free(driver->alsa_name_capture); - free(driver->alsa_driver); - - alsa_driver_release_channel_dependent_memory (driver); - jack_driver_nt_finish ((jack_driver_nt_t *) driver); - free (driver); -} - -static char* -discover_alsa_using_apps () -{ - char found[2048]; - char command[5192]; - char* path = getenv ("PATH"); - char* dir; - size_t flen = 0; - int card; - int device; - size_t cmdlen = 0; - - if (!path) { - return NULL; - } - - /* look for lsof and give up if its not in PATH */ - - path = strdup (path); - dir = strtok (path, ":"); - while (dir) { - char maybe[PATH_MAX+1]; - snprintf (maybe, sizeof(maybe), "%s/lsof", dir); - if (access (maybe, X_OK) == 0) { - break; - } - dir = strtok (NULL, ":"); - } - free (path); - - if (!dir) { - return NULL; - } - - snprintf (command, sizeof (command), "lsof -Fc0 "); - cmdlen = strlen (command); - - for (card = 0; card < 8; ++card) { - for (device = 0; device < 8; ++device) { - char buf[32]; - - snprintf (buf, sizeof (buf), "/dev/snd/pcmC%dD%dp", card, device); - if (access (buf, F_OK) == 0) { - snprintf (command+cmdlen, sizeof(command)-cmdlen, "%s ", buf); - } - cmdlen = strlen (command); - - snprintf (buf, sizeof (buf), "/dev/snd/pcmC%dD%dc", card, device); - if (access (buf, F_OK) == 0) { - snprintf (command+cmdlen, sizeof(command)-cmdlen, "%s ", buf); - } - cmdlen = strlen (command); - } + for (node = driver->capture_ports; node; + node = jack_slist_next (node)) { + jack_port_unregister (driver->client, + ((jack_port_t *) node->data)); } - FILE* f = popen (command, "r"); - - if (!f) { - return NULL; - } - - while (!feof (f)) { - char buf[1024]; /* lsof doesn't output much */ - - if (!fgets (buf, sizeof (buf), f)) { - break; - } - - if (*buf != 'p') { - return NULL; - } - - /* buf contains NULL as a separator between the process field and the command field */ - char *pid = buf; - ++pid; /* skip leading 'p' */ - char *cmd = pid; - - /* skip to NULL */ - while (*cmd) { - ++cmd; - } - ++cmd; /* skip to 'c' */ - ++cmd; /* skip to first character of command */ - - snprintf (found+flen, sizeof (found)-flen, "%s (process ID %s)\n", cmd, pid); - flen = strlen (found); - - if (flen >= sizeof (found)) { - break; - } - } - - pclose (f); - - if (flen) { - return strdup (found); - } else { - return NULL; - } -} - - -static jack_driver_t * -alsa_driver_new (char *name, char *playback_alsa_device, - char *capture_alsa_device, - jack_client_t *client, - jack_nframes_t frames_per_cycle, - jack_nframes_t user_nperiods, - jack_nframes_t rate, - int hw_monitoring, - int hw_metering, - int capturing, - int playing, - DitherAlgorithm dither, - int soft_mode, - int monitor, - int user_capture_nchnls, - int user_playback_nchnls, - int shorts_first, - jack_nframes_t capture_latency, - jack_nframes_t playback_latency, - alsa_midi_t *midi_driver + jack_slist_free (driver->capture_ports); + driver->capture_ports = 0; + + for (node = driver->playback_ports; node; + node = jack_slist_next (node)) { + jack_port_unregister (driver->client, + ((jack_port_t *) node->data)); + } + + jack_slist_free (driver->playback_ports); + driver->playback_ports = 0; + + if (driver->monitor_ports) { + for (node = driver->monitor_ports; node; + node = jack_slist_next (node)) { + jack_port_unregister (driver->client, + ((jack_port_t *) node->data)); + } + + jack_slist_free (driver->monitor_ports); + driver->monitor_ports = 0; + } + + return 0; + } + + #if 0 + static int /* UNUSED */ + alsa_driver_change_sample_clock (alsa_driver_t *driver, SampleClockMode mode) + + { + return driver->hw->change_sample_clock (driver->hw, mode); + } + + static void /* UNUSED */ + alsa_driver_request_all_monitor_input (alsa_driver_t *driver, int yn) + + { + if (driver->hw_monitoring) { + if (yn) { + driver->hw->set_input_monitor_mask (driver->hw, ~0U); + } else { + driver->hw->set_input_monitor_mask ( + driver->hw, driver->input_monitor_mask); + } + } + + driver->all_monitor_in = yn; + } + + static void /* UNUSED */ + alsa_driver_set_hw_monitoring (alsa_driver_t *driver, int yn) + { + if (yn) { + driver->hw_monitoring = TRUE; + + if (driver->all_monitor_in) { + driver->hw->set_input_monitor_mask (driver->hw, ~0U); + } else { + driver->hw->set_input_monitor_mask ( + driver->hw, driver->input_monitor_mask); + } + } else { + driver->hw_monitoring = FALSE; + driver->hw->set_input_monitor_mask (driver->hw, 0); + } + } + + static ClockSyncStatus /* UNUSED */ + alsa_driver_clock_sync_status (channel_t chn) + { + return Lock; + } + #endif + + static void + alsa_driver_delete (alsa_driver_t *driver) + { + JSList *node; + + /* + if (driver->midi) + (driver->midi->destroy)((jack_driver_t*) driver->midi); + */ + + for (node = driver->clock_sync_listeners; node; + node = jack_slist_next (node)) { + free (node->data); + } + jack_slist_free (driver->clock_sync_listeners); + + if (driver->ctl_handle) { + snd_ctl_close (driver->ctl_handle); + driver->ctl_handle = 0; + } + + if (driver->capture_handle) { + snd_pcm_close (driver->capture_handle); + driver->capture_handle = 0; + } + + if (driver->playback_handle) { + snd_pcm_close (driver->playback_handle); + driver->capture_handle = 0; + } + + if (driver->capture_hw_params) { + snd_pcm_hw_params_free (driver->capture_hw_params); + driver->capture_hw_params = 0; + } + + if (driver->playback_hw_params) { + snd_pcm_hw_params_free (driver->playback_hw_params); + driver->playback_hw_params = 0; + } + + if (driver->capture_sw_params) { + snd_pcm_sw_params_free (driver->capture_sw_params); + driver->capture_sw_params = 0; + } + + if (driver->playback_sw_params) { + snd_pcm_sw_params_free (driver->playback_sw_params); + driver->playback_sw_params = 0; + } + + if (driver->pfd) { + free (driver->pfd); + } + + if (driver->hw) { + driver->hw->release (driver->hw); + driver->hw = 0; + } + free(driver->alsa_name_playback); + free(driver->alsa_name_capture); + free(driver->alsa_driver); + + alsa_driver_release_channel_dependent_memory (driver); + jack_driver_nt_finish ((jack_driver_nt_t *) driver); + free (driver); + } + + static char* + discover_alsa_using_apps () + { + char found[2048]; + char command[5192]; + char* path = getenv ("PATH"); + char* dir; + size_t flen = 0; + int card; + int device; + size_t cmdlen = 0; + + if (!path) { + return NULL; + } + + /* look for lsof and give up if its not in PATH */ + + path = strdup (path); + dir = strtok (path, ":"); + while (dir) { + char maybe[PATH_MAX+1]; + snprintf (maybe, sizeof(maybe), "%s/lsof", dir); + if (access (maybe, X_OK) == 0) { + break; + } + dir = strtok (NULL, ":"); + } + free (path); + + if (!dir) { + return NULL; + } + + snprintf (command, sizeof (command), "lsof -Fc0 "); + cmdlen = strlen (command); + + for (card = 0; card < 8; ++card) { + for (device = 0; device < 8; ++device) { + char buf[32]; + + snprintf (buf, sizeof (buf), "/dev/snd/pcmC%dD%dp", card, device); + if (access (buf, F_OK) == 0) { + snprintf (command+cmdlen, sizeof(command)-cmdlen, "%s ", buf); + } + cmdlen = strlen (command); + + snprintf (buf, sizeof (buf), "/dev/snd/pcmC%dD%dc", card, device); + if (access (buf, F_OK) == 0) { + snprintf (command+cmdlen, sizeof(command)-cmdlen, "%s ", buf); + } + cmdlen = strlen (command); + } + } + + FILE* f = popen (command, "r"); + + if (!f) { + return NULL; + } + + while (!feof (f)) { + char buf[1024]; /* lsof doesn't output much */ + + if (!fgets (buf, sizeof (buf), f)) { + break; + } + + if (*buf != 'p') { + return NULL; + } + + /* buf contains NULL as a separator between the process field and the command field */ + char *pid = buf; + ++pid; /* skip leading 'p' */ + char *cmd = pid; + + /* skip to NULL */ + while (*cmd) { + ++cmd; + } + ++cmd; /* skip to 'c' */ + ++cmd; /* skip to first character of command */ + + snprintf (found+flen, sizeof (found)-flen, "%s (process ID %s)\n", cmd, pid); + flen = strlen (found); + + if (flen >= sizeof (found)) { + break; + } + } + + pclose (f); + + if (flen) { + return strdup (found); + } else { + return NULL; + } + } + + + static jack_driver_t * + alsa_driver_new (char *name, char *playback_alsa_device, + char *capture_alsa_device, + jack_client_t *client, + jack_nframes_t frames_per_cycle, + jack_nframes_t user_nperiods, + jack_nframes_t rate, + int hw_monitoring, + int hw_metering, + int capturing, + int playing, + DitherAlgorithm dither, + int soft_mode, + int monitor, + int user_capture_nchnls, + int user_playback_nchnls, + int shorts_first, + jack_nframes_t capture_latency, + jack_nframes_t playback_latency ) { int err; @@ -2225,7 +2201,6 @@ alsa_driver_new (char *name, char *playback_alsa_device, driver->alsa_name_playback = strdup (playback_alsa_device); driver->alsa_name_capture = strdup (capture_alsa_device); - driver->midi = midi_driver; driver->xrun_recovery = 0; if (alsa_driver_check_card_type (driver)) { @@ -2684,12 +2659,8 @@ driver_get_descriptor () params[i].character = 'X'; params[i].type = JackDriverParamString; strcpy (params[i].value.str, "none"); - strcpy (params[i].short_desc, "ALSA MIDI driver (seq|raw)"); - strcpy (params[i].long_desc, - "ALSA MIDI driver:\n" - " none - no MIDI driver\n" - " seq - ALSA Sequencer driver\n" - " raw - ALSA RawMIDI driver\n"); + strcpy (params[i].short_desc, "legacy"); + strcpy (params[i].long_desc, "legacy option - do not use"); desc->params = params; @@ -2716,8 +2687,6 @@ driver_initialize (jack_client_t *client, const JSList * params) int shorts_first = FALSE; jack_nframes_t systemic_input_latency = 0; jack_nframes_t systemic_output_latency = 0; - char *midi_driver_name = "none"; - alsa_midi_t *midi = NULL; const JSList * node; const jack_driver_param_t * param; @@ -2807,7 +2776,7 @@ driver_initialize (jack_client_t *client, const JSList * params) break; case 'X': - midi_driver_name = strdup (param->value.str); + /* ignored, legacy option */ break; } @@ -2819,12 +2788,6 @@ driver_initialize (jack_client_t *client, const JSList * params) playback = TRUE; } - if (strcmp(midi_driver_name, "seq")==0) { - midi = alsa_seqmidi_new(client, NULL); - } else if (strcmp(midi_driver_name, "raw")==0) { - midi = alsa_rawmidi_new(client); - } - return alsa_driver_new ("alsa_pcm", playback_pcm_name, capture_pcm_name, client, frames_per_interrupt, @@ -2834,7 +2797,7 @@ driver_initialize (jack_client_t *client, const JSList * params) user_capture_nchnls, user_playback_nchnls, shorts_first, systemic_input_latency, - systemic_output_latency, midi); + systemic_output_latency); } void |