diff --git a/linux/alsa/alsa_driver.c b/linux/alsa/alsa_driver.c index 6a7b92d6..055ac369 100644 --- a/linux/alsa/alsa_driver.c +++ b/linux/alsa/alsa_driver.c @@ -323,10 +323,22 @@ alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) sample_move_d32l24_sS; break; case SND_PCM_FORMAT_S32_LE: - driver->write_via_copy = driver->quirk_bswap? - sample_move_d32_sSs: - sample_move_d32_sS; + { + int bits = snd_pcm_hw_params_get_sbits(driver->playback_hw_params); + if (bits == 32) + { + driver->write_via_copy = driver->quirk_bswap? + sample_move_d32_sSs: + sample_move_d32_sS; + } + else + { + driver->write_via_copy = driver->quirk_bswap? + sample_move_d32u24_sSs: + sample_move_d32u24_sS; + } break; + } default: jack_error("unsupported 4 byte sample_format"); exit (1); @@ -357,20 +369,32 @@ alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) sample_move_dS_s24; break; case 4: - switch (driver->capture_sample_format) - { - case SND_PCM_FORMAT_S24_LE: - case SND_PCM_FORMAT_S24_BE: + switch (driver->capture_sample_format) + { + case SND_PCM_FORMAT_S24_LE: + case SND_PCM_FORMAT_S24_BE: driver->read_via_copy = driver->quirk_bswap? sample_move_dS_s32l24s: sample_move_dS_s32l24; break; - case SND_PCM_FORMAT_S32_LE: - driver->read_via_copy = driver->quirk_bswap? - sample_move_dS_s32s: - sample_move_dS_s32; - break; - default: + case SND_PCM_FORMAT_S32_LE: + { + int bits = snd_pcm_hw_params_get_sbits(driver->capture_hw_params); + if (bits == 32) + { + driver->read_via_copy = driver->quirk_bswap? + sample_move_dS_s32s: + sample_move_dS_s32; + } + else + { + driver->read_via_copy = driver->quirk_bswap? + sample_move_dS_s32u24s: + sample_move_dS_s32u24; + } + break; + } + default: jack_error("unsupported 4 byte sample_format"); exit (1); }