The Dig: 16 bit samples and mixer
svn-id: r4358
This commit is contained in:
parent
db9cdefa40
commit
c9a53bcf76
2 changed files with 21 additions and 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");
|
||||
|
|
|
@ -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 ");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue