[alsa-devel] [PATCH 0/9] Misc fixes related to rewinds
Alexander E. Patrakov
patrakov at gmail.com
Sun Sep 14 13:09:31 CEST 2014
14.09.2014 16:11, Alexander E. Patrakov wrote:
> 14.09.2014 14:53, Raymond Yau wrote:
>>
>> >
>> > Note: this series touches pcm_dmix.c, but does not make it
>> rewindable. In
>> > other words, a variant of the test in [2] now produces a tone
>> instead of
>> > failing due to snd_pcm_rewind() returning 0. But it should ideally
>> produce
>> > silence. Obviously, there is some bug left that I have not pinpointed
>> yet.
>> >
>>
>> It is better to let dmix not support rewind and force your rewind
>> program to fail
>>
>> You rewind program should not affect the other application playing
>> through dmix
>
> Sorry, you are not an author of a single line in dmix (although you do
> understand how it works), so I cannot just blindly follow this request.
> OTOH, I was about to ask the same "should it work" question.
Well, after looking a bit more at this, I think that I know what's wrong
with dmix. I can probably fix it, but I have tasks with higher priority
right now.
The real problem is that it tries to do some remixing work in its
.rewind callback. It shouldn't do this - in fact, the whole callback
should just move the application pointer. Look - on a hardware device,
if you disable xrun detection, write something, rewind it, and then let
it underrun, it will still be played in full. On dmix, it is actively
attempted to be unmixed.
The real rewind-support work should be done in the mmap_commit callback.
It should:
0. Keep a shadow copy of the mmap areas, so that it can look at old samples.
1. Zero out the part of the sum buffer crossed by the hardware pointer
since the last call (possibly in another client). Zero out the
corresponding part of the mmap areas (both real and shadow). This should
probably be done in snd_pcm_dmix_sync_ptr(), but I am not sure. There is
already a hack based on ARCH_CMPXCHG that purports to do this in
mix_areas_16().
2. Unmix the old contents of the mmap areas in mmap_commit callback
(instead of the rewind callback). Most of the time, it will unmix the
sequence of zeros.
3. Mix the new contents of mmap areas.
4. Update the shadow copy.
--
Alexander E. Patrakov
More information about the Alsa-devel
mailing list