aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound.cpp8
-rw-r--r--sound/mixer.cpp18
2 files changed, 21 insertions, 5 deletions
diff --git a/sound.cpp b/sound.cpp
index fe56ceb386..197e0aa4a4 100644
--- a/sound.cpp
+++ b/sound.cpp
@@ -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 ");