aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound.cpp55
-rw-r--r--sound/mixer.cpp31
2 files changed, 57 insertions, 29 deletions
diff --git a/sound.cpp b/sound.cpp
index 197e0aa4a4..98308ee383 100644
--- a/sound.cpp
+++ b/sound.cpp
@@ -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 ");