diff options
author | Nobutaka Okabe <nob77413@gmail.com> | 2016-12-12 18:52:58 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2016-12-12 22:43:35 +0100 |
commit | 012007309133d21a5a7eae3f552c03ac061a2b51 (patch) | |
tree | d4f50860eb63a511612b4495c2386ec149b53e27 /sound/usb/endpoint.c | |
parent | ALSA: usb-audio: Add native DSD support for TEAC 501/503 DAC (diff) | |
download | linux-012007309133d21a5a7eae3f552c03ac061a2b51.tar.xz linux-012007309133d21a5a7eae3f552c03ac061a2b51.zip |
ALSA: usb-audio: Eliminate noise at the start of DSD playback.
[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>
Diffstat (limited to 'sound/usb/endpoint.c')
-rw-r--r-- | sound/usb/endpoint.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 57b0d9968ec2..a2cdf3370afe 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -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); |