diff options
-rw-r--r-- | sound.cpp | 8 | ||||
-rw-r--r-- | sound/mixer.cpp | 18 |
2 files changed, 21 insertions, 5 deletions
@@ -125,23 +125,23 @@ void Scumm::processSoundQues() } if (bits == 12) { uint32 s_size = (size * 2) / 3; - byte * buffer = (byte*)malloc (s_size); + byte * buffer = (byte*)malloc (s_size + 4); uint32 l = 0, r = 0, tmp; for (; l < size; l += 3) { tmp = (ptr[l + 1] & 0x0f) << 8; tmp = (tmp | ptr[l + 0]) << 4; tmp -= 0x8000; -// buffer[r++] = (uint8)(tmp & 0xff); buffer[r++] = (uint8)((tmp >> 8) & 0xff); + buffer[r++] = (uint8)(tmp & 0xff); tmp = (ptr[l + 1] & 0xf0) << 4; tmp = (tmp | ptr[l + 2]) << 4; tmp -= 0x8000; -// buffer[r++] = (uint8)(tmp & 0xff); buffer[r++] = (uint8)((tmp >> 8) & 0xff); + buffer[r++] = (uint8)(tmp & 0xff); } - _mixer->play_raw(NULL, buffer, s_size, rate, SoundMixer::FLAG_AUTOFREE); + _mixer->play_raw(NULL, buffer, s_size, rate, SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS); } } else { warning("DIG: ignoring stereo sample"); diff --git a/sound/mixer.cpp b/sound/mixer.cpp index a47965ca65..587e524185 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -184,6 +184,8 @@ SoundMixer::Channel_RAW::Channel_RAW(SoundMixer *mixer, void *sound, uint32 size _realsize = size; _rate = rate; _size = size * mixer->_output_rate / rate; + if (_flags & FLAG_16BITS) _size = _size >> 1; + if (_flags & FLAG_STEREO) _size = _size >> 1; } void SoundMixer::Channel_RAW::append(void *data, uint32 len) { @@ -207,6 +209,8 @@ void SoundMixer::Channel_RAW::append(void *data, uint32 len) { /* Reset sizes */ _realsize = _cur_size + len; _size = _realsize * _mixer->_output_rate / _rate; + if (_flags & FLAG_16BITS) _size = _size >> 1; + if (_flags & FLAG_STEREO) _size = _size >> 1; _pos = 0; _fp_pos = 0; @@ -248,7 +252,19 @@ static void mix_unsigned_stereo_8(int16 *data, uint len, byte **s_ptr, uint32 *f warning("Mixing stereo unsigned 8 bit is not supported yet "); } static void mix_signed_mono_16(int16 *data, uint len, byte **s_ptr, uint32 *fp_pos_ptr, int fp_speed, const int16 *vol_tab) { - warning("Mixing mono signed 16 bit is not supported yet "); + uint32 fp_pos = *fp_pos_ptr; + byte *s = *s_ptr; + do { + fp_pos += fp_speed; + // FIXME: missing volume table + *data++ += (*s << 8) + *(s + 1); + *data++ += (*s << 8) + *(s + 1); + s += (fp_pos >> 16) << 1; + fp_pos &= 0x0000FFFF; + } while (--len); + + *fp_pos_ptr = fp_pos; + *s_ptr = s; } static void mix_unsigned_mono_16(int16 *data, uint len, byte **s_ptr, uint32 *fp_pos_ptr, int fp_speed, const int16 *vol_tab) { warning("Mixing mono unsigned 16 bit is not supported yet "); |