{
int err;
snd_pcm_softvol_t *svol = pcm->private_data;
+ snd_pcm_access_mask_t access_mask = { SND_PCM_ACCBIT_SHM };
snd_pcm_format_mask_t format_mask = {
{
(1ULL << SND_PCM_FORMAT_S16_LE) |
snd_pcm_format_mask_none(&format_mask);
snd_pcm_format_mask_set(&format_mask, svol->sformat);
}
+ err = _snd_pcm_hw_param_set_mask(params, SND_PCM_HW_PARAM_ACCESS,
+ &access_mask);
+ if (err < 0)
+ return err;
err = _snd_pcm_hw_param_set_mask(params, SND_PCM_HW_PARAM_FORMAT,
&format_mask);
if (err < 0)
static int snd_pcm_softvol_hw_refine_sprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *sparams)
{
snd_pcm_softvol_t *svol = pcm->private_data;
+ snd_pcm_access_mask_t saccess_mask = { SND_PCM_ACCBIT_MMAP };
_snd_pcm_hw_params_any(sparams);
+ _snd_pcm_hw_param_set_mask(sparams, SND_PCM_HW_PARAM_ACCESS,
+ &saccess_mask);
if (svol->sformat != SND_PCM_FORMAT_UNKNOWN) {
_snd_pcm_hw_params_set_format(sparams, svol->sformat);
_snd_pcm_hw_params_set_subformat(sparams, SND_PCM_SUBFORMAT_STD);
return 0;
}
+/*
+ * refine the access mask
+ */
+static int check_access_mask(snd_pcm_hw_params_t *src,
+ snd_pcm_hw_params_t *dst)
+{
+ const snd_pcm_access_mask_t *mask;
+ snd_pcm_access_mask_t smask;
+
+ mask = snd_pcm_hw_param_get_mask(src, SND_PCM_HW_PARAM_ACCESS);
+ snd_mask_none(&smask);
+ if (snd_pcm_access_mask_test(mask, SND_PCM_ACCESS_RW_INTERLEAVED) ||
+ snd_pcm_access_mask_test(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED)) {
+ snd_pcm_access_mask_set(&smask,
+ SND_PCM_ACCESS_RW_INTERLEAVED);
+ snd_pcm_access_mask_set(&smask,
+ SND_PCM_ACCESS_MMAP_INTERLEAVED);
+ }
+ if (snd_pcm_access_mask_test(mask, SND_PCM_ACCESS_RW_NONINTERLEAVED) ||
+ snd_pcm_access_mask_test(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED)) {
+ snd_pcm_access_mask_set(&smask,
+ SND_PCM_ACCESS_RW_NONINTERLEAVED);
+ snd_pcm_access_mask_set(&smask,
+ SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
+ }
+ if (snd_pcm_access_mask_test(mask, SND_PCM_ACCESS_MMAP_COMPLEX))
+ snd_pcm_access_mask_set(&smask,
+ SND_PCM_ACCESS_MMAP_COMPLEX);
+
+ return _snd_pcm_hw_param_set_mask(dst, SND_PCM_HW_PARAM_ACCESS, &smask);
+}
+
static int snd_pcm_softvol_hw_refine_schange(snd_pcm_t *pcm,
snd_pcm_hw_params_t *params,
snd_pcm_hw_params_t *sparams)
{
snd_pcm_softvol_t *svol = pcm->private_data;
int err;
- unsigned int links = (SND_PCM_HW_PARBIT_ACCESS |
- SND_PCM_HW_PARBIT_CHANNELS |
+ unsigned int links = (SND_PCM_HW_PARBIT_CHANNELS |
SND_PCM_HW_PARBIT_RATE |
SND_PCM_HW_PARBIT_PERIODS |
SND_PCM_HW_PARBIT_PERIOD_SIZE |
err = _snd_pcm_hw_params_refine(sparams, links, params);
if (err < 0)
return err;
+
+ err = check_access_mask(params, sparams);
+ if (err < 0)
+ return err;
+
return 0;
}
{
snd_pcm_softvol_t *svol = pcm->private_data;
int err;
- unsigned int links = (SND_PCM_HW_PARBIT_ACCESS |
- SND_PCM_HW_PARBIT_CHANNELS |
+ unsigned int links = (SND_PCM_HW_PARBIT_CHANNELS |
SND_PCM_HW_PARBIT_RATE |
SND_PCM_HW_PARBIT_PERIODS |
SND_PCM_HW_PARBIT_PERIOD_SIZE |
err = _snd_pcm_hw_params_refine(params, links, sparams);
if (err < 0)
return err;
+
+ err = check_access_mask(sparams, params);
+ if (err < 0)
+ return err;
+
return 0;
}