[PATCH v5] dsound: Commit next audio chunk between play cursor and write cursor to playing.

Andrew Eikum aeikum at codeweavers.com
Mon Sep 13 10:49:52 CDT 2021


On Mon, Sep 13, 2021 at 10:33:38AM -0500, Andrew Eikum wrote:
> This is looking pretty good. I'm going to run it through my set of
> dsound test applications
> 

Bad news, it causes a crash in the Darwinia 2 demo for me :(

    $ md5sum darwinia-demo2.exe
    3f5d3fd40db15dd1a7e51891f385c57f  darwinia-demo2.exe

    https://www.moddb.com/games/darwinia/downloads/darwinia-windows-demo

Andrew

> On Fri, Sep 10, 2021 at 06:36:23PM +0300, Eduard Permyakov wrote:
> > diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c
> > index dc3b54906ce..63468732e1d 100644
> > --- a/dlls/dsound/buffer.c
> > +++ b/dlls/dsound/buffer.c
> > @@ -101,6 +101,24 @@ static int __cdecl notify_compar(const void *l, const void *r)
> >      return 1;
> >  }
> >  
> > +static void commit_next_chunk(IDirectSoundBufferImpl *dsb)
> > +{
> > +    void *dstbuff = dsb->committedbuff, *srcbuff = dsb->buffer->memory;
> > +    DWORD srcoff = dsb->sec_mixpos, srcsize = dsb->buflen, cpysize = dsb->writelead;
> > +
> > +    if(cpysize > srcsize - srcoff) {
> > +        DWORD overflow = cpysize - (srcsize - srcoff);
> > +        memcpy(dstbuff, (BYTE*)srcbuff + srcoff, srcsize - srcoff);
> > +        memcpy((BYTE*)dstbuff + (srcsize - srcoff), srcbuff, overflow);
> > +    }else{
> > +        memcpy(dstbuff, (BYTE*)srcbuff + srcoff, cpysize);
> > +    }
> > +
> > +    dsb->use_committed = TRUE;
> > +    dsb->committed_mixpos = 0;
> 
> Is it right to always reset this to zero? Is it possible an app could
> write to the committed chunk while committed_mixpos is non-zero, and
> so reset committed_mixpos when it shouldn't be?
> 
> > @@ -153,7 +153,12 @@ struct IDirectSoundBufferImpl
> >      LONG64                      freqAccNum;
> >      /* used for mixing */
> >      DWORD                       sec_mixpos;
> > -
> > +    /* Holds a copy of the next 'writelead' bytes, to be used for mixing. This makes it
> > +     * so that these bytes get played once even if this region of the buffer gets overwritten,
> > +     * which is more in-line with native DirectSound behavior. */
> > +    BOOL                        use_committed;
> > +    LPVOID                      committedbuff;
> > +    DWORD                       committed_mixpos;
> 
> I think use_committed (and committed_mixpos?) should be initialized in
> Duplicate. What about SetCurrentPosition?
> 
> Andrew
> 



More information about the wine-devel mailing list