diff options
| author | Paweł Kołodziejski | 2002-05-19 20:38:53 +0000 | 
|---|---|---|
| committer | Paweł Kołodziejski | 2002-05-19 20:38:53 +0000 | 
| commit | 4aabb0378c88d77d544aad41376552f9ce4fa198 (patch) | |
| tree | 815c7a7dc8209854697477a2e29de443830c720a | |
| parent | c9a53bcf7616ded009df401cc84dbc90e1b4092f (diff) | |
| download | scummvm-rg350-4aabb0378c88d77d544aad41376552f9ce4fa198.tar.gz scummvm-rg350-4aabb0378c88d77d544aad41376552f9ce4fa198.tar.bz2 scummvm-rg350-4aabb0378c88d77d544aad41376552f9ce4fa198.zip | |
The Dig: stereo samples and mixer
svn-id: r4359
| -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 "); | 
