mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-31 22:25:35 -04:00
pcm: hw: introduce SNDRV_PCM_INFO_PERFECT_DRAIN
Handle the driver informing us that it is not necessary to set up silencing upon playback draining. This will be the case for drivers which are guaranteed to not read any samples beyond the application pointer. Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
dd9cb31a90
commit
90e25887d2
5 changed files with 30 additions and 1 deletions
|
|
@ -3707,6 +3707,29 @@ int snd_pcm_hw_params_can_disable_period_wakeup(const snd_pcm_hw_params_t *param
|
|||
return !!(params->info & SNDRV_PCM_INFO_NO_PERIOD_WAKEUP);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Check if hardware is capable of perfect drain
|
||||
* \param params Configuration space
|
||||
* \retval 0 Hardware doesn't do perfect drain
|
||||
* \retval 1 Hardware does perfect drain
|
||||
*
|
||||
* This function should only be called when the configuration space
|
||||
* contains a single configuration. Call #snd_pcm_hw_params to choose
|
||||
* a single configuration from the configuration space.
|
||||
*
|
||||
* Perfect drain means that the hardware does not use samples
|
||||
* beyond the stream application pointer.
|
||||
*/
|
||||
int snd_pcm_hw_params_is_perfect_drain(const snd_pcm_hw_params_t *params)
|
||||
{
|
||||
assert(params);
|
||||
if (CHECK_SANITY(params->info == ~0U)) {
|
||||
SNDMSG("invalid PCM info field");
|
||||
return 0; /* FIXME: should be a negative error? */
|
||||
}
|
||||
return !!(params->info & SNDRV_PCM_INFO_PERFECT_DRAIN);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Check if hardware supports audio wallclock timestamps
|
||||
* \param params Configuration space
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ typedef struct {
|
|||
struct snd_pcm_sync_ptr *sync_ptr;
|
||||
|
||||
bool prepare_reset_sw_params;
|
||||
bool perfect_drain;
|
||||
|
||||
int period_event;
|
||||
snd_timer_t *period_timer;
|
||||
|
|
@ -398,6 +399,7 @@ 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);
|
||||
return query_status_data(hw);
|
||||
}
|
||||
|
||||
|
|
@ -739,7 +741,7 @@ static int snd_pcm_hw_drain(snd_pcm_t *pcm)
|
|||
|
||||
if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
|
||||
goto __skip_silence;
|
||||
if (hw->drain_silence == 0)
|
||||
if (hw->drain_silence == 0 || hw->perfect_drain)
|
||||
goto __skip_silence;
|
||||
snd_pcm_sw_params_current_no_lock(pcm, &sw_params);
|
||||
if (hw->drain_silence > 0) {
|
||||
|
|
|
|||
|
|
@ -79,6 +79,8 @@
|
|||
#define SND_PCM_INFO_DOUBLE SNDRV_PCM_INFO_DOUBLE
|
||||
/** device transfers samples in batch */
|
||||
#define SND_PCM_INFO_BATCH SNDRV_PCM_INFO_BATCH
|
||||
/** device does perfect drain (silencing not required) */
|
||||
#define SND_PCM_INFO_PERFECT_DRAIN SNDRV_PCM_INFO_PERFECT_DRAIN
|
||||
/** device accepts interleaved samples */
|
||||
#define SND_PCM_INFO_INTERLEAVED SNDRV_PCM_INFO_INTERLEAVED
|
||||
/** device accepts non-interleaved samples */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue