mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
pcm: hw: introduce SNDRV_PCM_HW_PARAMS_DRAIN_SILENCE
The application may not require to touch the playback sample stream for the drain operation at all. In this case, the application is responsible to setup a silencing mechanism for the playback or another graceful stop (like using the rewind operation). Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
90e25887d2
commit
264d6c43ee
5 changed files with 45 additions and 1 deletions
|
|
@ -822,6 +822,8 @@ int snd_pcm_hw_params_set_export_buffer(snd_pcm_t *pcm, snd_pcm_hw_params_t *par
|
|||
int snd_pcm_hw_params_get_export_buffer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
|
||||
int snd_pcm_hw_params_set_period_wakeup(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
|
||||
int snd_pcm_hw_params_get_period_wakeup(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
|
||||
int snd_pcm_hw_params_set_drain_silence(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
|
||||
int snd_pcm_hw_params_get_drain_silence(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
|
||||
|
||||
int snd_pcm_hw_params_get_period_time(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
|
||||
int snd_pcm_hw_params_get_period_time_min(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
|
||||
|
|
|
|||
|
|
@ -390,6 +390,9 @@ typedef int snd_pcm_hw_param_t;
|
|||
#define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1<<0) /* avoid rate resampling */
|
||||
#define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER (1<<1) /* export buffer */
|
||||
#define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP (1<<2) /* disable period wakeups */
|
||||
#define SNDRV_PCM_HW_PARAMS_NO_DRAIN_SILENCE (1<<3) /* suppress the silence fill
|
||||
* for draining
|
||||
*/
|
||||
|
||||
struct snd_interval {
|
||||
unsigned int min, max;
|
||||
|
|
|
|||
|
|
@ -4958,6 +4958,43 @@ int snd_pcm_hw_params_get_period_wakeup(snd_pcm_t *pcm, snd_pcm_hw_params_t *par
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Restrict a configuration space to fill the end of playback stream with silence when drain() is invoked
|
||||
* \param pcm PCM handle
|
||||
* \param params Configuration space
|
||||
* \param val 0 = disabled, 1 = enabled (default) fill the end of the playback stream with silence when drain() is invoked
|
||||
* \return Zero on success, otherwise a negative error code.
|
||||
*
|
||||
* When disabled, the application should handle the end of stream gracefully
|
||||
* (fill the silent samples to align to the period size plus some extra
|
||||
* samples for hardware / driver without perfect drain). Note that the rewind
|
||||
* may be used for this purpose or the sw_params silencing mechanism.
|
||||
*/
|
||||
int snd_pcm_hw_params_set_drain_silence(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val)
|
||||
{
|
||||
assert(pcm && params);
|
||||
if (val)
|
||||
params->flags &= ~SND_PCM_HW_PARAMS_NO_DRAIN_SILENCE;
|
||||
else
|
||||
params->flags |= SND_PCM_HW_PARAMS_NO_DRAIN_SILENCE;
|
||||
params->rmask = ~0;
|
||||
return snd_pcm_hw_refine(pcm, params);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Extract drain with the filling of silence samples from a configuration space
|
||||
* \param pcm PCM handle
|
||||
* \param params Configuration space
|
||||
* \param val 0 = disabled, 1 = enabled
|
||||
* \return 0 otherwise a negative error code
|
||||
*/
|
||||
int snd_pcm_hw_params_get_drain_silence(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
|
||||
{
|
||||
assert(pcm && params && val);
|
||||
*val = params->flags & SND_PCM_HW_PARAMS_NO_DRAIN_SILENCE ? 0 : 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Extract period time from a configuration space
|
||||
* \param params Configuration space
|
||||
|
|
|
|||
|
|
@ -399,7 +399,8 @@ static int snd_pcm_hw_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params)
|
|||
params->info &= ~0xf0000000;
|
||||
if (pcm->tstamp_type != SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY)
|
||||
params->info |= SND_PCM_INFO_MONOTONIC;
|
||||
hw->perfect_drain = !!(params->info & SND_PCM_INFO_PERFECT_DRAIN);
|
||||
hw->perfect_drain = !!(params->info & SND_PCM_INFO_PERFECT_DRAIN) ||
|
||||
!!(params->flags & SND_PCM_HW_PARAMS_NO_DRAIN_SILENCE);
|
||||
return query_status_data(hw);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -107,6 +107,7 @@
|
|||
#define SND_PCM_HW_PARAMS_NORESAMPLE SNDRV_PCM_HW_PARAMS_NORESAMPLE
|
||||
#define SND_PCM_HW_PARAMS_EXPORT_BUFFER SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER
|
||||
#define SND_PCM_HW_PARAMS_NO_PERIOD_WAKEUP SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP
|
||||
#define SND_PCM_HW_PARAMS_NO_DRAIN_SILENCE SNDRV_PCM_HW_PARAMS_NO_DRAIN_SILENCE
|
||||
|
||||
#define SND_PCM_INFO_MONOTONIC 0x80000000
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue