aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/imuse_digi.cpp70
1 files changed, 20 insertions, 50 deletions
diff --git a/scumm/imuse_digi.cpp b/scumm/imuse_digi.cpp
index 8dc4381980..813cba7588 100644
--- a/scumm/imuse_digi.cpp
+++ b/scumm/imuse_digi.cpp
@@ -634,12 +634,9 @@ static const imuse_ft_music_table _ftSeqMusicTable[] = {
};
#endif
-static uint32 decode12BitsSample(byte *src, byte **dst, uint32 size, bool stereo) {
+static uint32 decode12BitsSample(byte *src, byte **dst, uint32 size) {
uint32 loop_size = size / 3;
uint32 s_size = loop_size * 4;
- if (stereo) {
- s_size *= 2;
- }
byte *ptr = *dst = (byte *)malloc(s_size);
uint32 tmp;
@@ -649,14 +646,8 @@ static uint32 decode12BitsSample(byte *src, byte **dst, uint32 size, bool stereo
byte v3 = *src++;
tmp = ((((v2 & 0x0f) << 8) | v1) << 4) - 0x8000;
WRITE_BE_UINT16(ptr, tmp); ptr += 2;
- if (stereo) {
- WRITE_BE_UINT16(ptr, tmp); ptr += 2;
- }
tmp = ((((v2 & 0xf0) << 4) | v3) << 4) - 0x8000;
WRITE_BE_UINT16(ptr, tmp); ptr += 2;
- if (stereo) {
- WRITE_BE_UINT16(ptr, tmp); ptr += 2;
- }
}
return s_size;
}
@@ -803,7 +794,6 @@ void IMuseDigital::startSound(int sound, byte *voc_src, int voc_size, int voc_ra
uint32 tag;
int32 size = 0;
- int t;
if ((sound == kTalkSoundID) && (_voiceVocData) || (READ_UINT32(ptr) == MKID('Crea'))) {
if (READ_UINT32(ptr) == MKID('Crea')) {
@@ -815,16 +805,8 @@ void IMuseDigital::startSound(int sound, byte *voc_src, int voc_size, int voc_ra
_channel[l].size = voc_size * 2;
_channel[l].bits = 8;
_channel[l].channels = 2;
- _channel[l].mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO | SoundMixer::FLAG_UNSIGNED;
- _channel[l].data = (byte *)malloc(_channel[l].size);
-
- // Widen data to two channels
- for (t = 0; t < _channel[l].size / 2; t++) {
- *(_channel[l].data + t * 2 + 0) = *(voc_src + t);
- *(_channel[l].data + t * 2 + 1) = *(voc_src + t);
- }
-
- free(voc_src);
+ _channel[l].mixerFlags = SoundMixer::FLAG_UNSIGNED;
+ _channel[l].data = voc_src;
} else if (READ_UINT32(ptr) == MKID('iMUS')) {
ptr += 16;
for (;;) {
@@ -928,13 +910,21 @@ void IMuseDigital::startSound(int sound, byte *voc_src, int voc_size, int voc_ra
// flag - since we copy the data around anyway, swapping the
// channels should be little extra work (in fact, none for
// mono data, which includes the 12 bit compressed format).
- _channel[l].mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO;
- _channel[l].mixerSize = _channel[l].freq * 2;
+
+ assert(_channel[l].channels == 1 || _channel[l].channels == 2);
+
+ if (_channel[l].channels == 2) {
+ _channel[l].mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO;
+ _channel[l].mixerSize = _channel[l].freq * 2;
+ } else {
+ _channel[l].mixerFlags = 0;
+ _channel[l].mixerSize = _channel[l].freq;
+ }
if (_channel[l].bits == 12) {
_channel[l].mixerSize *= 2;
_channel[l].mixerFlags |= SoundMixer::FLAG_16BITS;
- _channel[l].size = decode12BitsSample(ptr, &_channel[l].data, size, (_channel[l].channels == 2) ? false : true);
+ _channel[l].size = decode12BitsSample(ptr, &_channel[l].data, size);
} else if (_channel[l].bits == 16) {
_channel[l].mixerSize *= 2;
_channel[l].mixerFlags |= SoundMixer::FLAG_16BITS;
@@ -943,34 +933,14 @@ void IMuseDigital::startSound(int sound, byte *voc_src, int voc_size, int voc_ra
// the data is supposed to be in 16 bit format... that makes no sense...
size &= ~1;
- if (_channel[l].channels == 1) {
- size *= 2;
- _channel[l].channels = 2;
- _channel[l].data = (byte *)malloc(size);
- // Widen data to two channels
- for (t = 0; t < size / 4; t++) {
- *(uint16 *)(_channel[l].data + t * 4 + 0) = *(uint16 *)(ptr + t * 2);
- *(uint16 *)(_channel[l].data + t * 4 + 2) = *(uint16 *)(ptr + t * 2);
- }
- } else {
- error("IMuseDigital::startSound() Stereo 16 bit sound support not yet implemented");
- }
+ _channel[l].data = (byte *)malloc(size);
+ memcpy(_channel[l].data, ptr, size);
_channel[l].size = size;
} else if (_channel[l].bits == 8) {
_channel[l].mixerFlags |= SoundMixer::FLAG_UNSIGNED;
- if (_channel[l].channels == 1) {
- size *= 2;
- _channel[l].channels = 2;
- _channel[l].data = (byte *)malloc(size);
- // Widen data to two channels
- for (t = 0; t < size / 2; t++) {
- *(_channel[l].data + t * 2 + 0) = *(ptr + t);
- *(_channel[l].data + t * 2 + 1) = *(ptr + t);
- }
- } else {
- _channel[l].data = (byte *)malloc(size);
- memcpy(_channel[l].data, ptr, size);
- }
+
+ _channel[l].data = (byte *)malloc(size);
+ memcpy(_channel[l].data, ptr, size);
_channel[l].size = size;
} else
error("IMuseDigital::startSound() Can't handle %d bit samples", _channel[l].bits);
@@ -1394,7 +1364,7 @@ void IMuseDigital::bundleMusicHandler() {
byte *buffer = NULL;
uint32 final_size;
if (_bundleMusicSampleBits == 12) {
- final_size = decode12BitsSample(ptr, &buffer, _outputMixerSize, false);
+ final_size = decode12BitsSample(ptr, &buffer, _outputMixerSize);
} else if (_bundleMusicSampleBits == 16) {
buffer = (byte *)malloc(_outputMixerSize);
final_size = _outputMixerSize;