ALSA: usb-audio: Eliminate noise at the start of DSD playback.
authorNobutaka Okabe <nob77413@gmail.com>
Mon, 12 Dec 2016 17:52:58 +0000 (02:52 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 12 Dec 2016 21:43:35 +0000 (22:43 +0100)
[Problem]
In some USB DACs, a terrible pop noise comes to be heard
at the start of DSD playback (in the following situations).

- play first DSD track
- change from PCM track to DSD track
- change from DSD64 track to DSD128 track (and etc...)
- seek DSD track
- Fast-Forward/Rewind DSD track

[Cause]
At the start of playback, there is a little silence.
The silence bit pattern "0x69" is required on DSD mode,
but it is not like that.

[Solution]
This patch adds DSD silence pattern to the endpoint settings.

Signed-off-by: Nobutaka Okabe <nob77413@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/endpoint.c

index 57b0d9968ec216d83aa9c2b6a63428825e623fe7..a2cdf3370afe75f5f5029f5fd78a4a32fa9cc1f7 100644 (file)
@@ -638,7 +638,21 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep,
 
        ep->datainterval = fmt->datainterval;
        ep->stride = frame_bits >> 3;
-       ep->silence_value = pcm_format == SNDRV_PCM_FORMAT_U8 ? 0x80 : 0;
+
+       switch (pcm_format) {
+       case SNDRV_PCM_FORMAT_U8:
+               ep->silence_value = 0x80;
+               break;
+       case SNDRV_PCM_FORMAT_DSD_U8:
+       case SNDRV_PCM_FORMAT_DSD_U16_LE:
+       case SNDRV_PCM_FORMAT_DSD_U32_LE:
+       case SNDRV_PCM_FORMAT_DSD_U16_BE:
+       case SNDRV_PCM_FORMAT_DSD_U32_BE:
+               ep->silence_value = 0x69;
+               break;
+       default:
+               ep->silence_value = 0;
+       }
 
        /* assume max. frequency is 50% higher than nominal */
        ep->freqmax = ep->freqn + (ep->freqn >> 1);