📄 dossb.h
字号:
#define SBM_GENDAC_SIGNED 0x20
#define SBM_GENDAC_STEREO 0x40
/* DSP version masks */
#define SBVER_10 0x0100 /* Original SoundBlaster */
#define SBVER_15 0x0105 /* SoundBlaster 1.5 */
#define SBVER_20 0x0200 /* SoundBlaster 2.0 */
#define SBVER_PRO 0x0300 /* SoundBlaster Pro */
#define SBVER_PRO2 0x0301 /* SoundBlaster Pro 2 */
#define SBVER_16 0x0400 /* SoundBlaster 16 */
#define SBVER_AWE32 0x040c /* SoundBlaster AWE32 */
typedef unsigned char boolean;
#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif
/* Play mode bits */
#define SBMODE_16BITS 0x0001
#define SBMODE_STEREO 0x0002
#define SBMODE_SIGNED 0x0004
/* Mask for capabilities that never change */
#define SBMODE_MASK (SBMODE_16BITS | SBMODE_STEREO)
/* You can fill some members of this struct (i.e. port,irq,dma) before
* calling sb_detect() or sb_open()... this will ignore environment settings.
*/
typedef struct {
boolean ok; /* Are structure contents valid? */
int port, aweport; /* sb/awe32 base port */
int irq; /* SoundBlaster IRQ */
int dma8, dma16; /* 8-bit and 16-bit DMAs */
int maxfreq_mono; /* Maximum discretization frequency / mono mode */
int maxfreq_stereo; /* Maximum discretization frequency / stereo mode */
unsigned short dspver; /* DSP version number */
irq_handle *irq_handle; /* The interrupt handler */
dma_buffer *dma_buff; /* Pre-allocated DMA buffer */
unsigned char caps; /* SoundBlaster capabilities (SBMODE_XXX) */
unsigned char mode; /* Current SB mode (SBMODE_XXX) */
boolean open; /* Whenever the card has been opened */
volatile int irqcount; /* Incremented on each IRQ... for diagnostics */
void (*timer_callback) (); /* Called TWICE per buffer play */
} __sb_state;
extern __sb_state sb;
extern void __sb_wait();
static inline boolean __sb_dsp_ready_in()
{
int count;
for (count = 10000; count >= 0; count--)
if (inportb(SB_DSP_DATA_IN_STATUS) & SBM_DSP_READY)
return TRUE;
return FALSE;
}
static inline boolean __sb_dsp_ready_out()
{
int count;
for (count = 10000; count >= 0; count--)
if ((inportb(SB_DSP_DATA_OUT_STATUS) & SBM_DSP_READY) == 0)
return TRUE;
return FALSE;
}
static inline void __sb_dsp_out(unsigned char reg)
{
__sb_dsp_ready_out();
outportb(SB_DSP_DATA_OUT, reg);
}
static inline unsigned char __sb_dsp_in()
{
__sb_dsp_ready_in();
return inportb(SB_DSP_DATA_IN);
}
static inline void __sb_dspreg_out(unsigned char reg, unsigned char val)
{
__sb_dsp_out(reg);
__sb_dsp_out(val);
}
static inline void __sb_dspreg_outwlh(unsigned char reg, unsigned short val)
{
__sb_dsp_out(reg);
__sb_dsp_out(val);
__sb_dsp_out(val >> 8);
}
static inline void __sb_dspreg_outwhl(unsigned char reg, unsigned short val)
{
__sb_dsp_out(reg);
__sb_dsp_out(val >> 8);
__sb_dsp_out(val);
}
static inline unsigned char __sb_dspreg_in(unsigned char reg)
{
__sb_dsp_out(reg);
return __sb_dsp_in();
}
static inline void __sb_dsp_ack_dma8()
{
inportb(SB_DSP_DMA8_IRQ);
}
static inline void __sb_dsp_ack_dma16()
{
inportb(SB_DSP_DMA16_IRQ);
}
static inline unsigned short __sb_dsp_version()
{
unsigned short ver;
__sb_dsp_out(SBDSP_VERSION);
__sb_dsp_ready_in();
ver = ((unsigned short)__sb_dsp_in()) << 8;
ver |= __sb_dsp_in();
return ver;
}
static inline void __sb_mixer_out(unsigned char reg, unsigned char val)
{
outportb(SB_MIXER_REGSEL, reg);
outportb(SB_MIXER_DATA, val);
}
static inline unsigned char __sb_mixer_in(unsigned char reg)
{
outportb(SB_MIXER_REGSEL, reg);
return inportb(SB_MIXER_DATA);
}
/* Enable stereo transfers: sbpro mode only */
static inline void __sb_stereo(boolean stereo)
{
unsigned char val = __sb_mixer_in(SBMIX_OUTPUT_SELECT);
if (stereo)
val |= SBM_MIX_STEREO;
else
val &= ~SBM_MIX_STEREO;
__sb_mixer_out(SBMIX_OUTPUT_SELECT, val);
}
/* Detect whenever SoundBlaster is present and fill "sb" structure */
extern boolean sb_detect();
/* Reset SoundBlaster */
extern void sb_reset();
/* Start working with SoundBlaster */
extern boolean sb_open();
/* Finish working with SoundBlaster */
extern boolean sb_close();
/* Enable/disable speaker output */
extern void sb_output(boolean enable);
/* Start playing from DMA buffer in either 8/16 bit mono/stereo */
extern boolean sb_start_dma(unsigned char mode, unsigned int freq);
/* Stop playing from DMA buffer */
extern void sb_stop_dma();
/* Query current position/total size of the DMA buffer */
extern void sb_query_dma(unsigned int *dma_size, unsigned int *dma_pos);
#endif /* __DOSSB_H__ */
/* ex:set ts=4: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -