At Thu, 05 Apr 2007 15:36:34 +0200, I wrote:
At Thu, 05 Apr 2007 12:09:22 +0200, I wrote:
Yeah, that'd be better. I'll fix and commit to the HG tree later.
OK, now it's on HG tree.
While we're at it... I did a quick hack to add a new mixer element to choose the SPDIF playback route, either "Analog Duplicate" or "Exclusive PCM". (On AD codecs, it has more items for analog loopbacks.) This will solve one remaining problem, "SPDIF is blocked by analog open".
Of course, this has another problem that user may choose an incorrect value accidentally, but I come to believe it's better than a module option.
After reconsideration, I found it much easier to change the driver to allow access to the dedicated SPDIF stream even while analog dup mode. When the SPDIF stream is opened, the SPDIF is forced to reset and then the stream is reserved for the exclusive access until it's closed.
The below is a test patch. Now you see it's so simple...
Can anyone test it?
thanks,
Takashi
diff -r 5ef5aabbbfe8 pci/hda/hda_codec.c --- a/pci/hda/hda_codec.c Tue Apr 10 11:39:58 2007 +0200 +++ b/pci/hda/hda_codec.c Wed Apr 11 14:18:21 2007 +0200 @@ -1911,10 +1911,9 @@ int snd_hda_multi_out_dig_open(struct hd int snd_hda_multi_out_dig_open(struct hda_codec *codec, struct hda_multi_out *mout) { mutex_lock(&codec->spdif_mutex); - if (mout->dig_out_used) { - mutex_unlock(&codec->spdif_mutex); - return -EBUSY; /* already being used */ - } + if (mout->dig_out_used == HDA_DIG_ANALOG_DUP) + /* already opened as analog dup; reset it once */ + snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); mout->dig_out_used = HDA_DIG_EXCLUSIVE; mutex_unlock(&codec->spdif_mutex); return 0;