diff mbox

pcm: 2nd round of pcm_misc DSD fixes

Message ID 1408085019-5277-1-git-send-email-gtmkramer@xs4all.nl (mailing list archive)
State Accepted
Delegated to: Takashi Iwai
Headers show

Commit Message

Jurgen Kramer Aug. 15, 2014, 6:43 a.m. UTC
Functions 'snd_pcm_format_silence_64' and 'snd_pcm_format_size' also need to be
able to handle the DSD formats.

Signed-off-by: Jurgen Kramer <gtmkramer@xs4all.nl>
---
 src/pcm/pcm_misc.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Alexander Patrakov Aug. 15, 2014, 9:02 a.m. UTC | #1
15.08.2014 12:43, Jurgen Kramer wrote:
> Functions 'snd_pcm_format_silence_64' and 'snd_pcm_format_size' also need to be
> able to handle the DSD formats.

0 is not a DSD silence value. It is the most negative value, similar to 
-32768 for S16 samples. We need something that will average to zero.

ffmpeg uses a repeating pattern of 0x69 here, with this comment:

         /* 0x69 = 01101001
          * This pattern "on repeat" makes a low energy 352.8 kHz tone
          * and a high energy 1.0584 MHz tone which should be filtered
          * out completely by any playback system --> silence
          */

https://ffmpeg.org/pipermail/ffmpeg-cvslog/2014-April/076427.html

>
> Signed-off-by: Jurgen Kramer <gtmkramer@xs4all.nl>
> ---
>   src/pcm/pcm_misc.c | 4 ++++
>   1 file changed, 4 insertions(+)
>
> diff --git a/src/pcm/pcm_misc.c b/src/pcm/pcm_misc.c
> index 24d52f9..c52e7bf 100644
> --- a/src/pcm/pcm_misc.c
> +++ b/src/pcm/pcm_misc.c
> @@ -317,11 +317,13 @@ ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples)
>   	switch (format) {
>   	case SNDRV_PCM_FORMAT_S8:
>   	case SNDRV_PCM_FORMAT_U8:
> +	case SNDRV_PCM_FORMAT_DSD_U8:
>   		return samples;
>   	case SNDRV_PCM_FORMAT_S16_LE:
>   	case SNDRV_PCM_FORMAT_S16_BE:
>   	case SNDRV_PCM_FORMAT_U16_LE:
>   	case SNDRV_PCM_FORMAT_U16_BE:
> +	case SNDRV_PCM_FORMAT_DSD_U16_LE:
>   		return samples * 2;
>   	case SNDRV_PCM_FORMAT_S18_3LE:
>   	case SNDRV_PCM_FORMAT_S18_3BE:
> @@ -387,6 +389,8 @@ u_int64_t snd_pcm_format_silence_64(snd_pcm_format_t format)
>   	case SNDRV_PCM_FORMAT_S20_3BE:
>   	case SNDRV_PCM_FORMAT_S18_3LE:
>   	case SNDRV_PCM_FORMAT_S18_3BE:
> +	case SNDRV_PCM_FORMAT_DSD_U8:
> +	case SNDRV_PCM_FORMAT_DSD_U16_LE:
>   		return 0;
>   	case SNDRV_PCM_FORMAT_U8:
>   		return 0x8080808080808080ULL;
>
Takashi Iwai Aug. 15, 2014, 3:40 p.m. UTC | #2
At Fri, 15 Aug 2014 15:02:35 +0600,
Alexander E. Patrakov wrote:
> 
> 15.08.2014 12:43, Jurgen Kramer wrote:
> > Functions 'snd_pcm_format_silence_64' and 'snd_pcm_format_size' also need to be
> > able to handle the DSD formats.
> 
> 0 is not a DSD silence value. It is the most negative value, similar to 
> -32768 for S16 samples. We need something that will average to zero.
> 
> ffmpeg uses a repeating pattern of 0x69 here, with this comment:
> 
>          /* 0x69 = 01101001
>           * This pattern "on repeat" makes a low energy 352.8 kHz tone
>           * and a high energy 1.0584 MHz tone which should be filtered
>           * out completely by any playback system --> silence
>           */
> 
> https://ffmpeg.org/pipermail/ffmpeg-cvslog/2014-April/076427.html

Good point.  We need a fix in the kernel side, too.


Takashi
diff mbox

Patch

diff --git a/src/pcm/pcm_misc.c b/src/pcm/pcm_misc.c
index 24d52f9..c52e7bf 100644
--- a/src/pcm/pcm_misc.c
+++ b/src/pcm/pcm_misc.c
@@ -317,11 +317,13 @@  ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples)
 	switch (format) {
 	case SNDRV_PCM_FORMAT_S8:
 	case SNDRV_PCM_FORMAT_U8:
+	case SNDRV_PCM_FORMAT_DSD_U8:
 		return samples;
 	case SNDRV_PCM_FORMAT_S16_LE:
 	case SNDRV_PCM_FORMAT_S16_BE:
 	case SNDRV_PCM_FORMAT_U16_LE:
 	case SNDRV_PCM_FORMAT_U16_BE:
+	case SNDRV_PCM_FORMAT_DSD_U16_LE:
 		return samples * 2;
 	case SNDRV_PCM_FORMAT_S18_3LE:
 	case SNDRV_PCM_FORMAT_S18_3BE:
@@ -387,6 +389,8 @@  u_int64_t snd_pcm_format_silence_64(snd_pcm_format_t format)
 	case SNDRV_PCM_FORMAT_S20_3BE:
 	case SNDRV_PCM_FORMAT_S18_3LE:
 	case SNDRV_PCM_FORMAT_S18_3BE:
+	case SNDRV_PCM_FORMAT_DSD_U8:
+	case SNDRV_PCM_FORMAT_DSD_U16_LE:
 		return 0;
 	case SNDRV_PCM_FORMAT_U8:
 		return 0x8080808080808080ULL;