diff options
author | Eugene Sandulenko | 2005-05-06 15:59:33 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2005-05-06 15:59:33 +0000 |
commit | 5c426e6908c7c34f944c2ed9576acf05fb03d30f (patch) | |
tree | 3e5a696d8cf9b081022aec486033a8e1e5dff15c | |
parent | 3cbaf48932bab13af946d23078b64a8f84d49559 (diff) | |
download | scummvm-rg350-5c426e6908c7c34f944c2ed9576acf05fb03d30f.tar.gz scummvm-rg350-5c426e6908c7c34f944c2ed9576acf05fb03d30f.tar.bz2 scummvm-rg350-5c426e6908c7c34f944c2ed9576acf05fb03d30f.zip |
Patch #1196638 'GOB: Simple "beeper"'. Thanks eriktorbjorn.
svn-id: r17935
-rw-r--r-- | gob/goblin.cpp | 4 | ||||
-rw-r--r-- | gob/inter.cpp | 2 | ||||
-rw-r--r-- | gob/sound.cpp | 76 | ||||
-rw-r--r-- | gob/sound.h | 2 | ||||
-rw-r--r-- | gob/util.cpp | 4 |
5 files changed, 78 insertions, 10 deletions
diff --git a/gob/goblin.cpp b/gob/goblin.cpp index a5d7fae268..53772bfc65 100644 --- a/gob/goblin.cpp +++ b/gob/goblin.cpp @@ -1562,9 +1562,7 @@ void gob_moveAdvance(Gob_Object *gobDesc, int16 nextAct, int16 framesCount) { if (gobDesc->state >= 0 && gobDesc->state < 10 && gobDesc->stateMach == gobDesc->realStateMach && (gobDesc->curFrame == 3 || gobDesc->curFrame == 6)) { - snd_speakerOn(10 * util_getRandom(3) + 50); - util_delay(5); - snd_speakerOff(); + snd_speakerOn(10 * util_getRandom(3) + 50, 5); } if (gob_currentGoblin == 0 diff --git a/gob/inter.cpp b/gob/inter.cpp index 6a197b7902..733f3ea94e 100644 --- a/gob/inter.cpp +++ b/gob/inter.cpp @@ -1314,7 +1314,7 @@ void inter_funcBlock(int16 retFlag) { break; case 2: - snd_speakerOn(parse_parseValExpr()); + snd_speakerOn(parse_parseValExpr(), -1); break; case 3: diff --git a/gob/sound.cpp b/gob/sound.cpp index 17e0570aff..bcab86b8b3 100644 --- a/gob/sound.cpp +++ b/gob/sound.cpp @@ -19,11 +19,73 @@ * $Header$ * */ + +#include "sound/audiostream.h" + #include "gob/gob.h" #include "gob/global.h" #include "gob/sound.h" + namespace Gob { +// TODO: This is a very primitive square wave generator. The only thing is +// has in common with the PC speaker is that it sounds terrible. + +class SquareWaveStream : public AudioStream { +private: + uint _rate; + bool _beepForever; + uint32 _periodLength; + uint32 _periodSamples; + uint32 _remainingSamples; + int16 _sampleValue; + +public: + SquareWaveStream() {} + ~SquareWaveStream() {} + + void playNote(int freq, int32 ms); + + int readBuffer(int16 *buffer, const int numSamples); + + bool endOfData() const { return _remainingSamples == 0; } + bool isStereo() const { return false; } + int getRate() const { return _rate; } +}; + +void SquareWaveStream::playNote(int freq, int32 ms) { + _rate = _vm->_mixer->getOutputRate(); + _periodLength = _rate / (2 * freq); + _periodSamples = 0; + _sampleValue = 6000; + if (ms == -1) { + _remainingSamples = 1; + _beepForever = true; + } else { + _remainingSamples = (_rate * ms) / 1000; + _beepForever = false; + } +} + +int SquareWaveStream::readBuffer(int16 *buffer, const int numSamples) { + int samples = 0; + + while (samples < numSamples && _remainingSamples > 0) { + *buffer++ = _sampleValue; + if (_periodSamples++ > _periodLength) { + _periodSamples = 0; + _sampleValue = -_sampleValue; + } + samples++; + if (!_beepForever) + _remainingSamples--; + } + + return samples; +} + +SquareWaveStream speakerStream; +SoundHandle speakerHandle; Snd_SoundDesc *snd_loopingSounds[5]; // Should be enough void snd_initSound(void) { @@ -48,8 +110,18 @@ int16 snd_checkProAudio(void) {return 0;} int16 snd_checkAdlib(void) {return 0;} int16 snd_checkBlaster(void) {return 0;} void snd_setBlasterPort(int16 port) {return;} -void snd_speakerOn(int16 frequency) {return;} -void snd_speakerOff(void) {return;} + +void snd_speakerOn(int16 frequency, int32 length) { + speakerStream.playNote(frequency, length); + if (!_vm->_mixer->isSoundHandleActive(speakerHandle)) { + _vm->_mixer->playInputStream(SoundMixer::kSFXSoundType, &speakerHandle, &speakerStream, -1, 255, 0, false); + } +} + +void snd_speakerOff(void) { + _vm->_mixer->stopHandle(speakerHandle); +} + void snd_stopSound(int16 arg){return;} void snd_setResetTimerFlag(char flag){return;} diff --git a/gob/sound.h b/gob/sound.h index e2a472007a..cc913795da 100644 --- a/gob/sound.h +++ b/gob/sound.h @@ -30,7 +30,7 @@ int16 snd_checkProAudio(void); int16 snd_checkAdlib(void); int16 snd_checkBlaster(void); void snd_setBlasterPort(int16 port); -void snd_speakerOn(int16 frequency); +void snd_speakerOn(int16 frequency, int32 length); void snd_speakerOff(void); void snd_stopSound(int16 arg); void snd_setResetTimerFlag(char flag); diff --git a/gob/util.cpp b/gob/util.cpp index 9596d38215..5603748f02 100644 --- a/gob/util.cpp +++ b/gob/util.cpp @@ -192,9 +192,7 @@ void util_beep(int16 freq) { if (soundFlags == 0) return; - //sound(freq); - util_delay(50); - //nosound(); + snd_speakerOn(freq, 50); } uint32 util_getTimeKey(void) { |