aboutsummaryrefslogtreecommitdiff
path: root/engines/lab/labmusic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/lab/labmusic.cpp')
-rw-r--r--engines/lab/labmusic.cpp100
1 files changed, 72 insertions, 28 deletions
diff --git a/engines/lab/labmusic.cpp b/engines/lab/labmusic.cpp
index 1f5794b995..9bc0ee0dee 100644
--- a/engines/lab/labmusic.cpp
+++ b/engines/lab/labmusic.cpp
@@ -28,6 +28,8 @@
*
*/
+#include "audio/mixer.h"
+
#include "lab/stddefines.h"
#include "lab/labfun.h"
#include "lab/timing.h"
@@ -41,7 +43,6 @@ namespace Lab {
#define SAMPLESPEED 15000L
-extern bool EffectPlaying;
Music *g_music;
Music::Music() {
@@ -55,9 +56,10 @@ Music::Music() {
_leftinfile = 0;
_musicOn = false;
- _turnMusicOn = false;
_winmusic = false;
- _doNotFileFlushAudio = false;
+ _loopSoundEffect = false;
+ _queuingAudioStream = NULL;
+ _doNotFilestopSoundEffect = false;
}
/*****************************************************************************/
@@ -69,18 +71,63 @@ void Music::updateMusic() {
updateMouse();
- if (EffectPlaying)
- updateSoundBuffers();
-
if (_musicOn && getPlayingBufferCount() < MAXBUFFERS) {
// NOTE: We need to use malloc(), cause this will be freed with free()
// by the music code
byte *musicBuffer = (byte *)malloc(MUSICBUFSIZE);
fillbuffer(musicBuffer);
- playMusicBlock(musicBuffer, MUSICBUFSIZE, 0, SAMPLESPEED);
+
+ // Queue a music block, and start the music, if needed
+ bool startMusic = false;
+
+ if (!_queuingAudioStream) {
+ _queuingAudioStream = Audio::makeQueuingAudioStream(SAMPLESPEED, false);
+ startMusic = true;
+ }
+
+ byte soundFlags = Audio::FLAG_LITTLE_ENDIAN;
+ if (g_lab->getPlatform() == Common::kPlatformWindows)
+ soundFlags |= Audio::FLAG_16BITS;
+ else
+ soundFlags |= Audio::FLAG_UNSIGNED;
+
+ _queuingAudioStream->queueBuffer(musicBuffer, MUSICBUFSIZE, DisposeAfterUse::YES, soundFlags);
+
+ if (startMusic)
+ g_lab->_mixer->playStream(Audio::Mixer::kMusicSoundType, &_musicHandle, _queuingAudioStream);
}
}
+uint16 Music::getPlayingBufferCount() {
+ return (_queuingAudioStream) ? _queuingAudioStream->numQueuedStreams() : 0;
+}
+
+void Music::playSoundEffect(uint16 SampleSpeed, uint32 Length, void *Data) {
+ pauseBackMusic();
+ stopSoundEffect();
+
+ if (SampleSpeed < 4000)
+ SampleSpeed = 4000;
+
+ byte soundFlags = Audio::FLAG_LITTLE_ENDIAN;
+ if (g_lab->getPlatform() == Common::kPlatformWindows)
+ soundFlags |= Audio::FLAG_16BITS;
+ else
+ soundFlags |= Audio::FLAG_UNSIGNED;
+
+ Audio::SeekableAudioStream *audioStream = Audio::makeRawStream((const byte *)Data, Length, SampleSpeed, soundFlags, DisposeAfterUse::NO);
+ uint loops = (_loopSoundEffect) ? 0 : 1;
+ Audio::LoopingAudioStream *loopingAudioStream = new Audio::LoopingAudioStream(audioStream, loops, DisposeAfterUse::YES);
+ g_lab->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_sfxHandle, loopingAudioStream);
+}
+
+void Music::stopSoundEffect() {
+ g_lab->_mixer->stopHandle(_sfxHandle);
+}
+
+bool Music::isSoundEffectActive() const {
+ return g_lab->_mixer->isSoundHandleActive(_sfxHandle);
+}
void Music::fillbuffer(byte *musicBuffer) {
if (MUSICBUFSIZE < _leftinfile) {
@@ -114,7 +161,7 @@ void Music::startMusic(bool startatbegin) {
if (!_musicOn)
return;
- flushAudio();
+ stopSoundEffect();
if (startatbegin) {
_file->seek(0);
@@ -130,10 +177,6 @@ void Music::startMusic(bool startatbegin) {
/* Initializes the music buffers. */
/*****************************************************************************/
bool Music::initMusic() {
-
- if (!_turnMusicOn)
- return true;
-
_musicOn = true;
_musicPaused = false;
@@ -167,6 +210,12 @@ void Music::freeMusic() {
_file->close();
_file = 0;
+
+ g_lab->_mixer->stopHandle(_musicHandle);
+ g_lab->_mixer->stopHandle(_sfxHandle);
+
+ delete _queuingAudioStream;
+ _queuingAudioStream = NULL;
}
@@ -177,9 +226,9 @@ void Music::pauseBackMusic() {
if (!_musicPaused && _musicOn) {
updateMusic();
_musicOn = false;
- flushAudio();
+ stopSoundEffect();
- // TODO: Pause
+ g_lab->_mixer->pauseHandle(_musicHandle, true);
_musicPaused = true;
}
@@ -188,21 +237,21 @@ void Music::pauseBackMusic() {
/*****************************************************************************/
-/* Restarts the paused background music. */
+/* Resumes the paused background music. */
/*****************************************************************************/
-void Music::restartBackMusic() {
+void Music::resumeBackMusic() {
if (_musicPaused) {
- flushAudio();
+ stopSoundEffect();
_musicOn = true;
+
+ g_lab->_mixer->pauseHandle(_musicHandle, false);
+
updateMusic();
_musicPaused = false;
}
}
-
-
-
/*****************************************************************************/
/* Checks to see if need to fill buffers fill of music. */
/*****************************************************************************/
@@ -232,7 +281,7 @@ void Music::newCheckMusic() {
/* Turns the music on and off. */
/*****************************************************************************/
void Music::setMusic(bool on) {
- flushAudio();
+ stopSoundEffect();
if (on && !_musicOn) {
_musicOn = true;
@@ -251,15 +300,10 @@ void Music::changeMusic(const char *newmusic) {
if (!_tFile) {
_tFile = _file;
_tMusicOn = _musicOn;
-#if defined(DOSCODE)
- _tLeftInFile = _leftinfile;
-#else
_tLeftInFile = _leftinfile + 65536L;
if (_tLeftInFile > (uint32)_tFile->size())
_tLeftInFile = _leftinfile;
-
-#endif
}
_file = openPartial(newmusic);
@@ -336,8 +380,8 @@ byte **Music::newOpen(const char *name) {
fillUpMusic(true);
}
- if (!_doNotFileFlushAudio && EffectPlaying)
- flushAudio();
+ if (!_doNotFilestopSoundEffect && isSoundEffectActive())
+ stopSoundEffect();
file = openFile(name);
checkMusic();