2025-04-27 07:49:33 -04:00

352 lines
6.9 KiB
C

#include <mmsystem.h>
//
// Definitions for MM api entry points. The functions will be linked
// dynamically to avoid bringing winmm.dll in before wow32.
// BUGBUG - shielint. Should be moved to H file
//
typedef MMRESULT (WINAPI* SETVOLUMEPROC)(HWAVEOUT, DWORD);
typedef MMRESULT (WINAPI* GETVOLUMEPROC)(HWAVEOUT, LPDWORD);
typedef UINT (WINAPI* GETNUMDEVSPROC)(VOID);
typedef MMRESULT (WINAPI* GETDEVCAPSPROC)(UINT, LPWAVEOUTCAPSA, UINT);
typedef MMRESULT (WINAPI* OPENPROC)(LPHWAVEOUT, UINT, LPCWAVEFORMATEX, DWORD, DWORD, DWORD);
typedef MMRESULT (WINAPI* PAUSEPROC)(HWAVEOUT);
typedef MMRESULT (WINAPI* RESTARTPROC)(HWAVEOUT);
typedef MMRESULT (WINAPI* RESETPROC)(HWAVEOUT);
typedef MMRESULT (WINAPI* CLOSEPROC)(HWAVEOUT);
typedef MMRESULT (WINAPI* GETPOSITIONPROC)(HWAVEOUT, LPMMTIME, UINT);
typedef MMRESULT (WINAPI* WRITEPROC)(HWAVEOUT, LPWAVEHDR, UINT);
typedef MMRESULT (WINAPI* PREPAREHEADERPROC)(HWAVEOUT, LPWAVEHDR, UINT);
typedef MMRESULT (WINAPI* UNPREPAREHEADERPROC)(HWAVEOUT, LPWAVEHDR, UINT);
typedef MMRESULT (WINAPI* SETMIDIVOLUMEPROC)(HMIDIOUT, DWORD);
typedef MMRESULT (WINAPI* GETMIDIVOLUMEPROC)(HMIDIOUT, LPDWORD);
typedef UINT (WINAPI* MIDIGETNUMDEVSPROC)(VOID);
typedef MMRESULT (WINAPI* MIDIGETDEVCAPSPROC)(UINT, LPMIDIOUTCAPSA, UINT);
typedef MMRESULT (WINAPI* MIDIOPENPROC)(LPHMIDIOUT, UINT, DWORD, DWORD, DWORD);
typedef MMRESULT (WINAPI* MIDIRESETPROC)(HMIDIOUT);
typedef MMRESULT (WINAPI* MIDICLOSEPROC)(HMIDIOUT);
typedef MMRESULT (WINAPI* MIDILONGMSGPROC)(HMIDIOUT, LPMIDIHDR, UINT);
typedef MMRESULT (WINAPI* MIDISHORTMSGPROC)(HMIDIOUT, DWORD);
typedef MMRESULT (WINAPI* MIDIPREPAREHEADERPROC)(HMIDIOUT, LPMIDIHDR, UINT);
typedef MMRESULT (WINAPI* MIDIUNPREPAREHEADERPROC)(HMIDIOUT, LPMIDIHDR, UINT);
extern SETVOLUMEPROC SetVolumeProc;
extern GETVOLUMEPROC GetVolumeProc;
extern GETNUMDEVSPROC GetNumDevsProc;
extern GETDEVCAPSPROC GetDevCapsProc;
extern OPENPROC OpenProc;
extern PAUSEPROC PauseProc;
extern RESTARTPROC RestartProc;
extern RESETPROC ResetProc;
extern CLOSEPROC CloseProc;
extern GETPOSITIONPROC GetPositionProc;
extern WRITEPROC WriteProc;
extern PREPAREHEADERPROC PrepareHeaderProc;
extern UNPREPAREHEADERPROC UnprepareHeaderProc;
extern SETMIDIVOLUMEPROC SetMidiVolumeProc;
extern GETMIDIVOLUMEPROC GetMidiVolumeProc;
extern MIDIGETNUMDEVSPROC MidiGetNumDevsProc;
extern MIDIGETDEVCAPSPROC MidiGetDevCapsProc;
extern MIDIOPENPROC MidiOpenProc;
extern MIDIRESETPROC MidiResetProc;
extern MIDICLOSEPROC MidiCloseProc;
extern MIDILONGMSGPROC MidiLongMsgProc;
extern MIDISHORTMSGPROC MidiShortMsgProc;
extern MIDIPREPAREHEADERPROC MidiPrepareHeaderProc;
extern MIDIUNPREPAREHEADERPROC MidiUnprepareHeaderProc;
extern BOOL bHighSpeedMode;
extern HMIDIOUT HMidiOut;
extern HMIDIOUT HFM;
extern HWAVEOUT HWaveOut;
extern BOOL bExitMidiThread;
extern WORD MpuBasePort;
extern WORD BasePort;
extern BOOL bDevicesActive;
#define DisconnectPorts(First, Last) { \
WORD i; \
for (i = First; i <= Last; i++) { \
io_disconnect_port(i, SNDBLST_ADAPTER); \
} \
}
//
// Function Prototypes
//
//
// DSP prototypes
//
VOID
SbCloseDevices(
VOID
);
VOID
DspReadData(
BYTE * data
);
VOID
DspReadStatus(
BYTE * data
);
VOID
DspResetWrite(
BYTE data
);
VOID
DspWrite(
BYTE data
);
VOID
WriteCommandByte(
BYTE command
);
VOID
ResetDSP(
VOID
);
VOID
TableMunger(
BYTE data
);
DWORD
GetSamplingRate(
VOID
);
VOID
GenerateInterrupt(
DWORD
);
VOID
SetSpeaker(
BOOL
);
VOID
PauseWaveDevice(
VOID
);
VOID
RestartWaveDevice(
VOID
);
BOOL
FindWaveDevice(
VOID
);
BOOL
PrepareWaveInitialization(
VOID
);
VOID
CleanUpWave(
VOID
);
VOID
SetWaveOutVolume(
DWORD Volume
);
//
// FM Synth prototypes
//
VOID
ResetFM(
VOID
);
BOOL
OpenFMDevice(
VOID
);
VOID
CloseFMDevice(
VOID
);
VOID
FMStatusRead(
BYTE *data
);
VOID
FMDataWrite(
BYTE data
);
VOID
FMRegisterSelect(
BYTE data
);
//
// Mixer prototypes
//
void ResetMixer(void);
VOID
MixerDataRead(
BYTE *pData
);
VOID
MixerDataWrite(
BYTE data
);
VOID
MixerAddrWrite(
BYTE data
);
VOID
MixerSetMidiVolume(
BYTE level
);
VOID
MixerSetMasterVolume(
BYTE level
);
VOID
MixerSetVoiceVolume(
BYTE level
);
//
// MIDI prototypes
//
BOOL
InitializeMidi(
VOID
);
VOID
BufferMidi(
BYTE data
);
VOID
CloseMidiDevice(
VOID
);
BOOL
OpenMidiDevice(
HANDLE CallbackEvent
);
VOID
StopMidiThread(
BOOL wait
);
VOID
DetachMidi(
VOID
);
VOID
ResetMidiDevice(
VOID
);
VOID CALLBACK
MidiBlockPlayedCallback (
HMIDIOUT HMidiOut,
UINT uMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
VOID
SetMidiOutVolume(
DWORD Volume
);
/*****************************************************************************
*
* #defines
*
*****************************************************************************/
void DbgOut(LPSTR lpszFormat, ...);
/*****************************************************************************
*
* Debugging
* Levels:
* bit 0 - port usage
* bit 1 - errors only
* bit 2 - significant events
* bit 3 - regular events
* bit 4 - heaps o' information
*
*****************************************************************************/
#if DBG
extern int DebugLevel;
#define dprintf( _x_ ) DbgOut _x_
#define dprintf0( _x_ ) if (DebugLevel & 0x1) DbgOut _x_
#define dprintf1( _x_ ) if (DebugLevel & 0x2) DbgOut _x_
#define dprintf2( _x_ ) if (DebugLevel & 0x4) DbgOut _x_
#define dprintf3( _x_ ) if (DebugLevel & 0x8) DbgOut _x_
#define dprintf4( _x_ ) if (DebugLevel & 0x10) DbgOut _x_
#else
#define dprintf(x)
#define dprintf0(x)
#define dprintf1(x)
#define dprintf2(x)
#define dprintf3(x)
#define dprintf4(x)
#endif // DBG
//
// Temp stuff
//
#define REPORT_SB_MODE 1
#if REPORT_SB_MODE
#define DISPLAY_SINGLE 1
#define DISPLAY_HS_SINGLE 2
#define DISPLAY_AUTO 4
#define DISPLAY_HS_AUTO 8
#define DISPLAY_MIDI 16
#define DISPLAY_MIXER 32
#define DISPLAY_ADLIB 64
extern USHORT DisplayFlags;
extern void DisplaySbMode(USHORT Mode);
#endif