;* DSM.INC
;*
;* Digital Sound Mixer
;*
;* $Id: dsm.inc,v 1.5 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.
;*
VOLLEVELS = 33 ; total number of volume levels
VOLSHIFT = 1 ; amount to shift volume right
VOLADD = 1 ; amount to add to volume before
; shifting - used to round up
DSM_SMP_STREAM = MAXSAMPLES ; magic sample handle for streams
;/***************************************************************************\
;* 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
dsmPlayForwards = 1 ; playing forward
;/***************************************************************************\
;* struct dsmChannel
;* -----------------
;* Description: DSM channel data
;\***************************************************************************/
STRUC dsmChannel
D_ptr sample ; sample data pointer
D_int sampleType ; sample type, see enum sdSampleType
D_int samplePos ; sample position in memory
D_int sampleLength ; sample length
D_int loopMode ; sample looping mode, see enum
; sdLoopMode
D_int loop1Start ; first loop start
D_int loop1End ; first loop end
D_int loop1Type ; first loop type, see enum sdLoopType
D_int loop2Start ; second loop start
D_int loop2End ; second loop end
D_int loop2Type ; second loop type
D_int playPos ; playing position whole part
D_int playPosLow ; playing position fractional part
; (only lower 16 bits used)
D_int streamWritePos; ; stream write position
rate DD ? ; playing rate in Hz
D_int direction ; playing direction in bidirectional
; loops - 1 is forward, -1 back
D_int sampleHandle ; sample handle
D_int sampleChanged ; 1 if sample has been changed
; but values not yet set in
; channel struct
D_int panning ; panning information
D_int volume ; playing volume (0-64)
D_int muted ; 1 if channel muted, 0 if not
D_int status ; channel status, see enum dsm
; dsmChanStatus
D_int loopNum ; currently played sample loop
D_ptr loopCallback ; looping callback function
ENDS
;/***************************************************************************\
;* struct dsmSample
;* ----------------
;* Description: DSM internal sample structure
;\***************************************************************************/
STRUC dsmSample
D_ptr sample ; sample data pointer
D_int sampleType ; sample type, see enum sdSampleType
D_int samplePos ; sample position in memory
D_int sampleLength ; sample length
D_int loopMode ; sample looping mode, see enum
; sdLoopMode
D_int loop1Start ; first loop start
D_int loop1End ; first loop end
D_int loop1Type ; first loop type, see enum sdLoopType
D_int loop2Start ; second loop start
D_int loop2End ; second loop end
D_int loop2Type ; second loop type
D_int inUse ; 1 if sample is in use, 0 if not
; (removed using dsmRemoveSample)
D_int copied ; 1 if a copied sample (should be
; deallocated), 0 if not
ENDS
GLOBAL LANG dsmMixBuffer : _ptr ; DSM mixing buffer. dsmPlay()
; writes the mixed data here. Post-
; processing is usually necessary.
GLOBAL LANG dsmMixBufferSize : _int ; DSM mixing buffer size
; The following global variables are used internally by different DSM
; functions and should not be accessed by other modules:
GLOBAL LANG dsmMixRate : _int ; mixing rate in Hz
GLOBAL LANG dsmMode : _int ; output mode (see enum dsmMixMode)
IFDEF __16__
GLOBAL LANG dsmVolTableSeg : word ; volume table segment
ENDIF
GLOBAL LANG dsmVolumeTable : _ptr ; pointer to volume table
GLOBAL LANG dsmChannels : _ptr ; pointer to channel datas
GLOBAL LANG dsmSamples : _ptr ; sample structures
GLOBAL LANG dsmOutputBits : _int ; 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
;*
;\***************************************************************************/
GLOBAL LANG dsmInit : _funct
;/***************************************************************************\
;*
;* Function: int dsmClose(void)
;*
;* Description: Uninitializes Digital Sound Mixer
;*
;* Returns: MIDAS error code
;*
;\***************************************************************************/
GLOBAL LANG dsmClose : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmGetMixRate : _funct
;/***************************************************************************\
;*
;* Function: int dsmOpenChannels(unsigned channels);
;*
;* Description: Opens channels for output
;*
;* Input: unsigned channels number of channels to open
;*
;* Returns: MIDAS error code
;*
;\***************************************************************************/
GLOBAL LANG dsmOpenChannels : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmCalcVolTable : _funct
;/***************************************************************************\
;*
;* Function: int dsmCloseChannels(void)
;*
;* Description: Closes open output channels
;*
;* Returns: MIDAS error code
;*
;\***************************************************************************/
GLOBAL LANG dsmCloseChannels : _funct
;/***************************************************************************\
;*
;* Function: int dsmClearChannels(void)
;*
;* Description: Clears open channels (removes all sounds)
;*
;* Returns: MIDAS error code
;*
;\***************************************************************************/
GLOBAL LANG dsmClearChannels : _funct
;/***************************************************************************\
;*
;* Function: int dsmMute(int mute)
;*
;* Description: Mutes all channels
;*
;* Input: int mute 1 = mute, 0 = un-mute
;*
;* Returns: MIDAS error code
;*
;\***************************************************************************/
GLOBAL LANG dsmMute : _funct
;/***************************************************************************\
;*
;* Function: int dsmPause(int pause)
;*
;* Description: Pauses or resumes playing
;*
;* Input: int pause 1 = pause, 0 = resume
;*
;* Returns: MIDAS error code
;*
;\***************************************************************************/
GLOBAL LANG dsmPause : _funct
;/***************************************************************************\
;*
;* Function: int dsmSetMasterVolume(unsigned masterVolume)
;*
;* Description: Sets the master volume
;*
;* Input: unsigned masterVolume master volume (0 - 64)
;*
;* Returns: MIDAS error code
;*
;\***************************************************************************/
GLOBAL LANG dsmSetMasterVolume : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmGetMasterVolume : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmSetAmplification : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmGetAmplification : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmPlaySound : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmReleaseSound : _funct
;/***************************************************************************\
;*
;* Function: int dsmStopSound(unsigned channel)
;*
;* Description: Stops playing a sound
;*
;* Input: unsigned channel channel number
;*
;* Returns: MIDAS error code
;*
;\***************************************************************************/
GLOBAL LANG dsmStopSound : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmSetRate : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmGetRate : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmSetVolume : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmGetVolume : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmSetSample : _funct
;/***************************************************************************\
;*
;* 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;
;*
;\***************************************************************************/
GLOBAL LANG dsmGetSample : _funct
;/***************************************************************************\
;*
;* 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)
;*
;\***************************************************************************/
GLOBAL LANG dsmChangeSample : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmSetPosition : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmGetPosition : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmGetDirection : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmSetPanning : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmGetPanning : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmMuteChannel : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmAddSample : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmRemoveSample : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmMixData : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmMix : _funct
;/***************************************************************************\
;*
;* 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.
;*
;\***************************************************************************/
GLOBAL LANG dsmClearBuffer : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmSetLoopCallback : _funct
;/***************************************************************************\
;*
;* 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
;*
;\***************************************************************************/
GLOBAL LANG dsmSetStreamWritePosition : _funct
; Mixing routines:
GLOBAL LANG dsmMix8bitMonoMono : _funct
GLOBAL LANG dsmMix8bitMonoStereo : _funct
GLOBAL LANG dsmMix8bitStereoMono : _funct
GLOBAL LANG dsmMix8bitStereoStereo : _funct
GLOBAL LANG dsmMix16bitMonoMono : _funct
GLOBAL LANG dsmMix16bitMonoStereo : _funct
GLOBAL LANG dsmMix16bitStereoMono : _funct
GLOBAL LANG dsmMix16bitStereoStereo : _funct
;/***************************************************************************\
;* 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_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
;* $Log: dsm.inc,v $
;* Revision 1.5 1997/01/16 18:41:59 pekangas
;* Changed copyright messages to Housemarque
;*
;* Revision 1.4 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.3 1996/06/26 19:15:13 pekangas
;* Added sample loop callbakcs
;*
;* Revision 1.2 1996/05/28 20:30:22 pekangas
;* Made new mixing routines GLOBAL
;*
;* Revision 1.1 1996/05/22 20:49:33 pekangas
;* Initial revision
;*