diff --git a/libs/backends/alsa/zita-alsa-pcmi.cc b/libs/backends/alsa/zita-alsa-pcmi.cc index e8e9eb0e43..1cb974cd49 100644 --- a/libs/backends/alsa/zita-alsa-pcmi.cc +++ b/libs/backends/alsa/zita-alsa-pcmi.cc @@ -1,6 +1,7 @@ // ---------------------------------------------------------------------------- // // Copyright (C) 2006-2012 Fons Adriaensen +// Copyright (C) 2014-2021 Robin Gareus // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -62,7 +63,7 @@ Alsa_pcmi::Alsa_pcmi ( { const char *p; - p = getenv ("ZITA_ALSA_PCMI_DEBUG"); + p = getenv ("ARDOUR_ALSA_DEBUG"); if (p && *p) _debug = atoi (p); initialise (play_name, capt_name, ctrl_name); } @@ -347,6 +348,27 @@ int Alsa_pcmi::capt_done (int len) return snd_pcm_mmap_commit (_capt_handle, _capt_offs, len); } +static const char* access_type_name (snd_pcm_access_t a) +{ + switch (a) { + case SND_PCM_ACCESS_MMAP_INTERLEAVED: + return "MMAP interleaved"; + case SND_PCM_ACCESS_MMAP_NONINTERLEAVED: + return "MMAP non-interleaved"; + case SND_PCM_ACCESS_MMAP_COMPLEX: + return "MMAP complex"; + case SND_PCM_ACCESS_RW_INTERLEAVED: + assert (0); + return "RW interleaved"; + case SND_PCM_ACCESS_RW_NONINTERLEAVED: + assert (0); + return "RW non-interleaved"; + default: + assert (0); + return "unknown"; + } +} + void Alsa_pcmi::printinfo (void) { @@ -358,6 +380,7 @@ void Alsa_pcmi::printinfo (void) fprintf (stdout, " fsize : %ld\n", _fsize); fprintf (stdout, " nfrag : %d\n", _real_nfrag); fprintf (stdout, " format : %s\n", snd_pcm_format_name (_play_format)); + fprintf (stdout, " access : %s\n", access_type_name (_play_access)); } else { fprintf (stdout, " : not enabled\n"); } @@ -370,6 +393,7 @@ void Alsa_pcmi::printinfo (void) fprintf (stdout, " fsize : %ld\n", _fsize); fprintf (stdout, " nfrag : %d\n", _capt_nfrag); fprintf (stdout, " format : %s\n", snd_pcm_format_name (_capt_format)); + fprintf (stdout, " access : %s\n", access_type_name (_capt_access)); if (_play_handle) fprintf (stdout, "%s\n", _synced ? "synced" : "not synced"); } else { fprintf (stdout, " : not enabled\n"); @@ -701,9 +725,12 @@ int Alsa_pcmi::set_hwpar (snd_pcm_t *handle, snd_pcm_hw_params_t *hwpar, const sname); return -1; } - if ( (snd_pcm_hw_params_set_access (handle, hwpar, SND_PCM_ACCESS_MMAP_NONINTERLEAVED) < 0) - && (snd_pcm_hw_params_set_access (handle, hwpar, SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) - && (snd_pcm_hw_params_set_access (handle, hwpar, SND_PCM_ACCESS_MMAP_COMPLEX) < 0)) + + bool il = _debug & TRY_INTLVD; + + if ( (snd_pcm_hw_params_set_access (handle, hwpar, il ? SND_PCM_ACCESS_MMAP_INTERLEAVED : SND_PCM_ACCESS_MMAP_NONINTERLEAVED) < 0) + && (snd_pcm_hw_params_set_access (handle, hwpar, il ? SND_PCM_ACCESS_MMAP_NONINTERLEAVED : SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) + && (snd_pcm_hw_params_set_access (handle, hwpar, SND_PCM_ACCESS_MMAP_COMPLEX) < 0)) { if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: the %s interface doesn't support mmap-based access.\n", sname); diff --git a/libs/backends/alsa/zita-alsa-pcmi.h b/libs/backends/alsa/zita-alsa-pcmi.h index 0a505b08bf..154139434e 100644 --- a/libs/backends/alsa/zita-alsa-pcmi.h +++ b/libs/backends/alsa/zita-alsa-pcmi.h @@ -1,6 +1,7 @@ // ---------------------------------------------------------------------------- // // Copyright (C) 2006-2012 Fons Adriaensen +// Copyright (C) 2014-2021 Robin Gareus // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -45,13 +46,14 @@ public: enum { - DEBUG_INIT = 1, - DEBUG_STAT = 2, - DEBUG_WAIT = 4, - DEBUG_DATA = 8, - DEBUG_ALL = 15, - FORCE_16B = 256, - FORCE_2CH = 512 + DEBUG_INIT = 0x001, + DEBUG_STAT = 0x002, + DEBUG_WAIT = 0x004, + DEBUG_DATA = 0x008, + DEBUG_ALL = 0x00f, // 15 + FORCE_16B = 0x100, // 256, + FORCE_2CH = 0x200, // 512 + TRY_INTLVD = 0x400, // 1024 }; void printinfo (void);