[alsa-devel] snd_pcm_writei() -last value sustained
Alan Horstmann
gineera at aspect135.co.uk
Mon Jul 7 15:53:35 CEST 2008
On Friday 04 July 2008 09:38, I wrote:
> Working on an app I am seeing several strange effects, and this is one of
> them.
>
> It can be demonstrated with the pcm.c example program, and I have attempted
> to attach a small shot of Audacity capturing the effect.
>
> After writing to the pcm with snd_pcm_writei() a certain amount of data (I
> have pcm.c doing 2 periods) the value captured from the soundcard remains
> at the last value thereafter; clearly this card doesn't have DC elimination
> or this would not be seen.
>
> The sound card is ice1712 (DMX6fire); I had always noticed the PCM meters
> in envy24control often stayed high if something like XMMS was stopped or
> paused during play, but thought it a metering fault. Now it appears to be
> actual pcm value that 'gets stuck'.
>
> Close examination with Audacity shows it is in fact the last-but-one value
> that is sustained.
>
> Is this expected behaviour, configuration fault, driver bug or other
> problem? I had expected that after the block of data had been written out
> as audio the signal would return to zero straightaway. Can anyone give me
> any clues?
This seems to be an issue with the ice1712 driver: it does not occur with
au8820 device at all.
Note that all the results reported here are using pcm.c, not any other app
code at all, and correspond to effects seen in normal usage over the past
couple of years.
I have very littlle idea about the inner workings of alsa drivers, but notice
that in
snd_ice1712_pro_trigger()
the effect of SNDRV_PCM_TRIGGER_STOP is to set the envy24 chip play bit off,
which I would expect to essentially freeze the cards playback operation.
Could that be why?
My tests have involved adding to pcm.c (write method) firstly to limit the
number of periods played, set to 1. Then I re-use the data space, writing
various waveforms including a ramp, or individual data points, before writei
another period from the start. It can be clearly demonstrated that setting
the last-but one sample for a particular channel sets the output to zero
long-term. This does not happen with the last sample. Otherwise it remains
forever at the last-but-one sample value.
The attached shot shows existing sine data in the space, except for the
last-but-one sample being zero, and shows that the output ends up at zero.
Can anyone confirm this looks like a flaw in the driver, or am I using it
wrongly etc?
Alan
Actually, I've attached the shot to subsequent email in case it would cause
this email to be blocked.
More information about the Alsa-devel
mailing list