Initial commit
This commit is contained in:
377
engines/tony/sound.h
Normal file
377
engines/tony/sound.h
Normal file
@@ -0,0 +1,377 @@
|
||||
/* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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_UNKNOWN,
|
||||
FPCODEC_ADPCM,
|
||||
FPCODEC_MP3,
|
||||
FPCODEC_OGG,
|
||||
FPCODEC_FLAC
|
||||
};
|
||||
|
||||
/**
|
||||
* 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);
|
||||
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)
|
||||
|
||||
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
|
||||
*
|
||||
* @returns True is everything is OK, False otherwise
|
||||
*/
|
||||
|
||||
bool loadFile(const Common::String &fileName, int sync);
|
||||
|
||||
/**
|
||||
* 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
|
||||
Reference in New Issue
Block a user