/* DSM.H
*
* Digital Sound Mixer
*
* $Id: dsm.h,v 1.7 1997/01/16 18:41:59 pekangas Exp $
*
* Copyright 1996,1997 Housemarque Inc.
*
* This file is part of the MIDAS Sound System, and may only be
* used, modified and distributed under the terms of the MIDAS
* Sound System license, LICENSE.TXT. By continuing to use,
* modify or distribute this file you indicate that you have
* read the license and understand and accept it fully.
*/
#ifndef __DSM_H
#define __DSM_H
#define VOLLEVELS 33
#define VOLSHIFT 1
/* Magic sample handle for streams: */
#define DSM_SMP_STREAM MAXSAMPLES
#include "sdevice.h"
/****************************************************************************\
* enum dsmMixMode
* ---------------
* Description: Available DSM mixing modes
\****************************************************************************/
enum dsmMixMode
{
dsmMixMono = 1, /* mono mixing */
dsmMixStereo = 2 /* stereo mixing */
};
/****************************************************************************\
* enum dsmChanStatus
* ------------------
* Description: DSM channel sound playing status
\****************************************************************************/
enum dsmChanStatus
{
dsmChanStopped = 0, /* playing is stopped */
dsmChanEnd, /* playing has ended (not forced
stopped */
dsmChanPlaying, /* playing, not released */
dsmChanReleased /* playing, note has been released */
};
/****************************************************************************\
* enum dsmPlayDir
* ---------------
* Description: Playing direction in bidirectional loops
\****************************************************************************/
enum dsmPlayDir
{
dsmPlayBackwards = -1, /* playing backwards */
dsmPlayForward = 1 /* playing forward */
};
/****************************************************************************\
* struct dsmChannel
* -----------------
* Description: DSM channel data
\****************************************************************************/
typedef struct
{
uchar *sample; /* sample data pointer */
int sampleType; /* sample type, see enum
sdSampleType */
int samplePos; /* sample position in memory */
unsigned sampleLength; /* sample length */
int loopMode; /* sample looping mode, see enum
sdLoopMode */
unsigned loop1Start; /* first loop start */
unsigned loop1End; /* first loop end */
int loop1Type; /* first loop type, see enum
sdLoopType */
unsigned loop2Start; /* second loop start */
unsigned loop2End; /* second loop end */
int loop2Type; /* second loop type, see enum
sdLoopType */
unsigned playPos; /* playing position whole part */
unsigned playPosLow; /* playing position fractional part
(only lower 16 bits used) */
unsigned streamWritePos; /* stream write position */
ulong rate; /* playing rate in Hz */
int direction; /* playing direction in bidirectional
loops - 1 is forward, -1 back */
unsigned sampleHandle; /* sample handle */
unsigned sampleChanged; /* 1 if sample has been changed
but values not yet set in
channel struct */
int panning; /* panning information */
unsigned volume; /* playing volume (0-64) */
int muted; /* 1 if channel muted, 0 if not */
int status; /* channel status, see enum dsm
dsmChanStatus */
int loopNum; /* currently played sample loop */
void (CALLING *LoopCallback)(unsigned channel); /* sample loop
callback */
} dsmChannel;
/****************************************************************************\
* struct dsmSample
* ----------------
* Description: DSM internal sample structure
\****************************************************************************/
typedef struct
{
uchar *sample; /* sample data pointer */
int sampleType; /* sample type, see enum
sdSampleType */
int samplePos; /* sample position in memory */
unsigned sampleLength; /* sample length */
int loopMode; /* sample looping mode, see enum
sdLoopMode */
unsigned loop1Start; /* first loop start */
unsigned loop1End; /* first loop end */
int loop1Type; /* first loop type, see enum
sdLoopType */
unsigned loop2Start; /* second loop start */
unsigned loop2End; /* second loop end */
int loop2Type; /* second loop type, see enum
sdLoopType */
int inUse; /* 1 if sample is in use, 0 if not
(removed using dsmRemoveSample) */
int copied; /* 1 if a copied sample (should be
deallocated), 0 if not */
} dsmSample;
#ifdef __cplusplus
extern "C" {
#endif
extern unsigned * GLOBALVAR dsmMixBuffer; /* DSM mixing buffer. dsmPlay()
writes the mixed data here. Post-
processing is usually necessary. */
extern unsigned GLOBALVAR dsmMixBufferSize; /* DSM mixing buffer size */
/* The following global variables are used internally by different DSM
functions and should not be accessed by other modules: */
extern unsigned GLOBALVAR dsmMixRate; /* mixing rate in Hz */
extern unsigned GLOBALVAR dsmMode; /* output mode (see enum
dsmMixMode) */
#ifdef __16__
extern unsigned GLOBALVAR dsmVolTableSeg; /* volume table segment */
#endif
extern unsigned GLOBALVAR *dsmVolumeTable; /* pointer to volume table */
extern dsmChannel * GLOBALVAR dsmChannels; /* pointer to channel datas */
extern dsmSample * GLOBALVAR dsmSamples; /* sample structures */
extern unsigned GLOBALVAR dsmOutputBits; /* output bit width */
/****************************************************************************\
*
* Function: int dsmInit(unsigned mixRate, unsigned mode,
* unsigned outputBits);
*
* Description: Initializes Digital Sound Mixer
*
* Input: unsigned mixRate mixing rate in Hz
* unsigned mode mixing mode (see enum dsmMixMode)
* unsigned outputBits output bit width (if less than
* 16, output values are divided
* accordingly - mixing buffer is
* always a sequence of unsigned ints)
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmInit(unsigned mixRate, unsigned mode, unsigned amplitude);
/****************************************************************************\
*
* Function: int dsmClose(void)
*
* Description: Uninitializes Digital Sound Mixer
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmClose(void);
/****************************************************************************\
*
* Function: int dsmGetMixRate(unsigned *mixRate)
*
* Description: Reads the actual mixing rate
*
* Input: unsigned *mixRate pointer to mixing rate variable
*
* Returns: MIDAS error code.
* Mixing rate, in Hz, is stored in *mixRate
*
\****************************************************************************/
int CALLING dsmGetMixRate(unsigned *mixRate);
/****************************************************************************\
*
* Function: int dsmOpenChannels(unsigned channels);
*
* Description: Opens channels for output
*
* Input: unsigned channels number of channels to open
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmOpenChannels(unsigned channels);
/****************************************************************************\
*
* Function: int dsmCalcVolTable(unsigned amplification)
*
* Description: Calculates a new volume table
*
* Input: unsigned amplification Amplification level. 64 - normal
* (100%), 32 = 50%, 128 = 200% etc.
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmCalcVolTable(unsigned amplification);
/****************************************************************************\
*
* Function: int dsmCloseChannels(void)
*
* Description: Closes open output channels
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmCloseChannels(void);
/****************************************************************************\
*
* Function: int dsmClearChannels(void)
*
* Description: Clears open channels (removes all sounds)
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmClearChannels(void);
/****************************************************************************\
*
* Function: int dsmMute(int mute)
*
* Description: Mutes all channels
*
* Input: int mute 1 = mute, 0 = un-mute
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmMute(int mute);
/****************************************************************************\
*
* Function: int dsmPause(int pause)
*
* Description: Pauses or resumes playing
*
* Input: int pause 1 = pause, 0 = resume
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmPause(int pause);
/****************************************************************************\
*
* Function: int dsmSetMasterVolume(unsigned masterVolume)
*
* Description: Sets the master volume
*
* Input: unsigned masterVolume master volume (0 - 64)
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetMasterVolume(unsigned masterVolume);
/****************************************************************************\
*
* Function: int dsmGetMasterVolume(unsigned *masterVolume)
*
* Description: Reads the master volume
*
* Input: unsigned *masterVolume pointer to master volume
*
* Returns: MIDAS error code. Master volume is written to *masterVolume.
*
\****************************************************************************/
int CALLING dsmGetMasterVolume(unsigned *masterVolume);
/****************************************************************************\
*
* Function: int dsmSetAmplification(unsigned amplification)
*
* Description: Sets amplification level and calculates new volume table.
*
* Input: unsigned amplification amplification level, 64 = normal
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetAmplification(unsigned amplification);
/****************************************************************************\
*
* Function: int dsmGetAmplification(unsigned *amplification)
*
* Description: Reads the amplification level
*
* Input: unsigned *amplification pointer to amplification level
*
* Returns: MIDAS error code. Amplification level is written to
* *amplification.
*
\****************************************************************************/
int CALLING dsmGetAmplification(unsigned *amplification);
/****************************************************************************\
*
* Function: int dsmPlaySound(unsigned channel, ulong rate)
*
* Description: Starts playing a sound
*
* Input: unsigned channel channel number
* ulong rate playing rate in Hz
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmPlaySound(unsigned channel, ulong rate);
/****************************************************************************\
*
* Function: int dsmReleaseSound(unsigned channel)
*
* Description: Releases the current sound from the channel. If sdLoop1Rel or
* sdLoop2 looping modes are used, playing will be continued from
* the release part of the current sample (data after the end
* of the first loop) after the end of the first loop is reached
* next time, otherwise the sound will be stopped.
*
* Input: unsigned channel channel number
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmReleaseSound(unsigned channel);
/****************************************************************************\
*
* Function: int dsmStopSound(unsigned channel)
*
* Description: Stops playing a sound
*
* Input: unsigned channel channel number
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmStopSound(unsigned channel);
/****************************************************************************\
*
* Function: int dsmSetRate(unsigned channel, ulong rate)
*
* Description: Sets the playing rate
*
* Input: unsigned channel channel number
* ulong rate playing rate in Hz
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetRate(unsigned channel, ulong rate);
/****************************************************************************\
*
* Function: int dsmGetRate(unsigned channel, ulong *rate)
*
* Description: Reads the playing rate on a channel
*
* Input: unsigned channel channel number
* ulong *rate pointer to playing rate
*
* Returns: MIDAS error code. Playing rate is written to *rate, 0 if
* no sound is being played.
*
\****************************************************************************/
int CALLING dsmGetRate(unsigned channel, ulong *rate);
/****************************************************************************\
*
* Function: int dsmSetVolume(unsigned channel, unsigned volume)
*
* Description: Sets the playing volume
*
* Input: unsigned channel channel number
* unsigned volume playing volume (0-64)
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetVolume(unsigned channel, unsigned volume);
/****************************************************************************\
*
* Function: int dsmGetVolume(unsigned channel, unsigned *volume)
*
* Description: Reads the playing volume
*
* Input: unsigned channel channel number
* unsigned *volume pointer to volume
*
* Returns: MIDAS error code. Playing volume is written to *volume.
*
\****************************************************************************/
int CALLING dsmGetVolume(unsigned channe, unsigned *volume);
/****************************************************************************\
*
* Function: int dsmSetSample(unsigned channel, unsigned smpHandle)
*
* Description: Sets the sample number on a channel
*
* Input: unsigned channel channel number
* unsigned smpHandle sample handle returned by
* dsmAddSample()
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetSample(unsigned channel, unsigned smpHandle);
/****************************************************************************\
*
* Function: int dsmGetSample(unsigned channel, unsigned *smpHandle)
*
* Description: Reads current sample handle
*
* Input: unsigned channel channel number
* unsigned *smpHandle pointer to sample handle
*
* Returns: MIDAS error code. Sample handle is written to *smpHandle;
*
\****************************************************************************/
int CALLING dsmGetSample(unsigned channel, unsigned *smpHandle);
/****************************************************************************\
*
* Function: int dsmChangeSample(unsigned channel)
*
* Description: Changes the sample used in a channel to the one specified
* by the channel's sample handle. Used only internally by
* other DSM functions, does no error checking.
*
* Input: unsigned channel channel number
*
* Returns: MIDAS error code (does not fail)
*
\****************************************************************************/
int CALLING dsmChangeSample(unsigned channel);
/****************************************************************************\
*
* Function: int dsmSetPosition(unsigned channel, unsigned position)
*
* Description: Sets the playing position from the beginning of the sample
*
* Input: unsigned channel channel number
* unsigned position new playing position
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetPosition(unsigned channel, unsigned position);
/****************************************************************************\
*
* Function: int dsmGetPosition(unsigned channel, unsigned *position)
*
* Description: Reads the current playing position
*
* Input: unsigned channel channel number
* unsigned *position pointer to playing position
*
* Returns: MIDAS error code. Playing position is written to *position.
*
\****************************************************************************/
int CALLING dsmGetPosition(unsigned channel, unsigned *position);
/****************************************************************************\
*
* Function: int dsmGetDirection(unsigned channel, int *direction)
*
* Description: Reads current playing direction
*
* Input: unsigned channel channel number
* int *direction pointer to playing direction. 1 is
* forward, -1 backwards
*
* Returns: MIDAS error code. Playing direction is written to *direction.
*
\****************************************************************************/
int CALLING dsmGetDirection(unsigned channel, int *direction);
/****************************************************************************\
*
* Function: int dsmSetPanning(unsigned channel, int panning)
*
* Description: Sets the panning position of a channel
*
* Input: unsigned channel channel number
* int panning panning position (see enum sdPanning)
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetPanning(unsigned channel, int panning);
/****************************************************************************\
*
* Function: int dsmGetPanning(unsigned channel, int *panning)
*
* Description: Reads the panning position of a channel
*
* Input: unsigned channel channel number
* int *panning pointer to panning position
*
* Returns: MIDAS error code. Panning position is written to *panning.
*
\****************************************************************************/
int CALLING dsmGetPanning(unsigned channel, int *panning);
/****************************************************************************\
*
* Function: int dsmMuteChannel(unsigned channel, int mute)
*
* Description: Mutes/un-mutes a channel
*
* Input: unsigned channel channel number
* int mute muting status - 1 = mute, 0 = un-mute
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmMuteChannel(unsigned channel, int mute);
/****************************************************************************\
*
* Function: int dsmAddSample(sdSample *sample, int copySample,
* unsigned *smpHandle);
*
* Description: Adds a new sample to the DSM sample list and prepares it for
* DSM use
*
* Input: sdSample *sample pointer to sample information
* structure
* int copySample copy sample data to a new place in
* memory? 1 = yes, 0 = no
* unsigned *smpHandle pointer to sample handle
*
* Returns: MIDAS error code. Sample handle for the new sample is written
* to *smpHandle
*
* Notes: If copySample = 1, sample data must not be in EMS memory
*
\****************************************************************************/
int CALLING dsmAddSample(sdSample *sample, int copySample, unsigned *smpHandle);
/****************************************************************************\
*
* Function: int dsmRemoveSample(unsigned smpHandle)
*
* Description: Removes a sample from the sample list and deallocates it if
* necessary.
*
* Input: unsigned smpHandle sample handle returned by
* dsmAddSample()
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmRemoveSample(unsigned smpHandle);
/****************************************************************************\
*
* Function: int dsmMixData(unsigned numElems)
*
* Description: Mixes data to dsmMixBuffer.
*
* Input: unsigned numElems number of buffer elements to be mixed.
* In mono modes an "element" is an
* unsigned integer, and in stereo
* two.
*
* Returns: MIDAS error code. Mixed data is written to *dsmMixBuffer.
*
\****************************************************************************/
int CALLING dsmMixData(unsigned numElems);
/****************************************************************************\
*
* Function: int dsmMix(unsigned channel, void *mixRoutine,
* unsigned volume, unsigned numElems);
*
* Description: Mixes data for one channel. Used internally by dsmMixData().
*
* Input: unsigned channel channel number
* void *mixRoutine pointer to low-level mixing routine
* unsigned volume actual playing volume (volume in
* channel structure is ignored)
* unsigned numElems number of elements to mix (see
* dsmMixData())
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmMix(unsigned channel, void *mixRoutine, unsigned volume,
unsigned numElems);
/****************************************************************************\
*
* Function: int dsmClearBuffer(unsigned numElems)
*
* Description: Clears the mixing buffer. Used only by dsmMixData().
*
* Input: unsigned numElems number of elements to clear
*
* Returns: MIDAS error code.
*
\****************************************************************************/
int CALLING dsmClearBuffer(unsigned numElems);
#ifdef SUPPORTSTREAMS
/****************************************************************************\
*
* Function: int dsmStartStream(unsigned channel, uchar *buffer,
* unsigned bufferLength, int sampleType);
*
* Description: Starts playing a digital audio stream on a channel
*
* Input: unsigned channel channel number
* uchar *buffer pointer to stream buffer
* unsigned bufferLength buffer length in bytes
* int sampleType stream sample type
* ulong rate stream playing rate (in Hz)
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmStartStream(unsigned channel, uchar *buffer, unsigned
bufferLength, int sampleType, ulong rate);
/****************************************************************************\
*
* Function: int dsmStopStream(unsigned channel);
*
* Description: Stops playing digital audio stream on a channel
*
* Input: unsigned channel channel number
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmStopStream(unsigned channel);
/****************************************************************************\
*
* Function: int dsmSetLoopCallback(unsigned channel,
* void (CALLING *callback)(unsigned channel));
*
* Description: Sets sample looping callback to a channel
*
* Input: unsigned channel channel number
* [..] *callback pointer to callback function, NULL to
* disable callback
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetLoopCallback(unsigned channel,
void (CALLING *callback)(unsigned channel));
/****************************************************************************\
*
* Function: int dsmSetStreamWritePosition(unsigned channel,
* unsigned position)
*
* Description: Sets the stream write position on a channel
*
* Input: unsigned channel channel number
* unsigned position new stream write position
*
* Returns: MIDAS error code
*
\****************************************************************************/
int CALLING dsmSetStreamWritePosition(unsigned channel, unsigned position);
#endif /* #ifdef SUPPORTSTREAMS */
/* Prototypes for the actual mixing routines: */
void CALLING dsmMix8bitMonoMono(void); /* 8-bit Mono => Mono */
void CALLING dsmMix8bitMonoStereo(void); /* 8-bit Mono => Stereo */
void CALLING dsmMix8bitStereoMono(void); /* 8-bit Stereo => Mono */
void CALLING dsmMix8bitStereoStereo(void); /* 8-bit Stereo => Stereo */
void CALLING dsmMix16bitMonoMono(void); /* 16-bit Mono => Mono */
void CALLING dsmMix16bitMonoStereo(void); /* 16-bit Mono => Stereo */
void CALLING dsmMix16bitStereoMono(void); /* 16-bit Stereo => Mono */
void CALLING dsmMix16bitStereoStereo(void); /* 16-bit Stereo => Stereo */
#ifdef __cplusplus
}
#endif
/****************************************************************************\
* enum dsmFunctIDs
* ----------------
* Description: ID numbers for DSM functions
\****************************************************************************/
enum dsmFunctIDs
{
ID_dsmInit = ID_dsm,
ID_dsmClose,
ID_dsmGetMixRate,
ID_dsmOpenChannels,
ID_dsmCalcVolTable,
ID_dsmCloseChannels,
ID_dsmClearChannels,
ID_dsmMute,
ID_dsmPause,
ID_dsmSetMasterVolume,
ID_dsmGetMasterVolume,
ID_dsmSetAmplification,
ID_dsmGetAmplification,
ID_dsmPlaySound,
ID_dsmReleaseSound,
ID_dsmStopSound,
ID_dsmSetRate,
ID_dsmGetRate,
ID_dsmSetVolume,
ID_dsmGetVolume,
ID_dsmSetSample,
ID_dsmGetSample,
ID_dsmChangeSample,
ID_dsmSetPosition,
ID_dsmGetPosition,
ID_dsmGetDirection,
ID_dsmSetPanning,
ID_dsmGetPanning,
ID_dsmMuteChannel,
ID_dsmAddSample,
ID_dsmRemoveSample,
ID_dsmMixData,
ID_dsmMix,
ID_dsmMixMoNormal,
ID_dsmMixStNormal,
ID_dsmClearBuffer,
ID_dsmStartStream,
ID_dsmStopStream,
ID_dsmSetLoopCallback,
ID_dsmSetStreamWritePosition
};
#endif
/*
* $Log: dsm.h,v $
* Revision 1.7 1997/01/16 18:41:59 pekangas
* Changed copyright messages to Housemarque
*
* Revision 1.6 1997/01/16 18:19:10 pekangas
* Added support for setting the stream write position.
* Stream data is no longer played past the write position
*
* Revision 1.5 1996/07/13 18:13:25 pekangas
* Fixed to compile with Visual C
*
* Revision 1.4 1996/06/26 19:15:03 pekangas
* Added sample loop callbacks
*
* Revision 1.3 1996/05/28 20:29:56 pekangas
* Changed mixing routine prototypes and added new ones
*
* Revision 1.2 1996/05/26 20:55:20 pekangas
* Added dsmStartStream and dsmStopStream
*
* Revision 1.1 1996/05/22 20:49:33 pekangas
* Initial revision
*
*/