---<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 <-> 16 bits and mono <-> 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->device;<br>- INT istep = dsb->pwfx->wBitsPerSample / 8, ostep = device->pwfx->wBitsPerSample / 8;<br>-<br>- if (device->pwfx->nChannels == dsb->pwfx->nChannels ||<br>
- (device->pwfx->nChannels == 2 && dsb->pwfx->nChannels == 6)) {<br>- dsb->convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);<br>- if (device->pwfx->nChannels == 2)<br>
- dsb->convert(ibuf + istep, obuf + ostep, istride, ostride, count, freqAcc, adj);<br>- }<br>-<br>- if (device->pwfx->nChannels == 1 && dsb->pwfx->nChannels == 2)<br>- {<br>- dsb->convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);<br>
- }<br>-<br>- if (device->pwfx->nChannels == 2 && dsb->pwfx->nChannels == 1)<br>- {<br>- dsb->convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);<br>- dsb->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'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'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 <= 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->pwfx->nBlockAlign;<br>- INT oAdvance = dsb->device->pwfx->nBlockAlign;<br>- DWORD freqAcc, target_writepos = 0, overshot, maxlen;<br>
-<br>- /* We resample only when needed */<br>- if ((dsb->tmp_buffer && inmixer) || (!dsb->tmp_buffer && !inmixer) || dsb->resampleinmixer != inmixer)<br>- return;<br>-<br>- assert(writepos + len <= dsb->buflen);<br>
- if (inmixer && writepos + len < dsb->buflen)<br>- len += dsb->pwfx->nBlockAlign;<br>-<br>- maxlen = DSOUND_secpos_to_bufpos(dsb, len, 0, NULL);<br>-<br>- ibp = dsb->buffer->memory + writepos;<br>
- if (!inmixer)<br>- obp_begin = dsb->tmp_buffer;<br>- else if (dsb->device->tmp_buffer_len < maxlen || !dsb->device->tmp_buffer)<br>- {<br>- dsb->device->tmp_buffer_len = maxlen;<br>
- if (dsb->device->tmp_buffer)<br>- dsb->device->tmp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsb->device->tmp_buffer, maxlen);<br>- else<br>- dsb->device->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, maxlen);<br>
- obp_begin = dsb->device->tmp_buffer;<br>- }<br>- else<br>- obp_begin = dsb->device->tmp_buffer;<br>-<br>- TRACE("(%p, %p)\n", dsb, ibp);<br>- size = len / iAdvance;<br>-<br>
- /* Check for same sample rate */<br>- if (dsb->freq == dsb->device->pwfx->nSamplesPerSec) {<br>- TRACE("(%p) Same sample rate %d = primary %d\n", dsb,<br>- dsb->freq, dsb->device->pwfx->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 << DSOUND_FREQSHIFT);<br>- return;<br>
- }<br>-<br>- /* Mix in different sample rates */<br>- TRACE("(%p) Adjusting frequency: %d -> %d\n", dsb, dsb->freq, dsb->device->pwfx->nSamplesPerSec);<br>-<br>- target_writepos = DSOUND_secpos_to_bufpos(dsb, writepos, dsb->sec_mixpos, &freqAcc);<br>
- overshot = freqAcc >> DSOUND_FREQSHIFT;<br>- if (overshot)<br>- {<br>- if (overshot >= size)<br>- return;<br>- size -= overshot;<br>- writepos += overshot * iAdvance;<br>
- if (writepos >= dsb->buflen)<br>- return;<br>- ibp = dsb->buffer->memory + writepos;<br>- freqAcc &= (1 << DSOUND_FREQSHIFT) - 1;<br>- TRACE("Overshot: %d, freqAcc: %04x\n", 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'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->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 'len' 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->device->pwfx->nChannels;<br>- LPBYTE mem = (dsb->tmp_buffer ? dsb->tmp_buffer : dsb->buffer->memory) + dsb->buf_mixpos;<br>-<br>- if (dsb->resampleinmixer)<br>
- mem = dsb->device->tmp_buffer;<br>-<br>- TRACE("(%p,%d)\n",dsb,len);<br>- TRACE("left = %x, right = %x\n", dsb->volpan.dwTotalLeftAmpFactor,<br>- dsb->volpan.dwTotalRightAmpFactor);<br>
-<br>- if ((!(dsb->dsbd.dwFlags & DSBCAPS_CTRLPAN) || (dsb->volpan.lPan == 0)) &&<br>- (!(dsb->dsbd.dwFlags & DSBCAPS_CTRLVOLUME) || (dsb->volpan.lVolume == 0)) &&<br>- !(dsb->dsbd.dwFlags & DSBCAPS_CTRL3D))<br>
- return NULL; /* Nothing to do */<br>-<br>- if (nChannels != 1 && nChannels != 2)<br>- {<br>- FIXME("There is no support for %d channels\n", nChannels);<br>- return NULL;<br>- }<br>
-<br>- if (dsb->device->pwfx->wBitsPerSample != 8 && dsb->device->pwfx->wBitsPerSample != 16)<br>- {<br>- FIXME("There is no support for %d bpp\n", dsb->device->pwfx->wBitsPerSample);<br>
- return NULL;<br>- }<br>-<br>- if (dsb->device->tmp_buffer_len < len || !dsb->device->tmp_buffer)<br>- {<br>- /* If we just resampled in DSOUND_MixToTemporary, we shouldn't need to resize here */<br>
- assert(!dsb->resampleinmixer);<br>- dsb->device->tmp_buffer_len = len;<br>- if (dsb->device->tmp_buffer)<br>- dsb->device->tmp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsb->device->tmp_buffer, len);<br>
- else<br>- dsb->device->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, len);<br>- }<br>-<br>- bpc = dsb->device->tmp_buffer;<br>- bps = (INT16 *)bpc;<br>- mems = (INT16 *)mem;<br>- vLeft = dsb->volpan.dwTotalLeftAmpFactor;<br>
- if (nChannels > 1)<br>- vRight = dsb->volpan.dwTotalRightAmpFactor;<br>- else<br>- vRight = vLeft;<br>-<br>- switch (dsb->device->pwfx->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 < len-1; i+=2) {<br>- *(bpc++) = (((*(mem++) - 128) * vLeft) >> 16) + 128;<br>- *(bpc++) = (((*(mem++) - 128) * vRight) >> 16) + 128;<br>
- }<br>- if (len % 2 == 1 && nChannels == 1)<br>- *(bpc++) = (((*(mem++) - 128) * vLeft) >> 16) + 128;<br>- break;<br>- case 16:<br>- /* 16-bit WAV is signed -- much better */<br>
- for (i = 0; i < len-3; i += 4) {<br>- *(bps++) = (*(mems++) * vLeft) >> 16;<br>- *(bps++) = (*(mems++) * vRight) >> 16;<br>- }<br>- if (len % 4 == 2 && nChannels == 1)<br>
- *(bps++) = ((INT)*(mems++) * vLeft) >> 16;<br>- break;<br>- }<br>- return dsb->device->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 "dsb" (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->tmp_buffer ? dsb->tmp_buffer : dsb->buffer->memory) + dsb->buf_mixpos, *volbuf;<br>- DWORD oldpos, mixbufpos;<br>-<br>- TRACE("buf_mixpos=%d/%d sec_mixpos=%d/%d\n", dsb->buf_mixpos, dsb->tmp_buffer_len, dsb->sec_mixpos, dsb->buflen);<br>
- TRACE("(%p,%d,%d)\n",dsb,writepos,fraglen);<br>-<br>- assert(dsb->buf_mixpos + len <= dsb->tmp_buffer_len);<br>-<br>- if (len % dsb->device->pwfx->nBlockAlign) {<br>- INT nBlockAlign = dsb->device->pwfx->nBlockAlign;<br>
- ERR("length not a multiple of block size, len = %d, block size = %d\n", 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->sec_mixpos, DSOUND_bufpos_to_secpos(dsb, dsb->buf_mixpos+len) - dsb->sec_mixpos, TRUE);<br>- if (dsb->resampleinmixer)<br>- ibuf = dsb->device->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->device, writepos);<br>- /* Now mix the temporary buffer into the devices main buffer */<br>
- if ((writepos + len) <= dsb->device->buflen)<br>- dsb->device->mixfunction(ibuf, dsb->device->mix_buffer + mixbufpos, len);<br>- else<br>- {<br>- DWORD todo = dsb->device->buflen - writepos;<br>
- dsb->device->mixfunction(ibuf, dsb->device->mix_buffer + mixbufpos, todo);<br>- dsb->device->mixfunction(ibuf + todo, dsb->device->mix_buffer, len - todo);<br>- }<br>-<br>- oldpos = dsb->sec_mixpos;<br>
- dsb->buf_mixpos += len;<br>-<br>- if (dsb->buf_mixpos >= dsb->tmp_buffer_len) {<br>- if (dsb->buf_mixpos > dsb->tmp_buffer_len)<br>- ERR("Mixpos (%u) past buflen (%u), capping...\n", dsb->buf_mixpos, dsb->tmp_buffer_len);<br>
- if (dsb->playflags & DSBPLAY_LOOPING) {<br>- dsb->buf_mixpos -= dsb->tmp_buffer_len;<br>- } else if (dsb->buf_mixpos >= dsb->tmp_buffer_len) {<br>- dsb->buf_mixpos = dsb->sec_mixpos = 0;<br>
- dsb->state = STATE_STOPPED;<br>- }<br>- DSOUND_RecalcFreqAcc(dsb);<br>- }<br>-<br>- dsb->sec_mixpos = DSOUND_bufpos_to_secpos(dsb, dsb->buf_mixpos);<br>- ilen = DSOUND_BufPtrDiff(dsb->buflen, dsb->sec_mixpos, oldpos);<br>
- /* check for notification positions */<br>- if (dsb->dsbd.dwFlags & DSBCAPS_CTRLPOSITIONNOTIFY &&<br>- dsb->state != STATE_STARTING) {<br>- DSOUND_CheckEvent(dsb, oldpos, ilen);<br>
- }<br>-<br>- /* increase mix position */<br>- dsb->primary_mixpos += len;<br>- if (dsb->primary_mixpos >= dsb->device->buflen)<br>- dsb->primary_mixpos -= dsb->device->buflen;<br>
- return len;<br>-}<br>-<br>-/**<br>- * Mix some frames from the given secondary buffer "dsb" 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's primary_mixpos may be before or after the device<br>- * buffer's mixpos, but both must be ahead of writepos. */<br>
- DWORD primary_done;<br>-<br>- TRACE("(%p,%d,%d)\n",dsb,writepos,mixlen);<br>- TRACE("writepos=%d, buf_mixpos=%d, primary_mixpos=%d, mixlen=%d\n", writepos, dsb->buf_mixpos, dsb->primary_mixpos, mixlen);<br>
- TRACE("looping=%d, leadin=%d, buflen=%d\n", dsb->playflags, dsb->leadin, dsb->tmp_buffer_len);<br>-<br>- /* If leading in, only mix about 20 ms, and 'skip' mixing the rest, for more fluid pointer advancement */<br>
- if (dsb->leadin && dsb->state == STATE_STARTING)<br>- {<br>- if (mixlen > 2 * dsb->device->fraglen)<br>- {<br>- dsb->primary_mixpos += mixlen - 2 * dsb->device->fraglen;<br>
- dsb->primary_mixpos %= dsb->device->buflen;<br>- }<br>- }<br>- dsb->leadin = FALSE;<br>-<br>- /* calculate how much pre-buffering has already been done for this buffer */<br>- primary_done = DSOUND_BufPtrDiff(dsb->device->buflen, dsb->primary_mixpos, writepos);<br>
-<br>- /* sanity */<br>- if(mixlen < primary_done)<br>- {<br>- /* Should *NEVER* happen */<br>- ERR("Fatal error. Under/Overflow? primary_done=%d, mixpos=%d/%d (%d/%d), primary_mixpos=%d, writepos=%d, mixlen=%d\n", primary_done,dsb->buf_mixpos,dsb->tmp_buffer_len,dsb->sec_mixpos, dsb->buflen, dsb->primary_mixpos, writepos, mixlen);<br>
- dsb->primary_mixpos = writepos + mixlen;<br>- dsb->primary_mixpos %= dsb->device->buflen;<br>- return mixlen;<br>- }<br>-<br>- /* take into account already mixed data */<br>- mixlen -= primary_done;<br>
-<br>- TRACE("primary_done=%d, mixlen (primary) = %i\n", 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->buf_mixpos >= dsb->tmp_buffer_len)<br>- {<br>- DWORD newmixed, mixfirst = dsb->tmp_buffer_len - dsb->buf_mixpos;<br>
- newmixed = DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, mixfirst);<br>- mixlen -= newmixed;<br>-<br>- if (dsb->playflags & DSBPLAY_LOOPING)<br>- while (newmixed && mixlen)<br>
- {<br>- mixfirst = (dsb->tmp_buffer_len < mixlen ? dsb->tmp_buffer_len : mixlen);<br>- newmixed = DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, mixfirst);<br>- mixlen -= newmixed;<br>
- }<br>- }<br>- else DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, mixlen);<br>-<br>- /* re-calculate the primary done */<br>- primary_done = DSOUND_BufPtrDiff(dsb->device->buflen, dsb->primary_mixpos, writepos);<br>
-<br>- TRACE("new primary_mixpos=%d, total mixed data=%d\n", dsb->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>