---<br> dlls/dsound/mixer.c |  357 ---------------------------------------------------<br> 1 files changed, 0 insertions(+), 357 deletions(-)<br><br>diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c<br>index 0d7afdb..4a0b60e 100644<br>
--- a/dlls/dsound/mixer.c<br>+++ b/dlls/dsound/mixer.c<br>@@ -162,34 +162,6 @@ void DSOUND_CheckEvent(const IDirectSoundBufferImpl *dsb, DWORD playpos, int len<br>     }<br> }<br> <br>-/**<br>- * Copy a single frame from the given input buffer to the given output buffer.<br>
- * Translate 8 &lt;-&gt; 16 bits and mono &lt;-&gt; stereo<br>- */<br>-static inline void cp_fields(const IDirectSoundBufferImpl *dsb, const BYTE *ibuf, BYTE *obuf,<br>-        UINT istride, UINT ostride, UINT count, UINT freqAcc, UINT adj)<br>
-{<br>-    DirectSoundDevice *device = dsb-&gt;device;<br>-    INT istep = dsb-&gt;pwfx-&gt;wBitsPerSample / 8, ostep = device-&gt;pwfx-&gt;wBitsPerSample / 8;<br>-<br>-    if (device-&gt;pwfx-&gt;nChannels == dsb-&gt;pwfx-&gt;nChannels ||<br>
-        (device-&gt;pwfx-&gt;nChannels == 2 &amp;&amp; dsb-&gt;pwfx-&gt;nChannels == 6)) {<br>-        dsb-&gt;convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);<br>-        if (device-&gt;pwfx-&gt;nChannels == 2)<br>
-            dsb-&gt;convert(ibuf + istep, obuf + ostep, istride, ostride, count, freqAcc, adj);<br>-    }<br>-<br>-    if (device-&gt;pwfx-&gt;nChannels == 1 &amp;&amp; dsb-&gt;pwfx-&gt;nChannels == 2)<br>-    {<br>-        dsb-&gt;convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);<br>
-    }<br>-<br>-    if (device-&gt;pwfx-&gt;nChannels == 2 &amp;&amp; dsb-&gt;pwfx-&gt;nChannels == 1)<br>-    {<br>-        dsb-&gt;convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);<br>-        dsb-&gt;convert(ibuf, obuf + ostep, istride, ostride, count, freqAcc, adj);<br>
-    }<br>-}<br> <br> /**<br>  * Calculate the distance between two buffer offsets, taking wraparound<br>@@ -206,335 +178,6 @@ static inline DWORD DSOUND_BufPtrDiff(DWORD buflen, DWORD ptr1, DWORD ptr2)<br>         return buflen + ptr1 - ptr2;<br>
     }<br> }<br>-/**<br>- * Mix at most the given amount of data into the allocated temporary buffer<br>- * of the given secondary buffer, starting from the dsb&#39;s first currently<br>- * unsampled frame (writepos), translating frequency (pitch), stereo/mono<br>
- * and bits-per-sample so that it is ideal for the primary buffer.<br>- * Doesn&#39;t perform any mixing - this is a straight copy/convert operation.<br>- *<br>- * dsb = the secondary buffer<br>- * writepos = Starting position of changed buffer<br>
- * len = number of bytes to resample from writepos<br>- *<br>- * NOTE: writepos + len &lt;= buflen. When called by mixer, MixOne makes sure of this.<br>- */<br>-void DSOUND_MixToTemporary(const IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD len, BOOL inmixer)<br>
-{<br>-    INT    size;<br>-    BYTE    *ibp, *obp, *obp_begin;<br>-    INT    iAdvance = dsb-&gt;pwfx-&gt;nBlockAlign;<br>-    INT    oAdvance = dsb-&gt;device-&gt;pwfx-&gt;nBlockAlign;<br>-    DWORD freqAcc, target_writepos = 0, overshot, maxlen;<br>
-<br>-    /* We resample only when needed */<br>-    if ((dsb-&gt;tmp_buffer &amp;&amp; inmixer) || (!dsb-&gt;tmp_buffer &amp;&amp; !inmixer) || dsb-&gt;resampleinmixer != inmixer)<br>-        return;<br>-<br>-    assert(writepos + len &lt;= dsb-&gt;buflen);<br>
-    if (inmixer &amp;&amp; writepos + len &lt; dsb-&gt;buflen)<br>-        len += dsb-&gt;pwfx-&gt;nBlockAlign;<br>-<br>-    maxlen = DSOUND_secpos_to_bufpos(dsb, len, 0, NULL);<br>-<br>-    ibp = dsb-&gt;buffer-&gt;memory + writepos;<br>
-    if (!inmixer)<br>-        obp_begin = dsb-&gt;tmp_buffer;<br>-    else if (dsb-&gt;device-&gt;tmp_buffer_len &lt; maxlen || !dsb-&gt;device-&gt;tmp_buffer)<br>-    {<br>-        dsb-&gt;device-&gt;tmp_buffer_len = maxlen;<br>
-        if (dsb-&gt;device-&gt;tmp_buffer)<br>-            dsb-&gt;device-&gt;tmp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsb-&gt;device-&gt;tmp_buffer, maxlen);<br>-        else<br>-            dsb-&gt;device-&gt;tmp_buffer = HeapAlloc(GetProcessHeap(), 0, maxlen);<br>
-        obp_begin = dsb-&gt;device-&gt;tmp_buffer;<br>-    }<br>-    else<br>-        obp_begin = dsb-&gt;device-&gt;tmp_buffer;<br>-<br>-    TRACE(&quot;(%p, %p)\n&quot;, dsb, ibp);<br>-    size = len / iAdvance;<br>-<br>
-    /* Check for same sample rate */<br>-    if (dsb-&gt;freq == dsb-&gt;device-&gt;pwfx-&gt;nSamplesPerSec) {<br>-        TRACE(&quot;(%p) Same sample rate %d = primary %d\n&quot;, dsb,<br>-            dsb-&gt;freq, dsb-&gt;device-&gt;pwfx-&gt;nSamplesPerSec);<br>
-        obp = obp_begin;<br>-        if (!inmixer)<br>-             obp += writepos/iAdvance*oAdvance;<br>-<br>-        cp_fields(dsb, ibp, obp, iAdvance, oAdvance, size, 0, 1 &lt;&lt; DSOUND_FREQSHIFT);<br>-        return;<br>
-    }<br>-<br>-    /* Mix in different sample rates */<br>-    TRACE(&quot;(%p) Adjusting frequency: %d -&gt; %d\n&quot;, dsb, dsb-&gt;freq, dsb-&gt;device-&gt;pwfx-&gt;nSamplesPerSec);<br>-<br>-    target_writepos = DSOUND_secpos_to_bufpos(dsb, writepos, dsb-&gt;sec_mixpos, &amp;freqAcc);<br>
-    overshot = freqAcc &gt;&gt; DSOUND_FREQSHIFT;<br>-    if (overshot)<br>-    {<br>-        if (overshot &gt;= size)<br>-            return;<br>-        size -= overshot;<br>-        writepos += overshot * iAdvance;<br>
-        if (writepos &gt;= dsb-&gt;buflen)<br>-            return;<br>-        ibp = dsb-&gt;buffer-&gt;memory + writepos;<br>-        freqAcc &amp;= (1 &lt;&lt; DSOUND_FREQSHIFT) - 1;<br>-        TRACE(&quot;Overshot: %d, freqAcc: %04x\n&quot;, overshot, freqAcc);<br>
-    }<br>-<br>-    if (!inmixer)<br>-        obp = obp_begin + target_writepos;<br>-    else obp = obp_begin;<br>-<br>-    /* FIXME: Small problem here when we&#39;re overwriting buf_mixpos, it then STILL uses old freqAcc, not sure if it matters or not */<br>
-    cp_fields(dsb, ibp, obp, iAdvance, oAdvance, size, freqAcc, dsb-&gt;freqAdjust);<br>-}<br>-<br>-/** Apply volume to the given soundbuffer from (primary) position writepos and length len<br>- * Returns: NULL if no volume needs to be applied<br>
- * or else a memory handle that holds &#39;len&#39; volume adjusted buffer */<br>-static LPBYTE DSOUND_MixerVol(const IDirectSoundBufferImpl *dsb, INT len)<br>-{<br>-    INT    i;<br>-    BYTE    *bpc;<br>-    INT16    *bps, *mems;<br>
-    DWORD vLeft, vRight;<br>-    INT nChannels = dsb-&gt;device-&gt;pwfx-&gt;nChannels;<br>-    LPBYTE mem = (dsb-&gt;tmp_buffer ? dsb-&gt;tmp_buffer : dsb-&gt;buffer-&gt;memory) + dsb-&gt;buf_mixpos;<br>-<br>-    if (dsb-&gt;resampleinmixer)<br>
-        mem = dsb-&gt;device-&gt;tmp_buffer;<br>-<br>-    TRACE(&quot;(%p,%d)\n&quot;,dsb,len);<br>-    TRACE(&quot;left = %x, right = %x\n&quot;, dsb-&gt;volpan.dwTotalLeftAmpFactor,<br>-        dsb-&gt;volpan.dwTotalRightAmpFactor);<br>
-<br>-    if ((!(dsb-&gt;dsbd.dwFlags &amp; DSBCAPS_CTRLPAN) || (dsb-&gt;volpan.lPan == 0)) &amp;&amp;<br>-        (!(dsb-&gt;dsbd.dwFlags &amp; DSBCAPS_CTRLVOLUME) || (dsb-&gt;volpan.lVolume == 0)) &amp;&amp;<br>-         !(dsb-&gt;dsbd.dwFlags &amp; DSBCAPS_CTRL3D))<br>
-        return NULL; /* Nothing to do */<br>-<br>-    if (nChannels != 1 &amp;&amp; nChannels != 2)<br>-    {<br>-        FIXME(&quot;There is no support for %d channels\n&quot;, nChannels);<br>-        return NULL;<br>-    }<br>
-<br>-    if (dsb-&gt;device-&gt;pwfx-&gt;wBitsPerSample != 8 &amp;&amp; dsb-&gt;device-&gt;pwfx-&gt;wBitsPerSample != 16)<br>-    {<br>-        FIXME(&quot;There is no support for %d bpp\n&quot;, dsb-&gt;device-&gt;pwfx-&gt;wBitsPerSample);<br>
-        return NULL;<br>-    }<br>-<br>-    if (dsb-&gt;device-&gt;tmp_buffer_len &lt; len || !dsb-&gt;device-&gt;tmp_buffer)<br>-    {<br>-        /* If we just resampled in DSOUND_MixToTemporary, we shouldn&#39;t need to resize here */<br>
-        assert(!dsb-&gt;resampleinmixer);<br>-        dsb-&gt;device-&gt;tmp_buffer_len = len;<br>-        if (dsb-&gt;device-&gt;tmp_buffer)<br>-            dsb-&gt;device-&gt;tmp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsb-&gt;device-&gt;tmp_buffer, len);<br>
-        else<br>-            dsb-&gt;device-&gt;tmp_buffer = HeapAlloc(GetProcessHeap(), 0, len);<br>-    }<br>-<br>-    bpc = dsb-&gt;device-&gt;tmp_buffer;<br>-    bps = (INT16 *)bpc;<br>-    mems = (INT16 *)mem;<br>-    vLeft = dsb-&gt;volpan.dwTotalLeftAmpFactor;<br>
-    if (nChannels &gt; 1)<br>-        vRight = dsb-&gt;volpan.dwTotalRightAmpFactor;<br>-    else<br>-        vRight = vLeft;<br>-<br>-    switch (dsb-&gt;device-&gt;pwfx-&gt;wBitsPerSample) {<br>-    case 8:<br>-        /* 8-bit WAV is unsigned, but we need to operate */<br>
-        /* on signed data for this to work properly */<br>-        for (i = 0; i &lt; len-1; i+=2) {<br>-            *(bpc++) = (((*(mem++) - 128) * vLeft) &gt;&gt; 16) + 128;<br>-            *(bpc++) = (((*(mem++) - 128) * vRight) &gt;&gt; 16) + 128;<br>
-        }<br>-        if (len % 2 == 1 &amp;&amp; nChannels == 1)<br>-            *(bpc++) = (((*(mem++) - 128) * vLeft) &gt;&gt; 16) + 128;<br>-        break;<br>-    case 16:<br>-        /* 16-bit WAV is signed -- much better */<br>
-        for (i = 0; i &lt; len-3; i += 4) {<br>-            *(bps++) = (*(mems++) * vLeft) &gt;&gt; 16;<br>-            *(bps++) = (*(mems++) * vRight) &gt;&gt; 16;<br>-        }<br>-        if (len % 4 == 2 &amp;&amp; nChannels == 1)<br>
-            *(bps++) = ((INT)*(mems++) * vLeft) &gt;&gt; 16;<br>-        break;<br>-    }<br>-    return dsb-&gt;device-&gt;tmp_buffer;<br>-}<br>-<br>-/**<br>- * Mix (at most) the given number of bytes into the given position of the<br>
- * device buffer, from the secondary buffer &quot;dsb&quot; (starting at the current<br>- * mix position for that buffer).<br>- *<br>- * Returns the number of bytes actually mixed into the device buffer. This<br>- * will match fraglen unless the end of the secondary buffer is reached<br>
- * (and it is not looping).<br>- *<br>- * dsb  = the secondary buffer to mix from<br>- * writepos = position (offset) in device buffer to write at<br>- * fraglen = number of bytes to mix<br>- */<br>-static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD fraglen)<br>
-{<br>-    INT len = fraglen, ilen;<br>-    BYTE *ibuf = (dsb-&gt;tmp_buffer ? dsb-&gt;tmp_buffer : dsb-&gt;buffer-&gt;memory) + dsb-&gt;buf_mixpos, *volbuf;<br>-    DWORD oldpos, mixbufpos;<br>-<br>-    TRACE(&quot;buf_mixpos=%d/%d sec_mixpos=%d/%d\n&quot;, dsb-&gt;buf_mixpos, dsb-&gt;tmp_buffer_len, dsb-&gt;sec_mixpos, dsb-&gt;buflen);<br>
-    TRACE(&quot;(%p,%d,%d)\n&quot;,dsb,writepos,fraglen);<br>-<br>-    assert(dsb-&gt;buf_mixpos + len &lt;= dsb-&gt;tmp_buffer_len);<br>-<br>-    if (len % dsb-&gt;device-&gt;pwfx-&gt;nBlockAlign) {<br>-        INT nBlockAlign = dsb-&gt;device-&gt;pwfx-&gt;nBlockAlign;<br>
-        ERR(&quot;length not a multiple of block size, len = %d, block size = %d\n&quot;, len, nBlockAlign);<br>-        len -= len % nBlockAlign; /* data alignment */<br>-    }<br>-<br>-    /* Resample buffer to temporary buffer specifically allocated for this purpose, if needed */<br>
-    DSOUND_MixToTemporary(dsb, dsb-&gt;sec_mixpos, DSOUND_bufpos_to_secpos(dsb, dsb-&gt;buf_mixpos+len) - dsb-&gt;sec_mixpos, TRUE);<br>-    if (dsb-&gt;resampleinmixer)<br>-        ibuf = dsb-&gt;device-&gt;tmp_buffer;<br>
-<br>-    /* Apply volume if needed */<br>-    volbuf = DSOUND_MixerVol(dsb, len);<br>-    if (volbuf)<br>-        ibuf = volbuf;<br>-<br>-    mixbufpos = DSOUND_bufpos_to_mixpos(dsb-&gt;device, writepos);<br>-    /* Now mix the temporary buffer into the devices main buffer */<br>
-    if ((writepos + len) &lt;= dsb-&gt;device-&gt;buflen)<br>-        dsb-&gt;device-&gt;mixfunction(ibuf, dsb-&gt;device-&gt;mix_buffer + mixbufpos, len);<br>-    else<br>-    {<br>-        DWORD todo = dsb-&gt;device-&gt;buflen - writepos;<br>
-        dsb-&gt;device-&gt;mixfunction(ibuf, dsb-&gt;device-&gt;mix_buffer + mixbufpos, todo);<br>-        dsb-&gt;device-&gt;mixfunction(ibuf + todo, dsb-&gt;device-&gt;mix_buffer, len - todo);<br>-    }<br>-<br>-    oldpos = dsb-&gt;sec_mixpos;<br>
-    dsb-&gt;buf_mixpos += len;<br>-<br>-    if (dsb-&gt;buf_mixpos &gt;= dsb-&gt;tmp_buffer_len) {<br>-        if (dsb-&gt;buf_mixpos &gt; dsb-&gt;tmp_buffer_len)<br>-            ERR(&quot;Mixpos (%u) past buflen (%u), capping...\n&quot;, dsb-&gt;buf_mixpos, dsb-&gt;tmp_buffer_len);<br>
-        if (dsb-&gt;playflags &amp; DSBPLAY_LOOPING) {<br>-            dsb-&gt;buf_mixpos -= dsb-&gt;tmp_buffer_len;<br>-        } else if (dsb-&gt;buf_mixpos &gt;= dsb-&gt;tmp_buffer_len) {<br>-            dsb-&gt;buf_mixpos = dsb-&gt;sec_mixpos = 0;<br>
-            dsb-&gt;state = STATE_STOPPED;<br>-        }<br>-        DSOUND_RecalcFreqAcc(dsb);<br>-    }<br>-<br>-    dsb-&gt;sec_mixpos = DSOUND_bufpos_to_secpos(dsb, dsb-&gt;buf_mixpos);<br>-    ilen = DSOUND_BufPtrDiff(dsb-&gt;buflen, dsb-&gt;sec_mixpos, oldpos);<br>
-    /* check for notification positions */<br>-    if (dsb-&gt;dsbd.dwFlags &amp; DSBCAPS_CTRLPOSITIONNOTIFY &amp;&amp;<br>-        dsb-&gt;state != STATE_STARTING) {<br>-        DSOUND_CheckEvent(dsb, oldpos, ilen);<br>
-    }<br>-<br>-    /* increase mix position */<br>-    dsb-&gt;primary_mixpos += len;<br>-    if (dsb-&gt;primary_mixpos &gt;= dsb-&gt;device-&gt;buflen)<br>-        dsb-&gt;primary_mixpos -= dsb-&gt;device-&gt;buflen;<br>
-    return len;<br>-}<br>-<br>-/**<br>- * Mix some frames from the given secondary buffer &quot;dsb&quot; into the device<br>- * primary buffer.<br>- *<br>- * dsb = the secondary buffer<br>- * playpos = the current play position in the device buffer (primary buffer)<br>
- * writepos = the current safe-to-write position in the device buffer<br>- * mixlen = the maximum number of bytes in the primary buffer to mix, from the<br>- *          current writepos.<br>- *<br>- * Returns: the number of bytes beyond the writepos that were mixed.<br>
- */<br>-static DWORD DSOUND_MixOne(IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD mixlen)<br>-{<br>-    /* The buffer&#39;s primary_mixpos may be before or after the device<br>-     * buffer&#39;s mixpos, but both must be ahead of writepos. */<br>
-    DWORD primary_done;<br>-<br>-    TRACE(&quot;(%p,%d,%d)\n&quot;,dsb,writepos,mixlen);<br>-    TRACE(&quot;writepos=%d, buf_mixpos=%d, primary_mixpos=%d, mixlen=%d\n&quot;, writepos, dsb-&gt;buf_mixpos, dsb-&gt;primary_mixpos, mixlen);<br>
-    TRACE(&quot;looping=%d, leadin=%d, buflen=%d\n&quot;, dsb-&gt;playflags, dsb-&gt;leadin, dsb-&gt;tmp_buffer_len);<br>-<br>-    /* If leading in, only mix about 20 ms, and &#39;skip&#39; mixing the rest, for more fluid pointer advancement */<br>
-    if (dsb-&gt;leadin &amp;&amp; dsb-&gt;state == STATE_STARTING)<br>-    {<br>-        if (mixlen &gt; 2 * dsb-&gt;device-&gt;fraglen)<br>-        {<br>-            dsb-&gt;primary_mixpos += mixlen - 2 * dsb-&gt;device-&gt;fraglen;<br>
-            dsb-&gt;primary_mixpos %= dsb-&gt;device-&gt;buflen;<br>-        }<br>-    }<br>-    dsb-&gt;leadin = FALSE;<br>-<br>-    /* calculate how much pre-buffering has already been done for this buffer */<br>-    primary_done = DSOUND_BufPtrDiff(dsb-&gt;device-&gt;buflen, dsb-&gt;primary_mixpos, writepos);<br>
-<br>-    /* sanity */<br>-    if(mixlen &lt; primary_done)<br>-    {<br>-        /* Should *NEVER* happen */<br>-        ERR(&quot;Fatal error. Under/Overflow? primary_done=%d, mixpos=%d/%d (%d/%d), primary_mixpos=%d, writepos=%d, mixlen=%d\n&quot;, primary_done,dsb-&gt;buf_mixpos,dsb-&gt;tmp_buffer_len,dsb-&gt;sec_mixpos, dsb-&gt;buflen, dsb-&gt;primary_mixpos, writepos, mixlen);<br>
-        dsb-&gt;primary_mixpos = writepos + mixlen;<br>-        dsb-&gt;primary_mixpos %= dsb-&gt;device-&gt;buflen;<br>-        return mixlen;<br>-    }<br>-<br>-    /* take into account already mixed data */<br>-    mixlen -= primary_done;<br>
-<br>-    TRACE(&quot;primary_done=%d, mixlen (primary) = %i\n&quot;, primary_done, mixlen);<br>-<br>-    if (!mixlen)<br>-        return primary_done;<br>-<br>-    /* First try to mix to the end of the buffer if possible<br>
-     * Theoretically it would allow for better optimization<br>-    */<br>-    if (mixlen + dsb-&gt;buf_mixpos &gt;= dsb-&gt;tmp_buffer_len)<br>-    {<br>-        DWORD newmixed, mixfirst = dsb-&gt;tmp_buffer_len - dsb-&gt;buf_mixpos;<br>
-        newmixed = DSOUND_MixInBuffer(dsb, dsb-&gt;primary_mixpos, mixfirst);<br>-        mixlen -= newmixed;<br>-<br>-        if (dsb-&gt;playflags &amp; DSBPLAY_LOOPING)<br>-            while (newmixed &amp;&amp; mixlen)<br>
-            {<br>-                mixfirst = (dsb-&gt;tmp_buffer_len &lt; mixlen ? dsb-&gt;tmp_buffer_len : mixlen);<br>-                newmixed = DSOUND_MixInBuffer(dsb, dsb-&gt;primary_mixpos, mixfirst);<br>-                mixlen -= newmixed;<br>
-            }<br>-    }<br>-    else DSOUND_MixInBuffer(dsb, dsb-&gt;primary_mixpos, mixlen);<br>-<br>-    /* re-calculate the primary done */<br>-    primary_done = DSOUND_BufPtrDiff(dsb-&gt;device-&gt;buflen, dsb-&gt;primary_mixpos, writepos);<br>
-<br>-    TRACE(&quot;new primary_mixpos=%d, total mixed data=%d\n&quot;, dsb-&gt;primary_mixpos, primary_done);<br>-<br>-    /* Report back the total prebuffered amount for this buffer */<br>-    return primary_done;<br>
-}<br> <br> /**<br>  * For a DirectSoundDevice, go through all the currently playing buffers and<br>-- <br>1.7.2.3<br><br><br>