mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-02 09:01:48 -05:00
Fixes to shm refine/params
This commit is contained in:
parent
6425734d82
commit
45387697d3
1 changed files with 20 additions and 16 deletions
|
|
@ -156,57 +156,61 @@ static int snd_pcm_shm_info(snd_pcm_t *pcm, snd_pcm_info_t * info)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _snd_pcm_shm_hw_refine(snd_pcm_t *pcm,
|
static int _snd_pcm_shm_hw_refine(snd_pcm_t *pcm,
|
||||||
snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED)
|
snd_pcm_hw_params_t *params)
|
||||||
{
|
{
|
||||||
snd_pcm_shm_t *shm = pcm->private;
|
snd_pcm_shm_t *shm = pcm->private;
|
||||||
volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl;
|
volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl;
|
||||||
|
int err;
|
||||||
|
ctrl->u.hw_refine = *params;
|
||||||
ctrl->cmd = SND_PCM_IOCTL_HW_REFINE;
|
ctrl->cmd = SND_PCM_IOCTL_HW_REFINE;
|
||||||
return snd_pcm_shm_action(pcm);
|
err = snd_pcm_shm_action(pcm);
|
||||||
|
*params = ctrl->u.hw_refine;
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int snd_pcm_shm_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
|
static int snd_pcm_shm_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
|
||||||
{
|
{
|
||||||
snd_pcm_shm_t *shm = pcm->private;
|
snd_pcm_hw_params_t sparams;
|
||||||
volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl;
|
|
||||||
snd_pcm_hw_params_t *sparams = (snd_pcm_hw_params_t *) &ctrl->u.hw_refine;
|
|
||||||
const mask_t *access_mask = snd_pcm_hw_params_value_mask(params, SND_PCM_HW_PARAM_ACCESS);
|
const mask_t *access_mask = snd_pcm_hw_params_value_mask(params, SND_PCM_HW_PARAM_ACCESS);
|
||||||
mask_t *saccess_mask = alloca(mask_sizeof());
|
mask_t *saccess_mask = alloca(mask_sizeof());
|
||||||
mask_load(saccess_mask, SND_PCM_ACCBIT_MMAP);
|
mask_load(saccess_mask, SND_PCM_ACCBIT_MMAP);
|
||||||
if (!mask_test(access_mask, SND_PCM_ACCESS_RW_INTERLEAVED) &&
|
if (!mask_test(access_mask, SND_PCM_ACCESS_RW_INTERLEAVED) &&
|
||||||
!mask_test(access_mask, SND_PCM_ACCESS_RW_NONINTERLEAVED))
|
!mask_test(access_mask, SND_PCM_ACCESS_RW_NONINTERLEAVED))
|
||||||
mask_intersect(saccess_mask, access_mask);
|
mask_intersect(saccess_mask, access_mask);
|
||||||
_snd_pcm_hw_params_any(sparams);
|
_snd_pcm_hw_params_any(&sparams);
|
||||||
_snd_pcm_hw_params_mask(sparams, 0, SND_PCM_HW_PARAM_ACCESS,
|
_snd_pcm_hw_params_mask(&sparams, 0, SND_PCM_HW_PARAM_ACCESS,
|
||||||
saccess_mask);
|
saccess_mask);
|
||||||
return snd_pcm_hw_refine2(params, sparams,
|
return snd_pcm_hw_refine2(params, &sparams,
|
||||||
_snd_pcm_shm_hw_refine, pcm,
|
_snd_pcm_shm_hw_refine, pcm,
|
||||||
~SND_PCM_HW_PARBIT_ACCESS);
|
~SND_PCM_HW_PARBIT_ACCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _snd_pcm_shm_hw_params(snd_pcm_t *pcm,
|
static int _snd_pcm_shm_hw_params(snd_pcm_t *pcm,
|
||||||
snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED)
|
snd_pcm_hw_params_t *params)
|
||||||
{
|
{
|
||||||
snd_pcm_shm_t *shm = pcm->private;
|
snd_pcm_shm_t *shm = pcm->private;
|
||||||
volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl;
|
volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl;
|
||||||
|
int err;
|
||||||
ctrl->cmd = SND_PCM_IOCTL_HW_PARAMS;
|
ctrl->cmd = SND_PCM_IOCTL_HW_PARAMS;
|
||||||
return snd_pcm_shm_action(pcm);
|
ctrl->u.hw_params = *params;
|
||||||
|
err = snd_pcm_shm_action(pcm);
|
||||||
|
*params = ctrl->u.hw_params;
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int snd_pcm_shm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params)
|
static int snd_pcm_shm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params)
|
||||||
{
|
{
|
||||||
snd_pcm_shm_t *shm = pcm->private;
|
snd_pcm_hw_params_t sparams;
|
||||||
volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl;
|
|
||||||
snd_pcm_hw_params_t *sparams = (snd_pcm_hw_params_t *) &ctrl->u.hw_refine;
|
|
||||||
const mask_t *access_mask = snd_pcm_hw_params_value_mask(params, SND_PCM_HW_PARAM_ACCESS);
|
const mask_t *access_mask = snd_pcm_hw_params_value_mask(params, SND_PCM_HW_PARAM_ACCESS);
|
||||||
mask_t *saccess_mask = alloca(mask_sizeof());
|
mask_t *saccess_mask = alloca(mask_sizeof());
|
||||||
mask_load(saccess_mask, SND_PCM_ACCBIT_MMAP);
|
mask_load(saccess_mask, SND_PCM_ACCBIT_MMAP);
|
||||||
if (!mask_test(access_mask, SND_PCM_ACCESS_RW_INTERLEAVED) &&
|
if (!mask_test(access_mask, SND_PCM_ACCESS_RW_INTERLEAVED) &&
|
||||||
!mask_test(access_mask, SND_PCM_ACCESS_RW_NONINTERLEAVED))
|
!mask_test(access_mask, SND_PCM_ACCESS_RW_NONINTERLEAVED))
|
||||||
mask_intersect(saccess_mask, access_mask);
|
mask_intersect(saccess_mask, access_mask);
|
||||||
_snd_pcm_hw_params_any(sparams);
|
_snd_pcm_hw_params_any(&sparams);
|
||||||
_snd_pcm_hw_params_mask(sparams, 0, SND_PCM_HW_PARAM_ACCESS,
|
_snd_pcm_hw_params_mask(&sparams, 0, SND_PCM_HW_PARAM_ACCESS,
|
||||||
saccess_mask);
|
saccess_mask);
|
||||||
return snd_pcm_hw_params2(params, sparams,
|
return snd_pcm_hw_params2(params, &sparams,
|
||||||
_snd_pcm_shm_hw_params, pcm,
|
_snd_pcm_shm_hw_params, pcm,
|
||||||
~SND_PCM_HW_PARBIT_ACCESS);
|
~SND_PCM_HW_PARBIT_ACCESS);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue