DOSBox-X
|
00001 00002 enum { 00003 PCM86_LOGICALBUF = 0x8000, 00004 PCM86_BUFSIZE = (1 << 16), 00005 PCM86_BUFMSK = ((1 << 16) - 1), 00006 00007 PCM86_DIVBIT = 10, 00008 PCM86_DIVENV = (1 << PCM86_DIVBIT), 00009 00010 PCM86_RESCUE = 20 00011 }; 00012 00013 #define PCM86_EXTBUF pcm86.rescue // 救済延滞… 00014 #define PCM86_REALBUFSIZE (PCM86_LOGICALBUF + PCM86_EXTBUF) 00015 00016 #define RECALC_NOWCLKWAIT(cnt) { \ 00017 pcm86.virbuf -= (cnt << pcm86.stepbit); \ 00018 if (pcm86.virbuf < 0) { \ 00019 pcm86.virbuf &= pcm86.stepmask; \ 00020 } \ 00021 } 00022 00023 typedef struct { 00024 SINT32 divremain; 00025 SINT32 div; 00026 SINT32 div2; 00027 SINT32 smp; 00028 SINT32 lastsmp; 00029 SINT32 smp_l; 00030 SINT32 lastsmp_l; 00031 SINT32 smp_r; 00032 SINT32 lastsmp_r; 00033 00034 UINT32 readpos; // DSOUND再生位置 00035 UINT32 wrtpos; // 書込み位置 00036 SINT32 realbuf; // DSOUND用のデータ数 00037 SINT32 virbuf; // 86PCM(bufsize:0x8000)のデータ数 00038 SINT32 rescue; 00039 00040 SINT32 fifosize; 00041 SINT32 volume; 00042 SINT32 vol5; 00043 00044 UINT32 lastclock; 00045 UINT32 stepclock; 00046 UINT stepmask; 00047 00048 UINT8 fifo; 00049 UINT8 extfunc; 00050 UINT8 dactrl; 00051 UINT8 _write; 00052 UINT8 stepbit; 00053 UINT8 reqirq; 00054 UINT8 irqflag; 00055 UINT8 padding[1]; 00056 00057 UINT8 buffer[PCM86_BUFSIZE]; 00058 } _PCM86, *PCM86; 00059 00060 typedef struct { 00061 UINT rate; 00062 UINT vol; 00063 } PCM86CFG; 00064 00065 00066 #ifdef __cplusplus 00067 extern "C" { 00068 #endif 00069 00070 extern const UINT pcm86rate8[]; 00071 00072 void pcm86_cb(NEVENTITEM item); 00073 00074 void pcm86gen_initialize(UINT rate); 00075 void pcm86gen_setvol(UINT vol); 00076 00077 void pcm86_reset(void); 00078 void pcm86gen_update(void); 00079 void pcm86_setpcmrate(REG8 val); 00080 void pcm86_setnextintr(void); 00081 00082 void SOUNDCALL pcm86gen_checkbuf(void); 00083 void SOUNDCALL pcm86gen_getpcm(void *hdl, SINT32 *pcm, UINT count); 00084 00085 BOOL pcm86gen_intrq(void); 00086 00087 #ifdef __cplusplus 00088 } 00089 #endif 00090