RCS file: /cvsroot/scummvm/scummvm/sound/mixer.cpp,v
retrieving revision 1.26
diff -u -r1.26 mixer.cpp
|
|
|
578 | 578 | mix_signed_stereo_16, mix_unsigned_stereo_16 |
579 | 579 | }; |
580 | 580 | |
| 581 | static int16 mixer_element_size[] = { |
| 582 | 1, 1, |
| 583 | 2, 2, |
| 584 | 2, 2, |
| 585 | 4, 4 |
| 586 | }; |
| 587 | |
581 | 588 | void SoundMixer::ChannelRaw::mix(int16 * data, uint len) { |
582 | 589 | byte *s, *s_org = NULL; |
583 | 590 | uint32 fp_pos; |
… |
… |
|
648 | 655 | delete this; |
649 | 656 | } |
650 | 657 | |
| 658 | #define WARP_WORKAROUND 50000 |
| 659 | |
651 | 660 | SoundMixer::ChannelStream::ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, |
652 | 661 | byte flags, int32 timeout, int32 buffer_size) { |
653 | 662 | _mixer = mixer; |
654 | 663 | _flags = flags; |
655 | 664 | _bufferSize = buffer_size; |
656 | | _ptr = (byte *)malloc(_bufferSize); |
| 665 | _ptr = (byte *)malloc(_bufferSize + WARP_WORKAROUND); |
657 | 666 | memcpy(_ptr, sound, size); |
658 | 667 | _endOfData = _ptr + size; |
659 | 668 | _endOfBuffer = _ptr + _bufferSize; |
… |
… |
|
722 | 731 | if (_pos < end_of_data) { |
723 | 732 | mixer_helper_table[_flags & 0x07] (data, &len, &_pos, &fp_pos, fp_speed, vol_tab, end_of_data, (_flags & FLAG_REVERSE_STEREO) ? true : false); |
724 | 733 | } 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 |
726 | 751 | if (len != 0) { |
727 | 752 | //FIXME: what is wrong ? |
728 | 753 | warning("bad play sound in stream(wrap around)"); |