> On 2010-10-13 18:40, oku at iki.fi wrote: >> From: Jyri Sarha<jyri.sarha at nokia.com> ... > > Thank you for your work! This is the main reason I've been advocating > against enabling flat-volumes by default in Ubuntu, so I'm glad to see > something that addresses the issue. > > The basic problem is that we can't have sample accurate volume changes, > because no HW supports it. Right? Yes. On on non real-time OS and having less than accurate audio pipeline latency information this is a best effort task. Making this perfect would require HW support. > > So about the implementation - what you're saying is that it is better to > have two guaranteed down-volume "snaps" rather than to risk an up-volume > "snap". That sounds reasonable, but are these down-volume transients > hearable? Perhaps more hearable with playing a sine wave, rather than > white noise? > Since implementing ramps on a HW mixer is really not applicable, this is the only solution that I can see and in practice it seems to work pretty well. I also think that most analog components have enough "slowness" in them which in effect causes a kind of ramp. BTW, ran the test from my previous mail, but using sine wave, and still I could not hear any snapping sound on my T60. > Anyway, I've been thinking of something like this but never looked more > closely at implementing a solution, but I would probably have tried to > do something like: > start: > 1) rewind > 2) write stream with lower SW volume > 3) wait until rewind margin has passed > 4) raise HW volume This is pretty much what my patch is doing, just in slightly different order: 1. Insert volume event to happen after sink's reported latency has expired (+ modifications). 2. rewind and adjust volume events 3. wait until volume event expires = rewind margin has passed 4. raise HW volume This approach works also with sinks that do not support rewinding (e.g. alsa-sink not using tsched). > end: > 1) lower HW volume > 2) rewind > 3) write stream with higher SW volume > Here you are forgetting that there may still be some samples left within the rewind margin. You should add the delay also there. In effect the both volume ups and downs become quite symmetrical. > ...rather than trying to add explicit delays just for the volume sync. > Either that, or some kind of volume ramping. Just curious if you > considered that solution as well? > Well, I can't think how you get past "wait until rewind margin has passed" without having explicit delays. This code is really only chaning the way HW mixers are used. Ramping to SW volume could be implemented separately and it would not interfere with this patch in fact they would complement each other. But, hey please try out my patch. At least it solved the problem on N900 (yes the earlier version of the patch is on all N900s out there) and it works quite well on my both Linux boxes. Cheers, Jyri