diff mbox series

ALSA: uapi: pcm: control the filling of the silence samples for drain

Message ID 20230502115536.986900-1-perex@perex.cz
State Accepted
Commit a4bb75c4f19db711676e6bf6a278d932a5e7667b
Headers show
Series ALSA: uapi: pcm: control the filling of the silence samples for drain | expand

Commit Message

Jaroslav Kysela May 2, 2023, 11:55 a.m. UTC
Introduce SNDRV_PCM_INFO_PERFECT_DRAIN and SNDRV_PCM_HW_PARAMS_NO_DRAIN_SILENCE
flags to fully control the filling of the silence samples in the drain ioctl.
Actually, the configurable silencing is going to be implemented in the user
space [1], but drivers (hardware) may not require this operation. Those flags
do the bidirectional setup for this operation:

1) driver may notify the presence of the perfect drain
2) user space may not require the filling of the silence samples to inhibit clicks

If we decide to move this operation to the kernel space in future, the
SNDRV_PCM_INFO_PERFECT_DRAIN flag may handle this situation without
double "silence" processing (user + kernel space).

The ALSA API should be universal, so forcing the behaviour (modifying of
the ring buffer with any samples) for the drain operation is not ideal.

[1] https://lore.kernel.org/alsa-devel/20230502115010.986325-1-perex@perex.cz/

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 include/uapi/sound/asound.h | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Takashi Iwai May 2, 2023, 2:05 p.m. UTC | #1
On Tue, 02 May 2023 13:55:36 +0200,
Jaroslav Kysela wrote:
> 
> Introduce SNDRV_PCM_INFO_PERFECT_DRAIN and SNDRV_PCM_HW_PARAMS_NO_DRAIN_SILENCE
> flags to fully control the filling of the silence samples in the drain ioctl.
> Actually, the configurable silencing is going to be implemented in the user
> space [1], but drivers (hardware) may not require this operation. Those flags
> do the bidirectional setup for this operation:
> 
> 1) driver may notify the presence of the perfect drain
> 2) user space may not require the filling of the silence samples to inhibit clicks
> 
> If we decide to move this operation to the kernel space in future, the
> SNDRV_PCM_INFO_PERFECT_DRAIN flag may handle this situation without
> double "silence" processing (user + kernel space).
> 
> The ALSA API should be universal, so forcing the behaviour (modifying of
> the ring buffer with any samples) for the drain operation is not ideal.
> 
> [1] https://lore.kernel.org/alsa-devel/20230502115010.986325-1-perex@perex.cz/
> 
> Signed-off-by: Jaroslav Kysela <perex@perex.cz>

Looks good to me.

Will apply once after 6.5 devel branch is opened.


thanks,

Takashi
Takashi Iwai May 8, 2023, 1:24 p.m. UTC | #2
On Tue, 02 May 2023 13:55:36 +0200,
Jaroslav Kysela wrote:
> 
> Introduce SNDRV_PCM_INFO_PERFECT_DRAIN and SNDRV_PCM_HW_PARAMS_NO_DRAIN_SILENCE
> flags to fully control the filling of the silence samples in the drain ioctl.
> Actually, the configurable silencing is going to be implemented in the user
> space [1], but drivers (hardware) may not require this operation. Those flags
> do the bidirectional setup for this operation:
> 
> 1) driver may notify the presence of the perfect drain
> 2) user space may not require the filling of the silence samples to inhibit clicks
> 
> If we decide to move this operation to the kernel space in future, the
> SNDRV_PCM_INFO_PERFECT_DRAIN flag may handle this situation without
> double "silence" processing (user + kernel space).
> 
> The ALSA API should be universal, so forcing the behaviour (modifying of
> the ring buffer with any samples) for the drain operation is not ideal.
> 
> [1] https://lore.kernel.org/alsa-devel/20230502115010.986325-1-perex@perex.cz/
> 
> Signed-off-by: Jaroslav Kysela <perex@perex.cz>

Now applied to for-next branch (with a typo fix in the comment).


thanks,

Takashi
diff mbox series

Patch

diff --git a/include/uapi/sound/asound.h b/include/uapi/sound/asound.h
index 0aa955aa8246..e4b0f95694c5 100644
--- a/include/uapi/sound/asound.h
+++ b/include/uapi/sound/asound.h
@@ -274,6 +274,7 @@  typedef int __bitwise snd_pcm_subformat_t;
 #define SNDRV_PCM_INFO_DOUBLE		0x00000004	/* Double buffering needed for PCM start/stop */
 #define SNDRV_PCM_INFO_BATCH		0x00000010	/* double buffering */
 #define SNDRV_PCM_INFO_SYNC_APPLPTR	0x00000020	/* need the explicit sync of appl_ptr update */
+#define SNDRV_PCM_INFO_PERFECT_DRAIN	0x00000040	/* silencing at the end of stream is not required */
 #define SNDRV_PCM_INFO_INTERLEAVED	0x00000100	/* channels are interleaved */
 #define SNDRV_PCM_INFO_NONINTERLEAVED	0x00000200	/* channels are not interleaved */
 #define SNDRV_PCM_INFO_COMPLEX		0x00000400	/* complex frame organization (mmap only) */
@@ -383,6 +384,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)	/* supress drain with the filling
+							 * of the silence samples
+							 */
 
 struct snd_interval {
 	unsigned int min, max;