2010-10-08 22:30:39 +00:00
|
|
|
/* 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.
|
|
|
|
*
|
|
|
|
* $URL$
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef TOON_AUDIO_H
|
|
|
|
#define TOON_AUDIO_H
|
|
|
|
|
|
|
|
#include "sound/audiostream.h"
|
|
|
|
#include "sound/mixer.h"
|
2010-10-08 22:45:28 +00:00
|
|
|
#include "toon/toon.h"
|
2010-10-08 22:30:39 +00:00
|
|
|
|
|
|
|
namespace Toon {
|
|
|
|
|
|
|
|
// used for music/voice/everything
|
|
|
|
class AudioManager;
|
|
|
|
class AudioStreamInstance : public Audio::AudioStream {
|
|
|
|
|
|
|
|
public:
|
2010-11-13 02:44:34 +00:00
|
|
|
AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer, Common::SeekableReadStream *stream, bool looping = false, bool deleteFileStreamAtEnd = false);
|
2010-10-08 22:30:39 +00:00
|
|
|
~AudioStreamInstance();
|
|
|
|
void play(bool fade = false, Audio::Mixer::SoundType soundType = Audio::Mixer::kMusicSoundType);
|
|
|
|
void stop(bool fade = false);
|
|
|
|
|
|
|
|
bool isPlaying() {
|
|
|
|
return !_stopped;
|
|
|
|
}
|
|
|
|
bool isLooping() {
|
|
|
|
return _looping;
|
|
|
|
}
|
|
|
|
bool isFading() {
|
|
|
|
return _fadingIn || _fadingOut;
|
|
|
|
}
|
|
|
|
|
|
|
|
void setVolume(int32 volume);
|
|
|
|
protected:
|
2010-10-13 07:14:38 +00:00
|
|
|
int readBuffer(int16 *buffer, const int numSamples);
|
2010-10-08 22:30:39 +00:00
|
|
|
bool isStereo() const {
|
|
|
|
return false;
|
2010-10-09 10:29:11 +00:00
|
|
|
}
|
2010-10-08 22:30:39 +00:00
|
|
|
int getRate() const {
|
|
|
|
return 22100;
|
2010-10-09 10:29:11 +00:00
|
|
|
}
|
2010-10-08 22:30:39 +00:00
|
|
|
bool endOfData() const {
|
|
|
|
return _stopped;
|
2010-10-09 10:29:11 +00:00
|
|
|
}
|
2010-10-08 22:30:39 +00:00
|
|
|
void handleFade(int32 numSamples);
|
|
|
|
void stopNow();
|
|
|
|
|
|
|
|
bool readPacket();
|
|
|
|
void decodeADPCM(uint8 *comp, int16 *dest, int32 packetSize);
|
|
|
|
|
|
|
|
Common::SeekableReadStream *_file;
|
|
|
|
bool _fadingIn;
|
|
|
|
bool _fadingOut;
|
|
|
|
int32 _fadeTime;
|
|
|
|
uint8 *_compBuffer;
|
|
|
|
int16 *_buffer;
|
|
|
|
int32 _bufferSize;
|
|
|
|
int32 _bufferMaxSize;
|
|
|
|
int32 _bufferOffset;
|
|
|
|
int32 _compBufferSize;
|
|
|
|
Audio::SoundHandle _handle;
|
2010-10-10 21:12:10 +00:00
|
|
|
Audio::Mixer::SoundType _soundType;
|
2010-10-08 22:30:39 +00:00
|
|
|
Audio::Mixer *_mixer;
|
|
|
|
int32 _lastADPCMval1;
|
|
|
|
int32 _lastADPCMval2;
|
|
|
|
bool _stopped;
|
|
|
|
AudioManager *_man;
|
|
|
|
int32 _totalSize;
|
|
|
|
int32 _currentReadSize;
|
|
|
|
bool _looping;
|
|
|
|
int32 _volume;
|
2010-10-10 21:12:10 +00:00
|
|
|
int32 _musicAttenuation;
|
2010-11-13 02:44:34 +00:00
|
|
|
bool _deleteFileStream;
|
2010-10-08 22:30:39 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class AudioStreamPackage {
|
|
|
|
|
|
|
|
public:
|
|
|
|
AudioStreamPackage(ToonEngine *vm);
|
2010-10-10 21:12:10 +00:00
|
|
|
~AudioStreamPackage();
|
|
|
|
|
2010-10-08 22:30:39 +00:00
|
|
|
bool loadAudioPackage(Common::String indexFile, Common::String streamFile);
|
|
|
|
void getInfo(int32 id, int32 *offset, int32 *size);
|
|
|
|
Common::SeekableReadStream *getStream(int32 id, bool ownMemory = false);
|
|
|
|
protected:
|
|
|
|
Common::SeekableReadStream *_file;
|
|
|
|
uint32 *_indexBuffer;
|
|
|
|
ToonEngine *_vm;
|
|
|
|
};
|
|
|
|
|
2010-10-25 22:15:47 +00:00
|
|
|
struct AudioAmbientSFX {
|
|
|
|
int32 _id;
|
|
|
|
int32 _volume;
|
|
|
|
int32 _lastTimer;
|
|
|
|
int32 _delay;
|
|
|
|
int32 _mode;
|
|
|
|
int32 _channel;
|
|
|
|
bool _enabled;
|
|
|
|
};
|
|
|
|
|
2010-10-08 22:30:39 +00:00
|
|
|
class AudioManager {
|
|
|
|
public:
|
|
|
|
void removeInstance(AudioStreamInstance *inst); // called by destructor
|
|
|
|
|
|
|
|
AudioManager(ToonEngine *vm, Audio::Mixer *mixer);
|
2010-11-09 23:57:56 +00:00
|
|
|
~AudioManager();
|
2010-10-08 22:30:39 +00:00
|
|
|
|
|
|
|
bool voiceStillPlaying();
|
|
|
|
|
|
|
|
void playMusic(Common::String dir, Common::String music);
|
|
|
|
void playVoice(int32 id, bool genericVoice);
|
2010-10-25 22:15:47 +00:00
|
|
|
int32 playSFX(int32 id, int volume, bool genericSFX);
|
2010-10-08 22:30:39 +00:00
|
|
|
void stopCurrentVoice();
|
2010-10-29 22:00:31 +00:00
|
|
|
void stopAllSfxs();
|
2010-10-08 22:30:39 +00:00
|
|
|
void setMusicVolume(int32 volume);
|
|
|
|
void stopMusic();
|
2010-10-16 19:27:11 +00:00
|
|
|
void muteVoice(bool mute);
|
|
|
|
void muteMusic(bool mute);
|
|
|
|
void muteSfx(bool mute);
|
2010-10-25 22:15:47 +00:00
|
|
|
bool isVoiceMuted() { return _voiceMuted; }
|
|
|
|
bool isMusicMuted() { return _musicMuted; }
|
|
|
|
bool isSfxMuted() { return _sfxMuted; }
|
|
|
|
|
|
|
|
void startAmbientSFX(int32 id, int32 delay, int32 mode, int32 volume);
|
|
|
|
void killAmbientSFX(int32 id);
|
|
|
|
void killAllAmbientSFX();
|
|
|
|
void updateAmbientSFX();
|
|
|
|
void setAmbientSFXVolume(int32 id, int volume);
|
2010-10-08 22:30:39 +00:00
|
|
|
|
2010-10-22 23:29:52 +00:00
|
|
|
void closeAudioPack(int32 id);
|
2010-10-08 22:30:39 +00:00
|
|
|
bool loadAudioPack(int32 id, Common::String indexFile, Common::String packFile);
|
|
|
|
|
|
|
|
AudioStreamInstance *_channels[16]; // 0-1 : music
|
|
|
|
// 2 : voice
|
|
|
|
// 3-16 : SFX
|
|
|
|
|
|
|
|
AudioStreamPackage *_audioPacks[4]; // 0 : generic streams
|
|
|
|
// 1 : local streams
|
|
|
|
// 2 : generic SFX
|
|
|
|
// 3 : local SFX
|
|
|
|
uint32 _currentMusicChannel;
|
|
|
|
Common::String _currentMusicName;
|
|
|
|
ToonEngine *_vm;
|
|
|
|
Audio::Mixer *_mixer;
|
2010-10-16 19:27:11 +00:00
|
|
|
|
|
|
|
protected:
|
2010-10-25 22:15:47 +00:00
|
|
|
bool _voiceMuted;
|
|
|
|
bool _musicMuted;
|
|
|
|
bool _sfxMuted;
|
|
|
|
|
|
|
|
AudioAmbientSFX _ambientSFXs[4];
|
2010-10-08 22:30:39 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // End of namespace Toon
|
|
|
|
|
|
|
|
#endif
|