ALSA: add option to prefer interleaved access

This commit is contained in:
Robin Gareus 2021-05-15 23:10:14 +02:00
parent e2bac27885
commit 6801c2cac2
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
2 changed files with 40 additions and 11 deletions

View File

@ -1,6 +1,7 @@
// ----------------------------------------------------------------------------
//
// Copyright (C) 2006-2012 Fons Adriaensen <fons@linuxaudio.org>
// Copyright (C) 2014-2021 Robin Gareus <robin@gareus.org>
//
// 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);

View File

@ -1,6 +1,7 @@
// ----------------------------------------------------------------------------
//
// Copyright (C) 2006-2012 Fons Adriaensen <fons@linuxaudio.org>
// Copyright (C) 2014-2021 Robin Gareus <robin@gareus.org>
//
// 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);