scummvm/engines/tony/sound.h
2014-02-18 02:39:39 +01:00

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