diff options
author | Sven Hesse | 2007-01-25 15:17:46 +0000 |
---|---|---|
committer | Sven Hesse | 2007-01-25 15:17:46 +0000 |
commit | 43fb2e6ed9335831df31bead748f4fb7247c3272 (patch) | |
tree | 2e73f0eb9b60e5b29fda50fb0e33aa569e9d3a15 /sound/mods/infogrames.h | |
parent | f7c6643841d85334c57df7687eb1caba014f1019 (diff) | |
download | scummvm-rg350-43fb2e6ed9335831df31bead748f4fb7247c3272.tar.gz scummvm-rg350-43fb2e6ed9335831df31bead748f4fb7247c3272.tar.bz2 scummvm-rg350-43fb2e6ed9335831df31bead748f4fb7247c3272.zip |
Moved Paula and Infogrames to sound/mods/
svn-id: r25191
Diffstat (limited to 'sound/mods/infogrames.h')
-rw-r--r-- | sound/mods/infogrames.h | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/sound/mods/infogrames.h b/sound/mods/infogrames.h new file mode 100644 index 0000000000..78bc9efd82 --- /dev/null +++ b/sound/mods/infogrames.h @@ -0,0 +1,150 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2007 The ScummVM project + * + * 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 SOUND_MODS_INFOGRAMES_H +#define SOUND_MODS_INFOGRAMES_H + +#include "sound/mods/paula.h" +#include "common/stream.h" +#include "common/file.h" + +namespace Audio { + +/** A player for the Infogrames/RobHubbard2 format */ +class Infogrames : public Paula { +public: + class Instruments { + public: + Instruments(); + template<typename T> Instruments(T ins) { + init(); + bool result = load(ins); + assert(result); + } + ~Instruments(); + + bool load(Common::SeekableReadStream &ins); + bool load(const char *ins) { + Common::File f; + + if (f.open(ins)) + return load(f); + return false; + } + void unload(void); + + uint8 getCount(void) const { return _count; } + + protected: + struct Sample { + int8 *data; + int8 *dataRepeat; + uint32 length; + uint32 lengthRepeat; + } _samples[32]; + + uint8 _count; + int8 *_sampleData; + + void init(); + + friend class Infogrames; + }; + + Infogrames(Instruments &ins, bool stereo = false, int rate = 44100); + ~Infogrames(); + + Instruments *getInstruments(void) const { return _instruments; } + bool getRepeating(void) const { return _repCount != 0; } + void setRepeating (int32 repCount) { _repCount = repCount; } + virtual void startPlay(void) { _playing = true;} + virtual void stopPlay(void) + { + _mutex.lock(); + _playing = false; + _mutex.unlock(); + } + virtual void pausePlay(bool pause) { _playing = !pause; } + + bool load(Common::SeekableReadStream &dum); + bool load(const char *dum) { + Common::File f; + + if (f.open(dum)) + return load(f); + return false; + } + void unload(void); + void restart(void) { if (_data) { stopPlay(); init(); startPlay(); } } + +protected: + Instruments *_instruments; + + static const uint8 tickCount[]; + static const uint16 periods[]; + byte *_data; + int32 _repCount; + + byte *_subSong; + byte *_cmdBlocks; + byte *_volSlideBlocks; + byte *_periodSlideBlocks; + uint8 _speedCounter; + uint8 _speed; + + uint16 _volume; + int16 _period; + uint8 _sample; + + struct Slide { + byte *data; + int8 amount; + uint8 dataOffset; + int16 finetuneNeg; + int16 finetunePos; + uint8 curDelay1; + uint8 curDelay2; + uint8 flags; // 0: Apply finetune modifier, 2: Don't slide, 7: Continuous + }; + struct Channel { + byte *cmdBlockIndices; + byte *cmdBlocks; + byte *cmds; + uint8 ticks; + uint8 tickCount; + Slide volSlide; + Slide periodSlide; + int16 period; + int8 periodMod; + uint8 flags; // 0: Need init, 5: Loop cmdBlocks, 6: Ignore channel + } _chn[4]; + + void init(void); + void reset(void); + void getNextSample(Channel &chn); + int16 tune(Slide &slide, int16 start) const; + virtual void interrupt(void); +}; + +} // End of namespace Audio + +#endif |