Ticket #8124: Dig_mixer_patch_second_try.diff

File Dig_mixer_patch_second_try.diff, 2.1 KB (added by SF/arisme, 18 years ago)

Working patch (hopefully)

  • mixer.cpp

    RCS file: /cvsroot/scummvm/scummvm/sound/mixer.cpp,v
    retrieving revision 1.26
    diff -u -r1.26 mixer.cpp
     
    578578        mix_signed_stereo_16, mix_unsigned_stereo_16
    579579};
    580580
     581static int16 mixer_element_size[] = {
     582        1, 1,
     583        2, 2,
     584        2, 2,
     585        4, 4
     586};
     587
    581588void SoundMixer::ChannelRaw::mix(int16 * data, uint len) {
    582589        byte *s, *s_org = NULL;
    583590        uint32 fp_pos;
     
    648655        delete this;
    649656}
    650657
     658#define WARP_WORKAROUND 50000
     659
    651660SoundMixer::ChannelStream::ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate,
    652661                                                                                 byte flags, int32 timeout, int32 buffer_size) {
    653662        _mixer = mixer;
    654663        _flags = flags;
    655664        _bufferSize = buffer_size;
    656         _ptr = (byte *)malloc(_bufferSize);
     665        _ptr = (byte *)malloc(_bufferSize + WARP_WORKAROUND);
    657666        memcpy(_ptr, sound, size);
    658667        _endOfData = _ptr + size;
    659668        _endOfBuffer = _ptr + _bufferSize;
     
    722731        if (_pos < end_of_data) {
    723732                mixer_helper_table[_flags & 0x07] (data, &len, &_pos, &fp_pos, fp_speed, vol_tab, end_of_data, (_flags & FLAG_REVERSE_STEREO) ? true : false);
    724733        } else {
    725                 mixer_helper_table[_flags & 0x07] (data, &len, &_pos, &fp_pos, fp_speed, vol_tab, _endOfBuffer, (_flags & FLAG_REVERSE_STEREO) ? true : false);
     734                int wrap_offset = 0;
     735
     736                // see if we will wrap
     737                if (_pos + (mixer_element_size[_flags & 0x07] * len) > _endOfBuffer) {                 
     738                        wrap_offset = _pos + (mixer_element_size[_flags & 0x07] * len) - _endOfBuffer;
     739                        debug(9, "using wrap workaround for %d bytes", wrap_offset);
     740                        memcpy(_endOfBuffer, _ptr, wrap_offset);
     741                }
     742                         
     743               
     744                mixer_helper_table[_flags & 0x07] (data, &len, &_pos, &fp_pos, fp_speed, vol_tab, _endOfBuffer + wrap_offset, (_flags & FLAG_REVERSE_STEREO) ? true : false);
     745
     746                // recover from wrap
     747                if (wrap_offset)
     748                        _pos = _ptr + wrap_offset;
     749
     750                // shouldn't happen anymore
    726751                if (len != 0) {
    727752                        //FIXME: what is wrong ?
    728753                        warning("bad play sound in stream(wrap around)");