diff -uprN jack-audio-connection-kit-0.100.7/drivers/alsa/alsa_driver.c jack-0.100.7/drivers/alsa/alsa_driver.c --- jack-audio-connection-kit-0.100.7/drivers/alsa/alsa_driver.c 2005-09-24 15:51:53.000000000 +0100 +++ jack-0.100.7/drivers/alsa/alsa_driver.c 2005-12-10 19:10:27.000000000 +0000 @@ -70,6 +70,15 @@ alsa_driver_release_channel_dependent_me driver->capture_addr = 0; } + if (driver->playback_interleave_skip) { + free (driver->playback_interleave_skip); + driver->playback_interleave_skip = NULL; + } + if (driver->capture_interleave_skip) { + free (driver->capture_interleave_skip); + driver->capture_interleave_skip = NULL; + } + if (driver->silent) { free (driver->silent); driver->silent = 0; @@ -377,6 +386,9 @@ alsa_driver_configure_stream (alsa_drive if ((err = snd_pcm_hw_params_set_access ( handle, hw_params, SND_PCM_ACCESS_MMAP_INTERLEAVED)) < 0) { + if ((err = snd_pcm_hw_params_set_access ( + handle, hw_params, + SND_PCM_ACCESS_MMAP_COMPLEX)) < 0) { jack_error ("ALSA: mmap-based access is not possible" " for the %s " "stream of this audio interface", @@ -384,6 +396,7 @@ alsa_driver_configure_stream (alsa_drive return -1; } } + } format = sample_width == 4 ? 0 : NOFORMATS - 1; while (1) { @@ -683,7 +696,8 @@ alsa_driver_set_parameters (alsa_driver_ err = snd_pcm_hw_params_get_access (driver->playback_hw_params, &access); driver->playback_interleaved = - (access == SND_PCM_ACCESS_MMAP_INTERLEAVED); + (access == SND_PCM_ACCESS_MMAP_INTERLEAVED) + || (access == SND_PCM_ACCESS_MMAP_COMPLEX); if (p_period_size != driver->frames_per_cycle) { jack_error ("alsa_pcm: requested an interrupt every %" @@ -705,7 +719,8 @@ alsa_driver_set_parameters (alsa_driver_ err = snd_pcm_hw_params_get_access (driver->capture_hw_params, &access); driver->capture_interleaved = - (access == SND_PCM_ACCESS_MMAP_INTERLEAVED); + (access == SND_PCM_ACCESS_MMAP_INTERLEAVED) + || (access == SND_PCM_ACCESS_MMAP_COMPLEX); if (c_period_size != driver->frames_per_cycle) { @@ -765,15 +780,11 @@ alsa_driver_set_parameters (alsa_driver_ driver->alsa_name_playback); return -1; } - driver->playback_interleave_skip = my_areas[0].step / 8; driver->interleave_unit = snd_pcm_format_physical_width ( driver->playback_sample_format) / 8; } else { driver->interleave_unit = 0; /* NOT USED */ - driver->playback_interleave_skip = - snd_pcm_format_physical_width ( - driver->playback_sample_format) / 8; } if (driver->capture_interleaved) { @@ -785,11 +796,6 @@ alsa_driver_set_parameters (alsa_driver_ driver->alsa_name_capture); return -1; } - driver->capture_interleave_skip = my_areas[0].step / 8; - } else { - driver->capture_interleave_skip = - snd_pcm_format_physical_width ( - driver->capture_sample_format) / 8; } if (driver->playback_nchannels > driver->capture_nchannels) { @@ -819,6 +825,10 @@ alsa_driver_set_parameters (alsa_driver_ 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); + memset (driver->playback_interleave_skip, 0, + sizeof (unsigned long *) * driver->playback_nchannels); driver->silent = (unsigned long *) malloc (sizeof (unsigned long) * driver->playback_nchannels); @@ -841,6 +851,10 @@ alsa_driver_set_parameters (alsa_driver_ 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); + memset (driver->capture_interleave_skip, 0, + sizeof (unsigned long *) * driver->capture_nchannels); } driver->clock_sync_data = (ClockSyncStatus *) @@ -897,6 +911,7 @@ alsa_driver_get_channel_addresses (alsa_ &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); } } @@ -915,6 +930,7 @@ alsa_driver_get_channel_addresses (alsa_ &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); } } @@ -1988,6 +2004,8 @@ alsa_driver_new (char *name, char *playb driver->playback_addr = 0; driver->capture_addr = 0; + driver->playback_interleave_skip = NULL; + driver->capture_interleave_skip = NULL; driver->silent = 0; diff -uprN jack-audio-connection-kit-0.100.7/drivers/alsa/alsa_driver.h jack-0.100.7/drivers/alsa/alsa_driver.h --- jack-audio-connection-kit-0.100.7/drivers/alsa/alsa_driver.h 2005-04-07 00:58:16.000000000 +0100 +++ jack-0.100.7/drivers/alsa/alsa_driver.h 2005-12-10 19:16:55.000000000 +0000 @@ -65,8 +65,8 @@ typedef struct _alsa_driver { unsigned int playback_nfds; unsigned int capture_nfds; unsigned long interleave_unit; - unsigned long capture_interleave_skip; - unsigned long playback_interleave_skip; + unsigned long *capture_interleave_skip; + unsigned long *playback_interleave_skip; channel_t max_nchannels; channel_t user_nchannels; channel_t playback_nchannels; @@ -155,7 +155,7 @@ alsa_driver_silence_on_channel (alsa_dri (driver->playback_addr[chn], 0, nframes * driver->playback_sample_bytes, driver->interleave_unit, - driver->playback_interleave_skip); + driver->playback_interleave_skip[chn]); } else { memset (driver->playback_addr[chn], 0, nframes * driver->playback_sample_bytes); @@ -171,7 +171,7 @@ alsa_driver_silence_on_channel_no_mark ( (driver->playback_addr[chn], 0, nframes * driver->playback_sample_bytes, driver->interleave_unit, - driver->playback_interleave_skip); + driver->playback_interleave_skip[chn]); } else { memset (driver->playback_addr[chn], 0, nframes * driver->playback_sample_bytes); @@ -187,7 +187,7 @@ alsa_driver_read_from_channel (alsa_driv driver->read_via_copy (buf, driver->capture_addr[channel], nsamples, - driver->capture_interleave_skip); + driver->capture_interleave_skip[channel]); } static inline void @@ -199,7 +199,7 @@ alsa_driver_write_to_channel (alsa_drive driver->write_via_copy (driver->playback_addr[channel], buf, nsamples, - driver->playback_interleave_skip, + driver->playback_interleave_skip[channel], driver->dither_state+channel); alsa_driver_mark_channel_done (driver, channel); } @@ -213,8 +213,8 @@ alsa_driver_copy_channel (alsa_driver_t driver->channel_copy (driver->playback_addr[output_channel], driver->capture_addr[input_channel], nsamples * driver->playback_sample_bytes, - driver->playback_interleave_skip, - driver->capture_interleave_skip); + driver->playback_interleave_skip[output_channel], + driver->capture_interleave_skip[input_channel]); alsa_driver_mark_channel_done (driver, output_channel); }