summaryrefslogtreecommitdiff
path: root/drivers/alsa/alsa_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/alsa/alsa_driver.c')
-rw-r--r--drivers/alsa/alsa_driver.c581
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