NUVIE: Fix crash using queing audio streams for PC speaker

The PC Speaker streams are hardcoded at 22Khz, but when the
ScummVM queueing audio streams were created, they were being
set at the mixer rate of 44Khz. Which caused an error,
because the queueing audio stream expected the added streams
to be at the same rate. For now, the best solution seemed to
be to ignore the passed rate, and hardcode the queueing
audio streams to a rate of 22Khz to match.
This commit is contained in:
Paul Gilbert 2020-09-06 10:39:49 -07:00
parent f77e238629
commit d872e3a3b5

View file

@ -327,8 +327,8 @@ int PCSpeakerStutterStream::readBuffer(sint16 *buffer, const int numSamples) {
return s;
}
Audio::AudioStream *makePCSpeakerSlugDissolveSfxStream(uint rate) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(rate, false);
Audio::AudioStream *makePCSpeakerSlugDissolveSfxStream(uint /*rate*/) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(SPKR_OUTPUT_RATE, false);
for (uint16 i = 0; i < 20; i++) {
stream->queueAudioStream(new PCSpeakerRandomStream((NUVIE_RAND() % 0x1068) + 0x258, 0x15e, 1), DisposeAfterUse::YES);
}
@ -336,8 +336,8 @@ Audio::AudioStream *makePCSpeakerSlugDissolveSfxStream(uint rate) {
return stream;
}
Audio::AudioStream *makePCSpeakerGlassSfxStream(uint rate) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(rate, false);
Audio::AudioStream *makePCSpeakerGlassSfxStream(uint /*rate*/) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(SPKR_OUTPUT_RATE, false);
for (uint16 i = 0x7d0; i < 0x4e20; i += 0x3e8) {
stream->queueAudioStream(new PCSpeakerRandomStream(i, 0x78, 0x28), DisposeAfterUse::YES);
}
@ -346,7 +346,7 @@ Audio::AudioStream *makePCSpeakerGlassSfxStream(uint rate) {
}
Audio::AudioStream *makePCSpeakerMagicCastingP1SfxStream(uint rate, uint8 magic_circle) {
Audio::AudioStream *makePCSpeakerMagicCastingP1SfxStream(uint /*rate*/, uint8 magic_circle) {
//Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(rate, false);
return new PCSpeakerRandomStream(0x2bc, 0x640 * magic_circle + 0x1f40, 0x320);
@ -354,8 +354,8 @@ Audio::AudioStream *makePCSpeakerMagicCastingP1SfxStream(uint rate, uint8 magic_
//return stream;
}
Audio::AudioStream *makePCSpeakerMagicCastingP2SfxStream(uint rate, uint8 magic_circle) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(rate, false);
Audio::AudioStream *makePCSpeakerMagicCastingP2SfxStream(uint /*rate*/, uint8 magic_circle) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(SPKR_OUTPUT_RATE, false);
const sint16 word_30188[] = {3, 2, 2, 2, 1, 1, 1, 1, 1};
@ -370,10 +370,10 @@ Audio::AudioStream *makePCSpeakerMagicCastingP2SfxStream(uint rate, uint8 magic_
return stream;
}
Audio::AudioStream *makePCSpeakerAvatarDeathSfxStream(uint rate) {
Audio::AudioStream *makePCSpeakerAvatarDeathSfxStream(uint /*rate*/) {
const uint16 avatar_death_tune[] = {0x12C, 0x119, 0x12C, 0xFA, 0x119, 0xDE, 0xFA, 0xFA};
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(rate, false);
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(SPKR_OUTPUT_RATE, false);
for (uint8 i = 0; i < 8; i++) {
stream->queueAudioStream(new PCSpeakerStutterStream(3, 1, 0x4e20, 1, avatar_death_tune[i]));
}
@ -381,8 +381,8 @@ Audio::AudioStream *makePCSpeakerAvatarDeathSfxStream(uint rate) {
return stream;
}
Audio::AudioStream *makePCSpeakerKalLorSfxStream(uint rate) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(rate, false);
Audio::AudioStream *makePCSpeakerKalLorSfxStream(uint /*rate*/) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(SPKR_OUTPUT_RATE, false);
for (uint8 i = 0; i < 0x32; i++) {
stream->queueAudioStream(new PCSpeakerStutterStream((0x32 - i) << 2, 0x2710 - (i << 6), 0x3e8, 1, (i << 4) + 0x320));
}
@ -392,9 +392,11 @@ Audio::AudioStream *makePCSpeakerKalLorSfxStream(uint rate) {
return stream;
}
Audio::AudioStream *makePCSpeakerHailStoneSfxStream(uint rate) {
//FIXME This doesn't sound right. It should probably use a single pcspkr object. The original also plays the hailstones individually not all at once like we do. :(
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(rate, false);
Audio::AudioStream *makePCSpeakerHailStoneSfxStream(uint /*rate*/) {
//FIXME This doesn't sound right. It should probably use a single
// pcspkr object. The original also plays the hailstones
// individually, not all at once like we do. :(
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(SPKR_OUTPUT_RATE, false);
for (uint16 i = 0; i < 0x28; i++) {
stream->queueAudioStream(new PCSpeakerFreqStream((NUVIE_RAND() % 0x28) + 0x20, 8), DisposeAfterUse::YES);
@ -414,8 +416,8 @@ Audio::AudioStream *makePCSpeakerHailStoneSfxStream(uint rate) {
return stream;
}
Audio::AudioStream *makePCSpeakerEarthQuakeSfxStream(uint rate) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(rate, false);
Audio::AudioStream *makePCSpeakerEarthQuakeSfxStream(uint /*rate*/) {
Audio::QueuingAudioStream *stream = Audio::makeQueuingAudioStream(SPKR_OUTPUT_RATE, false);
for (uint16 i = 0; i < 0x28; i++) {
stream->queueAudioStream(new PCSpeakerFreqStream((NUVIE_RAND() % 0xb5) + 0x13, 8), DisposeAfterUse::YES);