Messages in this thread Patch in this message | | | Date | Tue, 01 Mar 2005 11:35:37 -0600 | From | Jeremy White <> | Subject | Apparent bug in sound/oss/via82cxxx_audio.c GETOPTR ioctl |
| |
Hi,
In trying to fix Wine's dsound implementation which uses mmap and DSP_SND_GETOPTR to write data out to the driver, I uncovered what appears to be a bug in the via82cxx_audio.c driver.
Specifically, via_sg_offset appears to return the number of bytes not yet consumed within the current block; we use it to adjust from blocks to a precise block count. However, it appears as though it returns 0 to indicate that no bytes have been consumed.
I was seeing results where I would get an OPTR return along the lines of 0x1c00, 0x1e00, 0x2800, and then 0x2100. Needless to say, having info.ptr go backwards causes Wine's code to have a serious hissy fit.
The attached patch fixes the problem for me, but I would appreciate review by an expert on this.
Cheers,
Jeremy --- via82cxxx_audio.c 2005-03-01 11:27:07.525265232 -0600 +++ via82cxxx_audio.c.orig 2005-03-01 11:27:24.700654176 -0600 @@ -2831,8 +2831,6 @@ unsigned long extra; info.ptr = atomic_read (&chan->hw_ptr) * chan->frag_size; extra = chan->frag_size - via_sg_offset(chan); - if (extra == chan->frag_size) - extra = 0; info.ptr += extra; info.bytes += extra; } else { | |