mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-23 18:24:59 +00:00
378 lines
8.4 KiB
C++
378 lines
8.4 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* This code is based on original Tony Tough source code
|
|
*
|
|
* Copyright (c) 1997-2003 Nayma Software
|
|
*/
|
|
|
|
#ifndef TONY_SOUND_H
|
|
#define TONY_SOUND_H
|
|
|
|
#include "audio/mixer.h"
|
|
#include "common/file.h"
|
|
#include "tony/gfxcore.h"
|
|
#include "tony/loc.h"
|
|
#include "tony/utils.h"
|
|
|
|
namespace Audio {
|
|
class RewindableAudioStream;
|
|
}
|
|
|
|
namespace Tony {
|
|
|
|
class FPStream;
|
|
class FPSfx;
|
|
|
|
enum SoundCodecs {
|
|
FPCODEC_RAW,
|
|
FPCODEC_ADPCM
|
|
};
|
|
|
|
/**
|
|
* Sound driver For Tony Tough
|
|
*/
|
|
|
|
class FPSound {
|
|
private:
|
|
bool _soundSupported;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor. Initializes the attributes.
|
|
*
|
|
*/
|
|
|
|
FPSound();
|
|
|
|
/**
|
|
* Destroy the object and free the memory
|
|
*
|
|
*/
|
|
|
|
~FPSound();
|
|
|
|
/**
|
|
* Initializes the object, and prepare everything you need to create streams and sound effects.
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool init();
|
|
|
|
/**
|
|
* Allocates an object of type FPStream, and return its pointer
|
|
*
|
|
* @param streamPtr Will contain a pointer to the object you just created.
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool createStream(FPStream **streamPtr);
|
|
|
|
/**
|
|
* Allocates an object of type FpSfx, and return its pointer
|
|
*
|
|
* @param sfxPtr Will contain a pointer to the object you just created.
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool createSfx(FPSfx **sfxPtr);
|
|
|
|
/**
|
|
* Set the general volume
|
|
*
|
|
* @param volume Volume to set (0-63)
|
|
*/
|
|
|
|
void setMasterVolume(int volume);
|
|
|
|
/**
|
|
* Get the general volume
|
|
*
|
|
* @param volume Variable that will contain the volume (0-63)
|
|
*/
|
|
|
|
void getMasterVolume(int *volume);
|
|
};
|
|
|
|
class FPSfx {
|
|
private:
|
|
bool _soundSupported; // True if the sound is active
|
|
bool _fileLoaded; // True is a file is opened
|
|
bool _loop; // True is sound effect should loop
|
|
int _lastVolume;
|
|
|
|
bool _isVoice;
|
|
bool _paused;
|
|
|
|
Audio::AudioStream *_loopStream;
|
|
Audio::RewindableAudioStream *_rewindableStream;
|
|
Audio::SoundHandle _handle;
|
|
|
|
public:
|
|
uint32 _hEndOfBuffer;
|
|
|
|
/**
|
|
* Check process for whether sounds have finished playing
|
|
*/
|
|
static void soundCheckProcess(CORO_PARAM, const void *param);
|
|
|
|
/**
|
|
* Default constructor.
|
|
*
|
|
* @remarks Do *NOT* declare an object directly, but rather
|
|
* create it using FPSound::CreateSfx()
|
|
*
|
|
*/
|
|
|
|
FPSfx(bool soundOn);
|
|
|
|
/**
|
|
* Default Destructor.
|
|
*
|
|
* @remarks It is also stops the sound effect that may be
|
|
* currently played, and free the memory it uses.
|
|
*
|
|
*/
|
|
|
|
~FPSfx();
|
|
|
|
/**
|
|
* Releases the memory used by the object.
|
|
*
|
|
* @remarks Must be called when the object is no longer used and
|
|
* **ONLY** if the object was created by
|
|
* FPSound::CreateStream().
|
|
* Object pointers are no longer valid after this call.
|
|
*/
|
|
|
|
void release();
|
|
|
|
/**
|
|
* Opens a file and loads a sound effect.
|
|
*
|
|
* @param fileName Sfx filename
|
|
* @param codec CODEC used to uncompress the samples
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool loadFile(const char *fileName, uint32 codec = FPCODEC_RAW);
|
|
bool loadWave(Common::SeekableReadStream *stream);
|
|
bool loadVoiceFromVDB(Common::File &vdbFP);
|
|
|
|
/**
|
|
* Play the Sfx in memory.
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool play();
|
|
|
|
/**
|
|
* Stops a Sfx.
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool stop();
|
|
|
|
/**
|
|
* Pauses a Sfx.
|
|
*
|
|
*/
|
|
|
|
void setPause(bool pause);
|
|
|
|
/**
|
|
* Enables or disables the Sfx loop.
|
|
*
|
|
* @param loop True to enable the loop, False to disable
|
|
*
|
|
* @remarks The loop must be activated BEFORE the sfx starts
|
|
* playing. Any changes made during the play will have
|
|
* no effect until the sfx is stopped then played again.
|
|
*/
|
|
|
|
void setLoop(bool loop);
|
|
|
|
/**
|
|
* Change the volume of Sfx
|
|
*
|
|
* @param volume Volume to be set (0-63)
|
|
*
|
|
*/
|
|
|
|
void setVolume(int volume);
|
|
|
|
/**
|
|
* Gets the Sfx volume
|
|
*
|
|
* @param volumePtr Will contain the current Sfx volume
|
|
*
|
|
*/
|
|
|
|
void getVolume(int *volumePtr);
|
|
|
|
/**
|
|
* Returns true if the underlying sound has ended
|
|
*/
|
|
bool endOfBuffer() const;
|
|
};
|
|
|
|
class FPStream {
|
|
private:
|
|
uint32 _bufferSize; // Buffer size (bytes)
|
|
uint32 _size; // Stream size (bytes)
|
|
uint32 _codec; // CODEC used
|
|
|
|
Common::File _file; // File handle used for the stream
|
|
|
|
bool _soundSupported; // True if the sound is active
|
|
bool _fileLoaded; // True if the file is open
|
|
bool _loop; // True if the stream should loop
|
|
bool _doFadeOut; // True if fade out is required
|
|
bool _syncExit;
|
|
bool _paused;
|
|
int _lastVolume;
|
|
FPStream *_syncToPlay;
|
|
|
|
Audio::AudioStream *_loopStream;
|
|
Audio::RewindableAudioStream *_rewindableStream;
|
|
Audio::SoundHandle _handle;
|
|
|
|
public:
|
|
|
|
/**
|
|
* Default constructor.
|
|
*
|
|
* @remarks Do *NOT* declare an object directly, but rather
|
|
* create it using FPSound::CreateStream()
|
|
*/
|
|
|
|
FPStream(bool soundOn);
|
|
|
|
/**
|
|
* Default destructor.
|
|
*
|
|
* @remarks It calls CloseFile() if needed.
|
|
*/
|
|
|
|
~FPStream();
|
|
|
|
/**
|
|
* Releases the memory object.
|
|
*
|
|
* @remarks Must be called when the object is no longer used
|
|
* and **ONLY** if the object was created by
|
|
* FPSound::CreateStream().
|
|
* Object pointers are no longer valid after this call.
|
|
*/
|
|
|
|
void release();
|
|
|
|
/**
|
|
* Opens a file stream
|
|
*
|
|
* @param fileName Filename to be opened
|
|
* @param codec CODEC to be used to uncompress samples
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool loadFile(const Common::String &fileName, uint32 codec = FPCODEC_RAW, int sync = 2000);
|
|
|
|
/**
|
|
* Closes a file stream (opened or not).
|
|
*
|
|
* @returns For safety, the destructor calls unloadFile() if it has not
|
|
* been mentioned explicitly.
|
|
*
|
|
* @remarks It is necessary to call this function to free the
|
|
* memory used by the stream.
|
|
*/
|
|
|
|
bool unloadFile();
|
|
|
|
/**
|
|
* Play the stream.
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool play();
|
|
void playFast();
|
|
|
|
/**
|
|
* Closes the stream.
|
|
*
|
|
* @returns True is everything is OK, False otherwise
|
|
*/
|
|
|
|
bool stop();
|
|
void waitForSync(FPStream *toPlay);
|
|
|
|
/**
|
|
* Pause sound effect
|
|
*
|
|
* @param pause True enables pause, False disables it
|
|
*/
|
|
|
|
void setPause(bool pause);
|
|
|
|
/**
|
|
* Unables or disables stream loop.
|
|
*
|
|
* @param loop True enable loop, False disables it
|
|
*
|
|
* @remarks The loop must be activated BEFORE the stream starts
|
|
* playing. Any changes made during the play will have no
|
|
* effect until the stream is stopped then played again.
|
|
*/
|
|
|
|
void setLoop(bool loop);
|
|
|
|
/**
|
|
* Change the volume of the stream
|
|
*
|
|
* @param volume Volume to be set (0-63)
|
|
*/
|
|
|
|
void setVolume(int volume);
|
|
|
|
/**
|
|
* Gets the volume of the stream
|
|
*
|
|
* @param volumePtr Variable that will contain the current volume
|
|
*
|
|
*/
|
|
|
|
void getVolume(int *volumePtr);
|
|
};
|
|
|
|
} // End of namespace Tony
|
|
|
|
#endif
|