aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gob/goblin.cpp4
-rw-r--r--gob/inter.cpp2
-rw-r--r--gob/sound.cpp76
-rw-r--r--gob/sound.h2
-rw-r--r--gob/util.cpp4
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) {