diff options
| -rw-r--r-- | sound.cpp | 55 | ||||
| -rw-r--r-- | sound/mixer.cpp | 31 |
2 files changed, 57 insertions, 29 deletions
@@ -116,35 +116,40 @@ void Scumm::processSoundQues() } if (tag == MKID_BE('DATA')) break; } - if (chan == 1) - { - if (bits == 8) { - byte * buffer = (byte*)malloc (size); - memcpy(buffer, ptr, size); + if (bits == 8) { + byte * buffer = (byte*)malloc (size); + memcpy(buffer, ptr, size); + if (chan == 1) { _mixer->play_raw(NULL, buffer, size, rate, SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_UNSIGNED); } - if (bits == 12) { - uint32 s_size = (size * 2) / 3; - 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 >> 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 >> 8) & 0xff); - buffer[r++] = (uint8)(tmp & 0xff); - } + else if (chan == 2) { + _mixer->play_raw(NULL, buffer, size, rate, SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_STEREO); + } + } + if (bits == 12) { + uint32 s_size = (size * 4) / 3; + 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 >> 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 >> 8) & 0xff); + buffer[r++] = (uint8)(tmp & 0xff); + } + if (chan == 1) { _mixer->play_raw(NULL, buffer, s_size, rate, SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS); } - } else { - warning("DIG: ignoring stereo sample"); + else if (chan == 2) { + _mixer->play_raw(NULL, buffer, s_size, rate, SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS | SoundMixer::FLAG_STEREO); + } } } } diff --git a/sound/mixer.cpp b/sound/mixer.cpp index 587e524185..d790122a3b 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -249,7 +249,18 @@ static void mix_signed_stereo_8(int16 *data, uint len, byte **s_ptr, uint32 *fp_ warning("Mixing stereo signed 8 bit is not supported yet "); } static void mix_unsigned_stereo_8(int16 *data, uint len, byte **s_ptr, uint32 *fp_pos_ptr, int fp_speed, const int16 *vol_tab) { - warning("Mixing stereo unsigned 8 bit is not supported yet "); + uint32 fp_pos = *fp_pos_ptr; + byte *s = *s_ptr; + do { + fp_pos += fp_speed; + *data++ += vol_tab[*s ^ 0x80]; + *data++ += vol_tab[*(s + 1) ^ 0x80]; + s += (fp_pos >> 16) << 1; + fp_pos &= 0x0000FFFF; + } while (--len); + + *fp_pos_ptr = fp_pos; + *s_ptr = s; } static void mix_signed_mono_16(int16 *data, uint len, byte **s_ptr, uint32 *fp_pos_ptr, int fp_speed, const int16 *vol_tab) { uint32 fp_pos = *fp_pos_ptr; @@ -257,8 +268,8 @@ static void mix_signed_mono_16(int16 *data, uint len, byte **s_ptr, uint32 *fp_p do { fp_pos += fp_speed; // FIXME: missing volume table - *data++ += (*s << 8) + *(s + 1); - *data++ += (*s << 8) + *(s + 1); + *data++ += ((*s << 8) | *(s + 1)); + *data++ += ((*s << 8) | *(s + 1)); s += (fp_pos >> 16) << 1; fp_pos &= 0x0000FFFF; } while (--len); @@ -270,7 +281,19 @@ static void mix_unsigned_mono_16(int16 *data, uint len, byte **s_ptr, uint32 *fp warning("Mixing mono unsigned 16 bit is not supported yet "); } static void mix_signed_stereo_16(int16 *data, uint len, byte **s_ptr, uint32 *fp_pos_ptr, int fp_speed, const int16 *vol_tab) { - warning("Mixing stereo 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 + 2) << 8) | *(s + 3)); + s += (fp_pos >> 16) << 2; + fp_pos &= 0x0000FFFF; + } while (--len); + + *fp_pos_ptr = fp_pos; + *s_ptr = s; } static void mix_unsigned_stereo_16(int16 *data, uint len, byte **s_ptr, uint32 *fp_pos_ptr, int fp_speed, const int16 *vol_tab) { warning("Mixing stereo unsigned 16 bit is not supported yet "); |
