[alsa-devel] [PATCH] Re: iec958 switch uneffective while playing ac3 stream
Dominique Dumont
domi.dumont at free.fr
Tue Apr 3 21:44:18 CEST 2007
Dominique Dumont <domi.dumont at free.fr> writes:
> I've included the patch which implement the behavior described
> above.
Looks like the attachment was ditched by mailman. Here it is ...
--- alsa-driver-1.0.14rc3-old/alsa-kernel/pci/hda/hda_intel.c 2007-03-06 13:26:32.000000000 +0100
+++ alsa-driver-1.0.14rc3/alsa-kernel/pci/hda/hda_intel.c 2007-04-03 19:21:34.000000000 +0200
@@ -1140,6 +1140,8 @@
struct azx_dev *azx_dev = get_azx_dev(substream);
struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
struct snd_pcm_runtime *runtime = substream->runtime;
+ int val ;
+ int ret ;
azx_dev->bufsize = snd_pcm_lib_buffer_bytes(substream);
azx_dev->fragsize = snd_pcm_lib_period_bytes(substream);
@@ -1148,12 +1150,22 @@
runtime->channels,
runtime->format,
hinfo->maxbps);
+
+
+
if (! azx_dev->format_val) {
snd_printk(KERN_ERR SFX "invalid format_val, rate=%d, ch=%d, format=%d\n",
runtime->rate, runtime->channels, runtime->format);
return -EINVAL;
}
+ /* azx_dev->format_val |= 0x800 ; */
+
+ /* Switch off iec958 before changing stream format as the digi
+ converter may misbehave */
+ val = apcm->codec->spdif_ctls ;
+ snd_hda_codec_write(apcm->codec, hinfo->nid, 0, AC_VERB_SET_DIGI_CONVERT_1, val & 0xfe);
+
snd_printdd("azx_pcm_prepare: bufsize=0x%x, fragsize=0x%x, format=0x%x\n",
azx_dev->bufsize, azx_dev->fragsize, azx_dev->format_val);
azx_setup_periods(azx_dev);
@@ -1163,8 +1175,12 @@
else
azx_dev->fifo_size = 0;
- return hinfo->ops.prepare(hinfo, apcm->codec, azx_dev->stream_tag,
+ ret = hinfo->ops.prepare(hinfo, apcm->codec, azx_dev->stream_tag,
azx_dev->format_val, substream);
+
+ /* Restore iec958 switch after all stream and converter are set */
+ snd_hda_codec_write(apcm->codec, hinfo->nid, 0, AC_VERB_SET_DIGI_CONVERT_1, val & 0xff);
+ return ret ;
}
static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
More information about the Alsa-devel
mailing list