mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-15 17:01:51 +00:00
git-svn-id: https://svn.eduke32.com/eduke32@1470 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
f80a415898
commit
039f004fb4
43 changed files with 0 additions and 16485 deletions
|
@ -1,282 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: _MIDI.H
|
||||
|
||||
author: James R. Dose
|
||||
date: May 25, 1994
|
||||
|
||||
Private header for MIDI.C. Midi song file playback routines.
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef ___MIDI_H
|
||||
#define ___MIDI_H
|
||||
#include "compat.h"
|
||||
|
||||
#define RELATIVE_BEAT( measure, beat, tick ) \
|
||||
( ( tick ) + ( ( beat ) << 9 ) + ( ( measure ) << 16 ) )
|
||||
|
||||
//Bobby Prince thinks this may be 100
|
||||
//#define GENMIDI_DefaultVolume 100
|
||||
#define GENMIDI_DefaultVolume 90
|
||||
|
||||
#define MAX_FORMAT 1
|
||||
|
||||
#define NUM_MIDI_CHANNELS 16
|
||||
|
||||
#define TIME_PRECISION 16
|
||||
|
||||
#define MIDI_HEADER_SIGNATURE 0x6468544d // "MThd"
|
||||
#define MIDI_TRACK_SIGNATURE 0x6b72544d // "MTrk"
|
||||
|
||||
#define MIDI_VOLUME 7
|
||||
#define MIDI_PAN 10
|
||||
#define MIDI_DETUNE 94
|
||||
#define MIDI_RHYTHM_CHANNEL 9
|
||||
#define MIDI_RPN_MSB 100
|
||||
#define MIDI_RPN_LSB 101
|
||||
#define MIDI_DATAENTRY_MSB 6
|
||||
#define MIDI_DATAENTRY_LSB 38
|
||||
#define MIDI_PITCHBEND_MSB 0
|
||||
#define MIDI_PITCHBEND_LSB 0
|
||||
#define MIDI_RUNNING_STATUS 0x80
|
||||
#define MIDI_NOTE_OFF 0x8
|
||||
#define MIDI_NOTE_ON 0x9
|
||||
#define MIDI_POLY_AFTER_TCH 0xA
|
||||
#define MIDI_CONTROL_CHANGE 0xB
|
||||
#define MIDI_PROGRAM_CHANGE 0xC
|
||||
#define MIDI_AFTER_TOUCH 0xD
|
||||
#define MIDI_PITCH_BEND 0xE
|
||||
#define MIDI_SPECIAL 0xF
|
||||
#define MIDI_SYSEX 0xF0
|
||||
#define MIDI_SYSEX_CONTINUE 0xF7
|
||||
#define MIDI_META_EVENT 0xFF
|
||||
#define MIDI_END_OF_TRACK 0x2F
|
||||
#define MIDI_TEMPO_CHANGE 0x51
|
||||
#define MIDI_TIME_SIGNATURE 0x58
|
||||
#define MIDI_RESET_ALL_CONTROLLERS 0x79
|
||||
#define MIDI_ALL_NOTES_OFF 0x7b
|
||||
#define MIDI_MONO_MODE_ON 0x7E
|
||||
#define MIDI_SYSTEM_RESET 0xFF
|
||||
|
||||
#define GET_NEXT_EVENT( track, data ) \
|
||||
( data ) = *( track )->pos; \
|
||||
( track )->pos += 1
|
||||
|
||||
#define GET_MIDI_CHANNEL( event ) ( ( event ) & 0xf )
|
||||
#define GET_MIDI_COMMAND( event ) ( ( event ) >> 4 )
|
||||
|
||||
#define EMIDI_INFINITE -1
|
||||
#define EMIDI_END_LOOP_VALUE 127
|
||||
#define EMIDI_ALL_CARDS 127
|
||||
#define EMIDI_INCLUDE_TRACK 110
|
||||
#define EMIDI_EXCLUDE_TRACK 111
|
||||
#define EMIDI_PROGRAM_CHANGE 112
|
||||
#define EMIDI_VOLUME_CHANGE 113
|
||||
#define EMIDI_CONTEXT_START 114
|
||||
#define EMIDI_CONTEXT_END 115
|
||||
#define EMIDI_LOOP_START 116
|
||||
#define EMIDI_LOOP_END 117
|
||||
#define EMIDI_SONG_LOOP_START 118
|
||||
#define EMIDI_SONG_LOOP_END 119
|
||||
|
||||
#define EMIDI_GeneralMIDI 0
|
||||
|
||||
#define EMIDI_AffectsCurrentCard( c, type ) \
|
||||
( ( ( c ) == EMIDI_ALL_CARDS ) || ( ( c ) == ( type ) ) )
|
||||
|
||||
|
||||
#define EMIDI_NUM_CONTEXTS 7
|
||||
typedef struct
|
||||
{
|
||||
char *pos;
|
||||
char *loopstart;
|
||||
int16_t loopcount;
|
||||
int16_t RunningStatus;
|
||||
uint32_t time;
|
||||
int32_t FPSecondsPerTick;
|
||||
int16_t tick;
|
||||
int16_t beat;
|
||||
int16_t measure;
|
||||
int16_t BeatsPerMeasure;
|
||||
int16_t TicksPerBeat;
|
||||
int16_t TimeBase;
|
||||
int32_t delay;
|
||||
int16_t active;
|
||||
} songcontext;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *start;
|
||||
char *pos;
|
||||
|
||||
int32_t delay;
|
||||
int16_t active;
|
||||
int16_t RunningStatus;
|
||||
|
||||
int16_t currentcontext;
|
||||
songcontext context[ EMIDI_NUM_CONTEXTS ];
|
||||
|
||||
char EMIDI_IncludeTrack;
|
||||
char EMIDI_ProgramChange;
|
||||
char EMIDI_VolumeChange;
|
||||
} track;
|
||||
|
||||
static int32_t _MIDI_ReadNumber( void *from, size_t size );
|
||||
static int32_t _MIDI_ReadDelta( track *ptr );
|
||||
static void _MIDI_ResetTracks( void );
|
||||
static void _MIDI_AdvanceTick( void );
|
||||
static void _MIDI_MetaEvent( track *Track );
|
||||
static void _MIDI_SysEx( track *Track );
|
||||
static int32_t _MIDI_InterpretControllerInfo( track *Track, int32_t TimeSet,
|
||||
int32_t channel, int32_t c1, int32_t c2 );
|
||||
static int32_t _MIDI_SendControlChange( int32_t channel, int32_t c1, int32_t c2 );
|
||||
static void _MIDI_SetChannelVolume( int32_t channel, int32_t volume );
|
||||
static void _MIDI_SendChannelVolumes( void );
|
||||
static int32_t _MIDI_ProcessNextTick( void );
|
||||
static void _MIDI_InitEMIDI( void );
|
||||
|
||||
/*
|
||||
if ( c1 == EMIDI_LOOP_START )
|
||||
{
|
||||
if ( c2 == 0 )
|
||||
{
|
||||
Track->context[ 0 ].loopcount = EMIDI_INFINITE;
|
||||
}
|
||||
else
|
||||
{
|
||||
Track->context[ 0 ].loopcount = c2;
|
||||
}
|
||||
|
||||
Track->context[ 0 ].pos = Track->pos;
|
||||
Track->context[ 0 ].loopstart = Track->pos;
|
||||
Track->context[ 0 ].RunningStatus = Track->RunningStatus;
|
||||
Track->context[ 0 ].time = _MIDI_Time;
|
||||
Track->context[ 0 ].FPSecondsPerTick = _MIDI_FPSecondsPerTick;
|
||||
Track->context[ 0 ].tick = _MIDI_Tick;
|
||||
Track->context[ 0 ].beat = _MIDI_Beat;
|
||||
Track->context[ 0 ].measure = _MIDI_Measure;
|
||||
Track->context[ 0 ].BeatsPerMeasure = _MIDI_BeatsPerMeasure;
|
||||
Track->context[ 0 ].TicksPerBeat = _MIDI_TicksPerBeat;
|
||||
Track->context[ 0 ].TimeBase = _MIDI_TimeBase;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( ( c1 == EMIDI_LOOP_END ) &&
|
||||
( c2 == EMIDI_END_LOOP_VALUE ) )
|
||||
{
|
||||
if ( ( Track->context[ 0 ].loopstart != NULL ) &&
|
||||
( Track->context[ 0 ].loopcount != 0 ) )
|
||||
{
|
||||
if ( Track->context[ 0 ].loopcount != EMIDI_INFINITE )
|
||||
{
|
||||
Track->context[ 0 ].loopcount--;
|
||||
}
|
||||
|
||||
Track->pos = Track->context[ 0 ].loopstart;
|
||||
Track->RunningStatus = Track->context[ 0 ].RunningStatus;
|
||||
|
||||
if ( !TimeSet )
|
||||
{
|
||||
_MIDI_Time = Track->context[ 0 ].time;
|
||||
_MIDI_FPSecondsPerTick = Track->context[ 0 ].FPSecondsPerTick;
|
||||
_MIDI_Tick = Track->context[ 0 ].tick;
|
||||
_MIDI_Beat = Track->context[ 0 ].beat;
|
||||
_MIDI_Measure = Track->context[ 0 ].measure;
|
||||
_MIDI_BeatsPerMeasure = Track->context[ 0 ].BeatsPerMeasure;
|
||||
_MIDI_TicksPerBeat = Track->context[ 0 ].TicksPerBeat;
|
||||
_MIDI_TimeBase = Track->context[ 0 ].TimeBase;
|
||||
TimeSet = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ( c1 == MIDI_MONO_MODE_ON )
|
||||
{
|
||||
Track->pos++;
|
||||
}
|
||||
|
||||
if ( ( c1 == MIDI_VOLUME ) && ( !Track->EMIDI_VolumeChange ) )
|
||||
{
|
||||
_MIDI_SetChannelVolume( channel, c2 );
|
||||
break;
|
||||
}
|
||||
else if ( ( c1 == EMIDI_VOLUME_CHANGE ) &&
|
||||
( Track->EMIDI_VolumeChange ) )
|
||||
{
|
||||
_MIDI_SetChannelVolume( channel, c2 );
|
||||
break;
|
||||
}
|
||||
|
||||
if ( ( c1 == EMIDI_PROGRAM_CHANGE ) &&
|
||||
( Track->EMIDI_ProgramChange ) )
|
||||
{
|
||||
_MIDI_Funcs->ProgramChange( channel, MIDI_PatchMap[ c2 & 0x7f ] );
|
||||
break;
|
||||
}
|
||||
|
||||
if ( c1 == EMIDI_CONTEXT_START )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if ( c1 == EMIDI_CONTEXT_END )
|
||||
{
|
||||
if ( ( Track->currentcontext != _MIDI_Context ) ||
|
||||
( Track->context[ _MIDI_Context ].pos == NULL )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Track->currentcontext = _MIDI_Context;
|
||||
Track->context[ 0 ].loopstart = Track->context[ _MIDI_Context ].loopstart;
|
||||
Track->context[ 0 ].loopcount = Track->context[ _MIDI_Context ].loopcount;
|
||||
Track->pos = Track->context[ _MIDI_Context ].pos;
|
||||
Track->RunningStatus = Track->context[ _MIDI_Context ].RunningStatus;
|
||||
|
||||
if ( TimeSet )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
_MIDI_Time = Track->context[ _MIDI_Context ].time;
|
||||
_MIDI_FPSecondsPerTick = Track->context[ _MIDI_Context ].FPSecondsPerTick;
|
||||
_MIDI_Tick = Track->context[ _MIDI_Context ].tick;
|
||||
_MIDI_Beat = Track->context[ _MIDI_Context ].beat;
|
||||
_MIDI_Measure = Track->context[ _MIDI_Context ].measure;
|
||||
_MIDI_BeatsPerMeasure = Track->context[ _MIDI_Context ].BeatsPerMeasure;
|
||||
_MIDI_TicksPerBeat = Track->context[ _MIDI_Context ].TicksPerBeat;
|
||||
_MIDI_TimeBase = Track->context[ _MIDI_Context ].TimeBase;
|
||||
TimeSet = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( _MIDI_Funcs->ControlChange )
|
||||
{
|
||||
_MIDI_Funcs->ControlChange( channel, c1, c2 );
|
||||
}
|
||||
*/
|
||||
|
||||
#endif
|
|
@ -1,277 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
file: _MULTIVC.H
|
||||
|
||||
author: James R. Dose
|
||||
date: December 20, 1993
|
||||
|
||||
Private header for MULTIVOC.C
|
||||
|
||||
(c) Copyright 1993 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef ___MULTIVC_H
|
||||
#define ___MULTIVC_H
|
||||
|
||||
#include "openal.h"
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE ( 1 == 1 )
|
||||
#define FALSE ( !TRUE )
|
||||
#endif
|
||||
|
||||
#define VOC_8BIT 0x0
|
||||
#define VOC_CT4_ADPCM 0x1
|
||||
#define VOC_CT3_ADPCM 0x2
|
||||
#define VOC_CT2_ADPCM 0x3
|
||||
#define VOC_16BIT 0x4
|
||||
#define VOC_ALAW 0x6
|
||||
#define VOC_MULAW 0x7
|
||||
#define VOC_CREATIVE_ADPCM 0x200
|
||||
|
||||
#define T_SIXTEENBIT_STEREO 0
|
||||
#define T_8BITS 1
|
||||
#define T_MONO 2
|
||||
#define T_16BITSOURCE 4
|
||||
#define T_LEFTQUIET 8
|
||||
#define T_RIGHTQUIET 16
|
||||
#define T_DEFAULT T_SIXTEENBIT_STEREO
|
||||
|
||||
#define MV_MaxPanPosition 127
|
||||
#define MV_NumPanPositions ( MV_MaxPanPosition + 1 )
|
||||
#define MV_MaxTotalVolume 255
|
||||
//#define MV_MaxVolume 63
|
||||
#define MV_NumVoices 8
|
||||
|
||||
#define MIX_VOLUME( volume ) \
|
||||
( ( max( 0, min( ( volume ), 255 ) ) * ( MV_MaxVolume + 1 ) ) >> 8 )
|
||||
// ( ( max( 0, min( ( volume ), 255 ) ) ) >> 2 )
|
||||
|
||||
//#define SILENCE_16BIT 0x80008000
|
||||
#define SILENCE_16BIT 0
|
||||
#define SILENCE_8BIT 0x80808080
|
||||
//#define SILENCE_16BIT_PAS 0
|
||||
|
||||
#if defined(_WIN32)
|
||||
#define MixBufferSize (MV_GetBufferSize(MV_RequestedMixRate))
|
||||
#else
|
||||
#define MixBufferSize (512)
|
||||
#endif
|
||||
|
||||
#define NumberOfBuffers 16
|
||||
#define TotalBufferSize ( MixBufferSize * NumberOfBuffers )
|
||||
|
||||
#define PI 3.14159265358979323
|
||||
|
||||
typedef enum
|
||||
{
|
||||
Raw,
|
||||
VOC,
|
||||
DemandFeed,
|
||||
WAV,
|
||||
OGG
|
||||
} wavedata;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NoMoreData,
|
||||
KeepPlaying
|
||||
} playbackstatus;
|
||||
|
||||
typedef struct VoiceNode
|
||||
{
|
||||
struct VoiceNode *next;
|
||||
struct VoiceNode *prev;
|
||||
|
||||
wavedata wavetype;
|
||||
char bits;
|
||||
|
||||
playbackstatus(*GetSound)(struct VoiceNode *voice);
|
||||
|
||||
void (*mix)(uint32_t position, uint32_t rate,
|
||||
char *start, uint32_t length);
|
||||
|
||||
char *NextBlock;
|
||||
char *LoopStart;
|
||||
char *LoopEnd;
|
||||
uint32_t LoopCount;
|
||||
uint32_t LoopSize;
|
||||
uint32_t BlockLength;
|
||||
|
||||
uint32_t PitchScale;
|
||||
uint32_t FixedPointBufferSize;
|
||||
|
||||
char *sound;
|
||||
uint32_t length;
|
||||
uint32_t SamplingRate;
|
||||
uint32_t RateScale;
|
||||
uint32_t position;
|
||||
int32_t Playing;
|
||||
|
||||
int32_t handle;
|
||||
int32_t priority;
|
||||
|
||||
void (*DemandFeed)(char **ptr, uint32_t *length);
|
||||
|
||||
sounddef OGGstream;
|
||||
// char *bufsnd;
|
||||
char bufsnd[0x8000*4];
|
||||
int32_t downsample;
|
||||
|
||||
int16_t *LeftVolume;
|
||||
int16_t *RightVolume;
|
||||
|
||||
uint32_t callbackval;
|
||||
|
||||
} VoiceNode;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
VoiceNode *start;
|
||||
VoiceNode *end;
|
||||
} VList;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char left;
|
||||
char right;
|
||||
} Pan;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
MONO16 left;
|
||||
MONO16 right;
|
||||
} STEREO16;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
MONO16 left;
|
||||
MONO16 right;
|
||||
} SIGNEDSTEREO16;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char left;
|
||||
char right;
|
||||
} STEREO8;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char RIFF[ 4 ];
|
||||
uint32_t file_size;
|
||||
char WAVE[ 4 ];
|
||||
char fmt[ 4 ];
|
||||
uint32_t format_size;
|
||||
} riff_header;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t wFormatTag;
|
||||
uint16_t nChannels;
|
||||
uint32_t nSamplesPerSec;
|
||||
uint32_t nAvgBytesPerSec;
|
||||
uint16_t nBlockAlign;
|
||||
uint16_t nBitsPerSample;
|
||||
} format_header;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char DATA[ 4 ];
|
||||
uint32_t size;
|
||||
} data_header;
|
||||
|
||||
typedef char HARSH_CLIP_TABLE_8[ MV_NumVoices * 256 ];
|
||||
|
||||
#if defined(_WIN32)
|
||||
static uint32_t MV_GetBufferSize(uint32_t);
|
||||
#endif
|
||||
static void MV_Mix(VoiceNode *voice, int32_t buffer);
|
||||
static void MV_PlayVoice(VoiceNode *voice);
|
||||
static void MV_StopVoice(VoiceNode *voice);
|
||||
static int32_t MV_ServiceVoc(int32_t);
|
||||
|
||||
static playbackstatus MV_GetNextVOCBlock(VoiceNode *voice);
|
||||
static playbackstatus MV_GetNextDemandFeedBlock(VoiceNode *voice);
|
||||
static playbackstatus MV_GetNextRawBlock(VoiceNode *voice);
|
||||
static playbackstatus MV_GetNextWAVBlock(VoiceNode *voice);
|
||||
|
||||
// static void MV_ServiceRecord( void );
|
||||
static VoiceNode *MV_GetVoice(int32_t handle);
|
||||
static VoiceNode *MV_AllocVoice(int32_t priority);
|
||||
|
||||
static int16_t *MV_GetVolumeTable(int32_t vol);
|
||||
|
||||
static void MV_SetVoiceMixMode(VoiceNode *voice);
|
||||
|
||||
static void MV_SetVoicePitch(VoiceNode *voice, uint32_t rate, int32_t pitchoffset);
|
||||
static void MV_CalcVolume(int32_t MaxLevel);
|
||||
static void MV_CalcPanTable(void);
|
||||
|
||||
static void ClearBuffer_DW(void *ptr, int32_t data, int32_t length);
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
|
||||
#define CDEC _cdecl
|
||||
|
||||
#elif defined(_WIN32)
|
||||
|
||||
#define CDEC __cdecl
|
||||
|
||||
#else
|
||||
|
||||
#define CDEC
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
void CDEC MV_Mix8BitMono(uint32_t position, uint32_t rate,
|
||||
char *start, uint32_t length);
|
||||
|
||||
void CDEC MV_Mix8BitStereo(uint32_t position,
|
||||
uint32_t rate, char *start, uint32_t length);
|
||||
|
||||
void CDEC MV_Mix16BitMono(uint32_t position,
|
||||
uint32_t rate, char *start, uint32_t length);
|
||||
|
||||
void CDEC MV_Mix16BitStereo(uint32_t position,
|
||||
uint32_t rate, char *start, uint32_t length);
|
||||
|
||||
void CDEC MV_Mix16BitMono16(uint32_t position,
|
||||
uint32_t rate, char *start, uint32_t length);
|
||||
|
||||
void CDEC MV_Mix8BitMono16(uint32_t position, uint32_t rate,
|
||||
char *start, uint32_t length);
|
||||
|
||||
void CDEC MV_Mix8BitStereo16(uint32_t position,
|
||||
uint32_t rate, char *start, uint32_t length);
|
||||
|
||||
void CDEC MV_Mix16BitStereo16(uint32_t position,
|
||||
uint32_t rate, char *start, uint32_t length);
|
||||
|
||||
void CDEC MV_16BitReverb(char *src, char *dest, VOLUME16 *volume, int32_t count);
|
||||
void CDEC MV_8BitReverb(char *src, char *dest, VOLUME16 *volume, int32_t count);
|
||||
void CDEC MV_16BitReverbFast(char *src, char *dest, int32_t count, int32_t shift);
|
||||
void CDEC MV_8BitReverbFast(char *src, char *dest, int32_t count, int32_t shift);
|
||||
|
||||
#undef CDEC
|
||||
|
||||
#endif
|
|
@ -1,393 +0,0 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Duke Nukem Copyright (C) 1996, 2003 3D Realms Entertainment
|
||||
|
||||
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
|
||||
|
||||
Duke Nukem 3D 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Dummy AudioLib stub implementation by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
#include "fx_man.h"
|
||||
|
||||
|
||||
#define TRUE ( 1 == 1 )
|
||||
#define FALSE ( !TRUE )
|
||||
|
||||
|
||||
int32_t FX_ErrorCode = FX_Ok;
|
||||
|
||||
#define FX_SetErrorCode( status ) \
|
||||
FX_ErrorCode = ( status );
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_ErrorString
|
||||
|
||||
Returns a pointer to the error message associated with an error
|
||||
number. A -1 returns a pointer the current error.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
char *FX_ErrorString
|
||||
(
|
||||
int32_t ErrorNumber
|
||||
)
|
||||
|
||||
{
|
||||
char *ErrorString;
|
||||
|
||||
switch (ErrorNumber)
|
||||
{
|
||||
case FX_Warning :
|
||||
case FX_Error :
|
||||
ErrorString = FX_ErrorString(FX_ErrorCode);
|
||||
break;
|
||||
|
||||
case FX_Ok :
|
||||
ErrorString = "Fx ok.";
|
||||
break;
|
||||
|
||||
case FX_ASSVersion :
|
||||
ErrorString = "Apogee Sound System Version 0 "
|
||||
"Programmed by Jim Dose\n"
|
||||
"(c) Copyright 1995 James R. Dose. All Rights Reserved.\n";
|
||||
break;
|
||||
|
||||
default :
|
||||
ErrorString = "Unknown Fx error code.";
|
||||
break;
|
||||
}
|
||||
|
||||
return(ErrorString);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_Init
|
||||
|
||||
Selects which sound device to use.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_Init
|
||||
(
|
||||
int32_t SoundCard,
|
||||
int32_t numvoices,
|
||||
int32_t numchannels,
|
||||
int32_t samplebits,
|
||||
uint32_t mixrate
|
||||
)
|
||||
|
||||
{
|
||||
return(FX_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_Shutdown
|
||||
|
||||
Terminates use of sound device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_Shutdown
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return(FX_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_SetCallback
|
||||
|
||||
Sets the function to call when a voice is done.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_SetCallBack
|
||||
(
|
||||
void(*function)(uint32_t)
|
||||
)
|
||||
|
||||
{
|
||||
return(FX_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_SetVolume
|
||||
|
||||
Sets the volume of the current sound device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void FX_SetVolume
|
||||
(
|
||||
int32_t volume
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_SetReverseStereo
|
||||
|
||||
Set the orientation of the left and right channels.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void FX_SetReverseStereo
|
||||
(
|
||||
int32_t setting
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_GetReverseStereo
|
||||
|
||||
Returns the orientation of the left and right channels.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_GetReverseStereo
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_SetReverb
|
||||
|
||||
Sets the reverb level.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void FX_SetReverb
|
||||
(
|
||||
int32_t reverb
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_SetReverbDelay
|
||||
|
||||
Sets the delay level of reverb to add to mix.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void FX_SetReverbDelay
|
||||
(
|
||||
int32_t delay
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_VoiceAvailable
|
||||
|
||||
Checks if a voice can be play at the specified priority.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_VoiceAvailable
|
||||
(
|
||||
int32_t priority
|
||||
)
|
||||
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_PlayLoopedVOC
|
||||
|
||||
Begin playback of sound data with the given volume and priority.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_PlayLoopedVOC
|
||||
(
|
||||
char *ptr,
|
||||
int32_t loopstart,
|
||||
int32_t loopend,
|
||||
int32_t pitchoffset,
|
||||
int32_t vol,
|
||||
int32_t left,
|
||||
int32_t right,
|
||||
int32_t priority,
|
||||
uint32_t callbackval
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_PlayWAV
|
||||
|
||||
Begin playback of sound data with the given volume and priority.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_PlayLoopedWAV
|
||||
(
|
||||
char *ptr,
|
||||
int32_t loopstart,
|
||||
int32_t loopend,
|
||||
int32_t pitchoffset,
|
||||
int32_t vol,
|
||||
int32_t left,
|
||||
int32_t right,
|
||||
int32_t priority,
|
||||
uint32_t callbackval
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_PlayVOC3D
|
||||
|
||||
Begin playback of sound data at specified angle and distance
|
||||
from listener.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_PlayVOC3D
|
||||
(
|
||||
char *ptr,
|
||||
int32_t pitchoffset,
|
||||
int32_t angle,
|
||||
int32_t distance,
|
||||
int32_t priority,
|
||||
uint32_t callbackval
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_PlayWAV3D
|
||||
|
||||
Begin playback of sound data at specified angle and distance
|
||||
from listener.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_PlayWAV3D
|
||||
(
|
||||
char *ptr,
|
||||
int32_t pitchoffset,
|
||||
int32_t angle,
|
||||
int32_t distance,
|
||||
int32_t priority,
|
||||
uint32_t callbackval
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_Pan3D
|
||||
|
||||
Set the angle and distance from the listener of the voice associated
|
||||
with the specified handle.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_Pan3D
|
||||
(
|
||||
int32_t handle,
|
||||
int32_t angle,
|
||||
int32_t distance
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_StopSound
|
||||
|
||||
Halts playback of a specific voice
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_StopSound
|
||||
(
|
||||
int32_t handle
|
||||
)
|
||||
|
||||
{
|
||||
return(FX_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: FX_StopAllSounds
|
||||
|
||||
Halts playback of all sounds.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t FX_StopAllSounds
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return(FX_Ok);
|
||||
}
|
||||
|
||||
|
||||
void AudioUpdate(void) { }
|
||||
|
||||
int32_t FX_PlayLoopedOGG
|
||||
(
|
||||
char *ptr,
|
||||
int32_t loopstart,
|
||||
int32_t loopend,
|
||||
int32_t pitchoffset,
|
||||
int32_t vol,
|
||||
int32_t left,
|
||||
int32_t right,
|
||||
int32_t priority,
|
||||
uint32_t callbackval
|
||||
)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
int32_t FX_PlayOGG3D
|
||||
(
|
||||
char *ptr,
|
||||
int32_t pitchoffset,
|
||||
int32_t angle,
|
||||
int32_t distance,
|
||||
int32_t priority,
|
||||
uint32_t callbackval
|
||||
)
|
||||
{
|
||||
return(0);
|
||||
}
|
|
@ -1,494 +0,0 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Duke Nukem Copyright (C) 1996, 2003 3D Realms Entertainment
|
||||
|
||||
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
|
||||
|
||||
Duke Nukem 3D 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Dummy AudioLib stub implementation by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
#include "music.h"
|
||||
|
||||
|
||||
#define TRUE ( 1 == 1 )
|
||||
#define FALSE ( !TRUE )
|
||||
|
||||
|
||||
int32_t MUSIC_ErrorCode = MUSIC_Ok;
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_ErrorString
|
||||
|
||||
Returns a pointer to the error message associated with an error
|
||||
number. A -1 returns a pointer the current error.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
char *MUSIC_ErrorString
|
||||
(
|
||||
int32_t ErrorNumber
|
||||
)
|
||||
|
||||
{
|
||||
char *ErrorString;
|
||||
|
||||
switch (ErrorNumber)
|
||||
{
|
||||
case MUSIC_Warning :
|
||||
case MUSIC_Error :
|
||||
ErrorString = MUSIC_ErrorString(MUSIC_ErrorCode);
|
||||
break;
|
||||
|
||||
case MUSIC_Ok :
|
||||
ErrorString = "Music ok.";
|
||||
break;
|
||||
|
||||
case MUSIC_ASSVersion :
|
||||
ErrorString = "Apogee Sound System Version "
|
||||
"Programmed by Jim Dose\n"
|
||||
"(c) Copyright 1996 James R. Dose. All Rights Reserved.\n";
|
||||
break;
|
||||
|
||||
case MUSIC_SoundCardError :
|
||||
break;
|
||||
|
||||
case MUSIC_MPU401Error :
|
||||
ErrorString = "Could not detect MPU-401.";
|
||||
break;
|
||||
|
||||
case MUSIC_InvalidCard :
|
||||
ErrorString = "Invalid Music device.";
|
||||
break;
|
||||
|
||||
case MUSIC_MidiError :
|
||||
ErrorString = "Error playing MIDI file.";
|
||||
break;
|
||||
|
||||
case MUSIC_TaskManError :
|
||||
ErrorString = "TaskMan error.";
|
||||
break;
|
||||
|
||||
case MUSIC_DPMI_Error :
|
||||
ErrorString = "DPMI Error in MUSIC.";
|
||||
break;
|
||||
|
||||
default :
|
||||
ErrorString = "Unknown Music error code.";
|
||||
break;
|
||||
}
|
||||
|
||||
return(ErrorString);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_Init
|
||||
|
||||
Selects which sound device to use.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_Init
|
||||
(
|
||||
int32_t SoundCard,
|
||||
int32_t Address
|
||||
)
|
||||
|
||||
{
|
||||
int32_t i;
|
||||
int32_t status;
|
||||
|
||||
status = MUSIC_Ok;
|
||||
|
||||
return(status);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_Shutdown
|
||||
|
||||
Terminates use of sound device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_Shutdown
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
int32_t status;
|
||||
|
||||
status = MUSIC_Ok;
|
||||
|
||||
|
||||
return(status);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetMaxFMMidiChannel
|
||||
|
||||
Sets the maximum MIDI channel that FM cards respond to.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetMaxFMMidiChannel
|
||||
(
|
||||
int32_t channel
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetVolume
|
||||
|
||||
Sets the volume of music playback.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetVolume
|
||||
(
|
||||
int32_t volume
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetMidiChannelVolume
|
||||
|
||||
Sets the volume of music playback on the specified MIDI channel.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetMidiChannelVolume
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t volume
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_ResetMidiChannelVolumes
|
||||
|
||||
Sets the volume of music playback on all MIDI channels to full volume.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_ResetMidiChannelVolumes
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_GetVolume
|
||||
|
||||
Returns the volume of music playback.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_GetVolume
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetLoopFlag
|
||||
|
||||
Set whether the music will loop or end when it reaches the end of
|
||||
the song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetLoopFlag
|
||||
(
|
||||
int32_t loopflag
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SongPlaying
|
||||
|
||||
Returns whether there is a song playing.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_SongPlaying
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_Continue
|
||||
|
||||
Continues playback of a paused song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_Continue
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_Pause
|
||||
|
||||
Pauses playback of a song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_Pause
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_StopSong
|
||||
|
||||
Stops playback of current song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_StopSong
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return(MUSIC_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_PlaySong
|
||||
|
||||
Begins playback of MIDI song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_PlaySong
|
||||
(
|
||||
char *song,
|
||||
int32_t loopflag
|
||||
)
|
||||
|
||||
{
|
||||
return(MUSIC_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetContext
|
||||
|
||||
Sets the song context.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetContext
|
||||
(
|
||||
int32_t context
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_GetContext
|
||||
|
||||
Returns the current song context.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_GetContext
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{ return 0; }
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetSongTick
|
||||
|
||||
Sets the position of the song pointer.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetSongTick
|
||||
(
|
||||
uint32_t PositionInTicks
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetSongTime
|
||||
|
||||
Sets the position of the song pointer.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetSongTime
|
||||
(
|
||||
uint32_t milliseconds
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetSongPosition
|
||||
|
||||
Sets the position of the song pointer.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetSongPosition
|
||||
(
|
||||
int32_t measure,
|
||||
int32_t beat,
|
||||
int32_t tick
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_GetSongPosition
|
||||
|
||||
Returns the position of the song pointer.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_GetSongPosition
|
||||
(
|
||||
songposition *pos
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_GetSongLength
|
||||
|
||||
Returns the length of the song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_GetSongLength
|
||||
(
|
||||
songposition *pos
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_FadeVolume
|
||||
|
||||
Fades music volume from current level to another over a specified
|
||||
period of time.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_FadeVolume
|
||||
(
|
||||
int32_t tovolume,
|
||||
int32_t milliseconds
|
||||
)
|
||||
|
||||
{
|
||||
return(MUSIC_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_FadeActive
|
||||
|
||||
Returns whether the fade routine is active.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_FadeActive
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_StopFade
|
||||
|
||||
Stops fading the music.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_StopFade
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_RerouteMidiChannel
|
||||
|
||||
Sets callback function to reroute MIDI commands from specified
|
||||
function.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_RerouteMidiChannel
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t(*function)(int32_t event, int32_t c1, int32_t c2)
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_RegisterTimbreBank
|
||||
|
||||
Halts playback of all sounds.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_RegisterTimbreBank
|
||||
(
|
||||
char *timbres
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
void MUSIC_Update(void)
|
||||
{}
|
||||
|
||||
void MUSIC_PlayMusic(char *_filename, int32_t loopflag)
|
||||
{}
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
#ifndef __DEBUGIO_H
|
||||
#define __DEBUGIO_H
|
||||
|
||||
void DB_SetXY( int32_t x, int32_t y );
|
||||
void DB_PutChar( char ch );
|
||||
int32_t DB_PrintString( char *string );
|
||||
int32_t DB_PrintNum( int32_t number );
|
||||
int32_t DB_PrintUnsigned( uint32_t number, int32_t radix );
|
||||
int32_t DB_printf( char *fmt, ... );
|
||||
|
||||
#endif
|
|
@ -1,280 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2003-2004 Ryan C. Gordon. and James Bentler
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Originally written by Ryan C. Gordon. (icculus@clutteredmind.org)
|
||||
Adapted to work with JonoF's port by James Bentler (bentler@cs.umn.edu)
|
||||
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include "dsl.h"
|
||||
#include "pragmas.h"
|
||||
|
||||
#define _NEED_SDLMIXER 1
|
||||
#include "sdl_inc.h"
|
||||
|
||||
extern int32_t MV_MixPage;
|
||||
|
||||
int32_t DSL_ErrorCode = DSL_Ok;
|
||||
|
||||
static int32_t mixer_initialized;
|
||||
static int32_t interrupts_disabled = 0;
|
||||
|
||||
static int32_t(*_DSL_CallBackFunc)(int32_t);
|
||||
static volatile char *_DSL_BufferStart;
|
||||
static int32_t _DSL_BufferSize;
|
||||
static int32_t _DSL_SampleRate;
|
||||
static int32_t _DSL_remainder;
|
||||
static Uint16 _DSL_format;
|
||||
static int32_t _DSL_channels;
|
||||
|
||||
|
||||
static Mix_Chunk *blank;
|
||||
static uint8_t *blank_buf;
|
||||
|
||||
/*
|
||||
possible todo ideas: cache sdl/sdl mixer error messages.
|
||||
*/
|
||||
|
||||
char *DSL_ErrorString(int32_t ErrorNumber)
|
||||
{
|
||||
char *ErrorString;
|
||||
|
||||
switch (ErrorNumber)
|
||||
{
|
||||
case DSL_Warning:
|
||||
case DSL_Error:
|
||||
ErrorString = DSL_ErrorString(DSL_ErrorCode);
|
||||
break;
|
||||
|
||||
case DSL_Ok:
|
||||
ErrorString = "SDL Driver ok.";
|
||||
break;
|
||||
|
||||
case DSL_SDLInitFailure:
|
||||
ErrorString = "SDL Audio initialization failed.";
|
||||
break;
|
||||
|
||||
case DSL_MixerActive:
|
||||
ErrorString = "SDL Mixer already initialized.";
|
||||
break;
|
||||
|
||||
case DSL_MixerInitFailure:
|
||||
ErrorString = "SDL Mixer initialization failed.";
|
||||
break;
|
||||
|
||||
default:
|
||||
ErrorString = "Unknown SDL Driver error.";
|
||||
break;
|
||||
}
|
||||
|
||||
return ErrorString;
|
||||
}
|
||||
|
||||
static void DSL_SetErrorCode(int32_t ErrorCode)
|
||||
{
|
||||
DSL_ErrorCode = ErrorCode;
|
||||
}
|
||||
|
||||
int32_t DSL_Init(int32_t soundcard, int32_t mixrate, int32_t numchannels, int32_t samplebits, int32_t buffersize)
|
||||
{
|
||||
/* FIXME: Do I need an SDL_mixer version check
|
||||
* like that in sdlmusic.h here, too???
|
||||
*/
|
||||
|
||||
UNREFERENCED_PARAMETER(soundcard);
|
||||
UNREFERENCED_PARAMETER(buffersize);
|
||||
|
||||
DSL_SetErrorCode(DSL_Ok);
|
||||
|
||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
|
||||
{
|
||||
DSL_SetErrorCode(DSL_SDLInitFailure);
|
||||
|
||||
return DSL_Error;
|
||||
}
|
||||
|
||||
_DSL_channels = numchannels;
|
||||
_DSL_SampleRate = mixrate;
|
||||
_DSL_format = (samplebits == 16) ? AUDIO_S16SYS : AUDIO_U8;
|
||||
|
||||
return DSL_Ok;
|
||||
}
|
||||
|
||||
void DSL_Shutdown(void)
|
||||
{
|
||||
DSL_StopPlayback();
|
||||
}
|
||||
|
||||
static void mixer_callback(int32_t chan, void *stream, int32_t len, void *udata)
|
||||
{
|
||||
Uint8 *stptr;
|
||||
Uint8 *fxptr;
|
||||
int32_t copysize;
|
||||
UNREFERENCED_PARAMETER(chan);
|
||||
UNREFERENCED_PARAMETER(udata);
|
||||
/* len should equal _DSL_BufferSize, else this is screwed up */
|
||||
|
||||
stptr = (Uint8 *)stream;
|
||||
|
||||
if (_DSL_remainder > 0)
|
||||
{
|
||||
copysize = min(len, _DSL_remainder);
|
||||
|
||||
fxptr = (Uint8 *)(&_DSL_BufferStart[MV_MixPage *
|
||||
_DSL_BufferSize]);
|
||||
|
||||
Bmemcpy(stptr, fxptr+(_DSL_BufferSize-_DSL_remainder), copysize);
|
||||
|
||||
len -= copysize;
|
||||
_DSL_remainder -= copysize;
|
||||
|
||||
stptr += copysize;
|
||||
}
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
/* new buffer */
|
||||
|
||||
_DSL_CallBackFunc(0);
|
||||
|
||||
fxptr = (Uint8 *)(&_DSL_BufferStart[MV_MixPage *
|
||||
_DSL_BufferSize]);
|
||||
|
||||
copysize = min(len, _DSL_BufferSize);
|
||||
|
||||
Bmemcpy(stptr, fxptr, copysize);
|
||||
|
||||
len -= copysize;
|
||||
|
||||
stptr += copysize;
|
||||
}
|
||||
|
||||
_DSL_remainder = len;
|
||||
}
|
||||
|
||||
//int32_t DSL_BeginBufferedPlayback(char *BufferStart,
|
||||
// int32_t BufferSize, int32_t NumDivisions, uint32_t SampleRate,
|
||||
// int32_t MixMode, void(*CallBackFunc)(void))
|
||||
int32_t DSL_BeginBufferedPlayback(char *BufferStart, int32_t(*CallBackFunc)(int32_t), int32_t BufferSize, int32_t NumDivisions)
|
||||
{
|
||||
int32_t chunksize;
|
||||
|
||||
if (mixer_initialized)
|
||||
{
|
||||
DSL_SetErrorCode(DSL_MixerActive);
|
||||
|
||||
return DSL_Error;
|
||||
}
|
||||
|
||||
_DSL_CallBackFunc = CallBackFunc;
|
||||
_DSL_BufferStart = BufferStart;
|
||||
_DSL_BufferSize = (BufferSize / NumDivisions);
|
||||
|
||||
_DSL_remainder = 0;
|
||||
|
||||
/*
|
||||
23ms is typically ideal (11025,22050,44100)
|
||||
46ms isn't bad
|
||||
*/
|
||||
|
||||
chunksize = 512;
|
||||
|
||||
if (_DSL_SampleRate >= 16000) chunksize *= 2;
|
||||
if (_DSL_SampleRate >= 32000) chunksize *= 2;
|
||||
|
||||
if (Mix_OpenAudio(_DSL_SampleRate, _DSL_format, _DSL_channels, chunksize) < 0)
|
||||
{
|
||||
DSL_SetErrorCode(DSL_MixerInitFailure);
|
||||
|
||||
return DSL_Error;
|
||||
}
|
||||
|
||||
/*
|
||||
Mix_SetPostMix(mixer_callback, NULL);
|
||||
*/
|
||||
/* have to use a channel because postmix will overwrite the music... */
|
||||
Mix_RegisterEffect(0, mixer_callback, NULL, NULL);
|
||||
|
||||
/* create a dummy sample just to allocate that channel */
|
||||
blank_buf = (Uint8 *)malloc(4096);
|
||||
memset(blank_buf, 0, 4096);
|
||||
|
||||
blank = Mix_QuickLoad_RAW(blank_buf, 4096);
|
||||
|
||||
Mix_PlayChannel(0, blank, -1);
|
||||
|
||||
mixer_initialized = 1;
|
||||
|
||||
return DSL_Ok;
|
||||
}
|
||||
|
||||
void DSL_StopPlayback(void)
|
||||
{
|
||||
if (mixer_initialized)
|
||||
{
|
||||
Mix_HaltChannel(0);
|
||||
}
|
||||
|
||||
if (blank != NULL)
|
||||
{
|
||||
Mix_FreeChunk(blank);
|
||||
}
|
||||
|
||||
blank = NULL;
|
||||
|
||||
if (blank_buf != NULL)
|
||||
{
|
||||
free(blank_buf);
|
||||
}
|
||||
|
||||
blank_buf = NULL;
|
||||
|
||||
if (mixer_initialized)
|
||||
{
|
||||
Mix_CloseAudio();
|
||||
}
|
||||
|
||||
mixer_initialized = 0;
|
||||
}
|
||||
|
||||
uint32_t DSL_GetPlaybackRate(void)
|
||||
{
|
||||
return _DSL_SampleRate;
|
||||
}
|
||||
|
||||
int32_t DisableInterrupts(void)
|
||||
{
|
||||
if (interrupts_disabled++)
|
||||
return 0;
|
||||
// interrupts_disabled = 1;
|
||||
SDL_LockAudio();
|
||||
return(0);
|
||||
}
|
||||
|
||||
int32_t RestoreInterrupts(int32_t flags)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(flags);
|
||||
if (--interrupts_disabled)
|
||||
return 0;
|
||||
// interrupts_disabled = 0;
|
||||
SDL_UnlockAudio();
|
||||
return(0);
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2003-2004 Ryan C. Gordon. and James Bentler
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Originally written by Ryan C. Gordon. (icculus@clutteredmind.org)
|
||||
Adapted to work with JonoF's port by James Bentler (bentler@cs.umn.edu)
|
||||
|
||||
*/
|
||||
#ifndef AUDIOLIB__DSL_H
|
||||
#define AUDIOLIB__DSL_H
|
||||
|
||||
#define MONO_8BIT 0
|
||||
#define STEREO 1
|
||||
#define SIXTEEN_BIT 2
|
||||
|
||||
enum DSL_ERRORS
|
||||
{
|
||||
DSL_Warning = -2,
|
||||
DSL_Error = -1,
|
||||
DSL_Ok = 0,
|
||||
DSL_SDLInitFailure,
|
||||
DSL_MixerActive,
|
||||
DSL_MixerInitFailure
|
||||
};
|
||||
|
||||
extern int32_t DSL_ErrorCode;
|
||||
char *DSL_ErrorString( int32_t ErrorNumber );
|
||||
|
||||
int32_t DisableInterrupts(void); // simulated using critical sections
|
||||
int32_t RestoreInterrupts(int32_t);
|
||||
|
||||
int32_t DSL_Init(int32_t soundcard, int32_t mixrate, int32_t numchannels, int32_t samplebits, int32_t buffersize);
|
||||
void DSL_StopPlayback( void );
|
||||
uint32_t DSL_GetPlaybackRate( void );
|
||||
int32_t DSL_BeginBufferedPlayback(char *BufferStart, int32_t (*CallBackFunc)(int32_t), int32_t buffersize, int32_t numdivisions);
|
||||
void DSL_Shutdown( void );
|
||||
|
||||
#endif
|
|
@ -1,639 +0,0 @@
|
|||
/*
|
||||
* DirectSound output code for MultiVoc
|
||||
* by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Duke Nukem Copyright (C) 1996, 2003 3D Realms Entertainment
|
||||
|
||||
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
|
||||
|
||||
Duke Nukem 3D 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
#include <dsound.h>
|
||||
#include "dsoundout.h"
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <mmsystem.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
#include "openal.h"
|
||||
#endif
|
||||
#include "compat.h"
|
||||
#include "winlayer.h"
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef RENDERTYPEWIN
|
||||
#error The DirectSound output module for AudioLib only works with the Windows interface.
|
||||
#endif
|
||||
|
||||
static CRITICAL_SECTION mutex;
|
||||
static int32_t _DSOUND_CriticalSectionAlloced = FALSE;
|
||||
static HANDLE isrthread = NULL;
|
||||
static HANDLE isrfinish = NULL;
|
||||
|
||||
static HMODULE hDSoundDLL = NULL;
|
||||
static LPDIRECTSOUND lpDS = NULL;
|
||||
static LPDIRECTSOUNDBUFFER lpDSBPrimary = NULL;
|
||||
static LPDIRECTSOUNDBUFFER lpDSBSecondary = NULL;
|
||||
static LPDIRECTSOUNDNOTIFY lpDSNotify = NULL;
|
||||
static HANDLE *hPosNotify = NULL;
|
||||
|
||||
static int32_t(*_DSOUND_CallBack)(int32_t) = NULL;
|
||||
static int32_t _DSOUND_BufferLength = 0;
|
||||
static int32_t _DSOUND_NumBuffers = 0;
|
||||
static char *_DSOUND_MixBuffer = NULL;
|
||||
|
||||
static int32_t DSOUND_Installed = FALSE;
|
||||
|
||||
int32_t DSOUND_ErrorCode = DSOUND_Ok;
|
||||
|
||||
#define DSOUND_SetErrorCode( status ) \
|
||||
DSOUND_ErrorCode = ( status );
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* DisableInterrupts
|
||||
* Enter the critical section.
|
||||
*/
|
||||
int32_t DisableInterrupts(void)
|
||||
{
|
||||
if (!_DSOUND_CriticalSectionAlloced) return -1;
|
||||
|
||||
EnterCriticalSection(&mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* RestoreInterrupts
|
||||
* Leave the critical section.
|
||||
*/
|
||||
int32_t RestoreInterrupts(int32_t a)
|
||||
{
|
||||
if (!_DSOUND_CriticalSectionAlloced) return -1;
|
||||
|
||||
LeaveCriticalSection(&mutex);
|
||||
|
||||
return 0;
|
||||
a=a;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DSOUND_ErrorString
|
||||
* Returns a description of an error code.
|
||||
*/
|
||||
char *DSOUND_ErrorString(int32_t errorcode)
|
||||
{
|
||||
switch (errorcode)
|
||||
{
|
||||
case DSOUND_Warning:
|
||||
case DSOUND_Error:
|
||||
return DSOUND_ErrorString(DSOUND_ErrorCode);
|
||||
|
||||
case DSOUND_Ok:
|
||||
return "DirectSound ok.";
|
||||
|
||||
case DSOUND_NoDLL:
|
||||
return "Failed loading DSOUND.DLL.";
|
||||
|
||||
case DSOUND_NoDirectSoundCreate:
|
||||
return "Failed getting DirectSoundCreate entry point.";
|
||||
|
||||
case DSOUND_FailedDSC:
|
||||
return "DirectSoundCreate failed.";
|
||||
|
||||
case DSOUND_FailedSetCoopLevel:
|
||||
return "Failed setting cooperative level.";
|
||||
|
||||
case DSOUND_FailedCreatePrimary:
|
||||
return "Failed creating primary buffer.";
|
||||
|
||||
case DSOUND_FailedSetFormat:
|
||||
return "Failed setting primary buffer format.";
|
||||
|
||||
case DSOUND_FailedCreateSecondary:
|
||||
return "Failed creating secondary buffer.";
|
||||
|
||||
case DSOUND_FailedCreateNotifyEvent:
|
||||
return "Failed creating notification event object.";
|
||||
|
||||
case DSOUND_FailedQueryNotify:
|
||||
return "Failed querying notification interface.";
|
||||
|
||||
case DSOUND_FailedSetNotify:
|
||||
return "Failed setting notification positions.";
|
||||
|
||||
case DSOUND_FailedCreateFinishEvent:
|
||||
return "Failed creating finish event object.";
|
||||
|
||||
case DSOUND_FailedCreateThread:
|
||||
return "Failed creating playback thread.";
|
||||
|
||||
case DSOUND_FailedPlaySecondary:
|
||||
return "Failed playing secondary buffer.";
|
||||
|
||||
case DSOUND_FailedGetExitCode:
|
||||
return "GetExitCodeThread failed.";
|
||||
|
||||
default:
|
||||
return "Unknown DirectSound error code.";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DSOUND_Init
|
||||
* Initializes the DirectSound objects.
|
||||
*/
|
||||
int32_t DSOUND_Init(int32_t soundcard, int32_t mixrate, int32_t numchannels, int32_t samplebits, int32_t buffersize)
|
||||
{
|
||||
HRESULT(WINAPI *aDirectSoundCreate)(LPGUID,LPDIRECTSOUND*,LPUNKNOWN);
|
||||
HRESULT hr;
|
||||
DSBUFFERDESC dsbuf;
|
||||
WAVEFORMATEX wfex;
|
||||
DSBPOSITIONNOTIFY posn;
|
||||
|
||||
UNREFERENCED_PARAMETER(soundcard);
|
||||
|
||||
if (DSOUND_Installed)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
}
|
||||
|
||||
initprintf("Initializing DirectSound...\n");
|
||||
|
||||
if (!_DSOUND_CriticalSectionAlloced)
|
||||
{
|
||||
// initialize the critical section object we'll use to
|
||||
// simulate (dis|en)abling interrupts
|
||||
InitializeCriticalSection(&mutex);
|
||||
_DSOUND_CriticalSectionAlloced = TRUE;
|
||||
}
|
||||
|
||||
// initprintf(" - Loading DSOUND.DLL\n");
|
||||
hDSoundDLL = LoadLibrary("DSOUND.DLL");
|
||||
if (!hDSoundDLL)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_NoDLL);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
aDirectSoundCreate = (void *)GetProcAddress(hDSoundDLL, "DirectSoundCreate");
|
||||
if (!aDirectSoundCreate)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_NoDirectSoundCreate);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
// initprintf(" - Creating DirectSound object\n");
|
||||
hr = aDirectSoundCreate(NULL, &lpDS, NULL);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedDSC);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
hr = IDirectSound_SetCooperativeLevel(lpDS, (HWND)win_gethwnd(), DSSCL_EXCLUSIVE);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedSetCoopLevel);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
// initprintf(" - Creating primary buffer\n");
|
||||
ZeroMemory(&dsbuf, sizeof(dsbuf));
|
||||
dsbuf.dwSize = sizeof(DSBUFFERDESC);
|
||||
dsbuf.dwFlags = DSBCAPS_PRIMARYBUFFER;
|
||||
hr = IDirectSound_CreateSoundBuffer(lpDS, &dsbuf, &lpDSBPrimary, NULL);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedCreatePrimary);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
/* initprintf(" - Setting primary buffer format\n"
|
||||
" Channels: %d\n"
|
||||
" Sample rate: %dHz\n"
|
||||
" Sample size: %d bits\n",
|
||||
numchannels, mixrate, samplebits); */
|
||||
initprintf(" - Primary buffer format: %d ch, %dHz, %d bits\n",
|
||||
numchannels, mixrate, samplebits);
|
||||
ZeroMemory(&wfex, sizeof(wfex));
|
||||
wfex.wFormatTag = WAVE_FORMAT_PCM;
|
||||
wfex.nChannels = numchannels;
|
||||
wfex.nSamplesPerSec = mixrate;
|
||||
wfex.wBitsPerSample = samplebits;
|
||||
wfex.nBlockAlign = (wfex.wBitsPerSample / 8) * wfex.nChannels;
|
||||
wfex.nAvgBytesPerSec = wfex.nBlockAlign * wfex.nSamplesPerSec;
|
||||
hr = IDirectSoundBuffer_SetFormat(lpDSBPrimary, &wfex);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedSetFormat);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
initprintf(" - Creating secondary buffer\n");
|
||||
ZeroMemory(&dsbuf, sizeof(dsbuf));
|
||||
dsbuf.dwSize = sizeof(DSBUFFERDESC);
|
||||
dsbuf.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE;
|
||||
dsbuf.dwBufferBytes = buffersize;
|
||||
dsbuf.lpwfxFormat = &wfex;
|
||||
hr = IDirectSound_CreateSoundBuffer(lpDS, &dsbuf, &lpDSBSecondary, NULL);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedCreateSecondary);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
hr = IDirectSoundBuffer_QueryInterface(lpDSBSecondary, &IID_IDirectSoundNotify, (LPVOID *)&lpDSNotify);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedQueryNotify);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
hPosNotify = (HANDLE *)malloc(sizeof(HANDLE));
|
||||
if (!hPosNotify)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedSetNotify);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
hPosNotify[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (!hPosNotify)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedCreateNotifyEvent);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
_DSOUND_BufferLength = 0;
|
||||
_DSOUND_NumBuffers = 1;
|
||||
posn.dwOffset = 0;
|
||||
posn.hEventNotify = hPosNotify[0];
|
||||
|
||||
hr = IDirectSoundNotify_SetNotificationPositions(lpDSNotify, 1, &posn);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedSetNotify);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
DSOUND_Installed = TRUE;
|
||||
|
||||
DSOUND_SetErrorCode(DSOUND_Ok);
|
||||
return DSOUND_Ok;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DSOUND_Shutdown
|
||||
* Shuts down DirectSound and it's associates.
|
||||
*/
|
||||
int32_t DSOUND_Shutdown(void)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
if (DSOUND_Installed) initprintf("Uninitializing DirectSound...\n");
|
||||
|
||||
DSOUND_Installed = FALSE;
|
||||
|
||||
DSOUND_StopPlayback();
|
||||
|
||||
if (lpDSNotify)
|
||||
{
|
||||
IDirectSoundNotify_Release(lpDSNotify);
|
||||
lpDSNotify = NULL;
|
||||
}
|
||||
|
||||
if (hPosNotify)
|
||||
{
|
||||
for (i=0; i<_DSOUND_NumBuffers; i++)
|
||||
{
|
||||
if (hPosNotify[i]) CloseHandle(hPosNotify[i]);
|
||||
}
|
||||
free(hPosNotify);
|
||||
hPosNotify = NULL;
|
||||
}
|
||||
|
||||
if (lpDSBSecondary)
|
||||
{
|
||||
// initprintf(" - Releasing secondary buffer\n");
|
||||
IDirectSoundBuffer_Stop(lpDSBSecondary);
|
||||
IDirectSoundBuffer_Release(lpDSBSecondary);
|
||||
lpDSBSecondary = NULL;
|
||||
}
|
||||
|
||||
if (lpDSBPrimary)
|
||||
{
|
||||
// initprintf(" - Releasing primary buffer\n");
|
||||
IDirectSoundBuffer_Release(lpDSBPrimary);
|
||||
lpDSBPrimary = NULL;
|
||||
}
|
||||
|
||||
if (lpDS)
|
||||
{
|
||||
// initprintf(" - Releasing DirectSound object\n");
|
||||
IDirectSound_Release(lpDS);
|
||||
lpDS = NULL;
|
||||
}
|
||||
|
||||
if (hDSoundDLL)
|
||||
{
|
||||
// initprintf(" - Unloading DSOUND.DLL\n");
|
||||
FreeLibrary(hDSoundDLL);
|
||||
hDSoundDLL = NULL;
|
||||
}
|
||||
|
||||
DSOUND_SetErrorCode(DSOUND_Ok);
|
||||
return DSOUND_Ok;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DSOUND_SetMixMode
|
||||
* Bit of filler for the future.
|
||||
*/
|
||||
int32_t DSOUND_SetMixMode(int32_t mode)
|
||||
{
|
||||
return mode;
|
||||
}
|
||||
|
||||
|
||||
//#define DEBUGAUDIO
|
||||
|
||||
#ifdef DEBUGAUDIO
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
static DWORD WINAPI isr(LPVOID parm)
|
||||
{
|
||||
HANDLE *handles;
|
||||
HRESULT hr;
|
||||
int32_t rv;
|
||||
#ifdef DEBUGAUDIO
|
||||
int32_t h;
|
||||
#endif
|
||||
int32_t p;
|
||||
LPVOID lockptr; DWORD lockbytes;
|
||||
LPVOID lockptr2; DWORD lockbytes2;
|
||||
|
||||
UNREFERENCED_PARAMETER(parm);
|
||||
|
||||
handles = (HANDLE *)malloc(sizeof(HANDLE)*(1+_DSOUND_NumBuffers));
|
||||
if (!handles) return 1;
|
||||
|
||||
handles[0] = isrfinish;
|
||||
for (p=0; p<_DSOUND_NumBuffers; p++)
|
||||
handles[p+1] = hPosNotify[p];
|
||||
|
||||
#ifdef DEBUGAUDIO
|
||||
h = creat("audio.raw",S_IREAD|S_IWRITE);
|
||||
#endif
|
||||
|
||||
while (1)
|
||||
{
|
||||
#ifdef USE_OPENAL
|
||||
AL_Update();
|
||||
#endif
|
||||
rv = WaitForMultipleObjects(1+_DSOUND_NumBuffers, handles, FALSE, INFINITE);
|
||||
|
||||
if (!(rv >= WAIT_OBJECT_0 && rv <= WAIT_OBJECT_0+1+_DSOUND_NumBuffers)) return -1;
|
||||
|
||||
if (rv == WAIT_OBJECT_0)
|
||||
{
|
||||
// we've been asked to finish up
|
||||
break;
|
||||
}
|
||||
|
||||
// otherwise we just service the interrupt
|
||||
if (_DSOUND_CallBack)
|
||||
{
|
||||
DisableInterrupts();
|
||||
|
||||
p = _DSOUND_CallBack(rv-WAIT_OBJECT_0-1);
|
||||
#ifdef DEBUGAUDIO
|
||||
write(h, _DSOUND_MixBuffer + p*_DSOUND_BufferLength, _DSOUND_BufferLength);
|
||||
#endif
|
||||
|
||||
hr = IDirectSoundBuffer_Lock(lpDSBSecondary, p*_DSOUND_BufferLength, _DSOUND_BufferLength,
|
||||
&lockptr, &lockbytes, &lockptr2, &lockbytes2, 0);
|
||||
if (hr == DSERR_BUFFERLOST)
|
||||
{
|
||||
hr = IDirectSoundBuffer_Restore(lpDSBSecondary);
|
||||
}
|
||||
if (hr == DS_OK)
|
||||
{
|
||||
/*
|
||||
#define copybuf(S,D,c) \
|
||||
({ void *__S=(S), *__D=(D); int32_t __c=(c); \
|
||||
__asm__ __volatile__ ("rep; movsl" \
|
||||
: "+S" (__S), "+D" (__D), "+c" (__c) : : "memory", "cc"); \
|
||||
0; })
|
||||
*/
|
||||
//copybuf(_DSOUND_MixBuffer + p * _DSOUND_BufferLength, lockptr, _DSOUND_BufferLength >> 2);
|
||||
Bmemcpy(lockptr, _DSOUND_MixBuffer + p * _DSOUND_BufferLength, _DSOUND_BufferLength);
|
||||
IDirectSoundBuffer_Unlock(lpDSBSecondary, lockptr, lockbytes, lockptr2, lockbytes2);
|
||||
}
|
||||
|
||||
RestoreInterrupts(0);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUGAUDIO
|
||||
close(h);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DSOUND_BeginBufferedPlayback
|
||||
* Spins off a thread that behaves somewhat like the SoundBlaster DMA ISR did.
|
||||
*/
|
||||
int32_t DSOUND_BeginBufferedPlayback(char *BufferStart, int32_t(*CallBackFunc)(int32_t), int32_t buffersize, int32_t numdivisions)
|
||||
{
|
||||
DWORD threadid;
|
||||
HRESULT hr;
|
||||
DSBPOSITIONNOTIFY *posns;
|
||||
int32_t i;
|
||||
|
||||
_DSOUND_CallBack = CallBackFunc;
|
||||
_DSOUND_MixBuffer = BufferStart;
|
||||
|
||||
if (!lpDSBSecondary) return DSOUND_Error;
|
||||
|
||||
if (isrthread)
|
||||
{
|
||||
DSOUND_StopPlayback();
|
||||
}
|
||||
|
||||
isrfinish = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
if (!isrfinish)
|
||||
{
|
||||
DSOUND_SetErrorCode(DSOUND_FailedCreateFinishEvent);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
isrthread = CreateThread(NULL, 0, isr, NULL, CREATE_SUSPENDED, &threadid);
|
||||
if (!isrthread)
|
||||
{
|
||||
DSOUND_SetErrorCode(DSOUND_FailedCreateThread);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
hPosNotify = (HANDLE *)malloc(sizeof(HANDLE)*numdivisions);
|
||||
if (!hPosNotify)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedSetNotify);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
memset(hPosNotify, 0, sizeof(HANDLE)*numdivisions);
|
||||
for (i=0; i<numdivisions; i++)
|
||||
{
|
||||
hPosNotify[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (!hPosNotify[i])
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedSetNotify);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
}
|
||||
|
||||
posns = (LPDSBPOSITIONNOTIFY)malloc(sizeof(DSBPOSITIONNOTIFY)*numdivisions);
|
||||
if (!posns)
|
||||
{
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedSetNotify);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
_DSOUND_BufferLength = buffersize/numdivisions;
|
||||
_DSOUND_NumBuffers = numdivisions;
|
||||
for (i=0; i<numdivisions; i++)
|
||||
{
|
||||
posns[i].dwOffset = i*_DSOUND_BufferLength;
|
||||
posns[i].hEventNotify = hPosNotify[i];
|
||||
}
|
||||
|
||||
hr = IDirectSoundNotify_SetNotificationPositions(lpDSNotify, numdivisions, posns);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
free(posns);
|
||||
DSOUND_Shutdown();
|
||||
DSOUND_SetErrorCode(DSOUND_FailedSetNotify);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
free(posns);
|
||||
|
||||
SetThreadPriority(isrthread, THREAD_PRIORITY_ABOVE_NORMAL);
|
||||
ResumeThread(isrthread);
|
||||
|
||||
hr = IDirectSoundBuffer_Play(lpDSBSecondary, 0, 0, DSBPLAY_LOOPING);
|
||||
if (hr != DS_OK)
|
||||
{
|
||||
DSOUND_SetErrorCode(DSOUND_FailedPlaySecondary);
|
||||
return DSOUND_Error;
|
||||
}
|
||||
|
||||
return DSOUND_Ok;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DSOUND_StopPlayback
|
||||
* Halts the playback thread.
|
||||
*/
|
||||
int32_t DSOUND_StopPlayback(void)
|
||||
{
|
||||
// DWORD exitcode;
|
||||
int32_t i;
|
||||
|
||||
if (isrthread)
|
||||
{
|
||||
SetEvent(isrfinish);
|
||||
|
||||
// initprintf("DirectSound: Waiting for sound thread to exit\n");
|
||||
// if (WaitForSingleObject(isrthread, 300) == WAIT_OBJECT_0)
|
||||
// initprintf("DirectSound: Sound thread has exited\n");
|
||||
// else
|
||||
// initprintf("DirectSound: Sound thread failed to exit!\n");
|
||||
if (WaitForSingleObject(isrthread, 300) != WAIT_OBJECT_0)
|
||||
initprintf("DirectSound: Sound thread failed to exit!\n");
|
||||
/*
|
||||
while (1) {
|
||||
if (!GetExitCodeThread(isrthread, &exitcode)) {
|
||||
DSOUND_SetErrorCode(DSOUND_FailedGetExitCode);
|
||||
return DSOUND_Warning;
|
||||
}
|
||||
if (exitcode != STILL_ACTIVE) break;
|
||||
}*/
|
||||
|
||||
CloseHandle(isrthread);
|
||||
isrthread = NULL;
|
||||
}
|
||||
|
||||
if (isrfinish)
|
||||
{
|
||||
CloseHandle(isrfinish);
|
||||
isrfinish = NULL;
|
||||
}
|
||||
|
||||
if (lpDSBSecondary)
|
||||
{
|
||||
IDirectSoundBuffer_Stop(lpDSBSecondary);
|
||||
}
|
||||
|
||||
if (hPosNotify)
|
||||
{
|
||||
for (i=0; i<_DSOUND_NumBuffers; i++)
|
||||
{
|
||||
if (hPosNotify[i]) CloseHandle(hPosNotify[i]);
|
||||
}
|
||||
free(hPosNotify);
|
||||
hPosNotify = NULL;
|
||||
}
|
||||
|
||||
return DSOUND_Ok;
|
||||
}
|
||||
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Duke Nukem Copyright (C) 1996, 2003 3D Realms Entertainment
|
||||
|
||||
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
|
||||
|
||||
Duke Nukem 3D 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
#ifndef __dsoundout_h__
|
||||
#define __dsoundout_h__
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
enum DSOUND_ERRORS {
|
||||
DSOUND_Warning = -2,
|
||||
DSOUND_Error = -1,
|
||||
DSOUND_Ok = 0,
|
||||
DSOUND_NoDLL,
|
||||
DSOUND_NoDirectSoundCreate,
|
||||
DSOUND_FailedDSC,
|
||||
DSOUND_FailedSetCoopLevel,
|
||||
DSOUND_FailedCreatePrimary,
|
||||
DSOUND_FailedSetFormat,
|
||||
DSOUND_FailedCreateSecondary,
|
||||
DSOUND_FailedCreateNotifyEvent,
|
||||
DSOUND_FailedQueryNotify,
|
||||
DSOUND_FailedSetNotify,
|
||||
DSOUND_FailedCreateFinishEvent,
|
||||
DSOUND_FailedCreateThread,
|
||||
DSOUND_FailedPlaySecondary,
|
||||
DSOUND_FailedGetExitCode
|
||||
};
|
||||
|
||||
extern int32_t DSOUND_ErrorCode;
|
||||
|
||||
char *DSOUND_ErrorString(int32_t);
|
||||
|
||||
int32_t DisableInterrupts(void); // simulated using critical sections
|
||||
int32_t RestoreInterrupts(int32_t);
|
||||
|
||||
int32_t DSOUND_Init(int32_t soundcard, int32_t mixrate, int32_t numchannels, int32_t samplebits, int32_t buffersize);
|
||||
int32_t DSOUND_Shutdown(void);
|
||||
|
||||
int32_t DSOUND_SetMixMode(int32_t mode);
|
||||
int32_t DSOUND_BeginBufferedPlayback(char *BufferStart, int32_t (*CallBackFunc)(int32_t), int32_t buffersize, int32_t numdivisions);
|
||||
int32_t DSOUND_StopPlayback(void);
|
||||
|
||||
#endif // __dsoundout_h__
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -1,143 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: FX_MAN.H
|
||||
|
||||
author: James R. Dose
|
||||
date: March 17, 1994
|
||||
|
||||
Public header for FX_MAN.C
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __FX_MAN_H
|
||||
#define __FX_MAN_H
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int32_t MaxVoices;
|
||||
int32_t MaxSampleBits;
|
||||
int32_t MaxChannels;
|
||||
} fx_device;
|
||||
|
||||
#define MonoFx 1
|
||||
#define StereoFx 2
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t Address;
|
||||
uint32_t Type;
|
||||
uint32_t Interrupt;
|
||||
uint32_t Dma8;
|
||||
uint32_t Dma16;
|
||||
uint32_t Midi;
|
||||
uint32_t Emu;
|
||||
} fx_blaster_config;
|
||||
|
||||
enum FX_ERRORS
|
||||
{
|
||||
FX_Warning = -2,
|
||||
FX_Error = -1,
|
||||
FX_Ok = 0,
|
||||
FX_ASSVersion,
|
||||
FX_BlasterError,
|
||||
FX_SoundCardError,
|
||||
FX_InvalidCard,
|
||||
FX_MultiVocError,
|
||||
FX_DPMI_Error
|
||||
};
|
||||
|
||||
/*
|
||||
enum fx_BLASTER_Types
|
||||
{
|
||||
fx_SB = 1,
|
||||
fx_SBPro = 2,
|
||||
fx_SB20 = 3,
|
||||
fx_SBPro2 = 4,
|
||||
fx_SB16 = 6
|
||||
};
|
||||
*/
|
||||
|
||||
char *FX_ErrorString( int32_t ErrorNumber );
|
||||
//int32_t FX_SetupCard( int32_t SoundCard, fx_device *device );
|
||||
//int32_t FX_GetBlasterSettings( fx_blaster_config *blaster );
|
||||
//int32_t FX_SetupSoundBlaster( fx_blaster_config blaster, int32_t *MaxVoices, int32_t *MaxSampleBits, int32_t *MaxChannels );
|
||||
int32_t FX_Init( int32_t SoundCard, int32_t numvoices, int32_t numchannels, int32_t samplebits, uint32_t mixrate );
|
||||
int32_t FX_Shutdown( void );
|
||||
int32_t FX_SetCallBack( void ( *function )( uint32_t ) );
|
||||
void FX_SetVolume( int32_t volume );
|
||||
int32_t FX_GetVolume( void );
|
||||
|
||||
void FX_SetReverseStereo( int32_t setting );
|
||||
int32_t FX_GetReverseStereo( void );
|
||||
void FX_SetReverb( int32_t reverb );
|
||||
void FX_SetFastReverb( int32_t reverb );
|
||||
int32_t FX_GetMaxReverbDelay( void );
|
||||
int32_t FX_GetReverbDelay( void );
|
||||
void FX_SetReverbDelay( int32_t delay );
|
||||
|
||||
int32_t FX_VoiceAvailable( int32_t priority );
|
||||
int32_t FX_EndLooping( int32_t handle );
|
||||
int32_t FX_SetPan( int32_t handle, int32_t vol, int32_t left, int32_t right );
|
||||
int32_t FX_SetPitch( int32_t handle, int32_t pitchoffset );
|
||||
int32_t FX_SetFrequency( int32_t handle, int32_t frequency );
|
||||
|
||||
int32_t FX_PlayVOC( char *ptr, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t FX_PlayLoopedVOC( char *ptr, int32_t loopstart, int32_t loopend,
|
||||
int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
|
||||
uint32_t callbackval );
|
||||
int32_t FX_PlayWAV( char *ptr, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t FX_PlayLoopedWAV( char *ptr, int32_t loopstart, int32_t loopend,
|
||||
int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
|
||||
uint32_t callbackval );
|
||||
int32_t FX_PlayLoopedOGG( char *ptr, int32_t loopstart, int32_t loopend,
|
||||
int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
|
||||
uint32_t callbackval );
|
||||
int32_t FX_PlayOGG3D( char *ptr, int32_t pitchoffset, int32_t angle, int32_t distance,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t FX_PlayVOC3D( char *ptr, int32_t pitchoffset, int32_t angle, int32_t distance,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t FX_PlayWAV3D( char *ptr, int32_t pitchoffset, int32_t angle, int32_t distance,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t FX_PlayRaw( char *ptr, uint32_t length, uint32_t rate,
|
||||
int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
|
||||
uint32_t callbackval );
|
||||
int32_t FX_PlayLoopedRaw( char *ptr, uint32_t length, char *loopstart,
|
||||
char *loopend, uint32_t rate, int32_t pitchoffset, int32_t vol, int32_t left,
|
||||
int32_t right, int32_t priority, uint32_t callbackval );
|
||||
int32_t FX_Pan3D( int32_t handle, int32_t angle, int32_t distance );
|
||||
int32_t FX_SoundActive( int32_t handle );
|
||||
int32_t FX_SoundsPlaying( void );
|
||||
int32_t FX_StopSound( int32_t handle );
|
||||
int32_t FX_StopAllSounds( void );
|
||||
int32_t FX_StartDemandFeedPlayback( void ( *function )( char **ptr, uint32_t *length ),
|
||||
int32_t rate, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t FX_StartRecording( int32_t MixRate, void ( *function )( char *ptr, int32_t length ) );
|
||||
void FX_StopRecord( void );
|
||||
|
||||
void FX_Update(void);
|
||||
#endif
|
|
@ -1,50 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: INTERRUP.H
|
||||
|
||||
author: James R. Dose
|
||||
date: March 31, 1994
|
||||
|
||||
Inline functions for disabling and restoring the interrupt flag.
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __INTERRUPT_H
|
||||
#define __INTERRUPT_H
|
||||
|
||||
uint32_t DisableInterrupts( void );
|
||||
void RestoreInterrupts( uint32_t flags );
|
||||
|
||||
#ifdef PLAT_DOS
|
||||
#pragma aux DisableInterrupts = \
|
||||
"pushfd", \
|
||||
"pop eax", \
|
||||
"cli" \
|
||||
modify [ eax ];
|
||||
|
||||
#pragma aux RestoreInterrupts = \
|
||||
"push eax", \
|
||||
"popfd" \
|
||||
parm [ eax ];
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -1,119 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
#ifndef __linklist_h
|
||||
#define __linklist_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define NewNode(type) ((type*)SafeMalloc(sizeof(type)))
|
||||
|
||||
|
||||
#define LL_CreateNewLinkedList(rootnode,type,next,prev) \
|
||||
{ \
|
||||
(rootnode) = NewNode(type); \
|
||||
(rootnode)->prev = (rootnode); \
|
||||
(rootnode)->next = (rootnode); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define LL_AddNode(rootnode, newnode, next, prev) \
|
||||
{ \
|
||||
(newnode)->next = (rootnode); \
|
||||
(newnode)->prev = (rootnode)->prev; \
|
||||
(rootnode)->prev->next = (newnode); \
|
||||
(rootnode)->prev = (newnode); \
|
||||
}
|
||||
|
||||
#define LL_TransferList(oldroot,newroot,next,prev) \
|
||||
{ \
|
||||
if ((oldroot)->prev != (oldroot)) \
|
||||
{ \
|
||||
(oldroot)->prev->next = (newroot); \
|
||||
(oldroot)->next->prev = (newroot)->prev; \
|
||||
(newroot)->prev->next = (oldroot)->next; \
|
||||
(newroot)->prev = (oldroot)->prev; \
|
||||
(oldroot)->next = (oldroot); \
|
||||
(oldroot)->prev = (oldroot); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define LL_ReverseList(root,type,next,prev) \
|
||||
{ \
|
||||
type *newend,*trav,*tprev; \
|
||||
\
|
||||
newend = (root)->next; \
|
||||
for(trav = (root)->prev; trav != newend; trav = tprev) \
|
||||
{ \
|
||||
tprev = trav->prev; \
|
||||
LL_MoveNode(trav,newend,next,prev); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
#define LL_RemoveNode(node,next,prev) \
|
||||
{ \
|
||||
(node)->prev->next = (node)->next; \
|
||||
(node)->next->prev = (node)->prev; \
|
||||
(node)->next = (node); \
|
||||
(node)->prev = (node); \
|
||||
}
|
||||
|
||||
|
||||
#define LL_SortedInsertion(rootnode,insertnode,next,prev,type,sortparm) \
|
||||
{ \
|
||||
type *hoya; \
|
||||
\
|
||||
hoya = (rootnode)->next; \
|
||||
while((hoya != (rootnode)) && ((insertnode)->sortparm > hoya->sortparm)) \
|
||||
{ \
|
||||
hoya = hoya->next; \
|
||||
} \
|
||||
LL_AddNode(hoya,(insertnode),next,prev); \
|
||||
}
|
||||
|
||||
#define LL_MoveNode(node,newroot,next,prev) \
|
||||
{ \
|
||||
LL_RemoveNode((node),next,prev); \
|
||||
LL_AddNode((newroot),(node),next,prev); \
|
||||
}
|
||||
|
||||
#define LL_ListEmpty(list,next,prev) \
|
||||
( \
|
||||
((list)->next == (list)) && \
|
||||
((list)->prev == (list)) \
|
||||
)
|
||||
|
||||
#define LL_Free(list) SafeFree(list)
|
||||
#define LL_Reset(list,next,prev) (list)->next = (list)->prev = (list)
|
||||
#define LL_New LL_CreateNewLinkedList
|
||||
#define LL_Remove LL_RemoveNode
|
||||
#define LL_Add LL_AddNode
|
||||
#define LL_Empty LL_ListEmpty
|
||||
#define LL_Move LL_MoveNode
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
#endif
|
|
@ -1,103 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: LL_MAN.C
|
||||
|
||||
author: James R. Dose
|
||||
date: January 1, 1994
|
||||
|
||||
Linked list management routines.
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#include <stddef.h>
|
||||
#include "ll_man.h"
|
||||
|
||||
#define OFFSET( structure, offset ) \
|
||||
( *( ( char ** )&( structure )[ offset ] ) )
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
|
||||
Memory locked functions:
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
void LL_AddNode
|
||||
(
|
||||
char *item,
|
||||
char **head,
|
||||
char **tail,
|
||||
int32_t next,
|
||||
int32_t prev
|
||||
)
|
||||
|
||||
{
|
||||
OFFSET(item, prev) = NULL;
|
||||
OFFSET(item, next) = *head;
|
||||
|
||||
if (*head)
|
||||
{
|
||||
OFFSET(*head, prev) = item;
|
||||
}
|
||||
else
|
||||
{
|
||||
*tail = item;
|
||||
}
|
||||
|
||||
*head = item;
|
||||
}
|
||||
|
||||
void LL_RemoveNode
|
||||
(
|
||||
char *item,
|
||||
char **head,
|
||||
char **tail,
|
||||
int32_t next,
|
||||
int32_t prev
|
||||
)
|
||||
|
||||
{
|
||||
if (OFFSET(item, prev) == NULL)
|
||||
{
|
||||
*head = OFFSET(item, next);
|
||||
}
|
||||
else
|
||||
{
|
||||
OFFSET(OFFSET(item, prev), next) = OFFSET(item, next);
|
||||
}
|
||||
|
||||
if (OFFSET(item, next) == NULL)
|
||||
{
|
||||
*tail = OFFSET(item, prev);
|
||||
}
|
||||
else
|
||||
{
|
||||
OFFSET(OFFSET(item, next), prev) = OFFSET(item, prev);
|
||||
}
|
||||
|
||||
OFFSET(item, next) = NULL;
|
||||
OFFSET(item, prev) = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: LL_MAN.H
|
||||
|
||||
author: James R. Dose
|
||||
date: February 4, 1994
|
||||
|
||||
Public header for LL_MAN.C. Linked list management routines.
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __LL_MAN_H
|
||||
#define __LL_MAN_H
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
enum LL_Errors
|
||||
{
|
||||
LL_Warning = -2,
|
||||
LL_Error = -1,
|
||||
LL_Ok = 0
|
||||
};
|
||||
|
||||
typedef struct list
|
||||
{
|
||||
void *start;
|
||||
void *end;
|
||||
} list;
|
||||
|
||||
void LL_AddNode( char *node, char **head, char **tail, int32_t next, int32_t prev );
|
||||
void LL_RemoveNode( char *node, char **head, char **tail, int32_t next, int32_t prev );
|
||||
|
||||
#define LL_AddToHead( type, listhead, node ) \
|
||||
LL_AddNode( ( char * )( node ), \
|
||||
( char ** )&( ( listhead )->start ), \
|
||||
( char ** )&( ( listhead )->end ), \
|
||||
( int32_t )&( ( type * ) 0 )->next, \
|
||||
( int32_t )&( ( type * ) 0 )->prev )
|
||||
|
||||
#define LL_AddToTail( type, listhead, node ) \
|
||||
LL_AddNode( ( char * )( node ), \
|
||||
( char ** )&( ( listhead )->end ), \
|
||||
( char ** )&( ( listhead )->start ), \
|
||||
( int32_t )&( ( type * ) 0 )->prev, \
|
||||
( int32_t )&( ( type * ) 0 )->next )
|
||||
|
||||
#define LL_Remove( type, listhead, node ) \
|
||||
LL_RemoveNode( ( char * )( node ), \
|
||||
( char ** )&( ( listhead )->start ), \
|
||||
( char ** )&( ( listhead )->end ), \
|
||||
( int32_t )&( ( type * ) 0 )->next, \
|
||||
( int32_t )&( ( type * ) 0 )->prev )
|
||||
|
||||
#define LL_NextNode( node ) ( ( node )->next )
|
||||
#define LL_PreviousNode( node ) ( ( node )->prev )
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load diff
|
@ -1,100 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: MIDI.H
|
||||
|
||||
author: James R. Dose
|
||||
date: May 25, 1994
|
||||
|
||||
Public header for MIDI.C. Midi song file playback routines.
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __MIDI_H
|
||||
#define __MIDI_H
|
||||
|
||||
enum MIDI_Errors
|
||||
{
|
||||
MIDI_Warning = -2,
|
||||
MIDI_Error = -1,
|
||||
MIDI_Ok = 0,
|
||||
MIDI_NullMidiModule,
|
||||
MIDI_InvalidMidiFile,
|
||||
MIDI_UnknownMidiFormat,
|
||||
MIDI_NoTracks,
|
||||
MIDI_InvalidTrack,
|
||||
MIDI_NoMemory,
|
||||
MIDI_DPMI_Error
|
||||
};
|
||||
|
||||
|
||||
#define MIDI_PASS_THROUGH 1
|
||||
#define MIDI_DONT_PLAY 0
|
||||
|
||||
#define MIDI_MaxVolume 255
|
||||
|
||||
extern char MIDI_PatchMap[ 128 ];
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void ( *NoteOff )( int32_t channel, int32_t key, int32_t velocity );
|
||||
void ( *NoteOn )( int32_t channel, int32_t key, int32_t velocity );
|
||||
void ( *PolyAftertouch )( int32_t channel, int32_t key, int32_t pressure );
|
||||
void ( *ControlChange )( int32_t channel, int32_t number, int32_t value );
|
||||
void ( *ProgramChange )( int32_t channel, int32_t program );
|
||||
void ( *ChannelAftertouch )( int32_t channel, int32_t pressure );
|
||||
void ( *PitchBend )( int32_t channel, int32_t lsb, int32_t msb );
|
||||
void ( *ReleasePatches )( void );
|
||||
void ( *LoadPatch )( int32_t number );
|
||||
void ( *SetVolume )( int32_t volume );
|
||||
int32_t ( *GetVolume )( void );
|
||||
void ( *FinishBuffer )( void );
|
||||
} midifuncs;
|
||||
|
||||
void MIDI_RerouteMidiChannel( int32_t channel, int32_t ( *function )( int32_t event, int32_t c1, int32_t c2 ) );
|
||||
int32_t MIDI_AllNotesOff( void );
|
||||
void MIDI_SetUserChannelVolume( int32_t channel, int32_t volume );
|
||||
void MIDI_ResetUserChannelVolume( void );
|
||||
int32_t MIDI_Reset( void );
|
||||
int32_t MIDI_SetVolume( int32_t volume );
|
||||
int32_t MIDI_GetVolume( void );
|
||||
void MIDI_SetMidiFuncs( midifuncs *funcs );
|
||||
void MIDI_SetContext( int32_t context );
|
||||
int32_t MIDI_GetContext( void );
|
||||
void MIDI_SetLoopFlag( int32_t loopflag );
|
||||
void MIDI_ContinueSong( void );
|
||||
void MIDI_PauseSong( void );
|
||||
int32_t MIDI_SongPlaying( void );
|
||||
void MIDI_StopSong( void );
|
||||
int32_t MIDI_PlaySong( char *song, int32_t loopflag );
|
||||
void MIDI_SetTempo( int32_t tempo );
|
||||
int32_t MIDI_GetTempo( void );
|
||||
void MIDI_SetSongTick( uint32_t PositionInTicks );
|
||||
void MIDI_SetSongTime( uint32_t milliseconds );
|
||||
void MIDI_SetSongPosition( int32_t measure, int32_t beat, int32_t tick );
|
||||
void MIDI_GetSongPosition( songposition *pos );
|
||||
void MIDI_GetSongLength( songposition *pos );
|
||||
void MIDI_LoadTimbres( void );
|
||||
void MIDI_UpdateMusic(void);
|
||||
void MIDI_SetDivision( int32_t division );
|
||||
|
||||
#endif
|
|
@ -1,496 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: MPU401.C
|
||||
|
||||
author: James R. Dose
|
||||
date: January 1, 1994
|
||||
|
||||
Low level routines to support sending of MIDI data to MPU401
|
||||
compatible MIDI interfaces.
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#include "mpu401.h"
|
||||
#include "compat.h"
|
||||
#include "osd.h"
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <mmsystem.h>
|
||||
|
||||
static HMIDISTRM hmido = (HMIDISTRM)-1;
|
||||
static MIDIOUTCAPS midicaps;
|
||||
static DWORD mididevice = -1;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int32_t time;
|
||||
int32_t stream;
|
||||
int32_t event;
|
||||
}
|
||||
MIDIEVENTHEAD;
|
||||
#define PAD(x) ((((x)+3)&(~3)))
|
||||
|
||||
#define BUFFERLEN (32*4*4)
|
||||
#define NUMBUFFERS 8
|
||||
static char eventbuf[NUMBUFFERS][BUFFERLEN];
|
||||
static int32_t eventcnt[NUMBUFFERS];
|
||||
static MIDIHDR bufferheaders[NUMBUFFERS];
|
||||
int32_t _MPU_CurrentBuffer = 0;
|
||||
int32_t _MPU_BuffersWaiting = 0;
|
||||
|
||||
extern uint32_t _MIDI_GlobalPositionInTicks;
|
||||
uint32_t _MPU_LastEvent=0;
|
||||
|
||||
#define MIDI_NOTE_OFF 0x80
|
||||
#define MIDI_NOTE_ON 0x90
|
||||
#define MIDI_POLY_AFTER_TCH 0xA0
|
||||
#define MIDI_CONTROL_CHANGE 0xB0
|
||||
#define MIDI_PROGRAM_CHANGE 0xC0
|
||||
#define MIDI_AFTER_TOUCH 0xD0
|
||||
#define MIDI_PITCH_BEND 0xE0
|
||||
#define MIDI_META_EVENT 0xFF
|
||||
#define MIDI_END_OF_TRACK 0x2F
|
||||
#define MIDI_TEMPO_CHANGE 0x51
|
||||
#define MIDI_MONO_MODE_ON 0x7E
|
||||
#define MIDI_ALL_NOTES_OFF 0x7B
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
|
||||
Memory locked functions:
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
void MPU_FinishBuffer(int32_t buffer)
|
||||
{
|
||||
if (!eventcnt[buffer]) return;
|
||||
ZeroMemory(&bufferheaders[buffer], sizeof(MIDIHDR));
|
||||
bufferheaders[buffer].lpData = eventbuf[buffer];
|
||||
bufferheaders[buffer].dwBufferLength =
|
||||
bufferheaders[buffer].dwBytesRecorded = eventcnt[buffer];
|
||||
midiOutPrepareHeader((HMIDIOUT)hmido, &bufferheaders[buffer], sizeof(MIDIHDR));
|
||||
midiStreamOut(hmido, &bufferheaders[buffer], sizeof(MIDIHDR));
|
||||
// OSD_Printf("Sending %d bytes (buffer %d)\n",eventcnt[buffer],buffer);
|
||||
_MPU_BuffersWaiting++;
|
||||
}
|
||||
|
||||
void MPU_BeginPlayback(void)
|
||||
{
|
||||
_MPU_LastEvent = _MIDI_GlobalPositionInTicks;
|
||||
if (hmido != (HMIDISTRM)-1) midiStreamRestart(hmido);
|
||||
}
|
||||
|
||||
void MPU_Pause(void)
|
||||
{
|
||||
if (hmido != (HMIDISTRM)-1) midiStreamPause(hmido);
|
||||
}
|
||||
|
||||
void MPU_Unpause(void)
|
||||
{
|
||||
if (hmido != (HMIDISTRM)-1) midiStreamRestart(hmido);
|
||||
}
|
||||
|
||||
|
||||
void CALLBACK MPU_MIDICallback(HMIDIOUT handle, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
UNREFERENCED_PARAMETER(dwInstance);
|
||||
UNREFERENCED_PARAMETER(dwParam2);
|
||||
|
||||
switch (uMsg)
|
||||
{
|
||||
case MOM_DONE:
|
||||
midiOutUnprepareHeader((HMIDIOUT)handle, (MIDIHDR*)dwParam1, sizeof(MIDIHDR));
|
||||
for (i=0;i<NUMBUFFERS;i++)
|
||||
{
|
||||
if (dwParam1 == (uint32_t)&bufferheaders[i])
|
||||
{
|
||||
eventcnt[i] = 0; // marks the buffer as free
|
||||
// OSD_Printf("Finished buffer %d\n",i);
|
||||
_MPU_BuffersWaiting--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
default: return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_SendMidi
|
||||
|
||||
Queues a MIDI message to the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MPU_GetNextBuffer(void)
|
||||
{
|
||||
int32_t i;
|
||||
for (i=0; i<NUMBUFFERS; i++)
|
||||
{
|
||||
if (eventcnt[i] == 0) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void MPU_SendMidi(char *data, int32_t count)
|
||||
{
|
||||
char *p;
|
||||
int32_t padded, nextbuffer;
|
||||
static int32_t masks[3] = { 0x000000ffl, 0x0000ffffl, 0x00ffffffl };
|
||||
|
||||
if (count <= 0) return;
|
||||
if (count <= 3)
|
||||
{
|
||||
if (eventcnt[_MPU_CurrentBuffer] + 12 > BUFFERLEN)
|
||||
{
|
||||
// buffer over-full
|
||||
nextbuffer = MPU_GetNextBuffer();
|
||||
if (nextbuffer < 0)
|
||||
{
|
||||
// OSD_Printf("All buffers full!\n");
|
||||
return;
|
||||
}
|
||||
MPU_FinishBuffer(_MPU_CurrentBuffer);
|
||||
_MPU_CurrentBuffer = nextbuffer;
|
||||
}
|
||||
|
||||
p = eventbuf[_MPU_CurrentBuffer] + eventcnt[_MPU_CurrentBuffer];
|
||||
((int32_t*)p)[0] = _MIDI_GlobalPositionInTicks - _MPU_LastEvent;
|
||||
((int32_t*)p)[1] = 0;
|
||||
((int32_t*)p)[2] = (MEVT_SHORTMSG << 24) | ((*((int32_t*)data)) & masks[count-1]);
|
||||
eventcnt[_MPU_CurrentBuffer] += 12;
|
||||
}
|
||||
else
|
||||
{
|
||||
padded = PAD(count);
|
||||
if (eventcnt[_MPU_CurrentBuffer] + 12 + padded > BUFFERLEN)
|
||||
{
|
||||
// buffer over-full
|
||||
nextbuffer = MPU_GetNextBuffer();
|
||||
if (nextbuffer < 0)
|
||||
{
|
||||
// OSD_Printf("All buffers full!\n");
|
||||
return;
|
||||
}
|
||||
MPU_FinishBuffer(_MPU_CurrentBuffer);
|
||||
_MPU_CurrentBuffer = nextbuffer;
|
||||
}
|
||||
|
||||
p = eventbuf[_MPU_CurrentBuffer] + eventcnt[_MPU_CurrentBuffer];
|
||||
((int32_t*)p)[0] = _MIDI_GlobalPositionInTicks - _MPU_LastEvent;
|
||||
((int32_t*)p)[1] = 0;
|
||||
((int32_t*)p)[2] = (MEVT_LONGMSG<<24) | (count & 0xffffffl);
|
||||
p+=12; eventcnt[_MPU_CurrentBuffer] += 12;
|
||||
for (; count>0; count--, padded--, eventcnt[_MPU_CurrentBuffer]++)
|
||||
*(p++) = *(data++);
|
||||
for (; padded>0; padded--, eventcnt[_MPU_CurrentBuffer]++)
|
||||
*(p++) = 0;
|
||||
}
|
||||
_MPU_LastEvent = _MIDI_GlobalPositionInTicks;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_SendMidiImmediate
|
||||
|
||||
Sends a MIDI message immediately to the the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
void MPU_SendMidiImmediate(char *data, int32_t count)
|
||||
{
|
||||
MIDIHDR mhdr;
|
||||
static int32_t masks[3] = { 0x00ffffffl, 0x0000ffffl, 0x000000ffl };
|
||||
|
||||
if (!count) return;
|
||||
if (count<=3) midiOutShortMsg((HMIDIOUT)hmido, (*((int32_t*)data)) & masks[count-1]);
|
||||
else
|
||||
{
|
||||
ZeroMemory(&mhdr, sizeof(mhdr));
|
||||
mhdr.lpData = data;
|
||||
mhdr.dwBufferLength = count;
|
||||
midiOutPrepareHeader((HMIDIOUT)hmido, &mhdr, sizeof(MIDIHDR));
|
||||
midiOutLongMsg((HMIDIOUT)hmido, &mhdr, sizeof(MIDIHDR));
|
||||
while (!(mhdr.dwFlags & MHDR_DONE)) ;
|
||||
midiOutUnprepareHeader((HMIDIOUT)hmido, &mhdr, sizeof(MIDIHDR));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_Reset
|
||||
|
||||
Resets the MPU401 card.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MPU_Reset
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
midiStreamStop(hmido);
|
||||
midiStreamClose(hmido);
|
||||
|
||||
return(MPU_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_Init
|
||||
|
||||
Detects and initializes the MPU401 card.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MPU_Init
|
||||
(
|
||||
int32_t addr
|
||||
)
|
||||
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
for (i=0;i<NUMBUFFERS;i++) eventcnt[i]=0;
|
||||
|
||||
mididevice = addr;
|
||||
|
||||
if (midiOutGetDevCaps(mididevice, &midicaps, sizeof(MIDIOUTCAPS)) != MMSYSERR_NOERROR) return MPU_Error;
|
||||
|
||||
if (midiStreamOpen(&hmido,(LPUINT)&mididevice,1,(DWORD)MPU_MIDICallback,0L,CALLBACK_FUNCTION) != MMSYSERR_NOERROR) return(MPU_Error);
|
||||
|
||||
return(MPU_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_NoteOff
|
||||
|
||||
Sends a full MIDI note off event out to the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MPU_NoteOff
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t key,
|
||||
int32_t velocity
|
||||
)
|
||||
|
||||
{
|
||||
char msg[3];
|
||||
msg[0] = (MIDI_NOTE_OFF | channel);
|
||||
msg[1] = (key);
|
||||
msg[2] = (velocity);
|
||||
MPU_SendMidi(msg, 3);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_NoteOn
|
||||
|
||||
Sends a full MIDI note on event out to the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MPU_NoteOn
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t key,
|
||||
int32_t velocity
|
||||
)
|
||||
|
||||
{
|
||||
char msg[3];
|
||||
msg[0] = (MIDI_NOTE_ON | channel);
|
||||
msg[1] = (key);
|
||||
msg[2] = (velocity);
|
||||
MPU_SendMidi(msg, 3);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_PolyAftertouch
|
||||
|
||||
Sends a full MIDI polyphonic aftertouch event out to the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MPU_PolyAftertouch
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t key,
|
||||
int32_t pressure
|
||||
)
|
||||
|
||||
{
|
||||
char msg[3];
|
||||
msg[0] = (MIDI_POLY_AFTER_TCH | channel);
|
||||
msg[1] = (key);
|
||||
msg[2] = (pressure);
|
||||
MPU_SendMidi(msg, 3);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_ControlChange
|
||||
|
||||
Sends a full MIDI control change event out to the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MPU_ControlChange
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t number,
|
||||
int32_t value
|
||||
)
|
||||
|
||||
{
|
||||
char msg[3];
|
||||
msg[0] = (MIDI_CONTROL_CHANGE | channel);
|
||||
msg[1] = (number);
|
||||
msg[2] = (value);
|
||||
MPU_SendMidi(msg, 3);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_ProgramChange
|
||||
|
||||
Sends a full MIDI program change event out to the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MPU_ProgramChange
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t program
|
||||
)
|
||||
|
||||
{
|
||||
char msg[2];
|
||||
msg[0] = (MIDI_PROGRAM_CHANGE | channel);
|
||||
msg[1] = (program);
|
||||
MPU_SendMidi(msg, 2);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_ChannelAftertouch
|
||||
|
||||
Sends a full MIDI channel aftertouch event out to the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MPU_ChannelAftertouch
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t pressure
|
||||
)
|
||||
|
||||
{
|
||||
char msg[2];
|
||||
msg[0] = (MIDI_AFTER_TOUCH | channel);
|
||||
msg[1] = (pressure);
|
||||
MPU_SendMidi(msg, 2);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MPU_PitchBend
|
||||
|
||||
Sends a full MIDI pitch bend event out to the music device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MPU_PitchBend
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t lsb,
|
||||
int32_t msb
|
||||
)
|
||||
|
||||
{
|
||||
char msg[3];
|
||||
msg[0] = (MIDI_PITCH_BEND | channel);
|
||||
msg[1] = (lsb);
|
||||
msg[2] = (msb);
|
||||
MPU_SendMidi(msg, 3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MPU_SetTempo(int32_t tempo)
|
||||
{
|
||||
MIDIPROPTEMPO prop;
|
||||
prop.cbStruct = sizeof(MIDIPROPTEMPO);
|
||||
prop.dwTempo = 60000000l/tempo;
|
||||
midiStreamProperty(hmido, (LPBYTE)&prop, MIDIPROP_SET|MIDIPROP_TEMPO);
|
||||
}
|
||||
|
||||
void MPU_SetDivision(int32_t division)
|
||||
{
|
||||
MIDIPROPTIMEDIV prop;
|
||||
prop.cbStruct = sizeof(MIDIPROPTIMEDIV);
|
||||
prop.dwTimeDiv = division;
|
||||
midiStreamProperty(hmido, (LPBYTE)&prop, MIDIPROP_SET|MIDIPROP_TIMEDIV);
|
||||
}
|
||||
|
||||
void MPU_SetVolume(int32_t volume)
|
||||
{
|
||||
/*
|
||||
HMIXER hmixer;
|
||||
int32_t mixerid;
|
||||
MIXERCONTROLDETAILS mxcd;
|
||||
MIXERCONTROLDETAILS_UNSIGNED mxcdu;
|
||||
MMRESULT mme;
|
||||
|
||||
if (mididevice < 0) return;
|
||||
|
||||
mme = mixerOpen(&hmixer, mididevice, 0,0, MIXER_OBJECTF_MIDIOUT);
|
||||
if (mme) {
|
||||
puts("Failed opening mixer");
|
||||
return;
|
||||
}
|
||||
|
||||
mixerGetID(hmixer, &mixerid, MIXER_OBJECTF_HMIXER);
|
||||
printf("mixerid=%d\n",mixerid);
|
||||
|
||||
ZeroMemory(&mxcd,sizeof(mxcd));
|
||||
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
|
||||
mxcd.dwControlID = MIXERCONTROL_CONTROLTYPE_VOLUME;
|
||||
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
|
||||
mxcd.paDetails = (LPVOID)&mxcdu;
|
||||
mxcdu.dwValue = (volume << 8) & 0xffff;
|
||||
|
||||
printf("set %d\n",mixerSetControlDetails((HMIXEROBJ)mididevice, &mxcd,
|
||||
MIXER_OBJECTF_MIDIOUT|MIXER_SETCONTROLDETAILSF_VALUE));
|
||||
|
||||
mixerClose(hmixer);
|
||||
*/
|
||||
UNREFERENCED_PARAMETER(volume);
|
||||
}
|
||||
|
||||
int32_t MPU_GetVolume(void)
|
||||
{
|
||||
// if (mididevice < 0) return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
#ifndef __MPU401_H
|
||||
#define __MPU401_H
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
#define MPU_DefaultAddress 0x330
|
||||
|
||||
enum MPU_ERRORS
|
||||
{
|
||||
MPU_Warning = -2,
|
||||
MPU_Error = -1,
|
||||
MPU_Ok = 0
|
||||
};
|
||||
|
||||
#define MPU_NotFound -1
|
||||
#define MPU_UARTFailed -2
|
||||
|
||||
#define MPU_ReadyToWrite 0x40
|
||||
#define MPU_ReadyToRead 0x80
|
||||
#define MPU_CmdEnterUART 0x3f
|
||||
#define MPU_CmdReset 0xff
|
||||
#define MPU_CmdAcknowledge 0xfe
|
||||
|
||||
extern int32_t _MPU_CurrentBuffer;
|
||||
extern int32_t _MPU_BuffersWaiting;
|
||||
|
||||
void MPU_SendMidi( char *data, int32_t count );
|
||||
void MPU_SendMidiImmediate( char *data, int32_t count );
|
||||
int32_t MPU_Reset( void );
|
||||
int32_t MPU_Init( int32_t addr );
|
||||
void MPU_NoteOff( int32_t channel, int32_t key, int32_t velocity );
|
||||
void MPU_NoteOn( int32_t channel, int32_t key, int32_t velocity );
|
||||
void MPU_PolyAftertouch( int32_t channel, int32_t key, int32_t pressure );
|
||||
void MPU_ControlChange( int32_t channel, int32_t number, int32_t value );
|
||||
void MPU_ProgramChange( int32_t channel, int32_t program );
|
||||
void MPU_ChannelAftertouch( int32_t channel, int32_t pressure );
|
||||
void MPU_PitchBend( int32_t channel, int32_t lsb, int32_t msb );
|
||||
|
||||
void MPU_SetTempo(int32_t tempo);
|
||||
void MPU_SetDivision(int32_t division);
|
||||
void MPU_SetVolume(int32_t volume);
|
||||
int32_t MPU_GetVolume(void);
|
||||
|
||||
void MPU_BeginPlayback( void );
|
||||
void MPU_Pause(void);
|
||||
void MPU_Unpause(void);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load diff
|
@ -1,133 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
file: MULTIVOC.H
|
||||
|
||||
author: James R. Dose
|
||||
date: December 20, 1993
|
||||
|
||||
Public header for MULTIVOC.C
|
||||
|
||||
(c) Copyright 1993 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __MULTIVOC_H
|
||||
#define __MULTIVOC_H
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
#define MV_MinVoiceHandle 1
|
||||
|
||||
extern int32_t MV_ErrorCode;
|
||||
|
||||
enum MV_Errors
|
||||
{
|
||||
MV_Warning = -2,
|
||||
MV_Error = -1,
|
||||
MV_Ok = 0,
|
||||
MV_UnsupportedCard,
|
||||
MV_NotInstalled,
|
||||
MV_NoVoices,
|
||||
MV_NoMem,
|
||||
MV_VoiceNotFound,
|
||||
MV_BlasterError,
|
||||
MV_DPMI_Error,
|
||||
MV_InvalidVOCFile,
|
||||
MV_InvalidWAVFile,
|
||||
MV_InvalidOGGFile,
|
||||
MV_InvalidMixMode,
|
||||
MV_IrqFailure,
|
||||
MV_DMAFailure,
|
||||
MV_DMA16Failure,
|
||||
MV_NullRecordFunction
|
||||
};
|
||||
|
||||
typedef int16_t MONO16;
|
||||
typedef int8_t MONO8;
|
||||
|
||||
typedef MONO8 VOLUME8[ 256 ];
|
||||
typedef MONO16 VOLUME16[ 256 ];
|
||||
|
||||
char *MV_ErrorString( int32_t ErrorNumber );
|
||||
int32_t MV_VoicePlaying( int32_t handle );
|
||||
int32_t MV_KillAllVoices( void );
|
||||
int32_t MV_Kill( int32_t handle );
|
||||
int32_t MV_VoicesPlaying( void );
|
||||
int32_t MV_VoiceAvailable( int32_t priority );
|
||||
int32_t MV_SetPitch( int32_t handle, int32_t pitchoffset );
|
||||
int32_t MV_SetFrequency( int32_t handle, int32_t frequency );
|
||||
int32_t MV_EndLooping( int32_t handle );
|
||||
int32_t MV_SetPan( int32_t handle, int32_t vol, int32_t left, int32_t right );
|
||||
int32_t MV_Pan3D( int32_t handle, int32_t angle, int32_t distance );
|
||||
void MV_SetReverb( int32_t reverb );
|
||||
void MV_SetFastReverb( int32_t reverb );
|
||||
int32_t MV_GetMaxReverbDelay( void );
|
||||
int32_t MV_GetReverbDelay( void );
|
||||
void MV_SetReverbDelay( int32_t delay );
|
||||
int32_t MV_SetMixMode( int32_t numchannels, int32_t samplebits );
|
||||
int32_t MV_StartPlayback( void );
|
||||
void MV_StopPlayback( void );
|
||||
int32_t MV_StartRecording( int32_t MixRate, void ( *function )( char *ptr, int32_t length ) );
|
||||
void MV_StopRecord( void );
|
||||
int32_t MV_StartDemandFeedPlayback( void ( *function )( char **ptr, uint32_t *length ),
|
||||
int32_t rate, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t MV_PlayRaw( char *ptr, uint32_t length,
|
||||
uint32_t rate, int32_t pitchoffset, int32_t vol, int32_t left,
|
||||
int32_t right, int32_t priority, uint32_t callbackval );
|
||||
int32_t MV_PlayLoopedRaw( char *ptr, int32_t length,
|
||||
char *loopstart, char *loopend, uint32_t rate, int32_t pitchoffset,
|
||||
int32_t vol, int32_t left, int32_t right, int32_t priority,
|
||||
uint32_t callbackval );
|
||||
int32_t MV_PlayWAV( char *ptr, int32_t pitchoffset, int32_t vol, int32_t left,
|
||||
int32_t right, int32_t priority, uint32_t callbackval );
|
||||
int32_t MV_PlayWAV3D( char *ptr, int32_t pitchoffset, int32_t angle, int32_t distance,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t MV_PlayLoopedWAV( char *ptr, int32_t loopstart, int32_t loopend,
|
||||
int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
|
||||
uint32_t callbackval );
|
||||
int32_t MV_PlayOGG( char *ptr, int32_t pitchoffset, int32_t vol, int32_t left,
|
||||
int32_t right, int32_t priority, uint32_t callbackval );
|
||||
int32_t MV_PlayOGG3D( char *ptr, int32_t pitchoffset, int32_t angle, int32_t distance,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t MV_PlayLoopedOGG( char *ptr, int32_t loopstart, int32_t loopend,
|
||||
int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
|
||||
uint32_t callbackval );
|
||||
int32_t MV_PlayVOC3D( char *ptr, int32_t pitchoffset, int32_t angle, int32_t distance,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t MV_PlayVOC( char *ptr, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right,
|
||||
int32_t priority, uint32_t callbackval );
|
||||
int32_t MV_PlayLoopedVOC( char *ptr, int32_t loopstart, int32_t loopend,
|
||||
int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority,
|
||||
uint32_t callbackval );
|
||||
void MV_CreateVolumeTable( int32_t index, int32_t volume, int32_t MaxVolume );
|
||||
void MV_SetVolume( int32_t volume );
|
||||
int32_t MV_GetVolume( void );
|
||||
void MV_SetCallBack( void ( *function )( uint32_t ) );
|
||||
void MV_SetReverseStereo( int32_t setting );
|
||||
int32_t MV_GetReverseStereo( void );
|
||||
int32_t MV_Init( int32_t soundcard, int32_t MixRate, int32_t Voices, int32_t numchannels,
|
||||
int32_t samplebits );
|
||||
int32_t MV_Shutdown( void );
|
||||
|
||||
void MV_Update(void);
|
||||
|
||||
#endif
|
|
@ -1,634 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: MUSIC.C
|
||||
|
||||
author: James R. Dose
|
||||
date: March 25, 1994
|
||||
|
||||
Device independant music playback routines.
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "music.h"
|
||||
#include "midi.h"
|
||||
#include "mpu401.h"
|
||||
#include "compat.h"
|
||||
#ifdef USE_OPENAL
|
||||
#include "openal.h"
|
||||
#endif
|
||||
#include "duke3d.h"
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE ( 1 == 1 )
|
||||
#define FALSE ( !TRUE )
|
||||
#endif
|
||||
|
||||
#ifndef min
|
||||
#define min(a,b) (((a)<(b))?(a):(b))
|
||||
#endif
|
||||
|
||||
#ifndef max
|
||||
# define max(a,b) ( ((a) > (b)) ? (a) : (b) )
|
||||
#endif
|
||||
|
||||
int32_t MUSIC_SoundDevice = -1;
|
||||
int32_t MUSIC_ErrorCode = MUSIC_Ok;
|
||||
|
||||
static midifuncs MUSIC_MidiFunctions;
|
||||
|
||||
int32_t MUSIC_InitMidi(int32_t card, midifuncs *Funcs, int32_t Address);
|
||||
|
||||
#define MUSIC_SetErrorCode( status ) \
|
||||
MUSIC_ErrorCode = ( status );
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_ErrorString
|
||||
|
||||
Returns a pointer to the error message associated with an error
|
||||
number. A -1 returns a pointer the current error.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
char *MUSIC_ErrorString
|
||||
(
|
||||
int32_t ErrorNumber
|
||||
)
|
||||
|
||||
{
|
||||
char *ErrorString;
|
||||
|
||||
switch (ErrorNumber)
|
||||
{
|
||||
case MUSIC_Warning :
|
||||
case MUSIC_Error :
|
||||
ErrorString = MUSIC_ErrorString(MUSIC_ErrorCode);
|
||||
break;
|
||||
|
||||
case MUSIC_Ok :
|
||||
ErrorString = "Music ok.";
|
||||
break;
|
||||
|
||||
case MUSIC_ASSVersion :
|
||||
ErrorString = "Apogee Sound System Version WinMM "
|
||||
"Programmed by Jim Dose, Ported by Jonathon Fowler\n"
|
||||
"(c) Copyright 1996 James R. Dose. All Rights Reserved.\n";
|
||||
break;
|
||||
|
||||
case MUSIC_SoundCardError :
|
||||
case MUSIC_MPU401Error :
|
||||
ErrorString = "Could not detect MPU-401.";
|
||||
break;
|
||||
|
||||
case MUSIC_InvalidCard :
|
||||
ErrorString = "Invalid Music device.";
|
||||
break;
|
||||
|
||||
case MUSIC_MidiError :
|
||||
ErrorString = "Error playing MIDI file.";
|
||||
break;
|
||||
|
||||
case MUSIC_TaskManError :
|
||||
ErrorString = "TaskMan error.";
|
||||
break;
|
||||
|
||||
case MUSIC_DPMI_Error :
|
||||
ErrorString = "DPMI Error in MUSIC.";
|
||||
break;
|
||||
|
||||
default :
|
||||
ErrorString = "Unknown Music error code.";
|
||||
break;
|
||||
}
|
||||
|
||||
return(ErrorString);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_Init
|
||||
|
||||
Selects which sound device to use.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_Init
|
||||
(
|
||||
int32_t SoundCard,
|
||||
int32_t Address
|
||||
)
|
||||
|
||||
{
|
||||
int32_t i;
|
||||
int32_t status;
|
||||
|
||||
for (i = 0; i < 128; i++)
|
||||
{
|
||||
MIDI_PatchMap[ i ] = i;
|
||||
}
|
||||
|
||||
MUSIC_SoundDevice = SoundCard;
|
||||
|
||||
status = MUSIC_InitMidi(SoundCard, &MUSIC_MidiFunctions, Address);
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
if (AL_Init())
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
// no AL support so shitcan the ogg definitions
|
||||
for (i=(MAXLEVELS*(MAXVOLUMES+1))-1;i>=0;i--) // +1 volume for "intro", "briefing" music
|
||||
{
|
||||
if (MapInfo[i].musicfn1 != NULL)
|
||||
Bfree(MapInfo[i].musicfn1);
|
||||
MapInfo[i].musicfn1 = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return(status);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_Shutdown
|
||||
|
||||
Terminates use of sound device.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_Shutdown
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
int32_t status;
|
||||
|
||||
status = MUSIC_Ok;
|
||||
|
||||
MIDI_StopSong();
|
||||
|
||||
//MPU_Reset();
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
AL_Shutdown();
|
||||
#endif
|
||||
|
||||
return(status);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetVolume
|
||||
|
||||
Sets the volume of music playback.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetVolume
|
||||
(
|
||||
int32_t volume
|
||||
)
|
||||
|
||||
{
|
||||
volume = max(0, volume);
|
||||
volume = min(volume, 255);
|
||||
#ifdef USE_OPENAL
|
||||
AL_SetMusicVolume(volume);
|
||||
#endif
|
||||
if (MUSIC_SoundDevice != -1)
|
||||
{
|
||||
MIDI_SetVolume(volume);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetMidiChannelVolume
|
||||
|
||||
Sets the volume of music playback on the specified MIDI channel.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetMidiChannelVolume
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t volume
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_SetUserChannelVolume(channel, volume);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_ResetMidiChannelVolumes
|
||||
|
||||
Sets the volume of music playback on all MIDI channels to full volume.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_ResetMidiChannelVolumes
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_ResetUserChannelVolume();
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_GetVolume
|
||||
|
||||
Returns the volume of music playback.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_GetVolume
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
if (MUSIC_SoundDevice == -1)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
return(MIDI_GetVolume());
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetLoopFlag
|
||||
|
||||
Set whether the music will loop or end when it reaches the end of
|
||||
the song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetLoopFlag
|
||||
(
|
||||
int32_t loopflag
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_SetLoopFlag(loopflag);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SongPlaying
|
||||
|
||||
Returns whether there is a song playing.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_SongPlaying
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return(MIDI_SongPlaying());
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_Continue
|
||||
|
||||
Continues playback of a paused song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_Continue
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
#ifdef USE_OPENAL
|
||||
AL_Continue();
|
||||
#endif
|
||||
MIDI_ContinueSong();
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_Pause
|
||||
|
||||
Pauses playback of a song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_Pause
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
#ifdef USE_OPENAL
|
||||
AL_Pause();
|
||||
#endif
|
||||
MIDI_PauseSong();
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_StopSong
|
||||
|
||||
Stops playback of current song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_StopSong
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
#ifdef USE_OPENAL
|
||||
AL_Stop();
|
||||
#endif
|
||||
MUSIC_StopFade();
|
||||
MIDI_StopSong();
|
||||
MUSIC_SetErrorCode(MUSIC_Ok);
|
||||
return(MUSIC_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_PlaySong
|
||||
|
||||
Begins playback of MIDI song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_PlaySong
|
||||
(
|
||||
char *song,
|
||||
int32_t loopflag
|
||||
)
|
||||
|
||||
{
|
||||
int32_t status;
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
AL_PlaySong((char *)song,loopflag);
|
||||
|
||||
if (AL_isntALmusic())
|
||||
#endif
|
||||
{
|
||||
MUSIC_StopSong();
|
||||
status = MIDI_PlaySong(song, loopflag);
|
||||
if (status != MIDI_Ok)
|
||||
{
|
||||
MUSIC_SetErrorCode(MUSIC_MidiError);
|
||||
return(MUSIC_Warning);
|
||||
}
|
||||
}
|
||||
|
||||
return(MUSIC_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetContext
|
||||
|
||||
Sets the song context.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetContext
|
||||
(
|
||||
int32_t context
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_SetContext(context);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_GetContext
|
||||
|
||||
Returns the current song context.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_GetContext
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return MIDI_GetContext();
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetSongTick
|
||||
|
||||
Sets the position of the song pointer.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetSongTick
|
||||
(
|
||||
uint32_t PositionInTicks
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_SetSongTick(PositionInTicks);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetSongTime
|
||||
|
||||
Sets the position of the song pointer.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetSongTime
|
||||
(
|
||||
uint32_t milliseconds
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_SetSongTime(milliseconds);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_SetSongPosition
|
||||
|
||||
Sets the position of the song pointer.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_SetSongPosition
|
||||
(
|
||||
int32_t measure,
|
||||
int32_t beat,
|
||||
int32_t tick
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_SetSongPosition(measure, beat, tick);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_GetSongPosition
|
||||
|
||||
Returns the position of the song pointer.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_GetSongPosition
|
||||
(
|
||||
songposition *pos
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_GetSongPosition(pos);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_GetSongLength
|
||||
|
||||
Returns the length of the song.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_GetSongLength
|
||||
(
|
||||
songposition *pos
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_GetSongLength(pos);
|
||||
}
|
||||
|
||||
|
||||
int32_t MUSIC_InitMidi
|
||||
(
|
||||
int32_t card,
|
||||
midifuncs *Funcs,
|
||||
int32_t Address
|
||||
)
|
||||
|
||||
{
|
||||
UNREFERENCED_PARAMETER(card);
|
||||
UNREFERENCED_PARAMETER(Address);
|
||||
Funcs->NoteOff = MPU_NoteOff;
|
||||
Funcs->NoteOn = MPU_NoteOn;
|
||||
Funcs->PolyAftertouch = MPU_PolyAftertouch;
|
||||
Funcs->ControlChange = MPU_ControlChange;
|
||||
Funcs->ProgramChange = MPU_ProgramChange;
|
||||
Funcs->ChannelAftertouch = MPU_ChannelAftertouch;
|
||||
Funcs->PitchBend = MPU_PitchBend;
|
||||
Funcs->ReleasePatches = NULL;
|
||||
Funcs->LoadPatch = NULL;
|
||||
Funcs->SetVolume = NULL /*MPU_SetVolume*/;
|
||||
Funcs->GetVolume = NULL /*MPU_GetVolume*/;
|
||||
|
||||
MIDI_SetMidiFuncs(Funcs);
|
||||
|
||||
return(MIDI_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_FadeVolume
|
||||
|
||||
Fades music volume from current level to another over a specified
|
||||
period of time.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_FadeVolume
|
||||
(
|
||||
int32_t tovolume,
|
||||
int32_t milliseconds
|
||||
)
|
||||
|
||||
{
|
||||
UNREFERENCED_PARAMETER(milliseconds);
|
||||
MIDI_SetVolume(tovolume);
|
||||
return(MUSIC_Ok);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_FadeActive
|
||||
|
||||
Returns whether the fade routine is active.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
int32_t MUSIC_FadeActive
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_StopFade
|
||||
|
||||
Stops fading the music.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_StopFade
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_RerouteMidiChannel
|
||||
|
||||
Sets callback function to reroute MIDI commands from specified
|
||||
function.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_RerouteMidiChannel
|
||||
(
|
||||
int32_t channel,
|
||||
int32_t(*function)(int32_t event, int32_t c1, int32_t c2)
|
||||
)
|
||||
|
||||
{
|
||||
MIDI_RerouteMidiChannel(channel, function);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: MUSIC_RegisterTimbreBank
|
||||
|
||||
Halts playback of all sounds.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
void MUSIC_RegisterTimbreBank
|
||||
(
|
||||
char *timbres
|
||||
)
|
||||
|
||||
{
|
||||
UNREFERENCED_PARAMETER(timbres);
|
||||
}
|
||||
|
||||
|
||||
void MUSIC_Update(void)
|
||||
{
|
||||
MIDI_UpdateMusic();
|
||||
}
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: MUSIC.H
|
||||
|
||||
author: James R. Dose
|
||||
date: March 25, 1994
|
||||
|
||||
Public header for MUSIC.C
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __MUSIC_H
|
||||
#define __MUSIC_H
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
extern int32_t MUSIC_ErrorCode;
|
||||
|
||||
enum MUSIC_ERRORS
|
||||
{
|
||||
MUSIC_Warning = -2,
|
||||
MUSIC_Error = -1,
|
||||
MUSIC_Ok = 0,
|
||||
MUSIC_ASSVersion,
|
||||
MUSIC_SoundCardError,
|
||||
MUSIC_MPU401Error,
|
||||
MUSIC_InvalidCard,
|
||||
MUSIC_MidiError,
|
||||
MUSIC_TaskManError,
|
||||
MUSIC_DPMI_Error
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t tickposition;
|
||||
uint32_t milliseconds;
|
||||
uint32_t measure;
|
||||
uint32_t beat;
|
||||
uint32_t tick;
|
||||
} songposition;
|
||||
|
||||
#define MUSIC_LoopSong ( 1 == 1 )
|
||||
#define MUSIC_PlayOnce ( !MUSIC_LoopSong )
|
||||
|
||||
char *MUSIC_ErrorString( int32_t ErrorNumber );
|
||||
int32_t MUSIC_Init( int32_t SoundCard, int32_t Address );
|
||||
int32_t MUSIC_Shutdown( void );
|
||||
void MUSIC_SetVolume( int32_t volume );
|
||||
void MUSIC_SetMidiChannelVolume( int32_t channel, int32_t volume );
|
||||
void MUSIC_ResetMidiChannelVolumes( void );
|
||||
int32_t MUSIC_GetVolume( void );
|
||||
void MUSIC_SetLoopFlag( int32_t loopflag );
|
||||
int32_t MUSIC_SongPlaying( void );
|
||||
void MUSIC_Continue( void );
|
||||
void MUSIC_Pause( void );
|
||||
int32_t MUSIC_StopSong( void );
|
||||
int32_t MUSIC_PlaySong( char *song, int32_t loopflag );
|
||||
void MUSIC_SetContext( int32_t context );
|
||||
int32_t MUSIC_GetContext( void );
|
||||
void MUSIC_SetSongTick( uint32_t PositionInTicks );
|
||||
void MUSIC_SetSongTime( uint32_t milliseconds );
|
||||
void MUSIC_SetSongPosition( int32_t measure, int32_t beat, int32_t tick );
|
||||
void MUSIC_GetSongPosition( songposition *pos );
|
||||
void MUSIC_GetSongLength( songposition *pos );
|
||||
int32_t MUSIC_FadeVolume( int32_t tovolume, int32_t milliseconds );
|
||||
int32_t MUSIC_FadeActive( void );
|
||||
void MUSIC_StopFade( void );
|
||||
void MUSIC_RerouteMidiChannel( int32_t channel, int32_t ( *function )( int32_t event, int32_t c1, int32_t c2 ) );
|
||||
void MUSIC_RegisterTimbreBank( char *timbres );
|
||||
void MUSIC_Update(void);
|
||||
|
||||
#endif
|
|
@ -1,301 +0,0 @@
|
|||
#include "multivoc.h"
|
||||
|
||||
extern char *MV_MixDestination;
|
||||
extern uint32_t MV_MixPosition;
|
||||
|
||||
extern char *MV_LeftVolume;
|
||||
extern char *MV_RightVolume;
|
||||
|
||||
extern char *MV_HarshClipTable;
|
||||
|
||||
extern int32_t MV_RightChannelOffset;
|
||||
extern int32_t MV_SampleSize;
|
||||
|
||||
void MV_Mix8BitMono(uint32_t position, uint32_t rate,
|
||||
const char *start, uint32_t length)
|
||||
{
|
||||
const char *src;
|
||||
char *dest;
|
||||
uint32_t i;
|
||||
|
||||
src = (const char *)start;
|
||||
dest = (char *)MV_MixDestination;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
int32_t s = src[position >> 16];
|
||||
int32_t d = *dest;
|
||||
|
||||
s = MV_LeftVolume[s * 2];
|
||||
|
||||
s += d;
|
||||
|
||||
s = MV_HarshClipTable[s + 0x80];
|
||||
|
||||
*dest = (s & 0xff);
|
||||
|
||||
position += rate;
|
||||
dest += MV_SampleSize;
|
||||
}
|
||||
|
||||
MV_MixPosition = position;
|
||||
MV_MixDestination = (char *)dest;
|
||||
}
|
||||
|
||||
void MV_Mix8BitStereo(uint32_t position,
|
||||
uint32_t rate, const char *start, uint32_t length)
|
||||
{
|
||||
const char *src;
|
||||
char *dest;
|
||||
uint32_t i;
|
||||
|
||||
src = (const char *)start;
|
||||
dest = (char *)MV_MixDestination;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
int32_t s = src[(position >> 16)];
|
||||
int32_t dl = dest[0];
|
||||
int32_t dr = dest[MV_RightChannelOffset];
|
||||
|
||||
dl += MV_LeftVolume[s * 2];
|
||||
dr += MV_RightVolume[s * 2];
|
||||
|
||||
dl = MV_HarshClipTable[dl + 0x80];
|
||||
dr = MV_HarshClipTable[dr + 0x80];
|
||||
|
||||
dest[0] = (dl & 0xff);
|
||||
dest[MV_RightChannelOffset] = (dr & 0xff);
|
||||
|
||||
position += rate;
|
||||
dest += MV_SampleSize;
|
||||
}
|
||||
|
||||
MV_MixPosition = position;
|
||||
MV_MixDestination = (char *)dest;
|
||||
}
|
||||
|
||||
void MV_Mix16BitMono(uint32_t position,
|
||||
uint32_t rate, const char *start, uint32_t length)
|
||||
{
|
||||
const int16_t *MV_LeftVolumeS;
|
||||
const char *src;
|
||||
int16_t *dest;
|
||||
uint32_t i;
|
||||
|
||||
src = (const char *)start;
|
||||
dest = (int16_t *)MV_MixDestination;
|
||||
|
||||
MV_LeftVolumeS = (const int16_t *)MV_LeftVolume;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
int32_t s = src[position >> 16];
|
||||
int32_t d = dest[0];
|
||||
|
||||
s = MV_LeftVolumeS[s];
|
||||
|
||||
s += d;
|
||||
|
||||
if (s < -32768) s = -32768;
|
||||
if (s > 32767) s = 32767;
|
||||
|
||||
*dest = (int16_t) s;
|
||||
|
||||
position += rate;
|
||||
dest += MV_SampleSize/2;
|
||||
}
|
||||
|
||||
MV_MixPosition = position;
|
||||
MV_MixDestination = (char *)dest;
|
||||
}
|
||||
|
||||
void MV_Mix16BitStereo(uint32_t position,
|
||||
uint32_t rate, const char *start, uint32_t length)
|
||||
{
|
||||
const int16_t *MV_LeftVolumeS;
|
||||
const int16_t *MV_RightVolumeS;
|
||||
const char *src;
|
||||
int16_t *dest;
|
||||
uint32_t i;
|
||||
|
||||
src = (char *)start;
|
||||
dest = (int16_t *)MV_MixDestination;
|
||||
|
||||
MV_LeftVolumeS = (const int16_t *)MV_LeftVolume;
|
||||
MV_RightVolumeS = (const int16_t *)MV_RightVolume;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
int32_t s = src[position >> 16];
|
||||
int32_t dl = dest[0];
|
||||
int32_t dr = dest[MV_RightChannelOffset/2];
|
||||
|
||||
dl += MV_LeftVolumeS[s];
|
||||
dr += MV_RightVolumeS[s];
|
||||
|
||||
if (dl < -32768) dl = -32768;
|
||||
if (dl > 32767) dl = 32767;
|
||||
if (dr < -32768) dr = -32768;
|
||||
if (dr > 32767) dr = 32767;
|
||||
|
||||
dest[0] = (int16_t) dl;
|
||||
dest[MV_RightChannelOffset/2] = (int16_t) dr;
|
||||
|
||||
position += rate;
|
||||
dest += MV_SampleSize/2;
|
||||
}
|
||||
|
||||
MV_MixPosition = position;
|
||||
MV_MixDestination = (char *)dest;
|
||||
}
|
||||
|
||||
void MV_Mix8BitMono16(uint32_t position, uint32_t rate,
|
||||
const char *start, uint32_t length)
|
||||
{
|
||||
const char *src;
|
||||
char *dest;
|
||||
uint32_t i;
|
||||
|
||||
src = (const char *)start + 1;
|
||||
dest = (char *)MV_MixDestination;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
int32_t s = (int32_t)src[(position >> 16) * 2] + 0x80;
|
||||
int32_t d = *dest;
|
||||
|
||||
s = MV_LeftVolume[s * 2];
|
||||
|
||||
s += d;
|
||||
|
||||
s = MV_HarshClipTable[s + 0x80];
|
||||
|
||||
*dest = (s & 0xff);
|
||||
|
||||
position += rate;
|
||||
dest += MV_SampleSize;
|
||||
}
|
||||
|
||||
MV_MixPosition = position;
|
||||
MV_MixDestination = (char *)dest;
|
||||
}
|
||||
|
||||
void MV_Mix8BitStereo16(uint32_t position,
|
||||
uint32_t rate, const char *start, uint32_t length)
|
||||
{
|
||||
const char *src;
|
||||
char *dest;
|
||||
uint32_t i;
|
||||
|
||||
src = (const char *)start + 1;
|
||||
dest = (char *)MV_MixDestination;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
int32_t s = src[(position >> 16) * 2] + 0x80;
|
||||
int32_t dl = dest[0];
|
||||
int32_t dr = dest[MV_RightChannelOffset];
|
||||
|
||||
dl += MV_LeftVolume[s * 2];
|
||||
dr += MV_RightVolume[s * 2];
|
||||
|
||||
dl = MV_HarshClipTable[dl + 0x80];
|
||||
dr = MV_HarshClipTable[dr + 0x80];
|
||||
|
||||
dest[0] = (dl & 0xff);
|
||||
dest[MV_RightChannelOffset] = (dr & 0xff);
|
||||
|
||||
position += rate;
|
||||
dest += MV_SampleSize;
|
||||
}
|
||||
|
||||
MV_MixPosition = position;
|
||||
MV_MixDestination = (char *)dest;
|
||||
}
|
||||
|
||||
void MV_Mix16BitMono16(uint32_t position,
|
||||
uint32_t rate, const char *start, uint32_t length)
|
||||
{
|
||||
const int16_t *MV_LeftVolumeS;
|
||||
const char *src;
|
||||
int16_t *dest;
|
||||
uint32_t i;
|
||||
|
||||
src = (const char *)start;
|
||||
dest = (int16_t *)MV_MixDestination;
|
||||
|
||||
MV_LeftVolumeS = (const int16_t *)MV_LeftVolume;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
int32_t sl = src[(position >> 16) * 2 + 0];
|
||||
int32_t sh = src[(position >> 16) * 2 + 1] ^ 0x80;
|
||||
|
||||
int32_t d = *dest;
|
||||
|
||||
sl = MV_LeftVolume[sl * 2 + 1];
|
||||
sh = MV_LeftVolumeS[sh];
|
||||
|
||||
d = sl + sh + 0x80 + d;
|
||||
|
||||
if (d < -32768) d = -32768;
|
||||
if (d > 32767) d = 32767;
|
||||
|
||||
*dest = (int16_t) d;
|
||||
|
||||
position += rate;
|
||||
dest += MV_SampleSize/2;
|
||||
}
|
||||
|
||||
MV_MixPosition = position;
|
||||
MV_MixDestination = (char *)dest;
|
||||
}
|
||||
|
||||
void MV_Mix16BitStereo16(uint32_t position,
|
||||
uint32_t rate, const char *start, uint32_t length)
|
||||
{
|
||||
const int16_t *MV_LeftVolumeS;
|
||||
const int16_t *MV_RightVolumeS;
|
||||
const char *src;
|
||||
int16_t *dest;
|
||||
uint32_t i;
|
||||
|
||||
src = (const char *)start;
|
||||
dest = (int16_t *)MV_MixDestination;
|
||||
|
||||
MV_LeftVolumeS = (const int16_t *)MV_LeftVolume;
|
||||
MV_RightVolumeS = (const int16_t *)MV_RightVolume;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
int32_t sl = src[(position >> 16) * 2 + 0];
|
||||
int32_t sh = src[(position >> 16) * 2 + 1] ^ 0x80;
|
||||
|
||||
int32_t dl = dest[0];
|
||||
int32_t dr = dest[MV_RightChannelOffset/2];
|
||||
|
||||
int32_t sll = MV_LeftVolume[sl * 2 + 1];
|
||||
int32_t slh = MV_LeftVolumeS[sh];
|
||||
|
||||
int32_t srl = MV_RightVolume[sl * 2 + 1];
|
||||
int32_t srh = MV_RightVolumeS[sh];
|
||||
|
||||
dl = sll + slh + 0x80 + dl;
|
||||
dr = srl + srh + 0x80 + dr;
|
||||
|
||||
if (dl < -32768) dl = -32768;
|
||||
if (dl > 32767) dl = 32767;
|
||||
if (dr < -32768) dr = -32768;
|
||||
if (dr > 32767) dr = 32767;
|
||||
|
||||
dest[0] = (int16_t) dl;
|
||||
dest[MV_RightChannelOffset/2] = (int16_t) dr;
|
||||
|
||||
position += rate;
|
||||
dest += MV_SampleSize/2;
|
||||
}
|
||||
|
||||
MV_MixPosition = position;
|
||||
MV_MixDestination = (char *)dest;
|
||||
}
|
|
@ -1,487 +0,0 @@
|
|||
.586P
|
||||
|
||||
EXTRN _MV_HarshClipTable : dword
|
||||
EXTRN _MV_MixDestination : dword
|
||||
EXTRN _MV_MixPosition : dword
|
||||
EXTRN _MV_LeftVolume : dword
|
||||
EXTRN _MV_RightVolume : dword
|
||||
EXTRN _MV_SampleSize : dword
|
||||
EXTRN _MV_RightChannelOffset : dword
|
||||
|
||||
CODE SEGMENT PUBLIC USE32 'DATA'
|
||||
ASSUME cs:CODE,ds:CODE
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitMono
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_Mix8BitMono
|
||||
_MV_Mix8BitMono:
|
||||
; Two at once
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [apatch7+2],bl
|
||||
mov byte ptr [apatch8+2],bl
|
||||
mov byte ptr [apatch9+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume ; Since we're mono, use left volume
|
||||
mov dword ptr [apatch1+4],ebx
|
||||
mov dword ptr [apatch2+4],ebx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, _MV_HarshClipTable
|
||||
add ebx, 128
|
||||
mov dword ptr [apatch3+2],ebx
|
||||
mov dword ptr [apatch4+2],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [apatch5+2],edx
|
||||
mov dword ptr [apatch6+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je short exit8m
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; apatch1 - volume table
|
||||
; apatch2 - volume table
|
||||
; apatch3 - harsh clip table
|
||||
; apatch4 - harsh clip table
|
||||
; apatch5 - sample rate
|
||||
; apatch6 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movzx eax, byte ptr [esi+eax] ; get first sample
|
||||
movzx ebx, byte ptr [esi+ebx] ; get second sample
|
||||
|
||||
;ALIGN 4
|
||||
mix8Mloop:
|
||||
movzx edx, byte ptr [edi] ; get current sample from destination
|
||||
apatch1:
|
||||
movsx eax, byte ptr [2*eax+12345678h] ; volume translate first sample
|
||||
apatch2:
|
||||
movsx ebx, byte ptr [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
apatch9:
|
||||
movzx edx, byte ptr [edi + 1] ; get current sample from destination
|
||||
apatch3:
|
||||
mov eax, [eax + 12345678h] ; harsh clip new sample
|
||||
add ebx, edx ; mix second sample
|
||||
mov [edi], al ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
apatch4:
|
||||
mov ebx, [ebx + 12345678h] ; harsh clip new sample
|
||||
apatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
apatch7:
|
||||
add edi, 1 ; move destination to second sample
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
mov [edi], bl ; write new sample to destination
|
||||
apatch6:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movzx ebx, byte ptr [esi+eax] ; get fourth sample
|
||||
movzx eax, byte ptr [esi+edx] ; get third sample
|
||||
apatch8:
|
||||
add edi, 2 ; move destination to third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Mloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
exit8m:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitStereo
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_Mix8BitStereo
|
||||
_MV_Mix8BitStereo:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [bpatch8+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, _MV_RightChannelOffset
|
||||
mov dword ptr [bpatch6+3],ebx
|
||||
mov dword ptr [bpatch7+2],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [bpatch1+4],ebx
|
||||
|
||||
mov ebx, _MV_RightVolume
|
||||
mov dword ptr [bpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [bpatch3+2],edx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, _MV_HarshClipTable
|
||||
add ebx,128
|
||||
mov dword ptr [bpatch4+2],ebx
|
||||
mov dword ptr [bpatch5+2],ebx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je short exit8S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; bpatch1 - left volume table
|
||||
; bpatch2 - right volume table
|
||||
; bpatch3 - sample rate
|
||||
; bpatch4 - harsh clip table
|
||||
; bpatch5 - harsh clip table
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movzx ebx, byte ptr [esi+eax] ; get first sample
|
||||
|
||||
;ALIGN 4
|
||||
mix8Sloop:
|
||||
bpatch1:
|
||||
movsx eax, byte ptr [2*ebx+12345678h] ; volume translate left sample
|
||||
movzx edx, byte ptr [edi] ; get current sample from destination
|
||||
bpatch2:
|
||||
movsx ebx, byte ptr [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
bpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
bpatch6:
|
||||
movzx edx, byte ptr [edi+12345678h] ; get current sample from destination
|
||||
bpatch4:
|
||||
mov eax, [eax + 12345678h] ; harsh clip left sample
|
||||
add ebx, edx ; mix right sample
|
||||
mov [edi], al ; write left sample to destination
|
||||
bpatch5:
|
||||
mov ebx, [ebx + 12345678h] ; harsh clip right sample
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
bpatch7:
|
||||
mov [edi+12345678h], bl ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
bpatch8:
|
||||
add edi, 2 ; move destination to second sample
|
||||
movzx ebx, byte ptr [esi+edx] ; get second sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Sloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
|
||||
EXIT8S:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitMono
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_Mix16BitMono
|
||||
_MV_Mix16BitMono:
|
||||
; Two at once
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [cpatch5+3],bl
|
||||
mov byte ptr [cpatch6+3],bl
|
||||
add bl,bl
|
||||
mov byte ptr [cpatch7+2],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [cpatch1+4],ebx
|
||||
mov dword ptr [cpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [cpatch3+2],edx
|
||||
mov dword ptr [cpatch4+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je exit16M
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; cpatch1 - volume table
|
||||
; cpatch2 - volume table
|
||||
; cpatch3 - sample rate
|
||||
; cpatch4 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movzx eax, byte ptr [esi+eax] ; get first sample
|
||||
movzx ebx, byte ptr [esi+ebx] ; get second sample
|
||||
|
||||
;ALIGN 4
|
||||
mix16Mloop:
|
||||
movsx edx, word ptr [edi] ; get current sample from destination
|
||||
cpatch1:
|
||||
movsx eax, word ptr [2*eax+12345678h] ; volume translate first sample
|
||||
cpatch2:
|
||||
movsx ebx, word ptr [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
cpatch5:
|
||||
movsx edx, word ptr [edi + 2] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short m16skip1
|
||||
mov eax, -32768
|
||||
jmp short m16skip2
|
||||
m16skip1:
|
||||
cmp eax, 32767
|
||||
jle short m16skip2
|
||||
mov eax, 32767
|
||||
m16skip2:
|
||||
add ebx, edx ; mix second sample
|
||||
mov [edi], ax ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short m16skip3
|
||||
mov ebx, -32768
|
||||
jmp short m16skip4
|
||||
m16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short m16skip4
|
||||
mov ebx, 32767
|
||||
m16skip4:
|
||||
cpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
cpatch6:
|
||||
mov [edi + 2], bx ; write new sample to destination
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
|
||||
cpatch4:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movzx ebx, byte ptr [esi+eax] ; get fourth sample
|
||||
cpatch7:
|
||||
add edi, 4 ; move destination to third sample
|
||||
movzx eax, byte ptr [esi+edx] ; get third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Mloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
EXIT16M:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitStereo
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_Mix16BitStereo
|
||||
_MV_Mix16BitStereo:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [dpatch6+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, _MV_RightChannelOffset
|
||||
mov dword ptr [dpatch4+3],ebx
|
||||
mov dword ptr [dpatch5+3],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [dpatch1+4],ebx
|
||||
|
||||
mov ebx, _MV_RightVolume
|
||||
mov dword ptr [dpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [dpatch3+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je exit16S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; dpatch1 - left volume table
|
||||
; dpatch2 - right volume table
|
||||
; dpatch3 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movzx ebx, byte ptr [esi+eax] ; get first sample
|
||||
|
||||
;ALIGN 4
|
||||
mix16Sloop:
|
||||
dpatch1:
|
||||
movsx eax, word ptr [2*ebx+12345678h] ; volume translate left sample
|
||||
movsx edx, word ptr [edi] ; get current sample from destination
|
||||
dpatch2:
|
||||
movsx ebx, word ptr [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
dpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
dpatch4:
|
||||
movsx edx, word ptr [edi+12345678h] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short s16skip1
|
||||
mov eax, -32768
|
||||
jmp short s16skip2
|
||||
s16skip1:
|
||||
cmp eax, 32767
|
||||
jle short s16skip2
|
||||
mov eax, 32767
|
||||
s16skip2:
|
||||
add ebx, edx ; mix right sample
|
||||
mov [edi], ax ; write left sample to destination
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short s16skip3
|
||||
mov ebx, -32768
|
||||
jmp short s16skip4
|
||||
s16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short s16skip4
|
||||
mov ebx, 32767
|
||||
s16skip4:
|
||||
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
dpatch5:
|
||||
mov [edi+12345678h], bx ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
dpatch6:
|
||||
add edi, 4 ; move destination to second sample
|
||||
movzx ebx, byte ptr [esi+edx] ; get second sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Sloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
exit16S:
|
||||
popad
|
||||
ret
|
||||
|
||||
CODE ENDS
|
||||
END
|
|
@ -1,524 +0,0 @@
|
|||
;Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
;
|
||||
;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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
;
|
||||
;Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
|
||||
CPU 386
|
||||
|
||||
SECTION .data
|
||||
|
||||
%ifdef UNDERSCORES
|
||||
|
||||
%define MV_Mix8BitMono _MV_Mix8BitMono
|
||||
%define MV_Mix8BitStereo _MV_Mix8BitStereo
|
||||
%define MV_Mix16BitMono _MV_Mix16BitMono
|
||||
%define MV_Mix16BitStereo _MV_Mix16BitStereo
|
||||
|
||||
%else
|
||||
|
||||
%define _MV_HarshClipTable MV_HarshClipTable
|
||||
%define _MV_MixDestination MV_MixDestination
|
||||
%define _MV_MixPosition MV_MixPosition
|
||||
%define _MV_LeftVolume MV_LeftVolume
|
||||
%define _MV_RightVolume MV_RightVolume
|
||||
%define _MV_SampleSize MV_SampleSize
|
||||
%define _MV_RightChannelOffset MV_RightChannelOffset
|
||||
|
||||
%endif
|
||||
|
||||
EXTERN _MV_HarshClipTable
|
||||
EXTERN _MV_MixDestination
|
||||
EXTERN _MV_MixPosition
|
||||
EXTERN _MV_LeftVolume
|
||||
EXTERN _MV_RightVolume
|
||||
EXTERN _MV_SampleSize
|
||||
EXTERN _MV_RightChannelOffset
|
||||
|
||||
GLOBAL MV_Mix8BitMono
|
||||
GLOBAL MV_Mix8BitStereo
|
||||
GLOBAL MV_Mix16BitMono
|
||||
GLOBAL MV_Mix16BitStereo
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitMono
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 4
|
||||
MV_Mix8BitMono:
|
||||
; Two at once
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, dword [_MV_SampleSize]
|
||||
mov byte [apatch7+2],bl
|
||||
mov byte [apatch8+2],bl
|
||||
mov byte [apatch9+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, dword [_MV_LeftVolume] ; Since we're mono, use left volume
|
||||
mov dword [apatch1+4],ebx
|
||||
mov dword [apatch2+4],ebx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, dword [_MV_HarshClipTable]
|
||||
add ebx, 128
|
||||
mov dword [apatch3+2],ebx
|
||||
mov dword [apatch4+2],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword [apatch5+2],edx
|
||||
mov dword [apatch6+2],edx
|
||||
|
||||
mov edi, dword [_MV_MixDestination] ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je short exit8m
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; apatch1 - volume table
|
||||
; apatch2 - volume table
|
||||
; apatch3 - harsh clip table
|
||||
; apatch4 - harsh clip table
|
||||
; apatch5 - sample rate
|
||||
; apatch6 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movzx eax, byte [esi+eax] ; get first sample
|
||||
movzx ebx, byte [esi+ebx] ; get second sample
|
||||
|
||||
ALIGN 4
|
||||
mix8Mloop:
|
||||
movzx edx, byte [edi] ; get current sample from destination
|
||||
apatch1:
|
||||
movsx eax, byte [2*eax+12345678h] ; volume translate first sample
|
||||
apatch2:
|
||||
movsx ebx, byte [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
apatch9:
|
||||
movzx edx, byte [edi + 1] ; get current sample from destination
|
||||
apatch3:
|
||||
mov eax, dword [eax + 12345678h] ; harsh clip new sample
|
||||
add ebx, edx ; mix second sample
|
||||
mov byte [edi], al ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
apatch4:
|
||||
mov ebx, dword [ebx + 12345678h] ; harsh clip new sample
|
||||
apatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
apatch7:
|
||||
add edi, 1 ; move destination to second sample
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
mov byte [edi], bl ; write new sample to destination
|
||||
apatch6:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movzx ebx, byte [esi+eax] ; get fourth sample
|
||||
movzx eax, byte [esi+edx] ; get third sample
|
||||
apatch8:
|
||||
add edi, 2 ; move destination to third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Mloop ; loop
|
||||
|
||||
mov dword [_MV_MixDestination], edi ; Store the current write position
|
||||
mov dword [_MV_MixPosition], ebp ; return position
|
||||
exit8m:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitStereo
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 4
|
||||
MV_Mix8BitStereo:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, dword [_MV_SampleSize]
|
||||
mov byte [bpatch8+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, dword [_MV_RightChannelOffset]
|
||||
mov dword [bpatch6+3],ebx
|
||||
mov dword [bpatch7+2],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, dword [_MV_LeftVolume]
|
||||
mov dword [bpatch1+4],ebx
|
||||
|
||||
mov ebx, dword [_MV_RightVolume]
|
||||
mov dword [bpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword [bpatch3+2],edx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, dword [_MV_HarshClipTable]
|
||||
add ebx,128
|
||||
mov dword [bpatch4+2],ebx
|
||||
mov dword [bpatch5+2],ebx
|
||||
|
||||
mov edi, dword [_MV_MixDestination] ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je short EXIT8S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; bpatch1 - left volume table
|
||||
; bpatch2 - right volume table
|
||||
; bpatch3 - sample rate
|
||||
; bpatch4 - harsh clip table
|
||||
; bpatch5 - harsh clip table
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movzx ebx, byte [esi+eax] ; get first sample
|
||||
|
||||
ALIGN 4
|
||||
mix8Sloop:
|
||||
bpatch1:
|
||||
movsx eax, byte [2*ebx+12345678h] ; volume translate left sample
|
||||
movzx edx, byte [edi] ; get current sample from destination
|
||||
bpatch2:
|
||||
movsx ebx, byte [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
bpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
bpatch6:
|
||||
movzx edx, byte [edi+12345678h] ; get current sample from destination
|
||||
bpatch4:
|
||||
mov eax, dword [eax + 12345678h] ; harsh clip left sample
|
||||
add ebx, edx ; mix right sample
|
||||
mov byte [edi], al ; write left sample to destination
|
||||
bpatch5:
|
||||
mov ebx, dword [ebx + 12345678h] ; harsh clip right sample
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
bpatch7:
|
||||
mov byte [edi+12345678h], bl ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
bpatch8:
|
||||
add edi, 2 ; move destination to second sample
|
||||
movzx ebx, byte [esi+edx] ; get second sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Sloop ; loop
|
||||
|
||||
mov dword [_MV_MixDestination], edi ; Store the current write position
|
||||
mov dword [_MV_MixPosition], ebp ; return position
|
||||
|
||||
EXIT8S:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitMono
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 4
|
||||
MV_Mix16BitMono:
|
||||
; Two at once
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, dword [_MV_SampleSize]
|
||||
mov byte [cpatch5+3],bl
|
||||
mov byte [cpatch6+3],bl
|
||||
add bl,bl
|
||||
mov byte [cpatch7+2],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, dword [_MV_LeftVolume]
|
||||
mov dword [cpatch1+4],ebx
|
||||
mov dword [cpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword [cpatch3+2],edx
|
||||
mov dword [cpatch4+2],edx
|
||||
|
||||
mov edi, dword [_MV_MixDestination] ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je near EXIT16M
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; cpatch1 - volume table
|
||||
; cpatch2 - volume table
|
||||
; cpatch3 - sample rate
|
||||
; cpatch4 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movzx eax, byte [esi+eax] ; get first sample
|
||||
movzx ebx, byte [esi+ebx] ; get second sample
|
||||
|
||||
ALIGN 4
|
||||
mix16Mloop:
|
||||
movsx edx, word [edi] ; get current sample from destination
|
||||
cpatch1:
|
||||
movsx eax, word [2*eax+12345678h] ; volume translate first sample
|
||||
cpatch2:
|
||||
movsx ebx, word [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
cpatch5:
|
||||
movsx edx, word [edi + 2] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short m16skip1
|
||||
mov eax, -32768
|
||||
jmp short m16skip2
|
||||
m16skip1:
|
||||
cmp eax, 32767
|
||||
jle short m16skip2
|
||||
mov eax, 32767
|
||||
m16skip2:
|
||||
add ebx, edx ; mix second sample
|
||||
mov word [edi], ax ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short m16skip3
|
||||
mov ebx, -32768
|
||||
jmp short m16skip4
|
||||
m16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short m16skip4
|
||||
mov ebx, 32767
|
||||
m16skip4:
|
||||
cpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
cpatch6:
|
||||
mov word [edi + 2], bx ; write new sample to destination
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
|
||||
cpatch4:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movzx ebx, byte [esi+eax] ; get fourth sample
|
||||
cpatch7:
|
||||
add edi, 4 ; move destination to third sample
|
||||
movzx eax, byte [esi+edx] ; get third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Mloop ; loop
|
||||
|
||||
mov dword [_MV_MixDestination], edi ; Store the current write position
|
||||
mov dword [_MV_MixPosition], ebp ; return position
|
||||
EXIT16M:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitStereo
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 4
|
||||
MV_Mix16BitStereo:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, dword [_MV_SampleSize]
|
||||
mov byte [dpatch6+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, dword [_MV_RightChannelOffset]
|
||||
mov dword [dpatch4+3],ebx
|
||||
mov dword [dpatch5+3],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, dword [_MV_LeftVolume]
|
||||
mov dword [dpatch1+4],ebx
|
||||
|
||||
mov ebx, dword [_MV_RightVolume]
|
||||
mov dword [dpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword [dpatch3+2],edx
|
||||
|
||||
mov edi, dword [_MV_MixDestination] ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je near exit16S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; dpatch1 - left volume table
|
||||
; dpatch2 - right volume table
|
||||
; dpatch3 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movzx ebx, byte [esi+eax] ; get first sample
|
||||
|
||||
ALIGN 4
|
||||
mix16Sloop:
|
||||
dpatch1:
|
||||
movsx eax, word [2*ebx+12345678h] ; volume translate left sample
|
||||
movsx edx, word [edi] ; get current sample from destination
|
||||
dpatch2:
|
||||
movsx ebx, word [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
dpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
dpatch4:
|
||||
movsx edx, word [edi+12345678h] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short s16skip1
|
||||
mov eax, -32768
|
||||
jmp short s16skip2
|
||||
s16skip1:
|
||||
cmp eax, 32767
|
||||
jle short s16skip2
|
||||
mov eax, 32767
|
||||
s16skip2:
|
||||
add ebx, edx ; mix right sample
|
||||
mov word [edi], ax ; write left sample to destination
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short s16skip3
|
||||
mov ebx, -32768
|
||||
jmp short s16skip4
|
||||
s16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short s16skip4
|
||||
mov ebx, 32767
|
||||
s16skip4:
|
||||
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
dpatch5:
|
||||
mov word [edi+12345678h], bx ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
dpatch6:
|
||||
add edi, 4 ; move destination to second sample
|
||||
movzx ebx, byte [esi+edx] ; get second sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Sloop ; loop
|
||||
|
||||
mov dword [_MV_MixDestination], edi ; Store the current write position
|
||||
mov dword [_MV_MixPosition], ebp ; return position
|
||||
exit16S:
|
||||
popad
|
||||
ret
|
||||
|
|
@ -1,491 +0,0 @@
|
|||
.586P
|
||||
|
||||
EXTRN _MV_HarshClipTable : dword
|
||||
EXTRN _MV_MixDestination : dword
|
||||
EXTRN _MV_MixPosition : dword
|
||||
EXTRN _MV_LeftVolume : dword
|
||||
EXTRN _MV_RightVolume : dword
|
||||
EXTRN _MV_SampleSize : dword
|
||||
EXTRN _MV_RightChannelOffset : dword
|
||||
|
||||
CODE SEGMENT PUBLIC USE32 'DATA'
|
||||
ASSUME cs:CODE,ds:CODE
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitMono
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_Mix8BitMono_
|
||||
MV_Mix8BitMono_:
|
||||
; Two at once
|
||||
pushad
|
||||
; Thanks to Lauri Liinat for spotting this lunacy
|
||||
;mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
;mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
;mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
;mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [apatch7+2],bl
|
||||
mov byte ptr [apatch8+2],bl
|
||||
mov byte ptr [apatch9+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume ; Since we're mono, use left volume
|
||||
mov dword ptr [apatch1+4],ebx
|
||||
mov dword ptr [apatch2+4],ebx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, _MV_HarshClipTable
|
||||
add ebx, 128
|
||||
mov dword ptr [apatch3+2],ebx
|
||||
mov dword ptr [apatch4+2],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [apatch5+2],edx
|
||||
mov dword ptr [apatch6+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je short exit8m
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; apatch1 - volume table
|
||||
; apatch2 - volume table
|
||||
; apatch3 - harsh clip table
|
||||
; apatch4 - harsh clip table
|
||||
; apatch5 - sample rate
|
||||
; apatch6 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movzx eax, byte ptr [esi+eax] ; get first sample
|
||||
movzx ebx, byte ptr [esi+ebx] ; get second sample
|
||||
|
||||
;ALIGN 4
|
||||
mix8Mloop:
|
||||
movzx edx, byte ptr [edi] ; get current sample from destination
|
||||
apatch1:
|
||||
movsx eax, byte ptr [2*eax+12345678h] ; volume translate first sample
|
||||
apatch2:
|
||||
movsx ebx, byte ptr [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
apatch9:
|
||||
movzx edx, byte ptr [edi + 1] ; get current sample from destination
|
||||
apatch3:
|
||||
mov eax, [eax + 12345678h] ; harsh clip new sample
|
||||
add ebx, edx ; mix second sample
|
||||
mov [edi], al ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
apatch4:
|
||||
mov ebx, [ebx + 12345678h] ; harsh clip new sample
|
||||
apatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
apatch7:
|
||||
add edi, 1 ; move destination to second sample
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
mov [edi], bl ; write new sample to destination
|
||||
apatch6:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movzx ebx, byte ptr [esi+eax] ; get fourth sample
|
||||
movzx eax, byte ptr [esi+edx] ; get third sample
|
||||
apatch8:
|
||||
add edi, 2 ; move destination to third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Mloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
exit8m:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitStereo
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_Mix8BitStereo_
|
||||
MV_Mix8BitStereo_:
|
||||
pushad
|
||||
; Thanks to Lauri Liinat for spotting this lunacy
|
||||
;mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
;mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
;mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
;mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [bpatch8+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, _MV_RightChannelOffset
|
||||
mov dword ptr [bpatch6+3],ebx
|
||||
mov dword ptr [bpatch7+2],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [bpatch1+4],ebx
|
||||
|
||||
mov ebx, _MV_RightVolume
|
||||
mov dword ptr [bpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [bpatch3+2],edx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, _MV_HarshClipTable
|
||||
add ebx,128
|
||||
mov dword ptr [bpatch4+2],ebx
|
||||
mov dword ptr [bpatch5+2],ebx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je short exit8S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; bpatch1 - left volume table
|
||||
; bpatch2 - right volume table
|
||||
; bpatch3 - sample rate
|
||||
; bpatch4 - harsh clip table
|
||||
; bpatch5 - harsh clip table
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movzx ebx, byte ptr [esi+eax] ; get first sample
|
||||
|
||||
;ALIGN 4
|
||||
mix8Sloop:
|
||||
bpatch1:
|
||||
movsx eax, byte ptr [2*ebx+12345678h] ; volume translate left sample
|
||||
movzx edx, byte ptr [edi] ; get current sample from destination
|
||||
bpatch2:
|
||||
movsx ebx, byte ptr [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
bpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
bpatch6:
|
||||
movzx edx, byte ptr [edi+12345678h] ; get current sample from destination
|
||||
bpatch4:
|
||||
mov eax, [eax + 12345678h] ; harsh clip left sample
|
||||
add ebx, edx ; mix right sample
|
||||
mov [edi], al ; write left sample to destination
|
||||
bpatch5:
|
||||
mov ebx, [ebx + 12345678h] ; harsh clip right sample
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
bpatch7:
|
||||
mov [edi+12345678h], bl ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
bpatch8:
|
||||
add edi, 2 ; move destination to second sample
|
||||
movzx ebx, byte ptr [esi+edx] ; get second sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Sloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
|
||||
EXIT8S:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitMono
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_Mix16BitMono_
|
||||
MV_Mix16BitMono_:
|
||||
; Two at once
|
||||
pushad
|
||||
; Thanks to Lauri Liinat for spotting this lunacy
|
||||
;mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
;mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
;mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
;mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [cpatch5+3],bl
|
||||
mov byte ptr [cpatch6+3],bl
|
||||
add bl,bl
|
||||
mov byte ptr [cpatch7+2],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [cpatch1+4],ebx
|
||||
mov dword ptr [cpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [cpatch3+2],edx
|
||||
mov dword ptr [cpatch4+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je exit16M
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; cpatch1 - volume table
|
||||
; cpatch2 - volume table
|
||||
; cpatch3 - sample rate
|
||||
; cpatch4 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movzx eax, byte ptr [esi+eax] ; get first sample
|
||||
movzx ebx, byte ptr [esi+ebx] ; get second sample
|
||||
|
||||
;ALIGN 4
|
||||
mix16Mloop:
|
||||
movsx edx, word ptr [edi] ; get current sample from destination
|
||||
cpatch1:
|
||||
movsx eax, word ptr [2*eax+12345678h] ; volume translate first sample
|
||||
cpatch2:
|
||||
movsx ebx, word ptr [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
cpatch5:
|
||||
movsx edx, word ptr [edi + 2] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short m16skip1
|
||||
mov eax, -32768
|
||||
jmp short m16skip2
|
||||
m16skip1:
|
||||
cmp eax, 32767
|
||||
jle short m16skip2
|
||||
mov eax, 32767
|
||||
m16skip2:
|
||||
add ebx, edx ; mix second sample
|
||||
mov [edi], ax ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short m16skip3
|
||||
mov ebx, -32768
|
||||
jmp short m16skip4
|
||||
m16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short m16skip4
|
||||
mov ebx, 32767
|
||||
m16skip4:
|
||||
cpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
cpatch6:
|
||||
mov [edi + 2], bx ; write new sample to destination
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
|
||||
cpatch4:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movzx ebx, byte ptr [esi+eax] ; get fourth sample
|
||||
cpatch7:
|
||||
add edi, 4 ; move destination to third sample
|
||||
movzx eax, byte ptr [esi+edx] ; get third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Mloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
EXIT16M:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitStereo
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_Mix16BitStereo_
|
||||
MV_Mix16BitStereo_:
|
||||
pushad
|
||||
; Thanks to Lauri Liinat for spotting this lunacy
|
||||
;mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
;mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
;mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
;mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [dpatch6+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, _MV_RightChannelOffset
|
||||
mov dword ptr [dpatch4+3],ebx
|
||||
mov dword ptr [dpatch5+3],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [dpatch1+4],ebx
|
||||
|
||||
mov ebx, _MV_RightVolume
|
||||
mov dword ptr [dpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [dpatch3+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je exit16S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; dpatch1 - left volume table
|
||||
; dpatch2 - right volume table
|
||||
; dpatch3 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movzx ebx, byte ptr [esi+eax] ; get first sample
|
||||
|
||||
;ALIGN 4
|
||||
mix16Sloop:
|
||||
dpatch1:
|
||||
movsx eax, word ptr [2*ebx+12345678h] ; volume translate left sample
|
||||
movsx edx, word ptr [edi] ; get current sample from destination
|
||||
dpatch2:
|
||||
movsx ebx, word ptr [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
dpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
dpatch4:
|
||||
movsx edx, word ptr [edi+12345678h] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short s16skip1
|
||||
mov eax, -32768
|
||||
jmp short s16skip2
|
||||
s16skip1:
|
||||
cmp eax, 32767
|
||||
jle short s16skip2
|
||||
mov eax, 32767
|
||||
s16skip2:
|
||||
add ebx, edx ; mix right sample
|
||||
mov [edi], ax ; write left sample to destination
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short s16skip3
|
||||
mov ebx, -32768
|
||||
jmp short s16skip4
|
||||
s16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short s16skip4
|
||||
mov ebx, 32767
|
||||
s16skip4:
|
||||
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
dpatch5:
|
||||
mov [edi+12345678h], bx ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
dpatch6:
|
||||
add edi, 4 ; move destination to second sample
|
||||
movzx ebx, byte ptr [esi+edx] ; get second sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Sloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
exit16S:
|
||||
popad
|
||||
ret
|
||||
|
||||
CODE ENDS
|
||||
END
|
|
@ -1,507 +0,0 @@
|
|||
.586P
|
||||
|
||||
EXTRN _MV_HarshClipTable:DWORD
|
||||
EXTRN _MV_MixDestination:DWORD
|
||||
EXTRN _MV_MixPosition:DWORD
|
||||
EXTRN _MV_LeftVolume:DWORD
|
||||
EXTRN _MV_RightVolume:DWORD
|
||||
EXTRN _MV_SampleSize:DWORD
|
||||
EXTRN _MV_RightChannelOffset:DWORD
|
||||
|
||||
CODE SEGMENT PUBLIC USE32 'DATA'
|
||||
ASSUME cs:CODE,ds:CODE
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitMono16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_Mix8BitMono16
|
||||
_MV_Mix8BitMono16:
|
||||
; Two at once
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
inc esi
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [apatch7+2],bl
|
||||
mov byte ptr [apatch8+2],bl
|
||||
mov byte ptr [apatch9+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume ; Since we're mono, use left volume
|
||||
mov dword ptr [apatch1+4],ebx
|
||||
mov dword ptr [apatch2+4],ebx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, _MV_HarshClipTable
|
||||
add ebx, 128
|
||||
mov dword ptr [apatch3+2],ebx
|
||||
mov dword ptr [apatch4+2],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [apatch5+2],edx
|
||||
mov dword ptr [apatch6+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je exit8m
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; apatch1 - volume table
|
||||
; apatch2 - volume table
|
||||
; apatch3 - harsh clip table
|
||||
; apatch4 - harsh clip table
|
||||
; apatch5 - sample rate
|
||||
; apatch6 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movsx eax, byte ptr [esi+2*eax] ; get first sample
|
||||
movsx ebx, byte ptr [esi+2*ebx] ; get second sample
|
||||
add eax, 80h
|
||||
add ebx, 80h
|
||||
|
||||
;ALIGN 4
|
||||
mix8Mloop:
|
||||
movzx edx, byte ptr [edi] ; get current sample from destination
|
||||
apatch1:
|
||||
movsx eax, byte ptr [2*eax+12345678h] ; volume translate first sample
|
||||
apatch2:
|
||||
movsx ebx, byte ptr [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
apatch9:
|
||||
movzx edx, byte ptr [edi + 1] ; get current sample from destination
|
||||
apatch3:
|
||||
mov eax, [eax + 12345678h] ; harsh clip new sample
|
||||
add ebx, edx ; mix second sample
|
||||
mov [edi], al ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
apatch4:
|
||||
mov ebx, [ebx + 12345678h] ; harsh clip new sample
|
||||
apatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
apatch7:
|
||||
add edi, 2 ; move destination to second sample
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
mov [edi], bl ; write new sample to destination
|
||||
apatch6:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movsx ebx, byte ptr [esi+2*eax] ; get fourth sample
|
||||
movsx eax, byte ptr [esi+2*edx] ; get third sample
|
||||
add ebx, 80h
|
||||
add eax, 80h
|
||||
apatch8:
|
||||
add edi, 2 ; move destination to third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Mloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
exit8m:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitStereo16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_Mix8BitStereo16
|
||||
_MV_Mix8BitStereo16:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
inc esi
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [bpatch8+2],bl
|
||||
; mov byte ptr [bpatch9+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, _MV_RightChannelOffset
|
||||
mov dword ptr [bpatch6+3],ebx
|
||||
mov dword ptr [bpatch7+2],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [bpatch1+4],ebx
|
||||
|
||||
mov ebx, _MV_RightVolume
|
||||
mov dword ptr [bpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [bpatch3+2],edx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, _MV_HarshClipTable
|
||||
add ebx,128
|
||||
mov dword ptr [bpatch4+2],ebx
|
||||
mov dword ptr [bpatch5+2],ebx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je short exit8S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; bpatch1 - left volume table
|
||||
; bpatch2 - right volume table
|
||||
; bpatch3 - sample rate
|
||||
; bpatch4 - harsh clip table
|
||||
; bpatch5 - harsh clip table
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movsx ebx, byte ptr [esi+2*eax] ; get first sample
|
||||
add ebx, 80h
|
||||
|
||||
;ALIGN 4
|
||||
mix8Sloop:
|
||||
bpatch1:
|
||||
movsx eax, byte ptr [2*ebx+12345678h] ; volume translate left sample
|
||||
movzx edx, byte ptr [edi] ; get current sample from destination
|
||||
bpatch2:
|
||||
movsx ebx, byte ptr [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
bpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
bpatch6:
|
||||
movzx edx, byte ptr [edi+12345678h] ; get current sample from destination
|
||||
bpatch4:
|
||||
mov eax, [eax + 12345678h] ; harsh clip left sample
|
||||
add ebx, edx ; mix right sample
|
||||
mov [edi], al ; write left sample to destination
|
||||
bpatch5:
|
||||
mov ebx, [ebx + 12345678h] ; harsh clip right sample
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
bpatch7:
|
||||
mov [edi+12345678h], bl ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
bpatch8:
|
||||
add edi, 1 ; move destination to second sample
|
||||
movsx ebx, byte ptr [esi+2*edx] ; get second sample
|
||||
add ebx, 80h
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Sloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
|
||||
EXIT8S:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitMono16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_Mix16BitMono16
|
||||
_MV_Mix16BitMono16:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [cpatch4+2],bl
|
||||
mov byte ptr [cpatch5+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [cpatch2+4],ebx
|
||||
inc ebx
|
||||
mov dword ptr [cpatch1+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [cpatch3+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je exit16M
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; cpatch1 - volume table
|
||||
; cpatch2 - volume table
|
||||
; cpatch3 - sample rate
|
||||
; cpatch4 - sample rate
|
||||
|
||||
mov ebx,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for first sample
|
||||
movzx eax, word ptr [esi+2*ebx] ; get low byte of sample
|
||||
xor eax, 8000h
|
||||
movzx ebx, ah
|
||||
sub ah, ah
|
||||
|
||||
movsx edx, word ptr [edi] ; get current sample from destination
|
||||
|
||||
;ALIGN 4
|
||||
mix16Mloop:
|
||||
cpatch1:
|
||||
movsx eax, byte ptr [2*eax+12345678h] ; volume translate low byte of sample
|
||||
cpatch2:
|
||||
movsx ebx, word ptr [2*ebx+12345678h] ; volume translate high byte of sample
|
||||
lea eax, [ eax + ebx + 80h ] ; mix high byte of sample
|
||||
add eax, edx ; mix low byte of sample
|
||||
cpatch5:
|
||||
movsx edx, word ptr [edi + 2] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short m16skip1
|
||||
mov eax, -32768
|
||||
jmp short m16skip2
|
||||
m16skip1:
|
||||
cmp eax, 32767
|
||||
jle short m16skip2
|
||||
mov eax, 32767
|
||||
m16skip2:
|
||||
mov ebx, ebp ; begin calculating second sample
|
||||
mov [edi], ax ; write new sample to destination
|
||||
|
||||
shr ebx, 16 ; finish calculation for second sample
|
||||
cpatch3:
|
||||
add ebp, 12345678h ; advance frac pointer
|
||||
|
||||
movzx eax, word ptr [esi+2*ebx] ; get second sample
|
||||
cpatch4:
|
||||
add edi, 2 ; move destination to second sample
|
||||
xor eax, 8000h
|
||||
movzx ebx, ah
|
||||
sub ah, ah
|
||||
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Mloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
EXIT16M:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitStereo16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_Mix16BitStereo16
|
||||
_MV_Mix16BitStereo16:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [dpatch9+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, _MV_RightChannelOffset
|
||||
mov dword ptr [dpatch7+3],ebx
|
||||
mov dword ptr [dpatch8+3],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [dpatch1+4],ebx
|
||||
inc ebx
|
||||
mov dword ptr [dpatch2+4],ebx
|
||||
|
||||
mov ebx, _MV_RightVolume
|
||||
mov dword ptr [dpatch3+4],ebx
|
||||
inc ebx
|
||||
mov dword ptr [dpatch4+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [dpatch5+2],edx
|
||||
|
||||
; Source ptr
|
||||
mov dword ptr [dpatch6+4],esi
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je exit16S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; esi - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; ebp - frac pointer
|
||||
; dpatch1 - left volume table
|
||||
; dpatch2 - right volume table
|
||||
; dpatch3 - sample rate
|
||||
|
||||
mov ebx,ebp ; begin calculating first sample
|
||||
shr ebx,16 ; finish calculation for first sample
|
||||
|
||||
movzx edx, word ptr [esi+2*ebx] ; get first sample
|
||||
xor edx, 8000h ; Change from signed to unsigned
|
||||
movzx esi, dh ; put high byte in esi
|
||||
sub dh, dh ; lo byte in edx
|
||||
|
||||
;ALIGN 4
|
||||
mix16Sloop:
|
||||
; Left channel
|
||||
dpatch1:
|
||||
movsx eax, word ptr [2*esi+12345678h] ; volume translate high byte of sample
|
||||
dpatch2:
|
||||
movsx ebx, byte ptr [2*edx+12345678h] ; volume translate low byte of sample
|
||||
lea eax, [ eax + ebx + 80h ] ; mix high byte of sample
|
||||
|
||||
; Right channel
|
||||
dpatch3:
|
||||
movsx esi, word ptr [2*esi+12345678h] ; volume translate high byte of sample
|
||||
dpatch4:
|
||||
movsx ebx, byte ptr [2*edx+12345678h] ; volume translate low byte of sample
|
||||
lea ebx, [ esi + ebx + 80h ] ; mix high byte of sample
|
||||
|
||||
dpatch7:
|
||||
movsx edx, word ptr [edi+12345678h] ; get current sample from destination
|
||||
dpatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
|
||||
add eax, edx ; mix left sample
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short s16skip1
|
||||
mov eax, -32768
|
||||
jmp short s16skip2
|
||||
s16skip1:
|
||||
cmp eax, 32767
|
||||
jle short s16skip2
|
||||
mov eax, 32767
|
||||
s16skip2:
|
||||
movsx edx, word ptr [edi+2] ; get current sample from destination
|
||||
mov [edi], ax ; write left sample to destination
|
||||
add ebx, edx ; mix right sample
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short s16skip3
|
||||
mov ebx, -32768
|
||||
jmp short s16skip4
|
||||
s16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short s16skip4
|
||||
mov ebx, 32767
|
||||
s16skip4:
|
||||
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
dpatch8:
|
||||
mov [edi+12345678h], bx ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
dpatch9:
|
||||
add edi, 4 ; move destination to second sample
|
||||
|
||||
dpatch6:
|
||||
movzx edx, word ptr [2*edx+12345678h] ; get second sample
|
||||
xor edx, 8000h ; Change from signed to unsigned
|
||||
movzx esi, dh ; put high byte in esi
|
||||
sub dh, dh ; lo byte in edx
|
||||
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Sloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
exit16S:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
CODE ENDS
|
||||
END
|
|
@ -1,544 +0,0 @@
|
|||
;Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
;
|
||||
;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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
;
|
||||
;Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
|
||||
|
||||
CPU 386
|
||||
|
||||
SECTION .data
|
||||
|
||||
%ifdef UNDERSCORES
|
||||
|
||||
%define MV_Mix8BitMono16 _MV_Mix8BitMono16
|
||||
%define MV_Mix8BitStereo16 _MV_Mix8BitStereo16
|
||||
%define MV_Mix16BitMono16 _MV_Mix16BitMono16
|
||||
%define MV_Mix16BitStereo16 _MV_Mix16BitStereo16
|
||||
|
||||
%else
|
||||
|
||||
%define _MV_HarshClipTable MV_HarshClipTable
|
||||
%define _MV_MixDestination MV_MixDestination
|
||||
%define _MV_MixPosition MV_MixPosition
|
||||
%define _MV_LeftVolume MV_LeftVolume
|
||||
%define _MV_RightVolume MV_RightVolume
|
||||
%define _MV_SampleSize MV_SampleSize
|
||||
%define _MV_RightChannelOffset MV_RightChannelOffset
|
||||
|
||||
%endif
|
||||
|
||||
EXTERN _MV_HarshClipTable
|
||||
EXTERN _MV_MixDestination
|
||||
EXTERN _MV_MixPosition
|
||||
EXTERN _MV_LeftVolume
|
||||
EXTERN _MV_RightVolume
|
||||
EXTERN _MV_SampleSize
|
||||
EXTERN _MV_RightChannelOffset
|
||||
|
||||
GLOBAL MV_Mix8BitMono16
|
||||
GLOBAL MV_Mix8BitStereo16
|
||||
GLOBAL MV_Mix16BitMono16
|
||||
GLOBAL MV_Mix16BitStereo16
|
||||
|
||||
%define OFFSET
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitMono16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 4
|
||||
MV_Mix8BitMono16:
|
||||
; Two at once
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
inc esi
|
||||
|
||||
; Sample size
|
||||
mov ebx, dword [_MV_SampleSize]
|
||||
mov byte [apatch7+2],bl
|
||||
mov byte [apatch8+2],bl
|
||||
mov byte [apatch9+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, dword [_MV_LeftVolume] ; Since we're mono, use left volume
|
||||
mov dword [apatch1+4],ebx
|
||||
mov dword [apatch2+4],ebx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, dword [_MV_HarshClipTable]
|
||||
add ebx, 128
|
||||
mov dword [apatch3+2],ebx
|
||||
mov dword [apatch4+2],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword [apatch5+2],edx
|
||||
mov dword [apatch6+2],edx
|
||||
|
||||
mov edi, dword [_MV_MixDestination] ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je near exit8m
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; apatch1 - volume table
|
||||
; apatch2 - volume table
|
||||
; apatch3 - harsh clip table
|
||||
; apatch4 - harsh clip table
|
||||
; apatch5 - sample rate
|
||||
; apatch6 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movsx eax, byte [esi+2*eax] ; get first sample
|
||||
movsx ebx, byte [esi+2*ebx] ; get second sample
|
||||
add eax, 80h
|
||||
add ebx, 80h
|
||||
|
||||
ALIGN 4
|
||||
mix8Mloop:
|
||||
movzx edx, byte [edi] ; get current sample from destination
|
||||
apatch1:
|
||||
movsx eax, byte [2*eax+12345678h] ; volume translate first sample
|
||||
apatch2:
|
||||
movsx ebx, byte [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
apatch9:
|
||||
movzx edx, byte [edi + 1] ; get current sample from destination
|
||||
apatch3:
|
||||
mov eax, dword [eax + 12345678h] ; harsh clip new sample
|
||||
add ebx, edx ; mix second sample
|
||||
mov byte [edi], al ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
apatch4:
|
||||
mov ebx, dword [ebx + 12345678h] ; harsh clip new sample
|
||||
apatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
apatch7:
|
||||
add edi, 2 ; move destination to second sample
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
mov byte [edi], bl ; write new sample to destination
|
||||
apatch6:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movsx ebx, byte [esi+2*eax] ; get fourth sample
|
||||
movsx eax, byte [esi+2*edx] ; get third sample
|
||||
add ebx, 80h
|
||||
add eax, 80h
|
||||
apatch8:
|
||||
add edi, 2 ; move destination to third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Mloop ; loop
|
||||
|
||||
mov dword [_MV_MixDestination], edi ; Store the current write position
|
||||
mov dword [_MV_MixPosition], ebp ; return position
|
||||
exit8m:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitStereo16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 4
|
||||
MV_Mix8BitStereo16:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
inc esi
|
||||
|
||||
; Sample size
|
||||
mov ebx, dword [_MV_SampleSize]
|
||||
mov byte [bpatch8+2],bl
|
||||
; mov byte [bpatch9+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, dword [_MV_RightChannelOffset]
|
||||
mov dword [bpatch6+3],ebx
|
||||
mov dword [bpatch7+2],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, dword [_MV_LeftVolume]
|
||||
mov dword [bpatch1+4],ebx
|
||||
|
||||
mov ebx, dword [_MV_RightVolume]
|
||||
mov dword [bpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword [bpatch3+2],edx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, dword [_MV_HarshClipTable]
|
||||
add ebx,128
|
||||
mov dword [bpatch4+2],ebx
|
||||
mov dword [bpatch5+2],ebx
|
||||
|
||||
mov edi, dword [_MV_MixDestination] ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je short EXIT8S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; bpatch1 - left volume table
|
||||
; bpatch2 - right volume table
|
||||
; bpatch3 - sample rate
|
||||
; bpatch4 - harsh clip table
|
||||
; bpatch5 - harsh clip table
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movsx ebx, byte [esi+2*eax] ; get first sample
|
||||
add ebx, 80h
|
||||
|
||||
ALIGN 4
|
||||
mix8Sloop:
|
||||
bpatch1:
|
||||
movsx eax, byte [2*ebx+12345678h] ; volume translate left sample
|
||||
movzx edx, byte [edi] ; get current sample from destination
|
||||
bpatch2:
|
||||
movsx ebx, byte [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
bpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
bpatch6:
|
||||
movzx edx, byte [edi+12345678h] ; get current sample from destination
|
||||
bpatch4:
|
||||
mov eax, dword [eax + 12345678h] ; harsh clip left sample
|
||||
add ebx, edx ; mix right sample
|
||||
mov byte [edi], al ; write left sample to destination
|
||||
bpatch5:
|
||||
mov ebx, dword [ebx + 12345678h] ; harsh clip right sample
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
bpatch7:
|
||||
mov byte [edi+12345678h], bl ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
bpatch8:
|
||||
add edi, 1 ; move destination to second sample
|
||||
movsx ebx, byte [esi+2*edx] ; get second sample
|
||||
add ebx, 80h
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Sloop ; loop
|
||||
|
||||
mov dword [_MV_MixDestination], edi ; Store the current write position
|
||||
mov dword [_MV_MixPosition], ebp ; return position
|
||||
|
||||
EXIT8S:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitMono16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 4
|
||||
MV_Mix16BitMono16:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, dword [_MV_SampleSize]
|
||||
mov byte [cpatch4+2],bl
|
||||
mov byte [cpatch5+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, dword [_MV_LeftVolume]
|
||||
mov dword [cpatch2+4],ebx
|
||||
inc ebx
|
||||
mov dword [cpatch1+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword [cpatch3+2],edx
|
||||
|
||||
mov edi, dword [_MV_MixDestination] ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je near EXIT16M
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; cpatch1 - volume table
|
||||
; cpatch2 - volume table
|
||||
; cpatch3 - sample rate
|
||||
; cpatch4 - sample rate
|
||||
|
||||
mov ebx,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for first sample
|
||||
movzx eax, word [esi+2*ebx] ; get low byte of sample
|
||||
xor eax, 8000h
|
||||
movzx ebx, ah
|
||||
sub ah, ah
|
||||
|
||||
movsx edx, word [edi] ; get current sample from destination
|
||||
|
||||
ALIGN 4
|
||||
mix16Mloop:
|
||||
cpatch1:
|
||||
movsx eax, byte [2*eax+12345678h] ; volume translate low byte of sample
|
||||
cpatch2:
|
||||
movsx ebx, word [2*ebx+12345678h] ; volume translate high byte of sample
|
||||
lea eax, [ eax + ebx + 80h ] ; mix high byte of sample
|
||||
add eax, edx ; mix low byte of sample
|
||||
cpatch5:
|
||||
movsx edx, word [edi + 2] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short m16skip1
|
||||
mov eax, -32768
|
||||
jmp short m16skip2
|
||||
m16skip1:
|
||||
cmp eax, 32767
|
||||
jle short m16skip2
|
||||
mov eax, 32767
|
||||
m16skip2:
|
||||
mov ebx, ebp ; begin calculating second sample
|
||||
mov word [edi], ax ; write new sample to destination
|
||||
|
||||
shr ebx, 16 ; finish calculation for second sample
|
||||
cpatch3:
|
||||
add ebp, 12345678h ; advance frac pointer
|
||||
|
||||
movzx eax, word [esi+2*ebx] ; get second sample
|
||||
cpatch4:
|
||||
add edi, 2 ; move destination to second sample
|
||||
xor eax, 8000h
|
||||
movzx ebx, ah
|
||||
sub ah, ah
|
||||
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Mloop ; loop
|
||||
|
||||
mov dword [_MV_MixDestination], edi ; Store the current write position
|
||||
mov dword [_MV_MixPosition], ebp ; return position
|
||||
EXIT16M:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitStereo16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 4
|
||||
MV_Mix16BitStereo16:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, dword [_MV_SampleSize]
|
||||
mov byte [dpatch9+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, dword [_MV_RightChannelOffset]
|
||||
mov dword [dpatch7+3],ebx
|
||||
mov dword [dpatch8+3],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, dword [_MV_LeftVolume]
|
||||
mov dword [dpatch1+4],ebx
|
||||
inc ebx
|
||||
mov dword [dpatch2+4],ebx
|
||||
|
||||
mov ebx, dword [_MV_RightVolume]
|
||||
mov dword [dpatch3+4],ebx
|
||||
inc ebx
|
||||
mov dword [dpatch4+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword [dpatch5+2],edx
|
||||
|
||||
; Source ptr
|
||||
mov dword [dpatch6+4],esi
|
||||
|
||||
mov edi, dword [_MV_MixDestination] ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je near exit16S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; esi - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; ebp - frac pointer
|
||||
; dpatch1 - left volume table
|
||||
; dpatch2 - right volume table
|
||||
; dpatch3 - sample rate
|
||||
|
||||
mov ebx,ebp ; begin calculating first sample
|
||||
shr ebx,16 ; finish calculation for first sample
|
||||
|
||||
movzx edx, word [esi+2*ebx] ; get first sample
|
||||
xor edx, 8000h ; Change from signed to unsigned
|
||||
movzx esi, dh ; put high byte in esi
|
||||
sub dh, dh ; lo byte in edx
|
||||
|
||||
ALIGN 4
|
||||
mix16Sloop:
|
||||
; Left channel
|
||||
dpatch1:
|
||||
movsx eax, word [2*esi+12345678h] ; volume translate high byte of sample
|
||||
dpatch2:
|
||||
movsx ebx, byte [2*edx+12345678h] ; volume translate low byte of sample
|
||||
lea eax, [ eax + ebx + 80h ] ; mix high byte of sample
|
||||
|
||||
; Right channel
|
||||
dpatch3:
|
||||
movsx esi, word [2*esi+12345678h] ; volume translate high byte of sample
|
||||
dpatch4:
|
||||
movsx ebx, byte [2*edx+12345678h] ; volume translate low byte of sample
|
||||
lea ebx, [ esi + ebx + 80h ] ; mix high byte of sample
|
||||
|
||||
dpatch7:
|
||||
movsx edx, word [edi+12345678h] ; get current sample from destination
|
||||
dpatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
|
||||
add eax, edx ; mix left sample
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short s16skip1
|
||||
mov eax, -32768
|
||||
jmp short s16skip2
|
||||
s16skip1:
|
||||
cmp eax, 32767
|
||||
jle short s16skip2
|
||||
mov eax, 32767
|
||||
s16skip2:
|
||||
movsx edx, word [edi+2] ; get current sample from destination
|
||||
mov word [edi], ax ; write left sample to destination
|
||||
add ebx, edx ; mix right sample
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short s16skip3
|
||||
mov ebx, -32768
|
||||
jmp short s16skip4
|
||||
s16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short s16skip4
|
||||
mov ebx, 32767
|
||||
s16skip4:
|
||||
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
dpatch8:
|
||||
mov word [edi+12345678h], bx ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
dpatch9:
|
||||
add edi, 4 ; move destination to second sample
|
||||
|
||||
dpatch6:
|
||||
movzx edx, word [2*edx+12345678h] ; get second sample
|
||||
xor edx, 8000h ; Change from signed to unsigned
|
||||
movzx esi, dh ; put high byte in esi
|
||||
sub dh, dh ; lo byte in edx
|
||||
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Sloop ; loop
|
||||
|
||||
mov dword [_MV_MixDestination], edi ; Store the current write position
|
||||
mov dword [_MV_MixPosition], ebp ; return position
|
||||
exit16S:
|
||||
popad
|
||||
ret
|
||||
|
|
@ -1,511 +0,0 @@
|
|||
.586P
|
||||
|
||||
EXTRN _MV_HarshClipTable:DWORD
|
||||
EXTRN _MV_MixDestination:DWORD
|
||||
EXTRN _MV_MixPosition:DWORD
|
||||
EXTRN _MV_LeftVolume:DWORD
|
||||
EXTRN _MV_RightVolume:DWORD
|
||||
EXTRN _MV_SampleSize:DWORD
|
||||
EXTRN _MV_RightChannelOffset:DWORD
|
||||
|
||||
CODE SEGMENT PUBLIC USE32 'DATA'
|
||||
ASSUME cs:CODE,ds:CODE
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitMono16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_Mix8BitMono16_
|
||||
MV_Mix8BitMono16_:
|
||||
; Two at once
|
||||
pushad
|
||||
; Thanks to Lauri Liinat for spotting this lunacy
|
||||
;mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
;mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
;mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
;mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
inc esi
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [apatch7+2],bl
|
||||
mov byte ptr [apatch8+2],bl
|
||||
mov byte ptr [apatch9+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume ; Since we're mono, use left volume
|
||||
mov dword ptr [apatch1+4],ebx
|
||||
mov dword ptr [apatch2+4],ebx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, _MV_HarshClipTable
|
||||
add ebx, 128
|
||||
mov dword ptr [apatch3+2],ebx
|
||||
mov dword ptr [apatch4+2],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [apatch5+2],edx
|
||||
mov dword ptr [apatch6+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
shr ecx, 1 ; double sample count
|
||||
cmp ecx, 0
|
||||
je exit8m
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; apatch1 - volume table
|
||||
; apatch2 - volume table
|
||||
; apatch3 - harsh clip table
|
||||
; apatch4 - harsh clip table
|
||||
; apatch5 - sample rate
|
||||
; apatch6 - sample rate
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
mov ebx,ebp ; begin calculating second sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for second sample
|
||||
|
||||
movsx eax, byte ptr [esi+2*eax] ; get first sample
|
||||
movsx ebx, byte ptr [esi+2*ebx] ; get second sample
|
||||
add eax, 80h
|
||||
add ebx, 80h
|
||||
|
||||
;ALIGN 4
|
||||
mix8Mloop:
|
||||
movzx edx, byte ptr [edi] ; get current sample from destination
|
||||
apatch1:
|
||||
movsx eax, byte ptr [2*eax+12345678h] ; volume translate first sample
|
||||
apatch2:
|
||||
movsx ebx, byte ptr [2*ebx+12345678h] ; volume translate second sample
|
||||
add eax, edx ; mix first sample
|
||||
apatch9:
|
||||
movzx edx, byte ptr [edi + 1] ; get current sample from destination
|
||||
apatch3:
|
||||
mov eax, [eax + 12345678h] ; harsh clip new sample
|
||||
add ebx, edx ; mix second sample
|
||||
mov [edi], al ; write new sample to destination
|
||||
mov edx, ebp ; begin calculating third sample
|
||||
apatch4:
|
||||
mov ebx, [ebx + 12345678h] ; harsh clip new sample
|
||||
apatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
shr edx, 16 ; finish calculation for third sample
|
||||
mov eax, ebp ; begin calculating fourth sample
|
||||
apatch7:
|
||||
add edi, 2 ; move destination to second sample
|
||||
shr eax, 16 ; finish calculation for fourth sample
|
||||
mov [edi], bl ; write new sample to destination
|
||||
apatch6:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
movsx ebx, byte ptr [esi+2*eax] ; get fourth sample
|
||||
movsx eax, byte ptr [esi+2*edx] ; get third sample
|
||||
add ebx, 80h
|
||||
add eax, 80h
|
||||
apatch8:
|
||||
add edi, 2 ; move destination to third sample
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Mloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
exit8m:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix8BitStereo16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_Mix8BitStereo16_
|
||||
MV_Mix8BitStereo16_:
|
||||
pushad
|
||||
; Thanks to Lauri Liinat for spotting this lunacy
|
||||
;mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
;mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
;mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
;mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
inc esi
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [bpatch8+2],bl
|
||||
; mov byte ptr [bpatch9+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, _MV_RightChannelOffset
|
||||
mov dword ptr [bpatch6+3],ebx
|
||||
mov dword ptr [bpatch7+2],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [bpatch1+4],ebx
|
||||
|
||||
mov ebx, _MV_RightVolume
|
||||
mov dword ptr [bpatch2+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [bpatch3+2],edx
|
||||
|
||||
; Harsh Clip table ptr
|
||||
mov ebx, _MV_HarshClipTable
|
||||
add ebx,128
|
||||
mov dword ptr [bpatch4+2],ebx
|
||||
mov dword ptr [bpatch5+2],ebx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je short exit8S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; bpatch1 - left volume table
|
||||
; bpatch2 - right volume table
|
||||
; bpatch3 - sample rate
|
||||
; bpatch4 - harsh clip table
|
||||
; bpatch5 - harsh clip table
|
||||
|
||||
mov eax,ebp ; begin calculating first sample
|
||||
shr eax,16 ; finish calculation for first sample
|
||||
|
||||
movsx ebx, byte ptr [esi+2*eax] ; get first sample
|
||||
add ebx, 80h
|
||||
|
||||
;ALIGN 4
|
||||
mix8Sloop:
|
||||
bpatch1:
|
||||
movsx eax, byte ptr [2*ebx+12345678h] ; volume translate left sample
|
||||
movzx edx, byte ptr [edi] ; get current sample from destination
|
||||
bpatch2:
|
||||
movsx ebx, byte ptr [2*ebx+12345678h] ; volume translate right sample
|
||||
add eax, edx ; mix left sample
|
||||
bpatch3:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
bpatch6:
|
||||
movzx edx, byte ptr [edi+12345678h] ; get current sample from destination
|
||||
bpatch4:
|
||||
mov eax, [eax + 12345678h] ; harsh clip left sample
|
||||
add ebx, edx ; mix right sample
|
||||
mov [edi], al ; write left sample to destination
|
||||
bpatch5:
|
||||
mov ebx, [ebx + 12345678h] ; harsh clip right sample
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
bpatch7:
|
||||
mov [edi+12345678h], bl ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
bpatch8:
|
||||
add edi, 1 ; move destination to second sample
|
||||
movsx ebx, byte ptr [esi+2*edx] ; get second sample
|
||||
add ebx, 80h
|
||||
dec ecx ; decrement count
|
||||
jnz mix8Sloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
|
||||
EXIT8S:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitMono16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_Mix16BitMono16_
|
||||
MV_Mix16BitMono16_:
|
||||
pushad
|
||||
; Thanks to Lauri Liinat for spotting this lunacy
|
||||
;mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
;mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
;mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
;mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [cpatch4+2],bl
|
||||
mov byte ptr [cpatch5+3],bl
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [cpatch2+4],ebx
|
||||
inc ebx
|
||||
mov dword ptr [cpatch1+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [cpatch3+2],edx
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je exit16M
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; esi - source
|
||||
; ebp - frac pointer
|
||||
; cpatch1 - volume table
|
||||
; cpatch2 - volume table
|
||||
; cpatch3 - sample rate
|
||||
; cpatch4 - sample rate
|
||||
|
||||
mov ebx,ebp ; begin calculating first sample
|
||||
add ebp,edx ; advance frac pointer
|
||||
shr ebx,16 ; finish calculation for first sample
|
||||
movzx eax, word ptr [esi+2*ebx] ; get low byte of sample
|
||||
xor eax, 8000h
|
||||
movzx ebx, ah
|
||||
sub ah, ah
|
||||
|
||||
movsx edx, word ptr [edi] ; get current sample from destination
|
||||
|
||||
;ALIGN 4
|
||||
mix16Mloop:
|
||||
cpatch1:
|
||||
movsx eax, byte ptr [2*eax+12345678h] ; volume translate low byte of sample
|
||||
cpatch2:
|
||||
movsx ebx, word ptr [2*ebx+12345678h] ; volume translate high byte of sample
|
||||
lea eax, [ eax + ebx + 80h ] ; mix high byte of sample
|
||||
add eax, edx ; mix low byte of sample
|
||||
cpatch5:
|
||||
movsx edx, word ptr [edi + 2] ; get current sample from destination
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short m16skip1
|
||||
mov eax, -32768
|
||||
jmp short m16skip2
|
||||
m16skip1:
|
||||
cmp eax, 32767
|
||||
jle short m16skip2
|
||||
mov eax, 32767
|
||||
m16skip2:
|
||||
mov ebx, ebp ; begin calculating second sample
|
||||
mov [edi], ax ; write new sample to destination
|
||||
|
||||
shr ebx, 16 ; finish calculation for second sample
|
||||
cpatch3:
|
||||
add ebp, 12345678h ; advance frac pointer
|
||||
|
||||
movzx eax, word ptr [esi+2*ebx] ; get second sample
|
||||
cpatch4:
|
||||
add edi, 2 ; move destination to second sample
|
||||
xor eax, 8000h
|
||||
movzx ebx, ah
|
||||
sub ah, ah
|
||||
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Mloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
EXIT16M:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_Mix16BitStereo16
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - position
|
||||
; edx - rate
|
||||
; ebx - start
|
||||
; ecx - number of samples to mix
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_Mix16BitStereo16_
|
||||
MV_Mix16BitStereo16_:
|
||||
pushad
|
||||
; Thanks to Lauri Liinat for spotting this lunacy
|
||||
;mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
;mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
;mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
;mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov ebp, eax
|
||||
|
||||
mov esi, ebx ; Source pointer
|
||||
|
||||
; Sample size
|
||||
mov ebx, _MV_SampleSize
|
||||
mov byte ptr [dpatch9+2],bl
|
||||
|
||||
; Right channel offset
|
||||
mov ebx, _MV_RightChannelOffset
|
||||
mov dword ptr [dpatch7+3],ebx
|
||||
mov dword ptr [dpatch8+3],ebx
|
||||
|
||||
; Volume table ptr
|
||||
mov ebx, _MV_LeftVolume
|
||||
mov dword ptr [dpatch1+4],ebx
|
||||
inc ebx
|
||||
mov dword ptr [dpatch2+4],ebx
|
||||
|
||||
mov ebx, _MV_RightVolume
|
||||
mov dword ptr [dpatch3+4],ebx
|
||||
inc ebx
|
||||
mov dword ptr [dpatch4+4],ebx
|
||||
|
||||
; Rate scale ptr
|
||||
mov dword ptr [dpatch5+2],edx
|
||||
|
||||
; Source ptr
|
||||
mov dword ptr [dpatch6+4],esi
|
||||
|
||||
mov edi, _MV_MixDestination ; Get the position to write to
|
||||
|
||||
; Number of samples to mix
|
||||
cmp ecx, 0
|
||||
je exit16S
|
||||
|
||||
; eax - scratch
|
||||
; ebx - scratch
|
||||
; edx - scratch
|
||||
; esi - scratch
|
||||
; ecx - count
|
||||
; edi - destination
|
||||
; ebp - frac pointer
|
||||
; dpatch1 - left volume table
|
||||
; dpatch2 - right volume table
|
||||
; dpatch3 - sample rate
|
||||
|
||||
mov ebx,ebp ; begin calculating first sample
|
||||
shr ebx,16 ; finish calculation for first sample
|
||||
|
||||
movzx edx, word ptr [esi+2*ebx] ; get first sample
|
||||
xor edx, 8000h ; Change from signed to unsigned
|
||||
movzx esi, dh ; put high byte in esi
|
||||
sub dh, dh ; lo byte in edx
|
||||
|
||||
;ALIGN 4
|
||||
mix16Sloop:
|
||||
; Left channel
|
||||
dpatch1:
|
||||
movsx eax, word ptr [2*esi+12345678h] ; volume translate high byte of sample
|
||||
dpatch2:
|
||||
movsx ebx, byte ptr [2*edx+12345678h] ; volume translate low byte of sample
|
||||
lea eax, [ eax + ebx + 80h ] ; mix high byte of sample
|
||||
|
||||
; Right channel
|
||||
dpatch3:
|
||||
movsx esi, word ptr [2*esi+12345678h] ; volume translate high byte of sample
|
||||
dpatch4:
|
||||
movsx ebx, byte ptr [2*edx+12345678h] ; volume translate low byte of sample
|
||||
lea ebx, [ esi + ebx + 80h ] ; mix high byte of sample
|
||||
|
||||
dpatch7:
|
||||
movsx edx, word ptr [edi+12345678h] ; get current sample from destination
|
||||
dpatch5:
|
||||
add ebp,12345678h ; advance frac pointer
|
||||
|
||||
add eax, edx ; mix left sample
|
||||
|
||||
cmp eax, -32768 ; Harsh clip sample
|
||||
jge short s16skip1
|
||||
mov eax, -32768
|
||||
jmp short s16skip2
|
||||
s16skip1:
|
||||
cmp eax, 32767
|
||||
jle short s16skip2
|
||||
mov eax, 32767
|
||||
s16skip2:
|
||||
movsx edx, word ptr [edi+2] ; get current sample from destination
|
||||
mov [edi], ax ; write left sample to destination
|
||||
add ebx, edx ; mix right sample
|
||||
|
||||
cmp ebx, -32768 ; Harsh clip sample
|
||||
jge short s16skip3
|
||||
mov ebx, -32768
|
||||
jmp short s16skip4
|
||||
s16skip3:
|
||||
cmp ebx, 32767
|
||||
jle short s16skip4
|
||||
mov ebx, 32767
|
||||
s16skip4:
|
||||
|
||||
mov edx, ebp ; begin calculating second sample
|
||||
dpatch8:
|
||||
mov [edi+12345678h], bx ; write right sample to destination
|
||||
shr edx, 16 ; finish calculation for second sample
|
||||
dpatch9:
|
||||
add edi, 4 ; move destination to second sample
|
||||
|
||||
dpatch6:
|
||||
movzx edx, word ptr [2*edx+12345678h] ; get second sample
|
||||
xor edx, 8000h ; Change from signed to unsigned
|
||||
movzx esi, dh ; put high byte in esi
|
||||
sub dh, dh ; lo byte in edx
|
||||
|
||||
dec ecx ; decrement count
|
||||
jnz mix16Sloop ; loop
|
||||
|
||||
mov _MV_MixDestination, edi ; Store the current write position
|
||||
mov _MV_MixPosition, ebp ; return position
|
||||
exit16S:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
CODE ENDS
|
||||
END
|
|
@ -1,67 +0,0 @@
|
|||
#include "multivoc.h"
|
||||
// #include "_multivc.h"
|
||||
|
||||
void MV_16BitReverb(char *src, char *dest, VOLUME16 *volume, int count)
|
||||
{
|
||||
int i;
|
||||
|
||||
short *pdest = (short *)dest;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
#if PLATFORM_BIGENDIAN
|
||||
int sl = src[i*2+1];
|
||||
int sh = src[i*2+0] ^ 0x80;
|
||||
#else
|
||||
int sl = src[i*2+0];
|
||||
int sh = src[i*2+1] ^ 0x80;
|
||||
#endif
|
||||
|
||||
sl = (*volume)[sl] >> 8;
|
||||
sh = (*volume)[sh];
|
||||
|
||||
pdest[i] = (short)(sl + sh + 0x80);
|
||||
}
|
||||
}
|
||||
|
||||
void MV_8BitReverb(signed char *src, signed char *dest, VOLUME16 *volume, int count)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
unsigned char s = (unsigned char) src[i];
|
||||
|
||||
s = (*volume)[s] & 0xff;
|
||||
|
||||
dest[i] = (char)(s + 0x80);
|
||||
}
|
||||
}
|
||||
|
||||
void MV_16BitReverbFast(char *src, char *dest, int count, int shift)
|
||||
{
|
||||
int i;
|
||||
|
||||
short *pdest = (short *)dest;
|
||||
const short *psrc = (const short *)src;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
pdest[i] = psrc[i] >> shift;
|
||||
}
|
||||
}
|
||||
|
||||
void MV_8BitReverbFast(signed char *src, signed char *dest, int count, int shift)
|
||||
{
|
||||
int i;
|
||||
|
||||
unsigned char sh = 0x80 - (0x80 >> shift);
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
unsigned char a = ((unsigned char) src[i]) >> shift;
|
||||
unsigned char c = (((unsigned char) src[i]) ^ 0x80) >> 7;
|
||||
|
||||
dest[i] = (signed char)(a + sh + c);
|
||||
}
|
||||
}
|
|
@ -1,202 +0,0 @@
|
|||
.586P
|
||||
|
||||
CODE SEGMENT PUBLIC USE32 'DATA'
|
||||
ASSUME cs:CODE,ds:CODE
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_16BitReverb
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - Volume table
|
||||
; ecx - number of samples
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_16BitReverb
|
||||
_MV_16BitReverb:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov esi, eax
|
||||
lea edi, [edx - 2]
|
||||
|
||||
;ALIGN 4
|
||||
rev16loop:
|
||||
movzx eax, word ptr [esi] ; get sample
|
||||
add edi, 2
|
||||
|
||||
movzx edx, ah
|
||||
sub ah, ah
|
||||
|
||||
movsx eax, byte ptr [2*eax+ebx+1] ; volume translate low byte of sample
|
||||
xor edx, 80h
|
||||
|
||||
movsx edx, word ptr [2*edx+ebx] ; volume translate high byte of sample
|
||||
add esi, 2
|
||||
|
||||
lea eax, [ eax + edx + 80h ] ; mix high byte of sample
|
||||
dec ecx ; decrement count
|
||||
|
||||
mov [edi], ax ; write new sample to destination
|
||||
jnz rev16loop ; loop
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_8BitReverb
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - Volume table
|
||||
; ecx - number of samples
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_8BitReverb
|
||||
_MV_8BitReverb:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov esi, eax
|
||||
lea edi, [edx - 1]
|
||||
|
||||
xor eax, eax
|
||||
|
||||
;ALIGN 4
|
||||
rev8loop:
|
||||
; movzx eax, byte ptr [esi] ; get sample
|
||||
mov al, byte ptr [esi] ; get sample
|
||||
inc edi
|
||||
|
||||
; movsx eax, byte ptr [2*eax+ebx] ; volume translate sample
|
||||
mov al, byte ptr [2*eax+ebx] ; volume translate sample
|
||||
inc esi
|
||||
|
||||
; add eax, 80h
|
||||
add al, 80h
|
||||
dec ecx ; decrement count
|
||||
|
||||
mov [edi], al ; write new sample to destination
|
||||
jnz rev8loop ; loop
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_16BitReverbFast
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - number of samples
|
||||
; ecx - shift
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_16BitReverbFast
|
||||
_MV_16BitReverbFast:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov esi, eax
|
||||
mov eax,OFFSET rpatch16+3
|
||||
|
||||
mov [eax],cl
|
||||
lea edi, [edx - 2]
|
||||
|
||||
;ALIGN 4
|
||||
frev16loop:
|
||||
mov ax, word ptr [esi] ; get sample
|
||||
add edi, 2
|
||||
|
||||
rpatch16:
|
||||
sar ax, 5 ;;;;Add 1 before shift
|
||||
add esi, 2
|
||||
|
||||
mov [edi], ax ; write new sample to destination
|
||||
dec ebx ; decrement count
|
||||
|
||||
jnz frev16loop ; loop
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_8BitReverbFast
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - number of samples
|
||||
; ecx - shift
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC _MV_8BitReverbFast
|
||||
_MV_8BitReverbFast:
|
||||
pushad
|
||||
mov eax, dword ptr [esp + 0*4 + 9*4]
|
||||
mov edx, dword ptr [esp + 1*4 + 9*4]
|
||||
mov ebx, dword ptr [esp + 2*4 + 9*4]
|
||||
mov ecx, dword ptr [esp + 3*4 + 9*4]
|
||||
|
||||
mov esi, eax
|
||||
mov eax,OFFSET rpatch8+2
|
||||
|
||||
mov edi, edx
|
||||
mov edx, 80h
|
||||
|
||||
mov [eax],cl
|
||||
mov eax, 80h
|
||||
|
||||
shr eax, cl
|
||||
|
||||
dec edi
|
||||
sub edx, eax
|
||||
|
||||
;ALIGN 4
|
||||
frev8loop:
|
||||
mov al, byte ptr [esi] ; get sample
|
||||
inc esi
|
||||
|
||||
mov ecx, eax
|
||||
inc edi
|
||||
|
||||
rpatch8:
|
||||
shr eax, 3
|
||||
xor ecx, 80h ; flip the sign bit
|
||||
|
||||
shr ecx, 7 ; shift the sign down to 1
|
||||
add eax, edx
|
||||
|
||||
add eax, ecx ; add sign bit to round to 0
|
||||
dec ebx ; decrement count
|
||||
|
||||
mov [edi], al ; write new sample to destination
|
||||
jnz frev8loop ; loop
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
CODE ENDS
|
||||
END
|
|
@ -1,230 +0,0 @@
|
|||
;Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
;
|
||||
;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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
;
|
||||
;Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
|
||||
CPU 386
|
||||
|
||||
SECTION .data
|
||||
|
||||
%ifdef UNDERSCORES
|
||||
|
||||
%define MV_16BitReverb _MV_16BitReverb
|
||||
%define MV_8BitReverb _MV_8BitReverb
|
||||
%define MV_16BitReverbFast _MV_16BitReverbFast
|
||||
%define MV_8BitReverbFast _MV_8BitReverbFast
|
||||
|
||||
%endif
|
||||
|
||||
GLOBAL MV_16BitReverb
|
||||
GLOBAL MV_8BitReverb
|
||||
GLOBAL MV_16BitReverbFast
|
||||
GLOBAL MV_8BitReverbFast
|
||||
|
||||
%define OFFSET
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_16BitReverb
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - Volume table
|
||||
; ecx - number of samples
|
||||
|
||||
ALIGN 4
|
||||
MV_16BitReverb:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov esi, eax
|
||||
lea edi, [edx - 2]
|
||||
|
||||
ALIGN 4
|
||||
rev16loop:
|
||||
movzx eax, word [esi] ; get sample
|
||||
add edi, 2
|
||||
|
||||
movzx edx, ah
|
||||
sub ah, ah
|
||||
|
||||
movsx eax, byte [2*eax+ebx+1] ; volume translate low byte of sample
|
||||
xor edx, 80h
|
||||
|
||||
movsx edx, word [2*edx+ebx] ; volume translate high byte of sample
|
||||
add esi, 2
|
||||
|
||||
lea eax, [ eax + edx + 80h ] ; mix high byte of sample
|
||||
dec ecx ; decrement count
|
||||
|
||||
mov word [edi], ax ; write new sample to destination
|
||||
jnz rev16loop ; loop
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_8BitReverb
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - Volume table
|
||||
; ecx - number of samples
|
||||
|
||||
ALIGN 4
|
||||
MV_8BitReverb:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov esi, eax
|
||||
lea edi, [edx - 1]
|
||||
|
||||
xor eax, eax
|
||||
|
||||
ALIGN 4
|
||||
rev8loop:
|
||||
; movzx eax, byte ptr [esi] ; get sample
|
||||
mov al, byte [esi] ; get sample
|
||||
inc edi
|
||||
|
||||
; movsx eax, byte ptr [2*eax+ebx] ; volume translate sample
|
||||
mov al, byte [2*eax+ebx] ; volume translate sample
|
||||
inc esi
|
||||
|
||||
; add eax, 80h
|
||||
add al, 80h
|
||||
dec ecx ; decrement count
|
||||
|
||||
mov byte [edi], al ; write new sample to destination
|
||||
jnz rev8loop ; loop
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_16BitReverbFast
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - number of samples
|
||||
; ecx - shift
|
||||
|
||||
ALIGN 4
|
||||
MV_16BitReverbFast:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov esi, eax
|
||||
mov eax,OFFSET rpatch16+3
|
||||
|
||||
mov byte [eax],cl
|
||||
lea edi, [edx - 2]
|
||||
|
||||
ALIGN 4
|
||||
frev16loop:
|
||||
mov ax, word [esi] ; get sample
|
||||
add edi, 2
|
||||
|
||||
rpatch16:
|
||||
sar ax, 5 ;;;;Add 1 before shift
|
||||
add esi, 2
|
||||
|
||||
mov word [edi], ax ; write new sample to destination
|
||||
dec ebx ; decrement count
|
||||
|
||||
jnz frev16loop ; loop
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_8BitReverbFast
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - number of samples
|
||||
; ecx - shift
|
||||
|
||||
ALIGN 4
|
||||
MV_8BitReverbFast:
|
||||
pushad
|
||||
mov eax, dword [esp + 0*4 + 9*4]
|
||||
mov edx, dword [esp + 1*4 + 9*4]
|
||||
mov ebx, dword [esp + 2*4 + 9*4]
|
||||
mov ecx, dword [esp + 3*4 + 9*4]
|
||||
|
||||
mov esi, eax
|
||||
mov eax,OFFSET rpatch8+2
|
||||
|
||||
mov edi, edx
|
||||
mov edx, 80h
|
||||
|
||||
mov byte [eax],cl
|
||||
mov eax, 80h
|
||||
|
||||
shr eax, cl
|
||||
|
||||
dec edi
|
||||
sub edx, eax
|
||||
|
||||
ALIGN 4
|
||||
frev8loop:
|
||||
mov al, byte [esi] ; get sample
|
||||
inc esi
|
||||
|
||||
mov ecx, eax
|
||||
inc edi
|
||||
|
||||
rpatch8:
|
||||
shr eax, 3
|
||||
xor ecx, 80h ; flip the sign bit
|
||||
|
||||
shr ecx, 7 ; shift the sign down to 1
|
||||
add eax, edx
|
||||
|
||||
add eax, ecx ; add sign bit to round to 0
|
||||
dec ebx ; decrement count
|
||||
|
||||
mov byte [edi], al ; write new sample to destination
|
||||
jnz frev8loop ; loop
|
||||
|
||||
popad
|
||||
ret
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
.586P
|
||||
|
||||
CODE SEGMENT PUBLIC USE32 'DATA'
|
||||
ASSUME cs:CODE,ds:CODE
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_16BitReverb
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - Volume table
|
||||
; ecx - number of samples
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_16BitReverb_
|
||||
MV_16BitReverb_:
|
||||
mov esi, eax
|
||||
lea edi, [edx - 2]
|
||||
|
||||
;ALIGN 4
|
||||
rev16loop:
|
||||
movzx eax, word ptr [esi] ; get sample
|
||||
add edi, 2
|
||||
|
||||
movzx edx, ah
|
||||
sub ah, ah
|
||||
|
||||
movsx eax, byte ptr [2*eax+ebx+1] ; volume translate low byte of sample
|
||||
xor edx, 80h
|
||||
|
||||
movsx edx, word ptr [2*edx+ebx] ; volume translate high byte of sample
|
||||
add esi, 2
|
||||
|
||||
lea eax, [ eax + edx + 80h ] ; mix high byte of sample
|
||||
dec ecx ; decrement count
|
||||
|
||||
mov [edi], ax ; write new sample to destination
|
||||
jnz rev16loop ; loop
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_8BitReverb
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - Volume table
|
||||
; ecx - number of samples
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_8BitReverb_
|
||||
MV_8BitReverb_:
|
||||
mov esi, eax
|
||||
lea edi, [edx - 1]
|
||||
|
||||
xor eax, eax
|
||||
|
||||
;ALIGN 4
|
||||
rev8loop:
|
||||
; movzx eax, byte ptr [esi] ; get sample
|
||||
mov al, byte ptr [esi] ; get sample
|
||||
inc edi
|
||||
|
||||
; movsx eax, byte ptr [2*eax+ebx] ; volume translate sample
|
||||
mov al, byte ptr [2*eax+ebx] ; volume translate sample
|
||||
inc esi
|
||||
|
||||
; add eax, 80h
|
||||
add al, 80h
|
||||
dec ecx ; decrement count
|
||||
|
||||
mov [edi], al ; write new sample to destination
|
||||
jnz rev8loop ; loop
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_16BitReverbFast
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - number of samples
|
||||
; ecx - shift
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_16BitReverbFast_
|
||||
MV_16BitReverbFast_:
|
||||
mov esi, eax
|
||||
mov eax,OFFSET rpatch16+3
|
||||
|
||||
mov [eax],cl
|
||||
lea edi, [edx - 2]
|
||||
|
||||
;ALIGN 4
|
||||
frev16loop:
|
||||
mov ax, word ptr [esi] ; get sample
|
||||
add edi, 2
|
||||
|
||||
rpatch16:
|
||||
sar ax, 5 ;;;;Add 1 before shift
|
||||
add esi, 2
|
||||
|
||||
mov [edi], ax ; write new sample to destination
|
||||
dec ebx ; decrement count
|
||||
|
||||
jnz frev16loop ; loop
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;================
|
||||
;
|
||||
; MV_8BitReverbFast
|
||||
;
|
||||
;================
|
||||
|
||||
; eax - source position
|
||||
; edx - destination position
|
||||
; ebx - number of samples
|
||||
; ecx - shift
|
||||
|
||||
ALIGN 16
|
||||
PUBLIC MV_8BitReverbFast_
|
||||
MV_8BitReverbFast_:
|
||||
mov esi, eax
|
||||
mov eax,OFFSET rpatch8+2
|
||||
|
||||
mov edi, edx
|
||||
mov edx, 80h
|
||||
|
||||
mov [eax],cl
|
||||
mov eax, 80h
|
||||
|
||||
shr eax, cl
|
||||
|
||||
dec edi
|
||||
sub edx, eax
|
||||
|
||||
;ALIGN 4
|
||||
frev8loop:
|
||||
mov al, byte ptr [esi] ; get sample
|
||||
inc esi
|
||||
|
||||
mov ecx, eax
|
||||
inc edi
|
||||
|
||||
rpatch8:
|
||||
shr eax, 3
|
||||
xor ecx, 80h ; flip the sign bit
|
||||
|
||||
shr ecx, 7 ; shift the sign down to 1
|
||||
add eax, edx
|
||||
|
||||
add eax, ecx ; add sign bit to round to 0
|
||||
dec ebx ; decrement count
|
||||
|
||||
mov [edi], al ; write new sample to destination
|
||||
jnz frev8loop ; loop
|
||||
|
||||
ret
|
||||
|
||||
CODE ENDS
|
||||
END
|
|
@ -1,528 +0,0 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Copyright (C) 2008 - EDuke32 developers
|
||||
|
||||
This file is part of EDuke32
|
||||
|
||||
EDuke32 is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License version 2
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "baselayer.h"
|
||||
#include "compat.h"
|
||||
#define AL_NO_PROTOTYPES
|
||||
#define ALC_NO_PROTOTYPES
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#include "openal.h"
|
||||
// #include "_multivc.h"
|
||||
|
||||
ALCdevice * device=NULL;
|
||||
ALCcontext * context=NULL;
|
||||
|
||||
char *ALdoing = NULL;
|
||||
int32_t AL_Error;
|
||||
int32_t bufsize;
|
||||
int32_t openal_disabled = 0;
|
||||
|
||||
typedef struct SD
|
||||
{
|
||||
ALuint buffers[16];
|
||||
ALuint source;
|
||||
ALenum format;
|
||||
|
||||
char loop;
|
||||
char type;
|
||||
int32_t rate;
|
||||
sounddef def;
|
||||
int32_t ready;
|
||||
} sounddef1;
|
||||
|
||||
sounddef1 music;
|
||||
|
||||
#ifdef _WIN32
|
||||
// Windows
|
||||
static HMODULE hALDLL = NULL;
|
||||
#else
|
||||
#include <dlfcn.h>
|
||||
static void *alhandle = NULL;
|
||||
#endif
|
||||
|
||||
static char *aldriver = NULL;
|
||||
static LPALGETSOURCEI balGetSourcei = NULL;
|
||||
static LPALSOURCEF balSourcef = NULL;
|
||||
static LPALSOURCEPLAY balSourcePlay = NULL;
|
||||
static LPALSOURCEPAUSE balSourcePause = NULL;
|
||||
static LPALCGETERROR balcGetError = NULL;
|
||||
static LPALGETERROR balGetError = NULL;
|
||||
static LPALBUFFERDATA balBufferData = NULL;
|
||||
static LPALGENBUFFERS balGenBuffers = NULL;
|
||||
static LPALGENSOURCES balGenSources = NULL;
|
||||
static LPALSOURCEI balSourcei = NULL;
|
||||
static LPALSOURCEQUEUEBUFFERS balSourceQueueBuffers = NULL;
|
||||
static LPALSOURCESTOP balSourceStop = NULL;
|
||||
static LPALSOURCEUNQUEUEBUFFERS balSourceUnqueueBuffers = NULL;
|
||||
static LPALCMAKECONTEXTCURRENT balcMakeContextCurrent = NULL;
|
||||
static LPALDELETESOURCES balDeleteSources = NULL;
|
||||
static LPALDELETEBUFFERS balDeleteBuffers = NULL;
|
||||
static LPALCDESTROYCONTEXT balcDestroyContext = NULL;
|
||||
static LPALCCLOSEDEVICE balcCloseDevice = NULL;
|
||||
static LPALCOPENDEVICE balcOpenDevice = NULL;
|
||||
static LPALCCREATECONTEXT balcCreateContext = NULL;
|
||||
static LPALGETSTRING balGetString = NULL;
|
||||
|
||||
static void * algetproc_(const char *s, int32_t *err, int32_t fatal)
|
||||
{
|
||||
void *t;
|
||||
#if defined _WIN32
|
||||
t = (void*)GetProcAddress(hALDLL,s);
|
||||
#else
|
||||
t = (void*)dlsym(alhandle,s);
|
||||
#endif
|
||||
if (!t && fatal)
|
||||
{
|
||||
initprintf("Failed to find %s in %s\n", s, aldriver);
|
||||
*err = 1;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
#define ALGETPROC(s) algetproc_(s,&err,1)
|
||||
#define ALGETPROCSOFT(s) algetproc_(s,&err,0)
|
||||
|
||||
static int32_t unloadaldriver(void)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (!hALDLL) return 0;
|
||||
#endif
|
||||
|
||||
if (aldriver)
|
||||
free(aldriver);
|
||||
aldriver = NULL;
|
||||
|
||||
#ifdef _WIN32
|
||||
if (hALDLL)
|
||||
FreeLibrary(hALDLL);
|
||||
hALDLL = NULL;
|
||||
#else
|
||||
if (alhandle)
|
||||
dlclose(alhandle);
|
||||
alhandle = NULL;
|
||||
#endif
|
||||
|
||||
balGetSourcei = NULL;
|
||||
balSourcef = NULL;
|
||||
balSourcePlay = NULL;
|
||||
balSourcePause = NULL;
|
||||
balcGetError = NULL;
|
||||
balGetError = NULL;
|
||||
balBufferData = NULL;
|
||||
balGenBuffers = NULL;
|
||||
balGenSources = NULL;
|
||||
balSourcei = NULL;
|
||||
balSourceQueueBuffers = NULL;
|
||||
balSourceStop = NULL;
|
||||
balSourceUnqueueBuffers = NULL;
|
||||
balDeleteSources = NULL;
|
||||
balcMakeContextCurrent = NULL;
|
||||
balDeleteSources = NULL;
|
||||
balDeleteBuffers = NULL;
|
||||
balcDestroyContext = NULL;
|
||||
balcCloseDevice = NULL;
|
||||
balcOpenDevice = NULL;
|
||||
balcCreateContext = NULL;
|
||||
balGetString = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32_t loadaldriver(void)
|
||||
{
|
||||
int32_t err=0;
|
||||
char *driver;
|
||||
|
||||
#ifdef _WIN32
|
||||
if (hALDLL)
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
// if (!driver)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
driver = "OpenAL32.DLL";
|
||||
#elif defined __APPLE__
|
||||
driver = "/System/Library/Frameworks/OpenGL.framework/OpenGL"; // FIXME: like I know anything about Apple. Hah.
|
||||
#else
|
||||
driver = "libopenal.so";
|
||||
#endif
|
||||
}
|
||||
|
||||
initprintf("Loading %s\n",driver);
|
||||
|
||||
#ifdef _WIN32
|
||||
hALDLL = LoadLibrary(driver);
|
||||
if (!hALDLL) return -1;
|
||||
#else
|
||||
alhandle = dlopen(driver, RTLD_NOW|RTLD_GLOBAL);
|
||||
if (!alhandle) return -1;
|
||||
#endif
|
||||
aldriver = strdup(driver);
|
||||
|
||||
balGetSourcei = ALGETPROC("alGetSourcei");
|
||||
balSourcef = ALGETPROC("alSourcef");
|
||||
balSourcePlay = ALGETPROC("alSourcePlay");
|
||||
balSourcePause = ALGETPROC("alSourcePause");
|
||||
balcGetError = ALGETPROC("alcGetError");
|
||||
balGetError = ALGETPROC("alGetError");
|
||||
balBufferData = ALGETPROC("alBufferData");
|
||||
balGenBuffers = ALGETPROC("alGenBuffers");
|
||||
balGenSources = ALGETPROC("alGenSources");
|
||||
balSourcei = ALGETPROC("alSourcei");
|
||||
balSourceQueueBuffers = ALGETPROC("alSourceQueueBuffers");
|
||||
balSourceStop = ALGETPROC("alSourceStop");
|
||||
balSourceUnqueueBuffers = ALGETPROC("alSourceUnqueueBuffers");
|
||||
balDeleteSources = ALGETPROC("alDeleteSources");
|
||||
balcMakeContextCurrent = ALGETPROC("alcMakeContextCurrent");
|
||||
balDeleteSources = ALGETPROC("alDeleteSources");
|
||||
balDeleteBuffers = ALGETPROC("alDeleteBuffers");
|
||||
balcDestroyContext = ALGETPROC("alcDestroyContext");
|
||||
balcCloseDevice = ALGETPROC("alcCloseDevice");
|
||||
balcOpenDevice = ALGETPROC("alcOpenDevice");
|
||||
balcCreateContext = ALGETPROC("alcCreateContext");
|
||||
balGetString = ALGETPROC("alGetString");
|
||||
|
||||
if (err) unloadaldriver();
|
||||
return err;
|
||||
}
|
||||
|
||||
char *ALC_ErrorString(int32_t code)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case ALC_NO_ERROR:
|
||||
return "OpenAL error: There is no current error.";
|
||||
case ALC_INVALID_DEVICE:
|
||||
return "OpenAL error: No device.";
|
||||
case ALC_INVALID_CONTEXT:
|
||||
return "OpenAL error: Invalid context ID.";
|
||||
case ALC_INVALID_ENUM:
|
||||
return "OpenAL error: Invalid parameter.";
|
||||
case ALC_INVALID_VALUE:
|
||||
return "OpenAL error: Invalid enum parameter value.";
|
||||
case ALC_OUT_OF_MEMORY:
|
||||
return "OpenAL error: Unable to allocate memory.";
|
||||
default:
|
||||
return "OpenAL error: Unknown error.";
|
||||
}
|
||||
}
|
||||
char *AL_ErrorString(int32_t code)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case AL_NO_ERROR:
|
||||
return "OpenAL error: There is no current error.";
|
||||
case AL_INVALID_NAME:
|
||||
return "OpenAL error: Invalid name parameter.";
|
||||
case AL_INVALID_ENUM:
|
||||
return "OpenAL error: Invalid parameter.";
|
||||
case AL_INVALID_VALUE:
|
||||
return "OpenAL error: Invalid enum parameter value.";
|
||||
case AL_INVALID_OPERATION:
|
||||
return "OpenAL error: Illegal call.";
|
||||
case AL_OUT_OF_MEMORY:
|
||||
return "OpenAL error: Unable to allocate memory.";
|
||||
case OV_EFAULT:
|
||||
return "Internal logic fault (bug or heap/stack corruption.";
|
||||
case OV_EREAD:
|
||||
return "Read from media.";
|
||||
case OV_EIMPL:
|
||||
return "The bitstream makes use of a feature not implemented in this library version.";
|
||||
case OV_EINVAL:
|
||||
return "Invalid argument value.";
|
||||
case OV_ENOTVORBIS:
|
||||
return "Not Vorbis data.";
|
||||
case OV_EBADHEADER:
|
||||
return "Invalid Vorbis header.";
|
||||
case OV_EVERSION:
|
||||
return "Vorbis version mismatch.";
|
||||
case OV_ENOTAUDIO:
|
||||
return "Packet data submitted to vorbis_synthesis is not audio data.";
|
||||
case OV_EBADPACKET:
|
||||
return "Invalid packet submitted to vorbis_synthesis.";
|
||||
case OV_EBADLINK:
|
||||
return "Invalid stream section supplied to libvorbis/libvorbisfile, or the requested link is corrupt.";
|
||||
case OV_ENOSEEK:
|
||||
return "Bitstream is not seekable.";
|
||||
default:
|
||||
return "Unknown OpenAL/Ogg error.";
|
||||
}
|
||||
}
|
||||
void check(int32_t show)
|
||||
{
|
||||
AL_Error=balcGetError(device);
|
||||
if (AL_Error!=ALC_NO_ERROR&&show)
|
||||
initprintf("%s(%s)\n",ALC_ErrorString(AL_Error),ALdoing);
|
||||
AL_Error=balGetError();
|
||||
if (AL_Error!= AL_NO_ERROR&&show)
|
||||
initprintf("%s(%s)\n", AL_ErrorString(AL_Error),ALdoing);
|
||||
}
|
||||
extern ov_callbacks cb;
|
||||
|
||||
|
||||
int32_t AL_Init()
|
||||
{
|
||||
Bmemset(&music,0,sizeof(music)); // "music.def.size=0" means music not playing
|
||||
if (loadaldriver())
|
||||
{
|
||||
initprintf("Failed loading OpenAL driver.\nDownload OpenAL 1.1 or greater from http://www.openal.org/downloads.html\n");
|
||||
openal_disabled = 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
ALdoing="Init";
|
||||
// device=alcOpenDevice(ud.config.HardwareAL?"Generic Hardware":"Generic Software");
|
||||
device=balcOpenDevice(NULL);
|
||||
check(1);
|
||||
|
||||
if (device)
|
||||
{
|
||||
context=balcCreateContext(device,NULL);
|
||||
check(1);
|
||||
}
|
||||
|
||||
if (context)
|
||||
{
|
||||
// char *s,*t,*u,i;
|
||||
|
||||
balcMakeContextCurrent(context);check(1);
|
||||
initprintf("OpenAL Information:\n"
|
||||
" Version: %s\n"
|
||||
" Vendor: %s\n"
|
||||
" Renderer: %s\n"
|
||||
// " Extensions:\n"
|
||||
,balGetString(AL_VERSION),balGetString(AL_VENDOR),balGetString(AL_RENDERER));
|
||||
|
||||
/* s = Bstrdup(balGetString(AL_EXTENSIONS));
|
||||
if (!s) initprintf(balGetString(AL_EXTENSIONS));
|
||||
else
|
||||
{
|
||||
i = 0; t = u = s;
|
||||
while (*t)
|
||||
{
|
||||
if (*t == ' ')
|
||||
{
|
||||
if (i&1)
|
||||
{
|
||||
*t = 0;
|
||||
initprintf(" %s\n",u);
|
||||
u = t+1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
t++;
|
||||
}
|
||||
if (i&1) initprintf(" %s\n",u);
|
||||
Bfree(s);
|
||||
}
|
||||
*/
|
||||
}
|
||||
else initprintf("OpenAL initialization failed.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void AL_Stop();
|
||||
void AL_Shutdown()
|
||||
{
|
||||
if (openal_disabled || !device) return;
|
||||
|
||||
initprintf("Uninitializing OpenAL...\n");
|
||||
AL_Stop();
|
||||
ALdoing="Shut";
|
||||
balcMakeContextCurrent(NULL);
|
||||
check(1);
|
||||
balcDestroyContext(context);
|
||||
check(1);
|
||||
balcCloseDevice(device);
|
||||
unloadaldriver();
|
||||
}
|
||||
|
||||
#define BUFFER_SIZE 65536 // (4096 * 4*8*8)
|
||||
int32_t AL_MusicVolume;
|
||||
extern int32_t g_musicSize;
|
||||
|
||||
|
||||
int32_t update();
|
||||
int32_t stream(ALuint buffer);
|
||||
void open1(char *ptr,int32_t sizef,char loop);
|
||||
|
||||
|
||||
|
||||
void AL_Pause() {if (music.def.size)balSourcePause(music.source);}
|
||||
void AL_Continue() {if (music.def.size)balSourcePlay(music.source);}
|
||||
void AL_Update() {if (music.def.size&&music.ready&&!update(0))AL_Stop();}
|
||||
int32_t AL_isntALmusic() {return !music.def.size;}
|
||||
|
||||
void AL_SetMusicVolume(int32_t volume)
|
||||
{
|
||||
AL_MusicVolume=volume;
|
||||
if (music.def.size)balSourcef(music.source,AL_GAIN,volume/(255.));
|
||||
}
|
||||
|
||||
int32_t isplaying()
|
||||
{
|
||||
ALenum state;
|
||||
balGetSourcei(music.source,AL_SOURCE_STATE,&state);
|
||||
return state==AL_PLAYING;
|
||||
}
|
||||
|
||||
int32_t update()
|
||||
{
|
||||
int32_t processed=0;
|
||||
int32_t active=1;
|
||||
ALuint buffer;
|
||||
|
||||
ALdoing="update";
|
||||
balGetSourcei(music.source,AL_BUFFERS_PROCESSED,&processed);
|
||||
check(1);
|
||||
if (processed)
|
||||
switch (music.type)
|
||||
{
|
||||
case 1:
|
||||
while (processed--)
|
||||
{
|
||||
ALdoing="update1";
|
||||
balSourceUnqueueBuffers(music.source,1,&buffer);
|
||||
check(1);
|
||||
active=stream(buffer);
|
||||
if (active)
|
||||
{
|
||||
ALdoing="update2";
|
||||
balSourceQueueBuffers(music.source,1,&buffer);
|
||||
check(1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return active;
|
||||
}
|
||||
|
||||
void AL_Stop()
|
||||
{
|
||||
int32_t queued=0;ALuint buffer;
|
||||
|
||||
if (!music.def.size)
|
||||
return;
|
||||
|
||||
music.ready=0;
|
||||
balSourceStop(music.source);
|
||||
balGetSourcei(music.source,AL_BUFFERS_QUEUED,&queued);
|
||||
|
||||
ALdoing="release";
|
||||
while (queued--)
|
||||
{
|
||||
balSourceUnqueueBuffers(music.source,1,&buffer);
|
||||
check(1);
|
||||
}
|
||||
balDeleteSources(1,&music.source);check(1);
|
||||
balDeleteBuffers(2, music.buffers);check(1);
|
||||
|
||||
if (music.type == 1)
|
||||
ov_clear(&music.def.oggStream);
|
||||
Bmemset(&music,0,sizeof(music));
|
||||
}
|
||||
|
||||
static char pcm[BUFFER_SIZE];
|
||||
|
||||
int32_t stream(ALuint buffer)
|
||||
{
|
||||
ALsizei size=0;
|
||||
int32_t section,result;
|
||||
|
||||
while (size<BUFFER_SIZE)
|
||||
{
|
||||
result=ov_read(&music.def.oggStream,pcm+size,BUFFER_SIZE-size,0,2,1,§ion);
|
||||
if (result==0&&music.loop)ov_pcm_seek(&music.def.oggStream,0);else
|
||||
if (result> 0)size+=result;else break;
|
||||
}
|
||||
if (!size)
|
||||
return 0;
|
||||
ALdoing="stream";
|
||||
balBufferData(buffer,music.format,pcm,size,music.rate);
|
||||
check(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void AL_PlaySong(char *ptr,int32_t loop)
|
||||
{
|
||||
vorbis_info* vorbisInfo;
|
||||
int32_t bf=2,i;
|
||||
|
||||
if (!context)
|
||||
return;
|
||||
Bmemset(&music,0,sizeof(sounddef1));
|
||||
switch (*ptr)
|
||||
{
|
||||
case 'O':
|
||||
music.type=1;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
music.def.size=g_musicSize;
|
||||
music.loop=loop;
|
||||
music.def.ptrsnd=ptr;
|
||||
|
||||
switch (music.type)
|
||||
{
|
||||
case 1:
|
||||
if ((i=ov_open_callbacks(&music.def,&music.def.oggStream,0,0,cb))<0)
|
||||
{
|
||||
Bmemset(&music,0,sizeof(sounddef1));
|
||||
initprintf("Music error: %s\n",AL_ErrorString(i));
|
||||
return;
|
||||
}
|
||||
vorbisInfo=ov_info(&music.def.oggStream,-1);
|
||||
if (!vorbisInfo)
|
||||
{
|
||||
initprintf("Music error: vorbisInfo\n");
|
||||
Bmemset(&music,0,sizeof(sounddef1));
|
||||
return;
|
||||
}
|
||||
music.rate=vorbisInfo->rate;
|
||||
music.format=(vorbisInfo->channels==1)?AL_FORMAT_MONO16:AL_FORMAT_STEREO16;
|
||||
break;
|
||||
}
|
||||
|
||||
ALdoing="Open";
|
||||
balGenBuffers(2, music.buffers);check(1);
|
||||
balGenSources(1,&music.source);check(1);
|
||||
balSourcei(music.source,AL_SOURCE_RELATIVE,AL_TRUE);
|
||||
|
||||
switch (music.type)
|
||||
{
|
||||
case 1:
|
||||
stream(music.buffers[0]);
|
||||
if (!stream(music.buffers[1]))
|
||||
bf=1;
|
||||
balSourceQueueBuffers(music.source,bf,music.buffers);
|
||||
break;
|
||||
}
|
||||
|
||||
AL_SetMusicVolume(AL_MusicVolume);
|
||||
AL_Continue();
|
||||
music.ready=1;
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Copyright (C) 2008 - EDuke32 developers
|
||||
|
||||
This file is part of EDuke32
|
||||
|
||||
EDuke32 is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License version 2
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
#ifndef __OPENAL_H
|
||||
#define __OPENAL_H
|
||||
|
||||
#include <vorbis/vorbisfile.h>
|
||||
|
||||
int32_t AL_Init();
|
||||
void AL_Shutdown();
|
||||
void AL_Update();
|
||||
char *AL_ErrorString(int32_t code);
|
||||
char *ALC_ErrorString(int32_t code);
|
||||
|
||||
void AL_Stop();
|
||||
int32_t AL_isntALmusic();
|
||||
void AL_PlaySong(char *song,int32_t loopflag);
|
||||
void AL_Pause();
|
||||
void AL_Continue();
|
||||
void AL_SetMusicVolume(int32_t volume);
|
||||
|
||||
int32_t openal_disabled;
|
||||
|
||||
typedef struct sounddef
|
||||
{
|
||||
uint32_t pos;
|
||||
char *ptrsnd;
|
||||
uint32_t size;
|
||||
OggVorbis_File oggStream;
|
||||
} sounddef;
|
||||
#endif
|
|
@ -1,199 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: PITCH.C
|
||||
|
||||
author: James R. Dose
|
||||
date: June 14, 1993
|
||||
|
||||
Routines for pitch scaling.
|
||||
|
||||
(c) Copyright 1993 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
//#include <math.h>
|
||||
#include "standard.h"
|
||||
#include "pitch.h"
|
||||
|
||||
#define MAXDETUNE 25
|
||||
|
||||
static uint32_t PitchTable[ 12 ][ MAXDETUNE ] =
|
||||
{
|
||||
{
|
||||
0x10000, 0x10097, 0x1012f, 0x101c7, 0x10260, 0x102f9, 0x10392, 0x1042c,
|
||||
0x104c6, 0x10561, 0x105fb, 0x10696, 0x10732, 0x107ce, 0x1086a, 0x10907,
|
||||
0x109a4, 0x10a41, 0x10adf, 0x10b7d, 0x10c1b, 0x10cba, 0x10d59, 0x10df8,
|
||||
0x10e98
|
||||
},
|
||||
{ 0x10f38, 0x10fd9, 0x1107a, 0x1111b, 0x111bd, 0x1125f, 0x11302, 0x113a5,
|
||||
0x11448, 0x114eb, 0x1158f, 0x11634, 0x116d8, 0x1177e, 0x11823, 0x118c9,
|
||||
0x1196f, 0x11a16, 0x11abd, 0x11b64, 0x11c0c, 0x11cb4, 0x11d5d, 0x11e06,
|
||||
0x11eaf },
|
||||
{ 0x11f59, 0x12003, 0x120ae, 0x12159, 0x12204, 0x122b0, 0x1235c, 0x12409,
|
||||
0x124b6, 0x12563, 0x12611, 0x126bf, 0x1276d, 0x1281c, 0x128cc, 0x1297b,
|
||||
0x12a2b, 0x12adc, 0x12b8d, 0x12c3e, 0x12cf0, 0x12da2, 0x12e55, 0x12f08,
|
||||
0x12fbc },
|
||||
{ 0x1306f, 0x13124, 0x131d8, 0x1328d, 0x13343, 0x133f9, 0x134af, 0x13566,
|
||||
0x1361d, 0x136d5, 0x1378d, 0x13846, 0x138fe, 0x139b8, 0x13a72, 0x13b2c,
|
||||
0x13be6, 0x13ca1, 0x13d5d, 0x13e19, 0x13ed5, 0x13f92, 0x1404f, 0x1410d,
|
||||
0x141cb },
|
||||
{ 0x1428a, 0x14349, 0x14408, 0x144c8, 0x14588, 0x14649, 0x1470a, 0x147cc,
|
||||
0x1488e, 0x14951, 0x14a14, 0x14ad7, 0x14b9b, 0x14c5f, 0x14d24, 0x14dea,
|
||||
0x14eaf, 0x14f75, 0x1503c, 0x15103, 0x151cb, 0x15293, 0x1535b, 0x15424,
|
||||
0x154ee },
|
||||
{ 0x155b8, 0x15682, 0x1574d, 0x15818, 0x158e4, 0x159b0, 0x15a7d, 0x15b4a,
|
||||
0x15c18, 0x15ce6, 0x15db4, 0x15e83, 0x15f53, 0x16023, 0x160f4, 0x161c5,
|
||||
0x16296, 0x16368, 0x1643a, 0x1650d, 0x165e1, 0x166b5, 0x16789, 0x1685e,
|
||||
0x16934 },
|
||||
{ 0x16a09, 0x16ae0, 0x16bb7, 0x16c8e, 0x16d66, 0x16e3e, 0x16f17, 0x16ff1,
|
||||
0x170ca, 0x171a5, 0x17280, 0x1735b, 0x17437, 0x17513, 0x175f0, 0x176ce,
|
||||
0x177ac, 0x1788a, 0x17969, 0x17a49, 0x17b29, 0x17c09, 0x17cea, 0x17dcc,
|
||||
0x17eae },
|
||||
{ 0x17f91, 0x18074, 0x18157, 0x1823c, 0x18320, 0x18406, 0x184eb, 0x185d2,
|
||||
0x186b8, 0x187a0, 0x18888, 0x18970, 0x18a59, 0x18b43, 0x18c2d, 0x18d17,
|
||||
0x18e02, 0x18eee, 0x18fda, 0x190c7, 0x191b5, 0x192a2, 0x19391, 0x19480,
|
||||
0x1956f },
|
||||
{ 0x1965f, 0x19750, 0x19841, 0x19933, 0x19a25, 0x19b18, 0x19c0c, 0x19d00,
|
||||
0x19df4, 0x19ee9, 0x19fdf, 0x1a0d5, 0x1a1cc, 0x1a2c4, 0x1a3bc, 0x1a4b4,
|
||||
0x1a5ad, 0x1a6a7, 0x1a7a1, 0x1a89c, 0x1a998, 0x1aa94, 0x1ab90, 0x1ac8d,
|
||||
0x1ad8b },
|
||||
{ 0x1ae89, 0x1af88, 0x1b088, 0x1b188, 0x1b289, 0x1b38a, 0x1b48c, 0x1b58f,
|
||||
0x1b692, 0x1b795, 0x1b89a, 0x1b99f, 0x1baa4, 0x1bbaa, 0x1bcb1, 0x1bdb8,
|
||||
0x1bec0, 0x1bfc9, 0x1c0d2, 0x1c1dc, 0x1c2e6, 0x1c3f1, 0x1c4fd, 0x1c609,
|
||||
0x1c716 },
|
||||
{ 0x1c823, 0x1c931, 0x1ca40, 0x1cb50, 0x1cc60, 0x1cd70, 0x1ce81, 0x1cf93,
|
||||
0x1d0a6, 0x1d1b9, 0x1d2cd, 0x1d3e1, 0x1d4f6, 0x1d60c, 0x1d722, 0x1d839,
|
||||
0x1d951, 0x1da69, 0x1db82, 0x1dc9c, 0x1ddb6, 0x1ded1, 0x1dfec, 0x1e109,
|
||||
0x1e225 },
|
||||
{ 0x1e343, 0x1e461, 0x1e580, 0x1e6a0, 0x1e7c0, 0x1e8e0, 0x1ea02, 0x1eb24,
|
||||
0x1ec47, 0x1ed6b, 0x1ee8f, 0x1efb4, 0x1f0d9, 0x1f1ff, 0x1f326, 0x1f44e,
|
||||
0x1f576, 0x1f69f, 0x1f7c9, 0x1f8f3, 0x1fa1e, 0x1fb4a, 0x1fc76, 0x1fda3,
|
||||
0x1fed1 }
|
||||
};
|
||||
|
||||
|
||||
//static int32_t PITCH_Installed = FALSE;
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: PITCH_Init
|
||||
|
||||
Initializes pitch table.
|
||||
---------------------------------------------------------------------*/
|
||||
/*
|
||||
void PITCH_Init
|
||||
(
|
||||
void
|
||||
)
|
||||
|
||||
{
|
||||
int32_t note;
|
||||
int32_t detune;
|
||||
|
||||
if ( !PITCH_Installed )
|
||||
{
|
||||
for( note = 0; note < 12; note++ )
|
||||
{
|
||||
for( detune = 0; detune < MAXDETUNE; detune++ )
|
||||
{
|
||||
PitchTable[ note ][ detune ] = 0x10000 *
|
||||
pow( 2, ( note * MAXDETUNE + detune ) / ( 12.0 * MAXDETUNE ) );
|
||||
}
|
||||
}
|
||||
|
||||
PITCH_Installed = TRUE;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/**********************************************************************
|
||||
|
||||
Memory locked functions:
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Function: PITCH_GetScale
|
||||
|
||||
Returns a fixed-point value to scale number the specified amount.
|
||||
---------------------------------------------------------------------*/
|
||||
|
||||
uint32_t PITCH_GetScale
|
||||
(
|
||||
int32_t pitchoffset
|
||||
)
|
||||
|
||||
{
|
||||
uint32_t scale;
|
||||
int32_t octaveshift;
|
||||
int32_t noteshift;
|
||||
int32_t note;
|
||||
int32_t detune;
|
||||
|
||||
// if ( !PITCH_Installed )
|
||||
// {
|
||||
// PITCH_Init();
|
||||
// }
|
||||
|
||||
if (pitchoffset == 0)
|
||||
{
|
||||
return(PitchTable[ 0 ][ 0 ]);
|
||||
}
|
||||
|
||||
noteshift = pitchoffset % 1200;
|
||||
if (noteshift < 0)
|
||||
{
|
||||
noteshift += 1200;
|
||||
}
|
||||
|
||||
note = noteshift / 100;
|
||||
detune = (noteshift % 100) / (100 / MAXDETUNE);
|
||||
octaveshift = (pitchoffset - noteshift) / 1200;
|
||||
|
||||
if (detune < 0)
|
||||
{
|
||||
detune += (100 / MAXDETUNE);
|
||||
note--;
|
||||
if (note < 0)
|
||||
{
|
||||
note += 12;
|
||||
octaveshift--;
|
||||
}
|
||||
}
|
||||
|
||||
scale = PitchTable[ note ][ detune ];
|
||||
|
||||
if (octaveshift < 0)
|
||||
{
|
||||
scale >>= -octaveshift;
|
||||
}
|
||||
else
|
||||
{
|
||||
scale <<= octaveshift;
|
||||
}
|
||||
|
||||
return(scale);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: PITCH.H
|
||||
|
||||
author: James R. Dose
|
||||
date: June 14, 1994
|
||||
|
||||
Public header for PITCH.C
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __PITCH_H
|
||||
#define __PITCH_H
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
enum PITCH_ERRORS
|
||||
{
|
||||
PITCH_Warning = -2,
|
||||
PITCH_Error = -1,
|
||||
PITCH_Ok = 0,
|
||||
};
|
||||
|
||||
//void PITCH_Init( void );
|
||||
uint32_t PITCH_GetScale( int32_t pitchoffset );
|
||||
#endif
|
|
@ -1,57 +0,0 @@
|
|||
#ifndef _INCLUDE_PLATFORM_H_
|
||||
#define _INCLUDE_PLATFORM_H_
|
||||
|
||||
#if (!defined __EXPORT__)
|
||||
#define __EXPORT__
|
||||
#endif
|
||||
|
||||
static __inline uint16_t _swap16(uint16_t D)
|
||||
{
|
||||
#if PLATFORM_MACOSX
|
||||
register uint16_t returnValue;
|
||||
__asm__ volatile("lhbrx %0,0,%1"
|
||||
: "=r" (returnValue)
|
||||
: "r" (&D)
|
||||
);
|
||||
return returnValue;
|
||||
#else
|
||||
return((D<<8)|(D>>8));
|
||||
#endif
|
||||
}
|
||||
|
||||
static __inline uint32_t _swap32(uint32_t D)
|
||||
{
|
||||
#if PLATFORM_MACOSX
|
||||
register uint32_t returnValue;
|
||||
__asm__ volatile("lwbrx %0,0,%1"
|
||||
: "=r" (returnValue)
|
||||
: "r" (&D)
|
||||
);
|
||||
return returnValue;
|
||||
#else
|
||||
return((D<<24)|((D<<8)&0x00FF0000)|((D>>8)&0x0000FF00)|(D>>24));
|
||||
#endif
|
||||
}
|
||||
|
||||
#if PLATFORM_MACOSX
|
||||
#define PLATFORM_BIGENDIAN 1
|
||||
#define BUILDSWAP_INTEL16(x) _swap16(x)
|
||||
#define BUILDSWAP_INTEL32(x) _swap32(x)
|
||||
#else
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
#define PLATFORM_LITTLEENDIAN 1
|
||||
#define BUILDSWAP_INTEL16(x) (x)
|
||||
#define BUILDSWAP_INTEL32(x) (x)
|
||||
#else
|
||||
#define PLATFORM_BIGENDIAN 1
|
||||
#define BUILDSWAP_INTEL16(x) _swap16(x)
|
||||
#define BUILDSWAP_INTEL32(x) _swap32(x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern int32_t has_altivec; /* PowerPC-specific. */
|
||||
|
||||
#endif /* !defined _INCLUDE_PLATFORM_H_ */
|
||||
|
||||
/* end of platform.h ... */
|
||||
|
|
@ -1,418 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2003-2004 Ryan C. Gordon. and James Bentler
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Originally written by Ryan C. Gordon. (icculus@clutteredmind.org)
|
||||
Adapted to work with JonoF's port by James Bentler (bentler@cs.umn.edu)
|
||||
|
||||
*/
|
||||
/*
|
||||
* A reimplementation of Jim Dose's FX_MAN routines, using SDL_mixer 1.2.
|
||||
* Whee. FX_MAN is also known as the "Apogee Sound System", or "ASS" for
|
||||
* short. How strangely appropriate that seems.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "duke3d.h"
|
||||
#include "cache1d.h"
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#define cdecl
|
||||
#endif
|
||||
|
||||
#define _NEED_SDLMIXER 1
|
||||
#include "sdl_inc.h"
|
||||
#include "music.h"
|
||||
|
||||
#define __FX_TRUE (1 == 1)
|
||||
#define __FX_FALSE (!__FX_TRUE)
|
||||
|
||||
#define DUKESND_DEBUG "DUKESND_DEBUG"
|
||||
|
||||
#ifndef min
|
||||
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef max
|
||||
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
int32_t MUSIC_ErrorCode = MUSIC_Ok;
|
||||
|
||||
static char warningMessage[80];
|
||||
static char errorMessage[80];
|
||||
static FILE *debug_file = NULL;
|
||||
static int32_t initialized_debugging = 0;
|
||||
static int32_t external_midi = 0;
|
||||
|
||||
static int32_t music_initialized = 0;
|
||||
static int32_t music_context = 0;
|
||||
static int32_t music_loopflag = MUSIC_PlayOnce;
|
||||
static Mix_Music *music_musicchunk = NULL;
|
||||
// static char *music_songdata = NULL;
|
||||
|
||||
// This gets called all over the place for information and debugging messages.
|
||||
// If the user set the DUKESND_DEBUG environment variable, the messages
|
||||
// go to the file that is specified in that variable. Otherwise, they
|
||||
// are ignored for the expense of the function call. If DUKESND_DEBUG is
|
||||
// set to "-" (without the quotes), then the output goes to stdout.
|
||||
static void musdebug(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (debug_file)
|
||||
{
|
||||
fprintf(debug_file, "DUKEMUS: ");
|
||||
va_start(ap, fmt);
|
||||
vfprintf(debug_file, fmt, ap);
|
||||
va_end(ap);
|
||||
fprintf(debug_file, "\n");
|
||||
fflush(debug_file);
|
||||
} // if
|
||||
} // musdebug
|
||||
|
||||
static void init_debugging(void)
|
||||
{
|
||||
const char *envr;
|
||||
|
||||
if (initialized_debugging)
|
||||
return;
|
||||
|
||||
envr = getenv(DUKESND_DEBUG);
|
||||
if (envr != NULL)
|
||||
{
|
||||
if (Bstrcmp(envr, "-") == 0)
|
||||
debug_file = stdout;
|
||||
else
|
||||
debug_file = fopen(envr, "w");
|
||||
|
||||
if (debug_file == NULL)
|
||||
fprintf(stderr, "DUKESND: -WARNING- Could not open debug file!\n");
|
||||
else
|
||||
setbuf(debug_file, NULL);
|
||||
} // if
|
||||
|
||||
initialized_debugging = 1;
|
||||
} // init_debugging
|
||||
|
||||
static void setErrorMessage(const char *msg)
|
||||
{
|
||||
Bstrncpy(errorMessage, msg, sizeof(errorMessage));
|
||||
// strncpy() doesn't add the null char if there isn't room...
|
||||
errorMessage[sizeof(errorMessage) - 1] = '\0';
|
||||
musdebug("Error message set to [%s].", errorMessage);
|
||||
} // setErrorMessage
|
||||
|
||||
// The music functions...
|
||||
|
||||
char *MUSIC_ErrorString(int32_t ErrorNumber)
|
||||
{
|
||||
switch (ErrorNumber)
|
||||
{
|
||||
case MUSIC_Warning:
|
||||
return(warningMessage);
|
||||
|
||||
case MUSIC_Error:
|
||||
return(errorMessage);
|
||||
|
||||
case MUSIC_Ok:
|
||||
return("OK; no error.");
|
||||
|
||||
case MUSIC_ASSVersion:
|
||||
return("Incorrect sound library version.");
|
||||
|
||||
case MUSIC_SoundCardError:
|
||||
return("General sound card error.");
|
||||
|
||||
case MUSIC_InvalidCard:
|
||||
return("Invalid sound card.");
|
||||
|
||||
case MUSIC_MidiError:
|
||||
return("MIDI error.");
|
||||
|
||||
case MUSIC_MPU401Error:
|
||||
return("MPU401 error.");
|
||||
|
||||
case MUSIC_TaskManError:
|
||||
return("Task Manager error.");
|
||||
|
||||
//case MUSIC_FMNotDetected:
|
||||
// return("FM not detected error.");
|
||||
|
||||
case MUSIC_DPMI_Error:
|
||||
return("DPMI error.");
|
||||
|
||||
default:
|
||||
return("Unknown error.");
|
||||
} // switch
|
||||
|
||||
assert(0); // shouldn't hit this point.
|
||||
return(NULL);
|
||||
} // MUSIC_ErrorString
|
||||
|
||||
int32_t MUSIC_Init(int32_t SoundCard, int32_t Address)
|
||||
{
|
||||
// Use an external MIDI player if the user has specified to do so
|
||||
char *command = getenv("EDUKE32_MUSIC_CMD");
|
||||
const SDL_version *linked = Mix_Linked_Version();
|
||||
|
||||
if (SDL_VERSIONNUM(linked->major,linked->minor,linked->patch) < MIX_REQUIREDVERSION)
|
||||
{
|
||||
// reject running with SDL_Mixer versions older than what is stated in sdl_inc.h
|
||||
initprintf("You need at least v%d.%d.%d of SDL_mixer for music\n",SDL_MIXER_MIN_X,SDL_MIXER_MIN_Y,SDL_MIXER_MIN_Z);
|
||||
return(MUSIC_Error);
|
||||
}
|
||||
|
||||
external_midi = (command != NULL && command[0] != 0);
|
||||
|
||||
if (external_midi)
|
||||
Mix_SetMusicCMD(command);
|
||||
else
|
||||
{
|
||||
FILE *fp = fopen("/etc/timidity.cfg", "r");
|
||||
if (fp == NULL)
|
||||
{
|
||||
initprintf("Error opening /etc/timidity.cfg: %s\n",strerror(errno));
|
||||
return MUSIC_Error;
|
||||
}
|
||||
Bfclose(fp);
|
||||
}
|
||||
|
||||
init_debugging();
|
||||
|
||||
musdebug("INIT! card=>%d, address=>%d...", SoundCard, Address);
|
||||
|
||||
if (music_initialized)
|
||||
{
|
||||
setErrorMessage("Music system is already initialized.");
|
||||
return(MUSIC_Error);
|
||||
} // if
|
||||
|
||||
SoundCard = 1;
|
||||
|
||||
music_initialized = 1;
|
||||
return(MUSIC_Ok);
|
||||
} // MUSIC_Init
|
||||
|
||||
|
||||
int32_t MUSIC_Shutdown(void)
|
||||
{
|
||||
musdebug("shutting down sound subsystem.");
|
||||
|
||||
// TODO - make sure this is being called from the menu -- SA
|
||||
if (external_midi)
|
||||
Mix_SetMusicCMD(NULL);
|
||||
|
||||
MUSIC_StopSong();
|
||||
music_context = 0;
|
||||
music_initialized = 0;
|
||||
music_loopflag = MUSIC_PlayOnce;
|
||||
|
||||
return(MUSIC_Ok);
|
||||
} // MUSIC_Shutdown
|
||||
|
||||
|
||||
void MUSIC_SetMaxFMMidiChannel(int32_t channel)
|
||||
{
|
||||
musdebug("STUB ... MUSIC_SetMaxFMMidiChannel(%d).\n", channel);
|
||||
} // MUSIC_SetMaxFMMidiChannel
|
||||
|
||||
|
||||
void MUSIC_SetVolume(int32_t volume)
|
||||
{
|
||||
volume = max(0, volume);
|
||||
volume = min(volume, 255);
|
||||
|
||||
Mix_VolumeMusic(volume >> 1); // convert 0-255 to 0-128.
|
||||
} // MUSIC_SetVolume
|
||||
|
||||
|
||||
void MUSIC_SetMidiChannelVolume(int32_t channel, int32_t volume)
|
||||
{
|
||||
musdebug("STUB ... MUSIC_SetMidiChannelVolume(%d, %d).\n", channel, volume);
|
||||
} // MUSIC_SetMidiChannelVolume
|
||||
|
||||
|
||||
void MUSIC_ResetMidiChannelVolumes(void)
|
||||
{
|
||||
musdebug("STUB ... MUSIC_ResetMidiChannelVolumes().\n");
|
||||
} // MUSIC_ResetMidiChannelVolumes
|
||||
|
||||
|
||||
int32_t MUSIC_GetVolume(void)
|
||||
{
|
||||
return(Mix_VolumeMusic(-1) << 1); // convert 0-128 to 0-255.
|
||||
} // MUSIC_GetVolume
|
||||
|
||||
|
||||
void MUSIC_SetLoopFlag(int32_t loopflag)
|
||||
{
|
||||
music_loopflag = loopflag;
|
||||
} // MUSIC_SetLoopFlag
|
||||
|
||||
|
||||
int32_t MUSIC_SongPlaying(void)
|
||||
{
|
||||
return((Mix_PlayingMusic()) ? __FX_TRUE : __FX_FALSE);
|
||||
} // MUSIC_SongPlaying
|
||||
|
||||
|
||||
void MUSIC_Continue(void)
|
||||
{
|
||||
if (Mix_PausedMusic())
|
||||
Mix_ResumeMusic();
|
||||
} // MUSIC_Continue
|
||||
|
||||
|
||||
void MUSIC_Pause(void)
|
||||
{
|
||||
Mix_PauseMusic();
|
||||
} // MUSIC_Pause
|
||||
|
||||
|
||||
int32_t MUSIC_StopSong(void)
|
||||
{
|
||||
//if (!fx_initialized)
|
||||
if (!Mix_QuerySpec(NULL, NULL, NULL))
|
||||
{
|
||||
setErrorMessage("Need FX system initialized, too. Sorry.");
|
||||
return(MUSIC_Error);
|
||||
} // if
|
||||
|
||||
if ((Mix_PlayingMusic()) || (Mix_PausedMusic()))
|
||||
Mix_HaltMusic();
|
||||
|
||||
if (music_musicchunk)
|
||||
Mix_FreeMusic(music_musicchunk);
|
||||
// if (music_songdata)
|
||||
// Bfree(music_songdata);
|
||||
|
||||
music_musicchunk = NULL;
|
||||
// music_songdata = NULL;
|
||||
|
||||
return(MUSIC_Ok);
|
||||
} // MUSIC_StopSong
|
||||
|
||||
// Duke3D-specific. --ryan.
|
||||
// void MUSIC_PlayMusic(char *_filename)
|
||||
int32_t MUSIC_PlaySong(char *song, int32_t loopflag)
|
||||
{
|
||||
MUSIC_StopSong();
|
||||
music_musicchunk = Mix_LoadMUS_RW(SDL_RWFromMem((char *) song, g_musicSize));
|
||||
|
||||
if (music_musicchunk != NULL)
|
||||
{
|
||||
Mix_PlayMusic(music_musicchunk, (loopflag == MUSIC_LoopSong)?-1:0);
|
||||
} // if
|
||||
return MUSIC_Ok;
|
||||
}
|
||||
|
||||
|
||||
void MUSIC_SetContext(int32_t context)
|
||||
{
|
||||
musdebug("STUB ... MUSIC_SetContext().\n");
|
||||
music_context = context;
|
||||
} // MUSIC_SetContext
|
||||
|
||||
|
||||
int32_t MUSIC_GetContext(void)
|
||||
{
|
||||
return(music_context);
|
||||
} // MUSIC_GetContext
|
||||
|
||||
|
||||
void MUSIC_SetSongTick(uint32_t PositionInTicks)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(PositionInTicks);
|
||||
musdebug("STUB ... MUSIC_SetSongTick().\n");
|
||||
} // MUSIC_SetSongTick
|
||||
|
||||
|
||||
void MUSIC_SetSongTime(uint32_t milliseconds)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(milliseconds);
|
||||
musdebug("STUB ... MUSIC_SetSongTime().\n");
|
||||
}// MUSIC_SetSongTime
|
||||
|
||||
|
||||
void MUSIC_SetSongPosition(int32_t measure, int32_t beat, int32_t tick)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(measure);
|
||||
UNREFERENCED_PARAMETER(beat);
|
||||
UNREFERENCED_PARAMETER(tick);
|
||||
musdebug("STUB ... MUSIC_SetSongPosition().\n");
|
||||
} // MUSIC_SetSongPosition
|
||||
|
||||
|
||||
void MUSIC_GetSongPosition(songposition *pos)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(pos);
|
||||
musdebug("STUB ... MUSIC_GetSongPosition().\n");
|
||||
} // MUSIC_GetSongPosition
|
||||
|
||||
|
||||
void MUSIC_GetSongLength(songposition *pos)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(pos);
|
||||
musdebug("STUB ... MUSIC_GetSongLength().\n");
|
||||
} // MUSIC_GetSongLength
|
||||
|
||||
|
||||
int32_t MUSIC_FadeVolume(int32_t tovolume, int32_t milliseconds)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(tovolume);
|
||||
Mix_FadeOutMusic(milliseconds);
|
||||
return(MUSIC_Ok);
|
||||
} // MUSIC_FadeVolume
|
||||
|
||||
|
||||
int32_t MUSIC_FadeActive(void)
|
||||
{
|
||||
return((Mix_FadingMusic() == MIX_FADING_OUT) ? __FX_TRUE : __FX_FALSE);
|
||||
} // MUSIC_FadeActive
|
||||
|
||||
|
||||
void MUSIC_StopFade(void)
|
||||
{
|
||||
musdebug("STUB ... MUSIC_StopFade().\n");
|
||||
} // MUSIC_StopFade
|
||||
|
||||
|
||||
void MUSIC_RerouteMidiChannel(int32_t channel, int32_t cdecl(*function)(int32_t event, int32_t c1, int32_t c2))
|
||||
{
|
||||
UNREFERENCED_PARAMETER(channel);
|
||||
UNREFERENCED_PARAMETER(function);
|
||||
musdebug("STUB ... MUSIC_RerouteMidiChannel().\n");
|
||||
} // MUSIC_RerouteMidiChannel
|
||||
|
||||
|
||||
void MUSIC_RegisterTimbreBank(char *timbres)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(timbres);
|
||||
musdebug("STUB ... MUSIC_RegisterTimbreBank().\n");
|
||||
} // MUSIC_RegisterTimbreBank
|
||||
|
||||
|
||||
void MUSIC_Update(void)
|
||||
{}
|
|
@ -1,275 +0,0 @@
|
|||
/*
|
||||
* DirectSound output code for MultiVoc
|
||||
* by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Duke Nukem Copyright (C) 1996, 2003 3D Realms Entertainment
|
||||
|
||||
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
|
||||
|
||||
Duke Nukem 3D 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
#include "sdlout.h"
|
||||
#include "sdl_inc.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "sdlayer.h"
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef RENDERTYPESDL
|
||||
#error The SDL output module for AudioLib only works with the SDL interface.
|
||||
#endif
|
||||
|
||||
static int32_t(*_SDLSOUND_CallBack)(int32_t) = NULL;
|
||||
static int32_t _SDLSOUND_BufferLength = 0;
|
||||
static int32_t _SDLSOUND_NumBuffers = 0;
|
||||
static char *_SDLSOUND_MixBuffer = NULL;
|
||||
|
||||
static int32_t SDLSOUND_Installed = FALSE;
|
||||
|
||||
int32_t SDLSOUND_ErrorCode = SDLSOUND_Ok;
|
||||
|
||||
#define SDLSOUND_SetErrorCode( status ) \
|
||||
SDLSOUND_ErrorCode = ( status );
|
||||
|
||||
static void isr(void *userdata, char *stream, int32_t len);
|
||||
|
||||
/*
|
||||
* DisableInterrupts
|
||||
* Enter the critical section.
|
||||
*/
|
||||
int32_t DisableInterrupts(void)
|
||||
{
|
||||
SDL_LockAudio();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* RestoreInterrupts
|
||||
* Leave the critical section.
|
||||
*/
|
||||
int32_t RestoreInterrupts(int32_t a)
|
||||
{
|
||||
SDL_UnlockAudio();
|
||||
|
||||
return 0;
|
||||
a=a;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SDLSOUND_ErrorString
|
||||
* Returns a description of an error code.
|
||||
*/
|
||||
char *SDLSOUND_ErrorString(int32_t errorcode)
|
||||
{
|
||||
switch (errorcode)
|
||||
{
|
||||
case SDLSOUND_Warning:
|
||||
case SDLSOUND_Error:
|
||||
return SDLSOUND_ErrorString(SDLSOUND_ErrorCode);
|
||||
|
||||
case SDLSOUND_Ok:
|
||||
return "SDL Sound ok.";
|
||||
|
||||
default:
|
||||
return "Unknown SDL sound error code.";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SDLSOUND_Init
|
||||
* Initializes the SDL sound objects.
|
||||
*/
|
||||
int32_t SDLSOUND_Init(int32_t soundcard, int32_t mixrate, int32_t numchannels, int32_t samplebits, int32_t buffersize)
|
||||
{
|
||||
SDL_AudioSpec spec,got;
|
||||
|
||||
if (SDLSOUND_Installed)
|
||||
{
|
||||
SDLSOUND_Shutdown();
|
||||
}
|
||||
|
||||
initprintf("Initializing SDL sound...\n");
|
||||
|
||||
initprintf(" - Requested sound format\n"
|
||||
" Channels: %d\n"
|
||||
" Sample rate: %dHz\n"
|
||||
" Sample size: %d bits\n",
|
||||
numchannels, mixrate, samplebits);
|
||||
|
||||
spec.freq = mixrate;
|
||||
spec.format = (samplebits == 8 ? AUDIO_U8 : AUDIO_S16LSB);
|
||||
spec.channels = (numchannels == 1 ? 1:2);
|
||||
spec.samples = (buffersize >> (spec.channels-1)) >> (samplebits==16);
|
||||
spec.callback = isr;
|
||||
spec.userdata = NULL;
|
||||
|
||||
|
||||
SDLSOUND_Installed = TRUE;
|
||||
|
||||
SDLSOUND_SetErrorCode(SDLSOUND_Ok);
|
||||
return SDLSOUND_Ok;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SDLSOUND_Shutdown
|
||||
* Shuts down SDL sound and it's associates.
|
||||
*/
|
||||
int32_t SDLSOUND_Shutdown(void)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
if (SDLSOUND_Installed) initprintf("Uninitializing SDL sound...\n");
|
||||
|
||||
SDLSOUND_Installed = FALSE;
|
||||
|
||||
SDLSOUND_StopPlayback();
|
||||
|
||||
|
||||
SDLSOUND_SetErrorCode(SDLSOUND_Ok);
|
||||
return SDLSOUND_Ok;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SDLSOUND_SetMixMode
|
||||
* Bit of filler for the future.
|
||||
*/
|
||||
int32_t SDLSOUND_SetMixMode(int32_t mode)
|
||||
{
|
||||
return mode;
|
||||
}
|
||||
|
||||
|
||||
static void isr(void *userdata, char *stream, int32_t len)
|
||||
{
|
||||
// otherwise we just service the interrupt
|
||||
if (_DSOUND_CallBack)
|
||||
{
|
||||
|
||||
p = _DSOUND_CallBack(rv-WAIT_OBJECT_0-1);
|
||||
|
||||
hr = IDirectSoundBuffer_Lock(lpDSBSecondary, p*_DSOUND_BufferLength, _DSOUND_BufferLength,
|
||||
&lockptr, &lockbytes, &lockptr2, &lockbytes2, 0);
|
||||
if (hr == DSERR_BUFFERLOST)
|
||||
{
|
||||
hr = IDirectSoundBuffer_Restore(lpDSBSecondary);
|
||||
}
|
||||
if (hr == DS_OK)
|
||||
{
|
||||
/*
|
||||
#define copybuf(S,D,c) \
|
||||
({ void *__S=(S), *__D=(D); int32_t __c=(c); \
|
||||
__asm__ __volatile__ ("rep; movsl" \
|
||||
: "+S" (__S), "+D" (__D), "+c" (__c) : : "memory", "cc"); \
|
||||
0; })
|
||||
*/
|
||||
//copybuf(_DSOUND_MixBuffer + p * _DSOUND_BufferLength, lockptr, _DSOUND_BufferLength >> 2);
|
||||
Bmemcpy(lockptr, _DSOUND_MixBuffer + p * _DSOUND_BufferLength, _DSOUND_BufferLength);
|
||||
IDirectSoundBuffer_Unlock(lpDSBSecondary, lockptr, lockbytes, lockptr2, lockbytes2);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SDLSOUND_BeginBufferedPlayback
|
||||
* Unpause SDL sound playback.
|
||||
*/
|
||||
int32_t DSOUND_BeginBufferedPlayback(char *BufferStart, int32_t(*CallBackFunc)(int32_t), int32_t buffersize, int32_t numdivisions)
|
||||
{
|
||||
_SDLSOUND_CallBack = CallBackFunc;
|
||||
_SDLSOUND_MixBuffer = BufferStart;
|
||||
|
||||
_SDLSOUND_BufferLength = buffersize/numdivisions;
|
||||
_SDLSOUND_NumBuffers = numdivisions;
|
||||
|
||||
return SDLSOUND_Ok;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DSOUND_StopPlayback
|
||||
* Halts the playback thread.
|
||||
*/
|
||||
int32_t DSOUND_StopPlayback(void)
|
||||
{
|
||||
// DWORD exitcode;
|
||||
BOOL t;
|
||||
int32_t i;
|
||||
|
||||
if (isrthread)
|
||||
{
|
||||
SetEvent(isrfinish);
|
||||
|
||||
initprintf("DirectSound: Waiting for sound thread to exit\n");
|
||||
if (WaitForSingleObject(isrthread, 300) == WAIT_OBJECT_0)
|
||||
initprintf("DirectSound: Sound thread has exited\n");
|
||||
else
|
||||
initprintf("DirectSound: Sound thread failed to exit!\n");
|
||||
/*
|
||||
while (1) {
|
||||
if (!GetExitCodeThread(isrthread, &exitcode)) {
|
||||
DSOUND_SetErrorCode(DSOUND_FailedGetExitCode);
|
||||
return DSOUND_Warning;
|
||||
}
|
||||
if (exitcode != STILL_ACTIVE) break;
|
||||
}*/
|
||||
|
||||
CloseHandle(isrthread);
|
||||
isrthread = NULL;
|
||||
}
|
||||
|
||||
if (isrfinish)
|
||||
{
|
||||
CloseHandle(isrfinish);
|
||||
isrfinish = NULL;
|
||||
}
|
||||
|
||||
if (lpDSBSecondary)
|
||||
{
|
||||
IDirectSoundBuffer_Stop(lpDSBSecondary);
|
||||
}
|
||||
|
||||
if (hPosNotify)
|
||||
{
|
||||
for (i=0; i<_DSOUND_NumBuffers; i++)
|
||||
{
|
||||
if (hPosNotify[i]) CloseHandle(hPosNotify[i]);
|
||||
}
|
||||
free(hPosNotify);
|
||||
hPosNotify = NULL;
|
||||
}
|
||||
|
||||
return DSOUND_Ok;
|
||||
}
|
||||
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Duke Nukem Copyright (C) 1996, 2003 3D Realms Entertainment
|
||||
|
||||
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
|
||||
|
||||
Duke Nukem 3D 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
#ifndef __sdlout_h__
|
||||
#define __sdlout_h__
|
||||
|
||||
enum SDLSOUND_ERRORS {
|
||||
SDLSOUND_Warning = -2,
|
||||
SDLSOUND_Error = -1,
|
||||
SDLSOUND_Ok = 0
|
||||
};
|
||||
|
||||
extern int32_t SDLSOUND_ErrorCode;
|
||||
|
||||
char *SDLSOUND_ErrorString(int32_t);
|
||||
|
||||
int32_t DisableInterrupts(void); // simulated using critical sections
|
||||
int32_t RestoreInterrupts(int32_t);
|
||||
|
||||
int32_t SDLSOUND_Init(int32_t soundcard, int32_t mixrate, int32_t numchannels, int32_t samplebits, int32_t buffersize);
|
||||
int32_t SDLSOUND_Shutdown(void);
|
||||
|
||||
int32_t SDLSOUND_SetMixMode(int32_t mode);
|
||||
int32_t SDLSOUND_BeginBufferedPlayback(char *BufferStart, int32_t (*CallBackFunc)(int32_t), int32_t buffersize, int32_t numdivisions);
|
||||
int32_t SDLSOUND_StopPlayback(void);
|
||||
|
||||
#endif // __sdlout_h__
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||||
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com)
|
||||
*/
|
||||
/**********************************************************************
|
||||
module: STANDARD.H
|
||||
|
||||
author: James R. Dose
|
||||
date: May 25, 1994
|
||||
|
||||
Header containing standard definitions.
|
||||
|
||||
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __STANDARD_H
|
||||
#define __STANDARD_H
|
||||
|
||||
typedef int boolean;
|
||||
typedef int errorcode;
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE ( 1 == 1 )
|
||||
#define FALSE ( !TRUE )
|
||||
#endif
|
||||
|
||||
enum STANDARD_ERRORS
|
||||
{
|
||||
Warning = -2,
|
||||
FatalError = -1,
|
||||
Success = 0
|
||||
};
|
||||
|
||||
#define BITSET( data, bit ) \
|
||||
( ( ( data ) & ( bit ) ) == ( bit ) )
|
||||
|
||||
#define ARRAY_LENGTH( array ) \
|
||||
( sizeof( array ) / sizeof( ( array )[ 0 ] ) )
|
||||
|
||||
#define WITHIN_BOUNDS( array, index ) \
|
||||
( ( 0 <= ( index ) ) && ( ( index ) < ARRAY_LENGTH( array ) ) )
|
||||
|
||||
#define FOREVER for( ; ; )
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define DEBUGGING 0
|
||||
#else
|
||||
#define DEBUGGING 1
|
||||
#endif
|
||||
|
||||
#define DEBUG_CODE \
|
||||
if ( DEBUGGING == 0 ) \
|
||||
{ \
|
||||
} \
|
||||
else
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue