pcm: direct - cleanups for snd_pcm_direct_reset_slave_ptr()

- improve readability
- pass slave hw_ptr as argument - improves the code flow

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2022-05-03 19:08:59 +02:00
parent 76659453ef
commit d0ebce5928
5 changed files with 16 additions and 22 deletions

View file

@ -2120,22 +2120,22 @@ int snd_pcm_direct_parse_open_conf(snd_config_t *root, snd_config_t *conf,
return 0; return 0;
} }
void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix) void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix,
snd_pcm_uframes_t hw_ptr)
{ {
dmix->slave_appl_ptr = dmix->slave_hw_ptr = hw_ptr;
if (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_ROUNDUP || if (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_ROUNDUP ||
(dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_AUTO && (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_AUTO &&
pcm->buffer_size <= pcm->period_size * 2)) pcm->buffer_size <= pcm->period_size * 2))
dmix->slave_appl_ptr = dmix->slave_appl_ptr =
((dmix->slave_appl_ptr + dmix->slave_period_size - 1) / ((dmix->slave_appl_ptr + dmix->slave_period_size - 1) /
dmix->slave_period_size) * dmix->slave_period_size; dmix->slave_period_size) * dmix->slave_period_size;
else if (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_ROUNDDOWN || else if (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_ROUNDDOWN ||
(dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_AUTO && (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_AUTO &&
(dmix->slave_period_size * SEC_TO_MS) / ((dmix->slave_period_size * SEC_TO_MS) / pcm->rate) < LOW_LATENCY_PERIOD_TIME))
pcm->rate < LOW_LATENCY_PERIOD_TIME))
dmix->slave_appl_ptr = dmix->slave_hw_ptr = dmix->slave_appl_ptr = dmix->slave_hw_ptr =
((dmix->slave_hw_ptr / dmix->slave_period_size) * ((dmix->slave_hw_ptr / dmix->slave_period_size) *
dmix->slave_period_size); dmix->slave_period_size);
} }
int _snd_pcm_direct_new(snd_pcm_t **pcmp, snd_pcm_direct_t **_dmix, int type, int _snd_pcm_direct_new(snd_pcm_t **pcmp, snd_pcm_direct_t **_dmix, int type,

View file

@ -348,7 +348,7 @@ int snd_pcm_direct_slave_recover(snd_pcm_direct_t *direct);
int snd_pcm_direct_check_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm); int snd_pcm_direct_check_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm);
int snd_timer_async(snd_timer_t *timer, int sig, pid_t pid); int snd_timer_async(snd_timer_t *timer, int sig, pid_t pid);
struct timespec snd_pcm_hw_fast_tstamp(snd_pcm_t *pcm); struct timespec snd_pcm_hw_fast_tstamp(snd_pcm_t *pcm);
void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix); void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix, snd_pcm_uframes_t hw_ptr);
struct snd_pcm_direct_open_conf { struct snd_pcm_direct_open_conf {
key_t ipc_key; key_t ipc_key;

View file

@ -531,8 +531,7 @@ static int snd_pcm_dmix_reset(snd_pcm_t *pcm)
snd_pcm_direct_t *dmix = pcm->private_data; snd_pcm_direct_t *dmix = pcm->private_data;
dmix->hw_ptr %= pcm->period_size; dmix->hw_ptr %= pcm->period_size;
dmix->appl_ptr = dmix->last_appl_ptr = dmix->hw_ptr; dmix->appl_ptr = dmix->last_appl_ptr = dmix->hw_ptr;
dmix->slave_appl_ptr = dmix->slave_hw_ptr = *dmix->spcm->hw.ptr; snd_pcm_direct_reset_slave_ptr(pcm, dmix, *dmix->spcm->hw.ptr);
snd_pcm_direct_reset_slave_ptr(pcm, dmix);
return 0; return 0;
} }
@ -541,8 +540,7 @@ static int snd_pcm_dmix_start_timer(snd_pcm_t *pcm, snd_pcm_direct_t *dmix)
int err; int err;
snd_pcm_hwsync(dmix->spcm); snd_pcm_hwsync(dmix->spcm);
dmix->slave_appl_ptr = dmix->slave_hw_ptr = *dmix->spcm->hw.ptr; snd_pcm_direct_reset_slave_ptr(pcm, dmix, *dmix->spcm->hw.ptr);
snd_pcm_direct_reset_slave_ptr(pcm, dmix);
err = snd_timer_start(dmix->timer); err = snd_timer_start(dmix->timer);
if (err < 0) if (err < 0)
return err; return err;

View file

@ -305,8 +305,7 @@ static int snd_pcm_dshare_reset(snd_pcm_t *pcm)
snd_pcm_direct_t *dshare = pcm->private_data; snd_pcm_direct_t *dshare = pcm->private_data;
dshare->hw_ptr %= pcm->period_size; dshare->hw_ptr %= pcm->period_size;
dshare->appl_ptr = dshare->last_appl_ptr = dshare->hw_ptr; dshare->appl_ptr = dshare->last_appl_ptr = dshare->hw_ptr;
dshare->slave_appl_ptr = dshare->slave_hw_ptr = *dshare->spcm->hw.ptr; snd_pcm_direct_reset_slave_ptr(pcm, dshare, *dshare->spcm->hw.ptr);
snd_pcm_direct_reset_slave_ptr(pcm, dshare);
return 0; return 0;
} }
@ -315,8 +314,7 @@ static int snd_pcm_dshare_start_timer(snd_pcm_t *pcm, snd_pcm_direct_t *dshare)
int err; int err;
snd_pcm_hwsync(dshare->spcm); snd_pcm_hwsync(dshare->spcm);
dshare->slave_appl_ptr = dshare->slave_hw_ptr = *dshare->spcm->hw.ptr; snd_pcm_direct_reset_slave_ptr(pcm, dshare, *dshare->spcm->hw.ptr);
snd_pcm_direct_reset_slave_ptr(pcm, dshare);
err = snd_timer_start(dshare->timer); err = snd_timer_start(dshare->timer);
if (err < 0) if (err < 0)
return err; return err;

View file

@ -251,8 +251,7 @@ static int snd_pcm_dsnoop_reset(snd_pcm_t *pcm)
snd_pcm_direct_t *dsnoop = pcm->private_data; snd_pcm_direct_t *dsnoop = pcm->private_data;
dsnoop->hw_ptr %= pcm->period_size; dsnoop->hw_ptr %= pcm->period_size;
dsnoop->appl_ptr = dsnoop->hw_ptr; dsnoop->appl_ptr = dsnoop->hw_ptr;
dsnoop->slave_appl_ptr = dsnoop->slave_hw_ptr; snd_pcm_direct_reset_slave_ptr(pcm, dsnoop, dsnoop->slave_hw_ptr);
snd_pcm_direct_reset_slave_ptr(pcm, dsnoop);
return 0; return 0;
} }
@ -265,8 +264,7 @@ static int snd_pcm_dsnoop_start(snd_pcm_t *pcm)
return -EBADFD; return -EBADFD;
snd_pcm_hwsync(dsnoop->spcm); snd_pcm_hwsync(dsnoop->spcm);
snoop_timestamp(pcm); snoop_timestamp(pcm);
dsnoop->slave_appl_ptr = dsnoop->slave_hw_ptr; snd_pcm_direct_reset_slave_ptr(pcm, dsnoop, dsnoop->slave_hw_ptr);
snd_pcm_direct_reset_slave_ptr(pcm, dsnoop);
err = snd_timer_start(dsnoop->timer); err = snd_timer_start(dsnoop->timer);
if (err < 0) if (err < 0)
return err; return err;