[alsa-devel] Problem bringing up new alsa driver
Jon Smirl
jonsmirl at gmail.com
Sun Apr 26 20:12:42 CEST 2009
On Sun, Apr 26, 2009 at 1:43 PM, Jaroslav Kysela <perex at perex.cz> wrote:
> On Sun, 26 Apr 2009, Takashi Iwai wrote:
>
>> At Sun, 26 Apr 2009 11:42:14 -0400,
>> Jon Smirl wrote:
>>>
>>> On Sun, Apr 26, 2009 at 7:14 AM, Takashi Iwai <tiwai at suse.de> wrote:
>>>>
>>>> At Sat, 25 Apr 2009 17:28:55 -0400,
>>>> Jon Smirl wrote:
>>>>>
>>>>> These new patches have broken audio support on the mpc5200....
>>>>
>>>> Then the lowlevel callbacks are likely wrong :)
>>>>
>>>>> They assume that the hardware is capable of telling where the DMA
>>>>> engine is in the middle of an operation.
>>>>
>>>> Well, nothing new by these patches. The original PCM core
>>>> implementation has been designed in that way. These changes may check
>>>> some bogus value more strictly.
>>>>
>>>> If the hardware doesn't support it, it needs report at least some
>>>> "sane" value; i.e. it must not be over the real position, but not
>>>> below the previous pointer.
>>>
>>>
>>>
>>>> In the worst case, the driver just needs to report the same position
>>>> at the previous period boundary until the next
>>>> snd_pcm_period_elapsed().
>>>
>>> That's doesn't work anymore. The PCM code is using jiffies to estimate
>>> where the pointer needs to be.
>>> I used the same jiffies to fake up a hardware position.
>>
>> Hrm, then it's a breakage. The quantum position must be still
>> supported.
>> Jaroslav, could you check that? It's your new code...
>
> My code checks only if samples delta is over expected jiffies delta, thus
> this case should not be evaluated as a wrong ring buffer position. It just
> problem with John's broken lowlevel driver.
>
> But adding finer resolution for pointer callback using jiffies or other
> timing source might make sense when hardware does not transfer whole buffer
> quickly (just small FIFO is on path). I'm not only sure, if we should add
> this code to the pcm midlevel code, because it's relatively easy to
> implement this in the lowlevel driver.
I set snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
I don't get errors from ALSA when playing with this set.
I then tried removing the DMA position estimating code.
delta = jiffies - s->jiffies;
delta = delta * runtime->rate / HZ;
frames = bytes_to_frames(substream->runtime, count);
return frames + delta;
If I take this out I get these errors...
ALSA sound/core/pcm_lib.c:264: PCM: hw_ptr skipping! [Q] (pos=11026,
delta=5513, period=5513, jdelta=33/37/0)
Once I hit one of those, the attempt at pointer fix up makes things worse...
ALSA sound/core/pcm_lib.c:264: PCM: hw_ptr skipping! [Q] (pos=16539,
delta=11026, period=5513, jdelta=38/75/0)
ALSA sound/core/pcm_lib.c:264: PCM: hw_ptr skipping! [Q] (pos=0,
delta=16539, period=5513, jdelta=37/112/0)
ALSA sound/core/pcm_lib.c:264: PCM: hw_ptr skipping! [Q] (pos=5513,
delta=22052, period=5513, jdelta=38/150/0)
>
> Jaroslav
>
> -----
> Jaroslav Kysela <perex at perex.cz>
> Linux Kernel Sound Maintainer
> ALSA Project, Red Hat, Inc.
>
--
Jon Smirl
jonsmirl at gmail.com
More information about the Alsa-devel
mailing list