SBSPSS/source/sound/xmplay.h
2001-01-19 16:25:05 +00:00

172 lines
4.3 KiB
C++

/*=========================================================================
xmplay.h
Author: PKG
Created:
Project: Spongebob
Purpose:
Copyright (c) 2000 Climax Development Ltd
===========================================================================*/
#ifndef __SOUND_XMPLAY_H__
#define __SOUND_XMPLAY_H__
/*----------------------------------------------------------------------
Includes
-------- */
#ifndef _FILEIO_HEADER_
#include "fileio\fileio.h"
#endif
/* Std Lib
------- */
/*----------------------------------------------------------------------
Tyepdefs && Defines
------------------- */
// This is a bit messy, but makes sure that you can't easily pass the wrong IDs to the xm functions
// ( ..something scares me about this way of doing it tho :)
typedef enum {NO_SAMPLE=-1} xmSampleId;
typedef enum {NO_SONG=-1} xmModId;
typedef enum {NOT_PLAYING=-1} xmPlayingId;
// Note that a playing id is a 16 bit value. Top 8 bits are an ( effectively ) random number and the bottom
// 8 bits are the base channel of the playing sound.
/*----------------------------------------------------------------------
Structure defintions
-------------------- */
class CXMPlaySound
{
public:
enum
{
MIN_VOLUME=0,
MAX_VOLUME=255,
PAN_LEFT=0,
PAN_CENTRE=127,
PAN_RIGHT=255,
};
void initialise();
void shutdown();
void think();
void setMasterSongVolume(unsigned char _vol);
void setMasterSfxVolume(unsigned char _vol);
xmSampleId loadSampleData(FileEquate _vhFe,FileEquate _vbFe);
xmModId loadModData(FileEquate _modFe);
void dumpSampleData(xmSampleId _sampleId);
void dumpModData(xmModId _modId);
void setStereo(int _stereo);
void setVolume(xmPlayingId _playingId,unsigned char _volume);
void setPanning(xmPlayingId _playingId,char _pan);
void stopAndUnlockAllSound();
xmPlayingId playSong(xmSampleId _sampleId,xmModId _modId,int _startPattern=0);
xmPlayingId playSfx(xmSampleId _sampleId,xmModId _modId,int _sfxPattern,int _playMask,u8 _priority);
xmPlayingId playLoopingSfx(xmSampleId _sampleId,xmModId _modId,int _soundId,u8 _priority,int _pitch=0x400);
void unlockPlayingId(xmPlayingId _playingId);
void stopPlayingId(xmPlayingId _playingId);
private:
enum
{
MAX_XM_SONGS=5, // How many mods our internal loader copes with
MAX_XM_VABS=5, // How many vabs our internal loader copes with
MAX_SONG_HEADERS=24, // Number of mods that xmplay can play at once
MAX_XM_HEADERS=MAX_XM_SONGS, // Number of mods that xmplay can load at once
NUM_SPU_CHANNELS=24,
};
typedef enum
{
SONG,
SFX,
LOOPINGSFX,
SILENT, // Channel is silent
FREE, // Channel is free for re-allocation
CONTINUE, // Channel is a continuation of the previous channel
} CHANNELUSETYPE;
// Internal representation of loaded mods
typedef struct XMMod
{
unsigned char *m_xmData;
FileEquate m_file;
int m_refCount;
// refcount these!
};
// Internal representation of loaded vabs
typedef struct XMVab
{
int m_vabId;
FileEquate m_vhFile,m_vbFile;
int m_refCount;
};
// Structure that records what is going on for each SPU channel
typedef struct
{
CHANNELUSETYPE m_useType;
xmPlayingId m_playingId;
u8 m_internalId;
u8 m_priority;
u8 m_locked;
u8 m_vol,m_pan;
} spuChannelUse;
xmPlayingId getNextSparePlayingId(int _baseChannel);
int findSpareChannels(int _channelCount,int _priority);
void markChannelsAsActive(int _baseChannel,int _channelCount,CHANNELUSETYPE _useType,xmPlayingId _playingId,int _internalId,u8 _priority);
void defragSpuMemory();
void updateLoopingSfx(spuChannelUse *ch);
unsigned char *m_fhPtr[MAX_XM_HEADERS];
unsigned char *m_songPtr[MAX_SONG_HEADERS];
XMMod m_xmMods[MAX_XM_SONGS];
XMVab m_xmVabs[MAX_XM_VABS];
spuChannelUse m_spuChannelUse[NUM_SPU_CHANNELS];
unsigned char m_masterSongVolume;
unsigned char m_masterSfxVolume;
};
/*----------------------------------------------------------------------
Globals
------- */
/*----------------------------------------------------------------------
Functions
--------- */
/*---------------------------------------------------------------------- */
#endif /* __SOUND_XMPLAY_H__ */
/*===========================================================================
end */