diff options
Diffstat (limited to 'drivers/alsa/alsa_driver.c')
-rw-r--r-- | drivers/alsa/alsa_driver.c | 1269 |
1 files changed, 635 insertions, 634 deletions
diff --git a/drivers/alsa/alsa_driver.c b/drivers/alsa/alsa_driver.c index c7dd724..2f42e31 100644 --- a/drivers/alsa/alsa_driver.c +++ b/drivers/alsa/alsa_driver.c @@ -16,7 +16,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ + */ #include <math.h> #include <stdio.h> @@ -44,10 +44,10 @@ #include "usx2y.h" #include "generic.h" -extern void store_work_time (int); -extern void store_wait_time (int); -extern void show_wait_times (); -extern void show_work_times (); +extern void store_work_time(int); +extern void store_wait_time(int); +extern void show_wait_times(); +extern void show_work_times(); #undef DEBUG_WAKEUP @@ -98,34 +98,34 @@ alsa_driver_check_capabilities (alsa_driver_t *driver) } static char* -get_control_device_name(const char * device_name) +get_control_device_name (const char * device_name) { - char * ctl_name; - const char * comma; - - /* the user wants a hw or plughw device, the ctl name - * should be hw:x where x is the card identification. - * We skip the subdevice suffix that starts with comma */ - - if (strncasecmp(device_name, "plughw:", 7) == 0) { - /* skip the "plug" prefix" */ - device_name += 4; - } - - comma = strchr(device_name, ','); - if (comma == NULL) { - ctl_name = strdup(device_name); - if (ctl_name == NULL) { - jack_error("strdup(\"%s\") failed.", device_name); - } - } else { - ctl_name = strndup(device_name, comma - device_name); - if (ctl_name == NULL) { - jack_error("strndup(\"%s\", %u) failed.", device_name, (unsigned int)(comma - device_name)); - } - } - - return ctl_name; + char * ctl_name; + const char * comma; + + /* the user wants a hw or plughw device, the ctl name + * should be hw:x where x is the card identification. + * We skip the subdevice suffix that starts with comma */ + + if (strncasecmp (device_name, "plughw:", 7) == 0) { + /* skip the "plug" prefix" */ + device_name += 4; + } + + comma = strchr (device_name, ','); + if (comma == NULL) { + ctl_name = strdup (device_name); + if (ctl_name == NULL) { + jack_error ("strdup(\"%s\") failed.", device_name); + } + } else { + ctl_name = strndup (device_name, comma - device_name); + if (ctl_name == NULL) { + jack_error ("strndup(\"%s\", %u) failed.", device_name, (unsigned int)(comma - device_name)); + } + } + + return ctl_name; } static int @@ -137,22 +137,22 @@ alsa_driver_check_card_type (alsa_driver_t *driver) snd_ctl_card_info_alloca (&card_info); - ctl_name = get_control_device_name(driver->alsa_name_playback); + ctl_name = get_control_device_name (driver->alsa_name_playback); // XXX: I don't know the "right" way to do this. Which to use // driver->alsa_name_playback or driver->alsa_name_capture. if ((err = snd_ctl_open (&driver->ctl_handle, ctl_name, 0)) < 0) { jack_error ("control open \"%s\" (%s)", ctl_name, - snd_strerror(err)); - } else if ((err = snd_ctl_card_info(driver->ctl_handle, card_info)) < 0) { + snd_strerror (err)); + } else if ((err = snd_ctl_card_info (driver->ctl_handle, card_info)) < 0) { jack_error ("control hardware info \"%s\" (%s)", driver->alsa_name_playback, snd_strerror (err)); snd_ctl_close (driver->ctl_handle); } - driver->alsa_driver = strdup(snd_ctl_card_info_get_driver (card_info)); + driver->alsa_driver = strdup (snd_ctl_card_info_get_driver (card_info)); - free(ctl_name); + free (ctl_name); return alsa_driver_check_capabilities (driver); } @@ -174,8 +174,8 @@ alsa_driver_hdsp_hardware (alsa_driver_t *driver) static int alsa_driver_ice1712_hardware (alsa_driver_t *driver) { - driver->hw = jack_alsa_ice1712_hw_new (driver); - return 0; + driver->hw = jack_alsa_ice1712_hw_new (driver); + return 0; } static int @@ -198,24 +198,24 @@ alsa_driver_hw_specific (alsa_driver_t *driver, int hw_monitoring, { int err; - if (!strcmp(driver->alsa_driver, "RME9652")) { + if (!strcmp (driver->alsa_driver, "RME9652")) { if ((err = alsa_driver_hammerfall_hardware (driver)) != 0) { return err; } - } else if (!strcmp(driver->alsa_driver, "H-DSP")) { - if ((err = alsa_driver_hdsp_hardware (driver)) !=0) { - return err; - } - } else if (!strcmp(driver->alsa_driver, "ICE1712")) { - if ((err = alsa_driver_ice1712_hardware (driver)) !=0) { - return err; - } - } else if (!strcmp(driver->alsa_driver, "USB US-X2Y")) { - if ((err = alsa_driver_usx2y_hardware (driver)) !=0) { - return err; + } else if (!strcmp (driver->alsa_driver, "H-DSP")) { + if ((err = alsa_driver_hdsp_hardware (driver)) != 0) { + return err; + } + } else if (!strcmp (driver->alsa_driver, "ICE1712")) { + if ((err = alsa_driver_ice1712_hardware (driver)) != 0) { + return err; + } + } else if (!strcmp (driver->alsa_driver, "USB US-X2Y")) { + if ((err = alsa_driver_usx2y_hardware (driver)) != 0) { + return err; } } else { - if ((err = alsa_driver_generic_hardware (driver)) != 0) { + if ((err = alsa_driver_generic_hardware (driver)) != 0) { return err; } } @@ -258,50 +258,50 @@ alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) case 2: switch (driver->dither) { case Rectangular: - jack_info("Rectangular dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_rect_d16_sSs: - sample_move_dither_rect_d16_sS; + jack_info ("Rectangular dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap ? + sample_move_dither_rect_d16_sSs : + sample_move_dither_rect_d16_sS; break; case Triangular: - jack_info("Triangular dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_tri_d16_sSs: - sample_move_dither_tri_d16_sS; + jack_info ("Triangular dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap ? + sample_move_dither_tri_d16_sSs : + sample_move_dither_tri_d16_sS; break; case Shaped: - jack_info("Noise-shaped dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_shaped_d16_sSs: - sample_move_dither_shaped_d16_sS; + jack_info ("Noise-shaped dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap ? + sample_move_dither_shaped_d16_sSs : + sample_move_dither_shaped_d16_sS; break; default: - driver->write_via_copy = driver->quirk_bswap? - sample_move_d16_sSs : - sample_move_d16_sS; + driver->write_via_copy = driver->quirk_bswap ? + sample_move_d16_sSs : + sample_move_d16_sS; break; } break; case 3: /* NO DITHER */ - driver->write_via_copy = driver->quirk_bswap? - sample_move_d24_sSs: - sample_move_d24_sS; + driver->write_via_copy = driver->quirk_bswap ? + sample_move_d24_sSs : + sample_move_d24_sS; break; case 4: /* NO DITHER */ - driver->write_via_copy = driver->quirk_bswap? - sample_move_d32u24_sSs: - sample_move_d32u24_sS; + driver->write_via_copy = driver->quirk_bswap ? + sample_move_d32u24_sSs : + sample_move_d32u24_sS; break; default: jack_error ("impossible sample width (%d) discovered!", - driver->playback_sample_bytes); + driver->playback_sample_bytes); exit (1); } } @@ -313,19 +313,19 @@ alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) } else { switch (driver->capture_sample_bytes) { case 2: - driver->read_via_copy = driver->quirk_bswap? - sample_move_dS_s16s: - sample_move_dS_s16; + driver->read_via_copy = driver->quirk_bswap ? + sample_move_dS_s16s : + sample_move_dS_s16; break; case 3: - driver->read_via_copy = driver->quirk_bswap? - sample_move_dS_s24s: - sample_move_dS_s24; + driver->read_via_copy = driver->quirk_bswap ? + sample_move_dS_s24s : + sample_move_dS_s24; break; case 4: - driver->read_via_copy = driver->quirk_bswap? - sample_move_dS_s32u24s: - sample_move_dS_s32u24; + driver->read_via_copy = driver->quirk_bswap ? + sample_move_dS_s32u24s : + sample_move_dS_s32u24; break; } } @@ -345,24 +345,25 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, int err, format; unsigned int frame_rate; snd_pcm_uframes_t stop_th; + static struct { char Name[40]; snd_pcm_format_t format; int swapped; } formats[] = { - {"32bit float little-endian", SND_PCM_FORMAT_FLOAT_LE, IS_LE}, - {"32bit integer little-endian", SND_PCM_FORMAT_S32_LE, IS_LE}, - {"32bit integer big-endian", SND_PCM_FORMAT_S32_BE, IS_BE}, - {"24bit little-endian in 3bytes format", SND_PCM_FORMAT_S24_3LE, IS_LE}, - {"24bit big-endian in 3bytes format", SND_PCM_FORMAT_S24_3BE, IS_BE}, - {"24bit little-endian", SND_PCM_FORMAT_S24_LE, IS_LE}, - {"24bit big-endian", SND_PCM_FORMAT_S24_BE, IS_BE}, - {"16bit little-endian", SND_PCM_FORMAT_S16_LE, IS_LE}, - {"16bit big-endian", SND_PCM_FORMAT_S16_BE, IS_BE}, + { "32bit float little-endian", SND_PCM_FORMAT_FLOAT_LE, IS_LE }, + { "32bit integer little-endian", SND_PCM_FORMAT_S32_LE, IS_LE }, + { "32bit integer big-endian", SND_PCM_FORMAT_S32_BE, IS_BE }, + { "24bit little-endian in 3bytes format", SND_PCM_FORMAT_S24_3LE, IS_LE }, + { "24bit big-endian in 3bytes format", SND_PCM_FORMAT_S24_3BE, IS_BE }, + { "24bit little-endian", SND_PCM_FORMAT_S24_LE, IS_LE }, + { "24bit big-endian", SND_PCM_FORMAT_S24_BE, IS_BE }, + { "16bit little-endian", SND_PCM_FORMAT_S16_LE, IS_LE }, + { "16bit big-endian", SND_PCM_FORMAT_S16_BE, IS_BE }, }; -#define NUMFORMATS (sizeof(formats)/sizeof(formats[0])) +#define NUMFORMATS (sizeof(formats) / sizeof(formats[0])) - if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0) { + if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0) { jack_error ("ALSA: no playback configurations available (%s)", snd_strerror (err)); return -1; @@ -416,10 +417,10 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, } } - frame_rate = driver->frame_rate ; + frame_rate = driver->frame_rate; err = snd_pcm_hw_params_set_rate_near (handle, hw_params, - &frame_rate, NULL) ; - driver->frame_rate = frame_rate ; + &frame_rate, NULL); + driver->frame_rate = frame_rate; if (err < 0) { jack_error ("ALSA: cannot set sample/frame rate to %" PRIu32 " for %s", driver->frame_rate, @@ -429,10 +430,10 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, if (!*nchns) { /*if not user-specified, try to find the maximum * number of channels */ - unsigned int channels_max ; + unsigned int channels_max; err = snd_pcm_hw_params_get_channels_max (hw_params, &channels_max); - *nchns = channels_max ; + *nchns = channels_max; if (*nchns > 1024) { @@ -442,14 +443,14 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, they can't be bothered to set up a proper default device, limit the number of channels for them to a sane default. - */ + */ jack_error ( -"You appear to be using the ALSA software \"plug\" layer, probably\n" -"a result of using the \"default\" ALSA device. This is less\n" -"efficient than it could be. Consider using a hardware device\n" -"instead rather than using the plug layer. Usually the name of the\n" -"hardware device that corresponds to the first sound card is hw:0\n" + "You appear to be using the ALSA software \"plug\" layer, probably\n" + "a result of using the \"default\" ALSA device. This is less\n" + "efficient than it could be. Consider using a hardware device\n" + "instead rather than using the plug layer. Usually the name of the\n" + "hardware device that corresponds to the first sound card is hw:0\n" ); *nchns = 2; } @@ -474,8 +475,9 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, *nperiodsp = driver->user_nperiods; snd_pcm_hw_params_set_periods_min (handle, hw_params, nperiodsp, NULL); - if (*nperiodsp < driver->user_nperiods) + if (*nperiodsp < driver->user_nperiods) { *nperiodsp = driver->user_nperiods; + } if (snd_pcm_hw_params_set_periods_near (handle, hw_params, nperiodsp, NULL) < 0) { jack_error ("ALSA: cannot set number of periods to %u for %s", @@ -485,15 +487,15 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, if (*nperiodsp < driver->user_nperiods) { jack_error ("ALSA: got smaller periods %u than %u for %s", - *nperiodsp, (unsigned int) driver->user_nperiods, + *nperiodsp, (unsigned int)driver->user_nperiods, stream_name); return -1; } jack_info ("ALSA: use %d periods for %s", *nperiodsp, stream_name); #if 0 - if (!jack_power_of_two(driver->frames_per_cycle)) { - jack_error("JACK: frames must be a power of two " - "(64, 512, 1024, ...)\n"); + if (!jack_power_of_two (driver->frames_per_cycle)) { + jack_error ("JACK: frames must be a power of two " + "(64, 512, 1024, ...)\n"); return -1; } #endif @@ -544,8 +546,8 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, #if 0 jack_info ("set silence size to %lu * %lu = %lu", - driver->frames_per_cycle, *nperiodsp, - driver->frames_per_cycle * *nperiodsp); + driver->frames_per_cycle, *nperiodsp, + driver->frames_per_cycle * *nperiodsp); if ((err = snd_pcm_sw_params_set_silence_size ( handle, sw_params, @@ -556,14 +558,15 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, } #endif - if (handle == driver->playback_handle) + if (handle == driver->playback_handle) { err = snd_pcm_sw_params_set_avail_min ( handle, sw_params, driver->frames_per_cycle * (*nperiodsp - driver->user_nperiods + 1)); - else + } else { err = snd_pcm_sw_params_set_avail_min ( handle, sw_params, driver->frames_per_cycle); + } if (err < 0) { jack_error ("ALSA: cannot set avail min for %s", stream_name); @@ -601,8 +604,8 @@ alsa_driver_set_parameters (alsa_driver_t *driver, driver->user_nperiods = user_nperiods; jack_info ("configuring for %" PRIu32 "Hz, period = %" - PRIu32 " frames (%.1f ms), buffer = %" PRIu32 " periods", - rate, frames_per_cycle, (((float)frames_per_cycle / (float) rate) * 1000.0f), user_nperiods); + PRIu32 " frames (%.1f ms), buffer = %" PRIu32 " periods", + rate, frames_per_cycle, (((float)frames_per_cycle / (float)rate) * 1000.0f), user_nperiods); if (driver->capture_handle) { if (alsa_driver_configure_stream ( @@ -666,14 +669,12 @@ alsa_driver_set_parameters (alsa_driver_t *driver, driver->frame_rate = cr; } - } - else if (driver->capture_handle && cr != driver->frame_rate) { + } else if (driver->capture_handle && cr != driver->frame_rate) { jack_error ("capture sample rate in use (%d Hz) does not " "match requested rate (%d Hz)", cr, driver->frame_rate); driver->frame_rate = cr; - } - else if (driver->playback_handle && pr != driver->frame_rate) { + } else if (driver->playback_handle && pr != driver->frame_rate) { jack_error ("playback sample rate in use (%d Hz) does not " "match requested rate (%d Hz)", pr, driver->frame_rate); @@ -684,28 +685,31 @@ alsa_driver_set_parameters (alsa_driver_t *driver, /* check the fragment size, since thats non-negotiable */ if (driver->playback_handle) { - snd_pcm_access_t access; + snd_pcm_access_t access; - err = snd_pcm_hw_params_get_period_size ( - driver->playback_hw_params, &p_period_size, &dir); - if (err != 0) + err = snd_pcm_hw_params_get_period_size ( + driver->playback_hw_params, &p_period_size, &dir); + if (err != 0) { jack_error ("snd_pcm_hw_params_get_period_size (playback) : %s", - snd_strerror (err)); + snd_strerror (err)); + } - err = snd_pcm_hw_params_get_format ( - driver->playback_hw_params, + err = snd_pcm_hw_params_get_format ( + driver->playback_hw_params, &(driver->playback_sample_format)); - if (err != 0) + if (err != 0) { jack_error ("snd_pcm_hw_params_get_format (playback) : %s", - snd_strerror (err)); + snd_strerror (err)); + } - err = snd_pcm_hw_params_get_access (driver->playback_hw_params, + err = snd_pcm_hw_params_get_access (driver->playback_hw_params, &access); - if (err != 0) + if (err != 0) { jack_error ("snd_pcm_hw_params_get_access (playback) : %s", - snd_strerror (err)); + snd_strerror (err)); + } - driver->playback_interleaved = + driver->playback_interleaved = (access == SND_PCM_ACCESS_MMAP_INTERLEAVED) || (access == SND_PCM_ACCESS_MMAP_COMPLEX); @@ -719,28 +723,31 @@ alsa_driver_set_parameters (alsa_driver_t *driver, } if (driver->capture_handle) { - snd_pcm_access_t access; + snd_pcm_access_t access; - err = snd_pcm_hw_params_get_period_size ( - driver->capture_hw_params, &c_period_size, &dir); - if (err != 0) + err = snd_pcm_hw_params_get_period_size ( + driver->capture_hw_params, &c_period_size, &dir); + if (err != 0) { jack_error ("snd_pcm_hw_params_get_period_size (capture): %s", - snd_strerror (err)); + snd_strerror (err)); + } - err = snd_pcm_hw_params_get_format ( - driver->capture_hw_params, + err = snd_pcm_hw_params_get_format ( + driver->capture_hw_params, &(driver->capture_sample_format)); - if (err != 0) + if (err != 0) { jack_error ("snd_pcm_hw_params_get_format (capture) : %s", - snd_strerror (err)); + snd_strerror (err)); + } - err = snd_pcm_hw_params_get_access (driver->capture_hw_params, + err = snd_pcm_hw_params_get_access (driver->capture_hw_params, &access); - if (err != 0) + if (err != 0) { jack_error ("snd_pcm_hw_params_get_access (capture) : %s", - snd_strerror (err)); + snd_strerror (err)); + } - driver->capture_interleaved = + driver->capture_interleaved = (access == SND_PCM_ACCESS_MMAP_INTERLEAVED) || (access == SND_PCM_ACCESS_MMAP_COMPLEX); @@ -749,7 +756,7 @@ alsa_driver_set_parameters (alsa_driver_t *driver, PRIu32 " frames but got %uc frames for capture", driver->frames_per_cycle, p_period_size); - goto errout; + goto errout; } } @@ -762,7 +769,7 @@ alsa_driver_set_parameters (alsa_driver_t *driver, if (driver->playback_handle) { switch (driver->playback_sample_format) { - case SND_PCM_FORMAT_FLOAT_LE: + case SND_PCM_FORMAT_FLOAT_LE: case SND_PCM_FORMAT_S32_LE: case SND_PCM_FORMAT_S24_3LE: case SND_PCM_FORMAT_S24_3BE: @@ -782,7 +789,7 @@ alsa_driver_set_parameters (alsa_driver_t *driver, if (driver->capture_handle) { switch (driver->capture_sample_format) { - case SND_PCM_FORMAT_FLOAT_LE: + case SND_PCM_FORMAT_FLOAT_LE: case SND_PCM_FORMAT_S32_LE: case SND_PCM_FORMAT_S24_3LE: case SND_PCM_FORMAT_S24_3BE: @@ -803,8 +810,8 @@ alsa_driver_set_parameters (alsa_driver_t *driver, if (driver->playback_interleaved) { const snd_pcm_channel_area_t *my_areas; snd_pcm_uframes_t offset, frames; - if (snd_pcm_mmap_begin(driver->playback_handle, - &my_areas, &offset, &frames) < 0) { + if (snd_pcm_mmap_begin (driver->playback_handle, + &my_areas, &offset, &frames) < 0) { jack_error ("ALSA: %s: mmap areas info error", driver->alsa_name_playback); goto errout; @@ -819,8 +826,8 @@ alsa_driver_set_parameters (alsa_driver_t *driver, if (driver->capture_interleaved) { const snd_pcm_channel_area_t *my_areas; snd_pcm_uframes_t offset, frames; - if (snd_pcm_mmap_begin(driver->capture_handle, - &my_areas, &offset, &frames) < 0) { + if (snd_pcm_mmap_begin (driver->capture_handle, + &my_areas, &offset, &frames) < 0) { jack_error ("ALSA: %s: mmap areas info error", driver->alsa_name_capture); goto errout; @@ -844,55 +851,53 @@ alsa_driver_set_parameters (alsa_driver_t *driver, channels require action on every cycle. any bits that are not set after the engine's process() call indicate channels that potentially need to be silenced. - */ + */ bitset_create (&driver->channels_done, driver->max_nchannels); bitset_create (&driver->channels_not_done, driver->max_nchannels); if (driver->playback_handle) { - driver->playback_addr = (char **) - malloc (sizeof (char *) * driver->playback_nchannels); + driver->playback_addr = (char**) + malloc (sizeof(char *) * driver->playback_nchannels); memset (driver->playback_addr, 0, - sizeof (char *) * driver->playback_nchannels); - driver->playback_interleave_skip = (unsigned long *) - malloc (sizeof (unsigned long *) * driver->playback_nchannels); + sizeof(char *) * driver->playback_nchannels); + driver->playback_interleave_skip = (unsigned long*) + malloc (sizeof(unsigned long *) * driver->playback_nchannels); memset (driver->playback_interleave_skip, 0, - sizeof (unsigned long *) * driver->playback_nchannels); - driver->silent = (unsigned long *) - malloc (sizeof (unsigned long) - * driver->playback_nchannels); + sizeof(unsigned long *) * driver->playback_nchannels); + driver->silent = (unsigned long*) + malloc (sizeof(unsigned long) + * driver->playback_nchannels); - for (chn = 0; chn < driver->playback_nchannels; chn++) { + for (chn = 0; chn < driver->playback_nchannels; chn++) driver->silent[chn] = 0; - } - for (chn = 0; chn < driver->playback_nchannels; chn++) { + for (chn = 0; chn < driver->playback_nchannels; chn++) bitset_add (driver->channels_done, chn); - } - driver->dither_state = (dither_state_t *) - calloc ( driver->playback_nchannels, - sizeof (dither_state_t)); + driver->dither_state = (dither_state_t*) + calloc ( driver->playback_nchannels, + sizeof(dither_state_t)); } if (driver->capture_handle) { - driver->capture_addr = (char **) - malloc (sizeof (char *) * driver->capture_nchannels); + driver->capture_addr = (char**) + malloc (sizeof(char *) * driver->capture_nchannels); memset (driver->capture_addr, 0, - sizeof (char *) * driver->capture_nchannels); - driver->capture_interleave_skip = (unsigned long *) - malloc (sizeof (unsigned long *) * driver->capture_nchannels); + sizeof(char *) * driver->capture_nchannels); + driver->capture_interleave_skip = (unsigned long*) + malloc (sizeof(unsigned long *) * driver->capture_nchannels); memset (driver->capture_interleave_skip, 0, - sizeof (unsigned long *) * driver->capture_nchannels); + sizeof(unsigned long *) * driver->capture_nchannels); } - driver->clock_sync_data = (ClockSyncStatus *) - malloc (sizeof (ClockSyncStatus) * driver->max_nchannels); + driver->clock_sync_data = (ClockSyncStatus*) + malloc (sizeof(ClockSyncStatus) * driver->max_nchannels); driver->period_usecs = - (jack_time_t) floor ((((float) driver->frames_per_cycle) / - driver->frame_rate) * 1000000.0f); - driver->poll_timeout = (int) floor (1.5f * driver->period_usecs); + (jack_time_t)floor ((((float)driver->frames_per_cycle) / + driver->frame_rate) * 1000000.0f); + driver->poll_timeout = (int)floor (1.5f * driver->period_usecs); if (driver->engine) { if (driver->engine->set_buffer_size (driver->engine, @@ -902,19 +907,19 @@ alsa_driver_set_parameters (alsa_driver_t *driver, } } - driver->previously_successfully_configured = TRUE; + driver->previously_successfully_configured = TRUE; return 0; - errout: - if (driver->previously_successfully_configured) { - /* attempt to restore previous configuration */ - jack_info ("ALSA: falling back to old configuration"); - if (alsa_driver_set_parameters (driver, old_frames_per_cycle, old_user_nperiods, old_rate) == 0) { - jack_error ("ALSA: reverted to previous parameters after failure"); - return 0; - } - } - return -1; +errout: + if (driver->previously_successfully_configured) { + /* attempt to restore previous configuration */ + jack_info ("ALSA: falling back to old configuration"); + if (alsa_driver_set_parameters (driver, old_frames_per_cycle, old_user_nperiods, old_rate) == 0) { + jack_error ("ALSA: reverted to previous parameters after failure"); + return 0; + } + } + return -1; } static int @@ -943,8 +948,8 @@ alsa_driver_get_channel_addresses (alsa_driver_t *driver, if (capture_avail) { if ((err = snd_pcm_mmap_begin ( driver->capture_handle, &driver->capture_areas, - (snd_pcm_uframes_t *) capture_offset, - (snd_pcm_uframes_t *) capture_avail)) < 0) { + (snd_pcm_uframes_t*)capture_offset, + (snd_pcm_uframes_t*)capture_avail)) < 0) { jack_error ("ALSA: %s: mmap areas info error", driver->alsa_name_capture); return -1; @@ -953,17 +958,17 @@ alsa_driver_get_channel_addresses (alsa_driver_t *driver, for (chn = 0; chn < driver->capture_nchannels; chn++) { const snd_pcm_channel_area_t *a = &driver->capture_areas[chn]; - driver->capture_addr[chn] = (char *) a->addr - + ((a->first + a->step * *capture_offset) / 8); - driver->capture_interleave_skip[chn] = (unsigned long ) (a->step / 8); + driver->capture_addr[chn] = (char*)a->addr + + ((a->first + a->step * *capture_offset) / 8); + driver->capture_interleave_skip[chn] = (unsigned long )(a->step / 8); } } if (playback_avail) { if ((err = snd_pcm_mmap_begin ( driver->playback_handle, &driver->playback_areas, - (snd_pcm_uframes_t *) playback_offset, - (snd_pcm_uframes_t *) playback_avail)) < 0) { + (snd_pcm_uframes_t*)playback_offset, + (snd_pcm_uframes_t*)playback_avail)) < 0) { jack_error ("ALSA: %s: mmap areas info error ", driver->alsa_name_playback); return -1; @@ -972,9 +977,9 @@ alsa_driver_get_channel_addresses (alsa_driver_t *driver, for (chn = 0; chn < driver->playback_nchannels; chn++) { const snd_pcm_channel_area_t *a = &driver->playback_areas[chn]; - driver->playback_addr[chn] = (char *) a->addr - + ((a->first + a->step * *playback_offset) / 8); - driver->playback_interleave_skip[chn] = (unsigned long ) (a->step / 8); + driver->playback_addr[chn] = (char*)a->addr + + ((a->first + a->step * *playback_offset) / 8); + driver->playback_interleave_skip[chn] = (unsigned long )(a->step / 8); } } @@ -995,7 +1000,7 @@ alsa_driver_start (alsa_driver_t *driver) if ((err = snd_pcm_prepare (driver->playback_handle)) < 0) { jack_error ("ALSA: prepare error for playback on " "\"%s\" (%s)", driver->alsa_name_playback, - snd_strerror(err)); + snd_strerror (err)); return -1; } } @@ -1005,7 +1010,7 @@ alsa_driver_start (alsa_driver_t *driver) if ((err = snd_pcm_prepare (driver->capture_handle)) < 0) { jack_error ("ALSA: prepare error for capture on \"%s\"" " (%s)", driver->alsa_name_capture, - snd_strerror(err)); + snd_strerror (err)); return -1; } } @@ -1042,14 +1047,14 @@ alsa_driver_start (alsa_driver_t *driver) free (driver->pfd); } - driver->pfd = (struct pollfd *) - malloc (sizeof (struct pollfd) * - (driver->playback_nfds + driver->capture_nfds + 2)); + driver->pfd = (struct pollfd*) + malloc (sizeof(struct pollfd) * + (driver->playback_nfds + driver->capture_nfds + 2)); if (driver->playback_handle) { /* fill playback buffer with zeroes, and mark all fragments as having data. - */ + */ pavail = snd_pcm_avail_update (driver->playback_handle); @@ -1060,7 +1065,7 @@ alsa_driver_start (alsa_driver_t *driver) } if (alsa_driver_get_channel_addresses (driver, - 0, &pavail, 0, &poffset)) { + 0, &pavail, 0, &poffset)) { return -1; } @@ -1071,7 +1076,7 @@ alsa_driver_start (alsa_driver_t *driver) alsa-lib may have a better function for doing this here, where the goal is to silence the entire buffer. - */ + */ for (chn = 0; chn < driver->playback_nchannels; chn++) { alsa_driver_silence_on_channel ( @@ -1112,7 +1117,7 @@ alsa_driver_stop (alsa_driver_t *driver) /* silence all capture port buffers, because we might be entering offline mode. - */ + */ for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) { @@ -1121,9 +1126,9 @@ alsa_driver_stop (alsa_driver_t *driver) char* buf; jack_nframes_t nframes = driver->engine->control->buffer_size; - port = (jack_port_t *) node->data; + port = (jack_port_t*)node->data; buf = jack_port_get_buffer (port, nframes); - memset (buf, 0, sizeof (jack_default_audio_sample_t) * nframes); + memset (buf, 0, sizeof(jack_default_audio_sample_t) * nframes); } if (driver->playback_handle) { @@ -1159,8 +1164,9 @@ alsa_driver_restart (alsa_driver_t *driver) int res; driver->xrun_recovery = 1; - if ((res = driver->nt_stop((struct _jack_driver_nt *) driver))==0) - res = driver->nt_start((struct _jack_driver_nt *) driver); + if ((res = driver->nt_stop ((struct _jack_driver_nt*)driver)) == 0) { + res = driver->nt_start ((struct _jack_driver_nt*)driver); + } driver->xrun_recovery = 0; return res; @@ -1172,47 +1178,46 @@ alsa_driver_xrun_recovery (alsa_driver_t *driver, float *delayed_usecs) snd_pcm_status_t *status; int res; - snd_pcm_status_alloca(&status); + snd_pcm_status_alloca (&status); if (driver->capture_handle) { - if ((res = snd_pcm_status(driver->capture_handle, status)) + if ((res = snd_pcm_status (driver->capture_handle, status)) < 0) { - jack_error("status error: %s", snd_strerror(res)); + jack_error ("status error: %s", snd_strerror (res)); } } else { - if ((res = snd_pcm_status(driver->playback_handle, status)) + if ((res = snd_pcm_status (driver->playback_handle, status)) < 0) { - jack_error("status error: %s", snd_strerror(res)); + jack_error ("status error: %s", snd_strerror (res)); } } - if (snd_pcm_status_get_state(status) == SND_PCM_STATE_SUSPENDED) - { - MESSAGE("\n\n**** alsa_pcm: pcm in suspended state, resuming it \n\n" ); + if (snd_pcm_status_get_state (status) == SND_PCM_STATE_SUSPENDED) { + MESSAGE ("\n\n**** alsa_pcm: pcm in suspended state, resuming it \n\n" ); if (driver->capture_handle) { - if ((res = snd_pcm_prepare(driver->capture_handle)) + if ((res = snd_pcm_prepare (driver->capture_handle)) < 0) { - jack_error("error preparing after suspend: %s", snd_strerror(res)); + jack_error ("error preparing after suspend: %s", snd_strerror (res)); } } else { - if ((res = snd_pcm_prepare(driver->playback_handle)) + if ((res = snd_pcm_prepare (driver->playback_handle)) < 0) { - jack_error("error preparing after suspend: %s", snd_strerror(res)); + jack_error ("error preparing after suspend: %s", snd_strerror (res)); } } } - if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN + if (snd_pcm_status_get_state (status) == SND_PCM_STATE_XRUN && driver->process_count > XRUN_REPORT_DELAY) { struct timeval now, diff, tstamp; driver->xrun_count++; - snd_pcm_status_get_tstamp(status,&now); - snd_pcm_status_get_trigger_tstamp(status, &tstamp); - timersub(&now, &tstamp, &diff); + snd_pcm_status_get_tstamp (status, &now); + snd_pcm_status_get_trigger_tstamp (status, &tstamp); + timersub (&now, &tstamp, &diff); *delayed_usecs = diff.tv_sec * 1000000.0 + diff.tv_usec; - MESSAGE("\n\n**** alsa_pcm: xrun of at least %.3f " - "msecs\n\n", - *delayed_usecs / 1000.0); + MESSAGE ("\n\n**** alsa_pcm: xrun of at least %.3f " + "msecs\n\n", + *delayed_usecs / 1000.0); } if (alsa_driver_restart (driver)) { @@ -1275,7 +1280,7 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float need_playback = driver->playback_handle ? 1 : 0; } - again: +again: while (need_playback || need_capture) { @@ -1303,14 +1308,13 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float /* ALSA doesn't set POLLERR in some versions of 0.9.X */ - for (i = 0; i < nfds; i++) { + for (i = 0; i < nfds; i++) driver->pfd[i].events |= POLLERR; - } if (extra_fd >= 0) { driver->pfd[nfds].fd = extra_fd; driver->pfd[nfds].events = - POLLIN|POLLERR|POLLHUP|POLLNVAL; + POLLIN | POLLERR | POLLHUP | POLLNVAL; nfds++; } @@ -1370,7 +1374,7 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float if (extra_fd >= 0) { - if (driver->pfd[nfds-1].revents == 0) { + if (driver->pfd[nfds - 1].revents == 0) { /* we timed out on the extra fd */ *status = -4; @@ -1380,13 +1384,13 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float /* if POLLIN was the only bit set, we're OK */ *status = 0; - return (driver->pfd[nfds-1].revents == POLLIN) ? 0 : -1; + return (driver->pfd[nfds - 1].revents == POLLIN) ? 0 : -1; } if (need_playback) { if (snd_pcm_poll_descriptors_revents - (driver->playback_handle, &driver->pfd[0], - driver->playback_nfds, &revents) < 0) { + (driver->playback_handle, &driver->pfd[0], + driver->playback_nfds, &revents) < 0) { jack_error ("ALSA: playback revents failed"); *status = -6; return 0; @@ -1408,8 +1412,8 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float if (need_capture) { if (snd_pcm_poll_descriptors_revents - (driver->capture_handle, &driver->pfd[ci], - driver->capture_nfds, &revents) < 0) { + (driver->capture_handle, &driver->pfd[ci], + driver->capture_nfds, &revents) < 0) { jack_error ("ALSA: capture revents failed"); *status = -6; return 0; @@ -1491,7 +1495,7 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float /* constrain the available count to the nearest (round down) number of periods. - */ + */ return avail - (avail % driver->frames_per_cycle); } @@ -1508,16 +1512,16 @@ alsa_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes) return -1; } - if (driver->capture_handle) { + if (driver->capture_handle) { nf = nframes; offset = 0; while (nf) { contiguous = nf; - if (alsa_driver_get_channel_addresses (driver, - &contiguous, 0, &offset, 0)) { - return -1; - } + if (alsa_driver_get_channel_addresses (driver, + &contiguous, 0, &offset, 0)) { + return -1; + } if (snd_pcm_mmap_commit (driver->capture_handle, offset, contiguous) < 0) { @@ -1534,15 +1538,14 @@ alsa_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes) while (nf) { contiguous = nf; - if (alsa_driver_get_channel_addresses (driver, - 0, &contiguous, 0, &offset)) { - return -1; - } + if (alsa_driver_get_channel_addresses (driver, + 0, &contiguous, 0, &offset)) { + return -1; + } - for (chn = 0; chn < driver->playback_nchannels; chn++) { + for (chn = 0; chn < driver->playback_nchannels; chn++) alsa_driver_silence_on_channel (driver, chn, contiguous); - } if (snd_pcm_mmap_commit (driver->playback_handle, offset, contiguous) < 0) { @@ -1570,7 +1573,7 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes) snd_pcm_sframes_t contiguous; snd_pcm_sframes_t nread; snd_pcm_uframes_t offset; - jack_nframes_t orig_nframes; + jack_nframes_t orig_nframes; jack_default_audio_sample_t* buf; channel_t chn; JSList *node; @@ -1599,8 +1602,8 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes) if (alsa_driver_get_channel_addresses ( driver, - (snd_pcm_uframes_t *) &contiguous, - (snd_pcm_uframes_t *) 0, + (snd_pcm_uframes_t*)&contiguous, + (snd_pcm_uframes_t*)0, &offset, 0) < 0) { return -1; } @@ -1608,7 +1611,7 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes) for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) { - port = (jack_port_t *) node->data; + port = (jack_port_t*)node->data; if (!jack_port_connected (port)) { /* no-copy optimization */ @@ -1616,13 +1619,13 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes) } buf = jack_port_get_buffer (port, orig_nframes); alsa_driver_read_from_channel (driver, chn, - buf + nread, contiguous); + buf + nread, contiguous); } if ((err = snd_pcm_mmap_commit (driver->capture_handle, - offset, contiguous)) < 0) { + offset, contiguous)) < 0) { jack_error ("ALSA: could not complete read of %" - PRIu32 " frames: error = %d", contiguous, err); + PRIu32 " frames: error = %d", contiguous, err); return -1; } @@ -1667,8 +1670,8 @@ alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes) for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) { - if (((jack_port_t *) node->data)->shared->monitor_requests) { - driver->input_monitor_mask |= (1<<chn); + if (((jack_port_t*)node->data)->shared->monitor_requests) { + driver->input_monitor_mask |= (1 << chn); } } @@ -1687,27 +1690,27 @@ alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes) if (alsa_driver_get_channel_addresses ( driver, - (snd_pcm_uframes_t *) 0, - (snd_pcm_uframes_t *) &contiguous, + (snd_pcm_uframes_t*)0, + (snd_pcm_uframes_t*)&contiguous, 0, &offset) < 0) { return -1; } - for (chn = 0, node = driver->playback_ports, mon_node=driver->monitor_ports; + for (chn = 0, node = driver->playback_ports, mon_node = driver->monitor_ports; node; node = jack_slist_next (node), chn++) { - port = (jack_port_t *) node->data; + port = (jack_port_t*)node->data; if (!jack_port_connected (port)) { continue; } buf = jack_port_get_buffer (port, orig_nframes); alsa_driver_write_to_channel (driver, chn, - buf + nwritten, contiguous); + buf + nwritten, contiguous); if (mon_node) { - port = (jack_port_t *) mon_node->data; + port = (jack_port_t*)mon_node->data; if (!jack_port_connected (port)) { continue; } @@ -1724,11 +1727,12 @@ alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes) } if ((err = snd_pcm_mmap_commit (driver->playback_handle, - offset, contiguous)) < 0) { + offset, contiguous)) < 0) { jack_error ("ALSA: could not complete playback of %" - PRIu32 " frames: error = %d", contiguous, err); - if (err != -EPIPE && err != -ESTRPIPE) + PRIu32 " frames: error = %d", contiguous, err); + if (err != -EPIPE && err != -ESTRPIPE) { return -1; + } } nframes -= contiguous; @@ -1752,10 +1756,11 @@ alsa_driver_run_cycle (alsa_driver_t *driver) DEBUG ("alsaback from wait, nframes = %lu", nframes); - if (unlikely(wait_status < 0)) - return -1; /* driver failed */ + if (unlikely (wait_status < 0)) { + return -1; /* driver failed */ - if (unlikely(nframes == 0)) { + } + if (unlikely (nframes == 0)) { /* we detected an xrun and restarted: notify * clients about the delay. @@ -1770,20 +1775,19 @@ alsa_driver_run_cycle (alsa_driver_t *driver) static void alsa_driver_latency_callback (jack_latency_callback_mode_t mode, void* arg) { - alsa_driver_t* driver = (alsa_driver_t*) arg; - jack_client_t* client = driver->client; - jack_latency_range_t range; - JSList* node; - - if (mode == JackPlaybackLatency) { - range.min = range.max = driver->frames_per_cycle + driver->playback_frame_latency; - } else { - range.min = range.max = driver->frames_per_cycle + driver->capture_frame_latency; - } + alsa_driver_t* driver = (alsa_driver_t*)arg; + jack_client_t* client = driver->client; + jack_latency_range_t range; + JSList* node; - for (node = client->ports; node; node = jack_slist_next (node)) { - jack_port_set_latency_range ((jack_port_t*) node->data, mode, &range); + if (mode == JackPlaybackLatency) { + range.min = range.max = driver->frames_per_cycle + driver->playback_frame_latency; + } else { + range.min = range.max = driver->frames_per_cycle + driver->capture_frame_latency; } + + for (node = client->ports; node; node = jack_slist_next (node)) + jack_port_set_latency_range ((jack_port_t*)node->data, mode, &range); } static int @@ -1801,7 +1805,7 @@ alsa_driver_attach (alsa_driver_t *driver) } driver->engine->set_sample_rate (driver->engine, driver->frame_rate); - port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal; + port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; if (driver->has_hw_monitoring) { port_flags |= JackPortCanMonitor; @@ -1809,7 +1813,7 @@ alsa_driver_attach (alsa_driver_t *driver) for (chn = 0; chn < driver->capture_nchannels; chn++) { - snprintf (buf, sizeof(buf), "capture_%lu", chn+1); + snprintf (buf, sizeof(buf), "capture_%lu", chn + 1); if ((port = jack_port_register (driver->client, buf, JACK_DEFAULT_AUDIO_TYPE, @@ -1825,12 +1829,12 @@ alsa_driver_attach (alsa_driver_t *driver) jack_slist_append (driver->capture_ports, port); } - port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal; + port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; for (chn = 0; chn < driver->playback_nchannels; chn++) { jack_port_t *monitor_port; - snprintf (buf, sizeof(buf) - 1, "playback_%lu", chn+1); + snprintf (buf, sizeof(buf) - 1, "playback_%lu", chn + 1); if ((port = jack_port_register (driver->client, buf, JACK_DEFAULT_AUDIO_TYPE, @@ -1846,7 +1850,7 @@ alsa_driver_attach (alsa_driver_t *driver) jack_slist_append (driver->playback_ports, port); if (driver->with_monitor_ports) { - snprintf (buf, sizeof(buf) - 1, "monitor_%lu", chn+1); + snprintf (buf, sizeof(buf) - 1, "monitor_%lu", chn + 1); if ((monitor_port = jack_port_register ( driver->client, buf, @@ -1878,307 +1882,302 @@ alsa_driver_detach (alsa_driver_t *driver) return 0; } - for (node = driver->capture_ports; node; - node = jack_slist_next (node)) { - jack_port_unregister (driver->client, - ((jack_port_t *) node->data)); - } + 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; + 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)); - } + 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; + 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)); - } + 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; - } + jack_slist_free (driver->monitor_ports); + driver->monitor_ports = 0; + } - return 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; - } +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; +static void +alsa_driver_delete (alsa_driver_t *driver) +{ + JSList *node; - /* - if (driver->midi) - (driver->midi->destroy)((jack_driver_t*) driver->midi); - */ + /* + 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 + 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; - char* current_apps; + char* current_apps; alsa_driver_t *driver; jack_info ("creating alsa driver ... %s|%s|%" PRIu32 "|%" PRIu32 - "|%" PRIu32"|%" PRIu32"|%" PRIu32 "|%s|%s|%s|%s", - playing ? playback_alsa_device : "-", - capturing ? capture_alsa_device : "-", - frames_per_cycle, user_nperiods, rate, - user_capture_nchnls,user_playback_nchnls, - hw_monitoring ? "hwmon": "nomon", - hw_metering ? "hwmeter":"swmeter", - soft_mode ? "soft-mode":"-", - shorts_first ? "16bit":"32bit"); - - driver = (alsa_driver_t *) calloc (1, sizeof (alsa_driver_t)); - - jack_driver_nt_init ((jack_driver_nt_t *) driver); - - driver->nt_attach = (JackDriverNTAttachFunction) alsa_driver_attach; - driver->nt_detach = (JackDriverNTDetachFunction) alsa_driver_detach; - driver->read = (JackDriverReadFunction) alsa_driver_read; - driver->write = (JackDriverReadFunction) alsa_driver_write; + "|%" PRIu32 "|%" PRIu32 "|%" PRIu32 "|%s|%s|%s|%s", + playing ? playback_alsa_device : "-", + capturing ? capture_alsa_device : "-", + frames_per_cycle, user_nperiods, rate, + user_capture_nchnls, user_playback_nchnls, + hw_monitoring ? "hwmon" : "nomon", + hw_metering ? "hwmeter" : "swmeter", + soft_mode ? "soft-mode" : "-", + shorts_first ? "16bit" : "32bit"); + + driver = (alsa_driver_t*)calloc (1, sizeof(alsa_driver_t)); + + jack_driver_nt_init ((jack_driver_nt_t*)driver); + + driver->nt_attach = (JackDriverNTAttachFunction)alsa_driver_attach; + driver->nt_detach = (JackDriverNTDetachFunction)alsa_driver_detach; + driver->read = (JackDriverReadFunction)alsa_driver_read; + driver->write = (JackDriverReadFunction)alsa_driver_write; driver->null_cycle = - (JackDriverNullCycleFunction) alsa_driver_null_cycle; - driver->nt_bufsize = (JackDriverNTBufSizeFunction) alsa_driver_bufsize; - driver->nt_start = (JackDriverNTStartFunction) alsa_driver_start; - driver->nt_stop = (JackDriverNTStopFunction) alsa_driver_stop; - driver->nt_run_cycle = (JackDriverNTRunCycleFunction) alsa_driver_run_cycle; + (JackDriverNullCycleFunction)alsa_driver_null_cycle; + driver->nt_bufsize = (JackDriverNTBufSizeFunction)alsa_driver_bufsize; + driver->nt_start = (JackDriverNTStartFunction)alsa_driver_start; + driver->nt_stop = (JackDriverNTStopFunction)alsa_driver_stop; + driver->nt_run_cycle = (JackDriverNTRunCycleFunction)alsa_driver_run_cycle; driver->playback_handle = NULL; driver->capture_handle = NULL; @@ -2189,8 +2188,8 @@ alsa_driver_detach (alsa_driver_t *driver) driver->user_nchannels = 0; driver->playback_nchannels = user_playback_nchnls; driver->capture_nchannels = user_capture_nchnls; - driver->playback_sample_bytes = (shorts_first ? 2:4); - driver->capture_sample_bytes = (shorts_first ? 2:4); + driver->playback_sample_bytes = (shorts_first ? 2 : 4); + driver->capture_sample_bytes = (shorts_first ? 2 : 4); driver->capture_frame_latency = capture_latency; driver->playback_frame_latency = playback_latency; @@ -2198,14 +2197,14 @@ alsa_driver_detach (alsa_driver_t *driver) driver->capture_addr = 0; driver->playback_interleave_skip = NULL; driver->capture_interleave_skip = NULL; - driver->previously_successfully_configured = FALSE; + driver->previously_successfully_configured = FALSE; driver->silent = 0; driver->all_monitor_in = FALSE; driver->with_monitor_ports = monitor; - driver->clock_mode = ClockMaster; /* XXX is it? */ - driver->input_monitor_mask = 0; /* XXX is it? */ + driver->clock_mode = ClockMaster; /* XXX is it? */ + driver->input_monitor_mask = 0; /* XXX is it? */ driver->capture_ports = 0; driver->playback_ports = 0; @@ -2246,23 +2245,23 @@ alsa_driver_detach (alsa_driver_t *driver) SND_PCM_NONBLOCK) < 0) { switch (errno) { case EBUSY: - current_apps = discover_alsa_using_apps (); - if (current_apps) { - jack_error ("\n\nATTENTION: The playback device \"%s\" is " - "already in use. The following applications " - " are using your soundcard(s) so you should " - " check them and stop them as necessary before " - " trying to start JACK again:\n\n%s", - playback_alsa_device, - current_apps); - free (current_apps); - } else { - jack_error ("\n\nATTENTION: The playback device \"%s\" is " - "already in use. Please stop the" - " application using it and " - "run JACK again", - playback_alsa_device); - } + current_apps = discover_alsa_using_apps (); + if (current_apps) { + jack_error ("\n\nATTENTION: The playback device \"%s\" is " + "already in use. The following applications " + " are using your soundcard(s) so you should " + " check them and stop them as necessary before " + " trying to start JACK again:\n\n%s", + playback_alsa_device, + current_apps); + free (current_apps); + } else { + jack_error ("\n\nATTENTION: The playback device \"%s\" is " + "already in use. Please stop the" + " application using it and " + "run JACK again", + playback_alsa_device); + } alsa_driver_delete (driver); return NULL; break; @@ -2291,23 +2290,23 @@ alsa_driver_detach (alsa_driver_t *driver) SND_PCM_NONBLOCK) < 0) { switch (errno) { case EBUSY: - current_apps = discover_alsa_using_apps (); - if (current_apps) { - jack_error ("\n\nATTENTION: The capture device \"%s\" is " - "already in use. The following applications " - " are using your soundcard(s) so you should " - " check them and stop them as necessary before " - " trying to start JACK again:\n\n%s", - capture_alsa_device, - current_apps); - free (current_apps); - } else { - jack_error ("\n\nATTENTION: The capture (recording) device \"%s\" is " - "already in use. Please stop the" - " application using it and " - "run JACK again", - capture_alsa_device); - } + current_apps = discover_alsa_using_apps (); + if (current_apps) { + jack_error ("\n\nATTENTION: The capture device \"%s\" is " + "already in use. The following applications " + " are using your soundcard(s) so you should " + " check them and stop them as necessary before " + " trying to start JACK again:\n\n%s", + capture_alsa_device, + current_apps); + free (current_apps); + } else { + jack_error ("\n\nATTENTION: The capture (recording) device \"%s\" is " + "already in use. Please stop the" + " application using it and " + "run JACK again", + capture_alsa_device); + } alsa_driver_delete (driver); return NULL; break; @@ -2423,11 +2422,11 @@ alsa_driver_detach (alsa_driver_t *driver) } } - jack_set_latency_callback (client, alsa_driver_latency_callback, driver); + jack_set_latency_callback (client, alsa_driver_latency_callback, driver); driver->client = client; - return (jack_driver_t *) driver; + return (jack_driver_t*)driver; } int @@ -2437,7 +2436,7 @@ alsa_driver_listen_for_clock_sync_status (alsa_driver_t *driver, { ClockSyncListener *csl; - csl = (ClockSyncListener *) malloc (sizeof (ClockSyncListener)); + csl = (ClockSyncListener*)malloc (sizeof(ClockSyncListener)); csl->function = func; csl->arg = arg; csl->id = driver->next_clock_sync_listener_id++; @@ -2456,10 +2455,11 @@ alsa_driver_stop_listening_to_clock_sync_status (alsa_driver_t *driver, { JSList *node; int ret = -1; + pthread_mutex_lock (&driver->clock_sync_lock); for (node = driver->clock_sync_listeners; node; node = jack_slist_next (node)) { - if (((ClockSyncListener *) node->data)->id == which) { + if (((ClockSyncListener*)node->data)->id == which) { driver->clock_sync_listeners = jack_slist_remove_link ( driver->clock_sync_listeners, node); @@ -2482,7 +2482,7 @@ alsa_driver_clock_sync_notify (alsa_driver_t *driver, channel_t chn, pthread_mutex_lock (&driver->clock_sync_lock); for (node = driver->clock_sync_listeners; node; node = jack_slist_next (node)) { - ClockSyncListener *csl = (ClockSyncListener *) node->data; + ClockSyncListener *csl = (ClockSyncListener*)node->data; csl->function (chn, status, csl->arg); } pthread_mutex_unlock (&driver->clock_sync_lock); @@ -2529,12 +2529,12 @@ driver_get_descriptor () jack_driver_param_desc_t * params; unsigned int i; - desc = calloc (1, sizeof (jack_driver_desc_t)); + desc = calloc (1, sizeof(jack_driver_desc_t)); - strcpy (desc->name,"alsa"); + strcpy (desc->name, "alsa"); desc->nparams = 18; - params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); + params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t)); i = 0; strcpy (params[i].name, "capture"); @@ -2591,7 +2591,7 @@ driver_get_descriptor () params[i].character = 'H'; params[i].type = JackDriverParamBool; params[i].value.i = 0; - strcpy (params[i].short_desc,"Hardware monitoring, if available"); + strcpy (params[i].short_desc, "Hardware monitoring, if available"); strcpy (params[i].long_desc, params[i].short_desc); i++; @@ -2614,7 +2614,7 @@ driver_get_descriptor () i++; strcpy (params[i].name, "softmode"); params[i].character = 's'; - params[i].type = JackDriverParamBool; + params[i].type = JackDriverParamBool; params[i].value.i = 0; strcpy (params[i].short_desc, "Soft-mode, no xrun handling"); strcpy (params[i].long_desc, params[i].short_desc); @@ -2699,7 +2699,7 @@ driver_get_descriptor () jack_driver_t * driver_initialize (jack_client_t *client, const JSList * params) { - jack_nframes_t srate = 48000; + jack_nframes_t srate = 48000; jack_nframes_t frames_per_interrupt = 1024; unsigned long user_nperiods = 2; char *playback_pcm_name = "hw:0"; @@ -2720,7 +2720,7 @@ driver_initialize (jack_client_t *client, const JSList * params) const jack_driver_param_t * param; for (node = params; node; node = jack_slist_next (node)) { - param = (const jack_driver_param_t *) node->data; + param = (const jack_driver_param_t*)node->data; switch (param->character) { @@ -2761,9 +2761,9 @@ driver_initialize (jack_client_t *client, const JSList * params) break; case 'r': - srate = param->value.ui; + srate = param->value.ui; jack_info ("apparent rate = %d", srate); - break; + break; case 'p': frames_per_interrupt = param->value.ui; @@ -2771,8 +2771,9 @@ driver_initialize (jack_client_t *client, const JSList * params) case 'n': user_nperiods = param->value.ui; - if (user_nperiods < 2) /* enforce minimum value */ + if (user_nperiods < 2) { /* enforce minimum value */ user_nperiods = 2; + } break; case 's': @@ -2781,7 +2782,7 @@ driver_initialize (jack_client_t *client, const JSList * params) case 'z': if (dither_opt (param->value.c, &dither)) { - return NULL; + return NULL; } break; @@ -2789,7 +2790,7 @@ driver_initialize (jack_client_t *client, const JSList * params) user_capture_nchnls = param->value.ui; break; case 'o': - user_playback_nchnls = param->value.ui; + user_playback_nchnls = param->value.ui; break; case 'S': @@ -2805,7 +2806,7 @@ driver_initialize (jack_client_t *client, const JSList * params) break; case 'X': - /* ignored, legacy option */ + /* ignored, legacy option */ break; } @@ -2832,5 +2833,5 @@ driver_initialize (jack_client_t *client, const JSList * params) void driver_finish (jack_driver_t *driver) { - alsa_driver_delete ((alsa_driver_t *) driver); + alsa_driver_delete ((alsa_driver_t*)driver); } |