windows-nt/Source/XPSP1/NT/base/mvdm/vdd/vsndblst/dsp.h

125 lines
3.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/***************************************************************************
*
* dsp.h
*
* Copyright (c) 1991-1996 Microsoft Corporation. All Rights Reserved.
*
* This code provides VDD support for SB 2.0 sound output, specifically:
* DSP 2.01+ (excluding SB-MIDI port)
*
***************************************************************************/
/*****************************************************************************
*
* #defines
*
*****************************************************************************/
/*
* DSP Ports
*/
#define RESET_PORT 0x06 // used to reset SoundBlaster
#define READ_STATUS 0x0E // 0xFF-data to read, 0x7F-no data to read
#define READ_DATA 0x0A // App reads data from this port
#define WRITE_STATUS 0x0C // 0x7f-port ready, 0xFF-port not ready
#define WRITE_PORT 0x0C // Data or command
/*
* Only implemented commands are defined
*/
/*
* DSP commands - miscellaneous
*/
#define DSP_GET_VERSION 0xE1 // dsp version command
#define DSP_CARD_IDENTIFY 0xE0 // byte inverter
#define DSP_TABLE_MUNGE 0xE2 // jump table munging
#define DSP_LOAD_RES_REG 0xE4 // load byte into reserved register
#define DSP_READ_RES_REG 0xE8 // read byte from reserved register
#define DSP_GENERATE_INT 0xF2 // generate an interrupt
/*
* DSP commands - speaker
*/
#define DSP_SPEAKER_ON 0xD1 // speaker on command
#define DSP_SPEAKER_OFF 0xD3 // speaker off command
/*
* DSP commands - DMA mode
*/
#define DSP_SET_SAMPLE_RATE 0x40 // set the sample rate (one byte format)
#define DSP_SET_BLOCK_SIZE 0x48 // set dma block size
#define DSP_PAUSE_DMA 0xD0 // pause dma
#define DSP_CONTINUE_DMA 0xD4 // continue dma
#define DSP_STOP_AUTO 0xDA // Stop auto init dma
#define DSP_WRITE 0x14 // Start single cycle output (8-bit PCM mono)
#define DSP_WRITE_HS 0x91 // Start single cycle high-speed output (8-bit PCM mono)
#define DSP_WRITE_AUTO 0x1C // Start auto init output (8-bit PCM mono)
#define DSP_WRITE_HS_AUTO 0x90 // Start auto init high=speed output (8-bit PCM mono)
#define DSP_READ 0x24 // Start single cycle input (not implemented)
/*
* Performance parameters for single and auto-init DMA fine tuning
*/
#define AUTO_BLOCK_SIZE 0x100 // size of each buffer in auto
#define DEFAULT_LOOKAHEAD 0x600 // target # of bytes to queue to kernel driver
#define MAX_WAVE_BYTES 0x2000 // maximum # of bytes to queue to kernel driver
#define SINGLE_PIECES 2 // number of pieces in each single write
#define SINGLE_SLEEP_ADJ 15 // number of overhead milliseconds in single
/*****************************************************************************
*
* Function Prototypes
*
*****************************************************************************/
/*
* General function prototypes
*/
BOOL DspProcessAttach(VOID);
VOID DspProcessDetach(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(void);
void SetSpeaker(BOOL);
/*
* Wave function prototypes
*/
UINT FindWaveDevice(void);
BOOL OpenWaveDevice(VOID);
void ResetWaveDevice(void);
void CloseWaveDevice(void);
BOOL TestWaveFormat(DWORD sampleRate);
BOOL SetWaveFormat(void);
void PauseDMA(void);
void ContinueDMA(void);
ULONG GetDMATransferAddress(void);
void SetDMAStatus(BOOL requesting, BOOL tc);
BOOL StartAutoWave(void);
void StopAutoWave(BOOL wait);
BOOL StartSingleWave(void);
void StopSingleWave(BOOL wait);
DWORD WINAPI AutoThreadEntry(LPVOID context);
DWORD WINAPI SingleThreadEntry(LPVOID context);
DWORD WINAPI SingleSynchThreadEntry(LPVOID context);