[alsa-devel] AK4114 - capturing spdif input stops the stream
Takashi Iwai
tiwai at suse.de
Thu Mar 13 08:50:42 CET 2008
At Wed, 12 Mar 2008 23:50:08 +0100,
Pavel Hofman wrote:
>
> Hi,
>
> here is my scenario:
>
> ICE1724 card, trying to record from SPDIF input via AK4114, ICE1724
> slaved to SPDIF clock from the receiver.
>
> The card detects SPDIF input rate correctly (in my case ESI Juli where
> AK4114 is provided with independent clock signal to enable the rate
> detection). Let's say it is 192000.
>
> Now I want to arecord the input stream, let's say in CD quality, using
> the plug plugin. The command fails, because of the check in ak4114.c:
>
> res = external_rate(rcs1);
> if (!(flags & AK4114_CHECK_NO_RATE) && runtime && runtime->rate != res) {
> snd_pcm_stream_lock_irqsave(ak4114->capture_substream, _flags);
> if (snd_pcm_running(ak4114->capture_substream)) {
> printk(KERN_DEBUG "rate changed (%i <- %i)\n", runtime->rate, res);
> snd_pcm_stop(ak4114->capture_substream, SNDRV_PCM_STATE_DRAINING);
> res = 1;
> }
> snd_pcm_stream_unlock_irqrestore(ak4114->capture_substream, _flags);
> }
>
> The stream gets stopped because res = 192000 and runtime->rate = 44100.
>
> The problem is that the capture device still offers all the available
> rates, instead of the single SPDIF input one. Thus, the plug plugin is
> not forced to convert from 192000 to 44100 and runtime->rate is 44100
> instead of 192000.
>
> Of course recording at 192000 works fine.
>
> What would be the best way to force the SPDIF capture device to offer
> (advertise) only the current rate? This functionality would have to be
> applicable only to the few cards correctly detecting incoming rate
> (unlike most ice1724 cards without independent clock in slave mode).
What about to call snd_ak4114_check_rate_and_errors() at PCM open?
You can pass AK4114_CHECK_NO_RATE to flags argument to skip the check
there, at least.
Takashi
More information about the Alsa-devel
mailing list