Reformat HDAudio.ZC

This commit is contained in:
TomAwezome 2022-12-28 18:18:53 -05:00
parent 2fd8527fdb
commit f2490f75bc

View file

@ -1,239 +1,262 @@
//SysFile("~/sup1hdaudio/Sup1CodeScraps/Mem/Mem2Meg.ZC"); //SysFile("~/sup1hdaudio/Sup1CodeScraps/Mem/Mem2Meg.ZC");
# #help_index "Sound/HDAudio"
help_index "Sound/HDAudio"
//snd devs //snd devs
#define SD_PC_SPEAKER 0 #define SD_PC_SPEAKER 0
#define SD_HD_AUDIO 1 #define SD_HD_AUDIO 1
#define SND_SAMPLE_RATE 48000
#define SND_SAMPLE_BITS 24 #define SND_SAMPLE_RATE 48000
#define SND_OCHANNELS 2 #define SND_SAMPLE_BITS 24
#define SND_ICHANNELS 2 #define SND_OCHANNELS 2
#define SND_OUT_CONTAINER I32 #define SND_ICHANNELS 2
#define SND_IN_CONTAINER I16 #define SND_OUT_CONTAINER I32
#define SND_BUF_LEN 0x400 #define SND_IN_CONTAINER I16
#define SND_BUF_TIME_mS(SND_BUF_LEN / SND_OCHANNELS *1000.0 / \ #define SND_BUF_LEN 0x400
SND_SAMPLE_RATE) #define SND_BUF_TIME_mS (SND_BUF_LEN / SND_OCHANNELS * 1000.0 / SND_SAMPLE_RATE)
F64 snd_freq = 0; F64 snd_freq = 0;
I64 snd_dev = SD_PC_SPEAKER; I64 snd_dev = SD_PC_SPEAKER;
Bool snd_record = FALSE; Bool snd_record = FALSE;
F64 snd_vol = 0.1; F64 snd_vol = 0.1;
U0(*fp_snd)(F64 freq, I64 waveform, F64 amp) = NULL; U0 (*fp_snd) (F64 freq, I64 waveform, F64 amp) = NULL;
U0(*fp_snd_record)(F64 freq, I64 waveform, F64 amp) = NULL; U0 (*fp_snd_record)(F64 freq, I64 waveform, F64 amp) = NULL;
U0(*fp_snd_fill_buf)(SND_OUT_CONTAINER *buf, I64 buf_num) = NULL; U0 (*fp_snd_fill_buf)(SND_OUT_CONTAINER *buf, I64 buf_num) = NULL;
U0(*fp_snd_copy_buf)(SND_IN_CONTAINER *buf, I64 buf_num) = NULL; U0 (*fp_snd_copy_buf)(SND_IN_CONTAINER *buf, I64 buf_num) = NULL;
I64 snd_obuf_num, snd_ibuf_num; I64 snd_obuf_num, snd_ibuf_num;
#define Sf_FILLING_OUT 0 #define Sf_FILLING_OUT 0
I64 snd_flags; I64 snd_flags;
#define HD_1_CHAN 0 #define HD_1_CHAN 0
#define HD_2_CHAN 1 #define HD_2_CHAN 1
#define HD_3_CHAN 2 #define HD_3_CHAN 2
#define HD_4_CHAN 3 #define HD_4_CHAN 3
#define HD_8_BIT 0
#define HD_16_BIT 1 #define HD_8_BIT 0
#define HD_20_BIT 2 #define HD_16_BIT 1
#define HD_24_BIT 3 #define HD_20_BIT 2
#define HD_32_BIT 4 #define HD_24_BIT 3
#define HD_48kHz 0 #define HD_32_BIT 4
#define HD_DFT_OUT_FMT(HD_2_CHAN + HD_24_BIT << 4 + HD_48kHz << 8) #define HD_48kHz 0
#define HD_DFT_IN_FMT(HD_2_CHAN + HD_16_BIT << 4 + HD_48kHz << 8)
#define HD_DFT_OUT_FMT (HD_2_CHAN + HD_24_BIT << 4 + HD_48kHz << 8)
#define HD_DFT_IN_FMT (HD_2_CHAN + HD_16_BIT << 4 + HD_48kHz << 8)
#define HD_POS_BUF_MULTIPLES 0x1000 #define HD_POS_BUF_MULTIPLES 0x1000
#define HD_CORB_ENTRIES 256
#define HD_RIRB_ENTRIES 256 #define HD_CORB_ENTRIES 256
#define HD_BDL_ENTRIES 256 #define HD_RIRB_ENTRIES 256
#define HD_GCTL 0x08 #define HD_BDL_ENTRIES 256
#define HD_STATESTS 0x0E
#define HD_GSTS 0x10 #define HD_GCTL 0x08
#define HD_CORBLBASE 0x40 #define HD_STATESTS 0x0E
#define HD_CORBUBASE 0x44 #define HD_GSTS 0x10
#define HD_CORBWP 0x48 #define HD_CORBLBASE 0x40
#define HD_CORBRP 0x4A #define HD_CORBUBASE 0x44
#define HD_CORBCTL 0x4C #define HD_CORBWP 0x48
#define HD_CORBST 0x4D #define HD_CORBRP 0x4A
#define HD_RIRBLBASE 0x50 #define HD_CORBCTL 0x4C
#define HD_RIRBUBASE 0x54 #define HD_CORBST 0x4D
#define HD_RIRBWP 0x58 #define HD_RIRBLBASE 0x50
#define HD_RIRBCTL 0x5C #define HD_RIRBUBASE 0x54
#define HD_RIRBSTS 0x5D #define HD_RIRBWP 0x58
#define STRCTL 0x00 #define HD_RIRBCTL 0x5C
#define STRSTS 0x03 #define HD_RIRBSTS 0x5D
#define STRLPIB 0x04
#define STRCBL 0x08 #define STRCTL 0x00
#define STRLVI 0x0C #define STRSTS 0x03
#define STRFIFOW 0x0E #define STRLPIB 0x04
#define STRFIFOS 0x10 #define STRCBL 0x08
#define STRFMT 0x12 #define STRLVI 0x0C
#define STRBDPL 0x18 #define STRFIFOW 0x0E
#define STRBDPU 0x1C #define STRFIFOS 0x10
#define ISTR0 0x080 #define STRFMT 0x12
#define ISTR1 0x0A0 #define STRBDPL 0x18
#define ISTR2 0x0C0 #define STRBDPU 0x1C
#define ISTR3 0x0E0 #define ISTR0 0x080
#define OSTR0 0x100 #define ISTR1 0x0A0
#define OSTR1 0x120 #define ISTR2 0x0C0
#define OSTR2 0x140 #define ISTR3 0x0E0
#define OSTR3 0x160 #define OSTR0 0x100
#define VERB_GET_PARAM 0xF0000 #define OSTR1 0x120
#define VERB_CONNECT_SEL_GET 0xF0100 #define OSTR2 0x140
#define VERB_CONNECT_SEL_SET 0x70100 #define OSTR3 0x160
#define VERB_GET_CONNECT_LST 0xF0200
#define VERB_PROCESS_STATE_GET 0xF0300 #define VERB_GET_PARAM 0xF0000
#define VERB_PROCESS_STATE_SET 0x70300 #define VERB_CONNECT_SEL_GET 0xF0100
#define VERB_COEFF_IDX_GET 0xD0000 #define VERB_CONNECT_SEL_SET 0x70100
#define VERB_COEFF_IDX_SET 0x50000 #define VERB_GET_CONNECT_LST 0xF0200
#define VERB_PROCESS_COEFF_GET 0xC0000 #define VERB_PROCESS_STATE_GET 0xF0300
#define VERB_PROCESS_COEFF_SET 0x40000 #define VERB_PROCESS_STATE_SET 0x70300
#define VERB_AMPLIFIER_GAIN_GET 0xB0000 #define VERB_COEFF_IDX_GET 0xD0000
#define VERB_AMPLIFIER_GAIN_SET 0x30000 #define VERB_COEFF_IDX_SET 0x50000
#define VERB_STREAM_FMT_GET 0xA0000 #define VERB_PROCESS_COEFF_GET 0xC0000
#define VERB_STREAM_FMT_SET 0x20000 #define VERB_PROCESS_COEFF_SET 0x40000
#define VERB_DIGIT_CONVERT1_GET 0xF0D00 #define VERB_AMPLIFIER_GAIN_GET 0xB0000
#define VERB_DIGIT_CONVERT1_SET 0x70D00 #define VERB_AMPLIFIER_GAIN_SET 0x30000
#define VERB_DIGIT_CONVERT2_GET 0xF0D00 #define VERB_STREAM_FMT_GET 0xA0000
#define VERB_DIGIT_CONVERT2_SET 0x70E00 #define VERB_STREAM_FMT_SET 0x20000
#define VERB_POWER_STATE_GET 0xF0500 #define VERB_DIGIT_CONVERT1_GET 0xF0D00
#define VERB_POWER_STATE_SET 0x70500 #define VERB_DIGIT_CONVERT1_SET 0x70D00
#define VERB_CHAN_STREAM_ID_GET 0xF0600 #define VERB_DIGIT_CONVERT2_GET 0xF0D00
#define VERB_CHAN_STREAM_ID_SET 0x70600 #define VERB_DIGIT_CONVERT2_SET 0x70E00
#define VERB_SDI_SEL_GET 0xF0400 #define VERB_POWER_STATE_GET 0xF0500
#define VERB_SDI_SEL_SET 0x70400 #define VERB_POWER_STATE_SET 0x70500
#define VERB_PIN_WIDGET_CTL_GET 0xF0700 #define VERB_CHAN_STREAM_ID_GET 0xF0600
#define VERB_PIN_WIDGET_CTL_SET 0x70700 #define VERB_CHAN_STREAM_ID_SET 0x70600
#define VERB_UNSOL_ENABLE_GET 0xF0800 #define VERB_SDI_SEL_GET 0xF0400
#define VERB_UNSOL_ENABLE_SET 0x70800 #define VERB_SDI_SEL_SET 0x70400
#define VERB_PIN_SENSE_GET 0xF0900 #define VERB_PIN_WIDGET_CTL_GET 0xF0700
#define VERB_PIN_SENSE_SET 0x70900 #define VERB_PIN_WIDGET_CTL_SET 0x70700
#define VERB_EAPDBTL_ENABLE_GET 0xF0C00 #define VERB_UNSOL_ENABLE_GET 0xF0800
#define VERB_EAPDBTL_ENABLE_SET 0x70C00 #define VERB_UNSOL_ENABLE_SET 0x70800
#define VERB_BEEP_CTL_GET 0xF0A00 #define VERB_PIN_SENSE_GET 0xF0900
#define VERB_BEEP_CTL_SET 0x70A00 #define VERB_PIN_SENSE_SET 0x70900
#define VERB_GPI_CTRL0_GET 0xF1000 #define VERB_EAPDBTL_ENABLE_GET 0xF0C00
#define VERB_GPI_CTRL0_SET 0x71000 #define VERB_EAPDBTL_ENABLE_SET 0x70C00
#define VERB_GPI_CTRL1_GET 0xF1100 #define VERB_BEEP_CTL_GET 0xF0A00
#define VERB_GPI_CTRL1_SET 0x71100 #define VERB_BEEP_CTL_SET 0x70A00
#define VERB_GPI_CTRL2_GET 0xF1200 #define VERB_GPI_CTRL0_GET 0xF1000
#define VERB_GPI_CTRL2_SET 0x71200 #define VERB_GPI_CTRL0_SET 0x71000
#define VERB_GPI_CTRL3_GET 0xF1300 #define VERB_GPI_CTRL1_GET 0xF1100
#define VERB_GPI_CTRL3_SET 0x71300 #define VERB_GPI_CTRL1_SET 0x71100
#define VERB_GPI_CTRL4_GET 0xF1400 #define VERB_GPI_CTRL2_GET 0xF1200
#define VERB_GPI_CTRL4_SET 0x71400 #define VERB_GPI_CTRL2_SET 0x71200
#define VERB_GPI_CTRL5_GET 0xF1500 #define VERB_GPI_CTRL3_GET 0xF1300
#define VERB_GPI_CTRL5_SET 0x71500 #define VERB_GPI_CTRL3_SET 0x71300
#define VERB_GPI_CTRL6_GET 0xF1600 #define VERB_GPI_CTRL4_GET 0xF1400
#define VERB_GPI_CTRL6_SET 0x71600 #define VERB_GPI_CTRL4_SET 0x71400
#define VERB_GPI_CTRL7_GET 0xF1700 #define VERB_GPI_CTRL5_GET 0xF1500
#define VERB_GPI_CTRL7_SET 0x71700 #define VERB_GPI_CTRL5_SET 0x71500
#define VERB_GPI_CTRL8_GET 0xF1800 #define VERB_GPI_CTRL6_GET 0xF1600
#define VERB_GPI_CTRL8_SET 0x71800 #define VERB_GPI_CTRL6_SET 0x71600
#define VERB_GPI_CTRL9_GET 0xF1900 #define VERB_GPI_CTRL7_GET 0xF1700
#define VERB_GPI_CTRL9_SET 0x71900 #define VERB_GPI_CTRL7_SET 0x71700
#define VERB_GPI_CTRLA_GET 0xF1A00 #define VERB_GPI_CTRL8_GET 0xF1800
#define VERB_GPI_CTRLA_SET 0x71A00 #define VERB_GPI_CTRL8_SET 0x71800
#define VERB_VOL_CTL_GET 0xF0F00 #define VERB_GPI_CTRL9_GET 0xF1900
#define VERB_VOL_CTL_SET 0x70F00 #define VERB_GPI_CTRL9_SET 0x71900
#define VERB_SUB_SYS_ID0_GET 0xF2000 #define VERB_GPI_CTRLA_GET 0xF1A00
#define VERB_SUB_SYS_ID0_SET 0x72000 #define VERB_GPI_CTRLA_SET 0x71A00
#define VERB_SUB_SYS_ID1_GET 0xF2000 #define VERB_VOL_CTL_GET 0xF0F00
#define VERB_SUB_SYS_ID1_SET 0x72100 #define VERB_VOL_CTL_SET 0x70F00
#define VERB_SUB_SYS_ID2_GET 0xF2000 #define VERB_SUB_SYS_ID0_GET 0xF2000
#define VERB_SUB_SYS_ID2_SET 0x72200 #define VERB_SUB_SYS_ID0_SET 0x72000
#define VERB_SUB_SYS_ID3_GET 0xF2000 #define VERB_SUB_SYS_ID1_GET 0xF2000
#define VERB_SUB_SYS_ID3_SET 0x72300 #define VERB_SUB_SYS_ID1_SET 0x72100
#define VERB_CFG_DFT0_GET 0xF1C00 #define VERB_SUB_SYS_ID2_GET 0xF2000
#define VERB_CFG_DFT0_SET 0x71C00 #define VERB_SUB_SYS_ID2_SET 0x72200
#define VERB_CFG_DFT1_GET 0xF1C00 #define VERB_SUB_SYS_ID3_GET 0xF2000
#define VERB_CFG_DFT1_SET 0x71D00 #define VERB_SUB_SYS_ID3_SET 0x72300
#define VERB_CFG_DFT2_GET 0xF1C00 #define VERB_CFG_DFT0_GET 0xF1C00
#define VERB_CFG_DFT2_SET 0x71E00 #define VERB_CFG_DFT0_SET 0x71C00
#define VERB_CFG_DFT3_GET 0xF1C00 #define VERB_CFG_DFT1_GET 0xF1C00
#define VERB_CFG_DFT3_SET 0x71F00 #define VERB_CFG_DFT1_SET 0x71D00
#define VERB_STRIPE_CTL_GET 0xF2400 #define VERB_CFG_DFT2_GET 0xF1C00
#define VERB_STRIPE_CTL_SET 0x72400 #define VERB_CFG_DFT2_SET 0x71E00
#define VERB_RST 0x7FF00 #define VERB_CFG_DFT3_GET 0xF1C00
#define VERB_CFG_DFT3_SET 0x71F00
#define VERB_STRIPE_CTL_GET 0xF2400
#define VERB_STRIPE_CTL_SET 0x72400
#define VERB_RST 0x7FF00
//Parameters //Parameters
#define P_VENDOR_ID 0x00 #define P_VENDOR_ID 0x00
#define P_REVISION_ID 0x02 #define P_REVISION_ID 0x02
#define P_SUBNODE_CNT 0x04 #define P_SUBNODE_CNT 0x04
#define P_FUN_GRP_TYPE 0x05 #define P_FUN_GRP_TYPE 0x05
#define P_AUDIO_FUN_CAP 0x08 #define P_AUDIO_FUN_CAP 0x08
#define P_AUDIO_WIDGET_CAP 0x09 #define P_AUDIO_WIDGET_CAP 0x09
#define P_SAMPLE_SIZE_RATE_CAP 0x0A #define P_SAMPLE_SIZE_RATE_CAP 0x0A
#define P_STREAM_FMTS 0x0B #define P_STREAM_FMTS 0x0B
#define P_PIN_CAP 0x0C #define P_PIN_CAP 0x0C
#define P_INPUT_AMP_CAP 0x0D #define P_INPUT_AMP_CAP 0x0D
#define P_OUTPUT_AMP_CAP 0x12 #define P_OUTPUT_AMP_CAP 0x12
#define P_CONNECT_LST_LEN 0x0E #define P_CONNECT_LST_LEN 0x0E
#define P_POWER_STATES 0x0F #define P_POWER_STATES 0x0F
#define P_PROCESSING_CAP 0x10 #define P_PROCESSING_CAP 0x10
#define P_GPIO_CNT 0x11 #define P_GPIO_CNT 0x11
#define P_VOL_KNOB_CAP 0x13 #define P_VOL_KNOB_CAP 0x13
//Function Group Types //Function Group Types
//00 reserved //00 reserved
#define FGT_AUDIO 1 #define FGT_AUDIO 1
#define FGT_VENDOR_MODEM 2 #define FGT_VENDOR_MODEM 2
//03-7F reserved //03-7F reserved
//80-FF vendor function group //80-FF vendor function group
//Audio Widget Types //Audio Widget Types
#define AWT_OUTPUT 0x0 #define AWT_OUTPUT 0x0
#define AWT_INPUT 0x1 #define AWT_INPUT 0x1
#define AWT_MIXER 0x2 #define AWT_MIXER 0x2
#define AWT_SELECTOR 0x3 #define AWT_SELECTOR 0x3
#define AWT_PIN_COMPLEX 0x4 #define AWT_PIN_COMPLEX 0x4
#define AWT_POWER_WIDGET 0x5 #define AWT_POWER_WIDGET 0x5
#define AWT_VOL_KNOB_WIDGET 0x6 #define AWT_VOL_KNOB_WIDGET 0x6
#define AWT_BEEP_GEN_WIDGET 0x7 #define AWT_BEEP_GEN_WIDGET 0x7
#define AWT_VENDOR 0xF #define AWT_VENDOR 0xF
#define AWT_NODE 0x10 #define AWT_NODE 0x10
DefineListLoad("ST_AUDIO_WIDGET_TYPES", DefineListLoad("ST_AUDIO_WIDGET_TYPES",
"Output\0Input\0Mixer\0Sellector\0Pin Complex\0" "Output\0"
"Power Widget\0Vol Knob\0Beep Gen\0\0\0\0\0\0\0\0Vendor\0Node\0"); "Input\0"
"Mixer\0"
"Selector\0"
"Pin Complex\0"
"Power Widget\0"
"Vol Knob\0"
"Beep Gen\0"
" \0"
" \0"
" \0"
" \0"
" \0"
" \0"
" \0"
"Vendor\0"
"Node\0");
class CHDBufDesc class CHDBufDesc
{ {
I32 * buf; I32 *buf;
U32 len; U32 len;
U32 ctrl; U32 ctrl;
}; };
#define HD_TONES 8 #define HD_TONES 8
class CHDAudioCtrl class CHDAudioCtrl
{ {
U8 * bar; U8 *bar;
CBlkPool * bp; CBlkPool *bp;
CHeapCtrl * hc; CHeapCtrl *hc;
I64 cad; I64 cad;
U32 * corb; U32 *corb;
I64 * rirb; I64 *rirb;
CHDBufDesc *ostr0_bdl, *istr0_bdl; CHDBufDesc *ostr0_bdl,
SND_OUT_CONTAINER *ostr0_buf[2], *o_tmp_buf; *istr0_bdl;
SND_IN_CONTAINER *istr0_buf[2]; SND_OUT_CONTAINER *ostr0_buf[2],
CTask * task; *o_tmp_buf;
I64 waveform; SND_IN_CONTAINER *istr0_buf[2];
F64 freq, amp; CTask *task;
CSndWaveCtrl *tone_swcs[HD_TONES]; I64 waveform;
U8 rirb_rp, corb_wp; F64 freq, amp;
Bool audio_task_started, in_running, out_running; CSndWaveCtrl *tone_swcs[HD_TONES];
} U8 rirb_rp, corb_wp;
Bool audio_task_started, in_running, out_running;
} hda;
hda;
MemSet(&hda, 0, sizeof(CHDAudioCtrl)); MemSet(&hda, 0, sizeof(CHDAudioCtrl));
U0 HDSyncCORB() U0 HDSyncCORB()
{ {
U16 *wp, *rp; U16 *wp, *rp;
wp = hda.bar + HD_CORBWP; wp = hda.bar + HD_CORBWP;
*wp = hda.corb_wp; *wp = hda.corb_wp;
rp = hda.bar + HD_CORBRP; rp = hda.bar + HD_CORBRP;
while (*rp &255 != hda.corb_wp) while (*rp & 255 != hda.corb_wp)
Yield; Yield;
} }
@ -245,25 +268,30 @@ U0 HDWriteCORB(I64 cad, I64 nid, U32 val)
I64 HDSyncRIRB() I64 HDSyncRIRB()
{ {
U16 * _w; U16 *_w;
I64 wp, res = 0; I64 wp, res = 0;
_w = hda.bar + HD_RIRBWP; _w = hda.bar + HD_RIRBWP;
wp = *_w; wp = *_w;
while (hda.rirb_rp != wp) while (hda.rirb_rp != wp)
res = hda.rirb[++hda.rirb_rp]; res = hda.rirb[++hda.rirb_rp];
return res; return res;
} }
I64 HDReadRIRB() I64 HDReadRIRB()
{ {
U16 * _w; U16 *_w;
I64 wp, res = 0; I64 wp, res = 0;
_w = hda.bar + HD_RIRBWP; _w = hda.bar + HD_RIRBWP;
do { do
{
Yield; Yield;
wp = *_w; wp = *_w;
} while (wp == hda.rirb_rp); } while (wp == hda.rirb_rp);
res = hda.rirb[++hda.rirb_rp]; res = hda.rirb[++hda.rirb_rp];
return res; return res;
} }
@ -279,7 +307,7 @@ I64 HDWriteCORBSync(I64 cad, I64 nid, U32 val)
Bool HDTestCORBSync(I64 cad, I64 nid, U32 val) Bool HDTestCORBSync(I64 cad, I64 nid, U32 val)
{ {
//Checks for a response //Checks for a response
U16 * _w; U16 *_w;
I64 wp; I64 wp;
HDSyncCORB; HDSyncCORB;
@ -293,6 +321,7 @@ Bool HDTestCORBSync(I64 cad, I64 nid, U32 val)
if (wp == hda.rirb_rp) if (wp == hda.rirb_rp)
return FALSE; return FALSE;
HDReadRIRB; HDReadRIRB;
return TRUE; return TRUE;
} }
@ -312,9 +341,9 @@ U0 HDTraverse(I64 cad, I64 nid)
else else
{ {
aud_cap = HDWriteCORBSync(cad, nid, VERB_GET_PARAM + P_AUDIO_WIDGET_CAP); aud_cap = HDWriteCORBSync(cad, nid, VERB_GET_PARAM + P_AUDIO_WIDGET_CAP);
type = aud_cap >> 20 &15; type = aud_cap >> 20 & 15;
if (Bt(&aud_cap, 8)) if (Bt(&aud_cap, 8))
len = HDWriteCORBSync(cad, nid, VERB_GET_PARAM + P_CONNECT_LST_LEN) &127; len = HDWriteCORBSync(cad, nid, VERB_GET_PARAM + P_CONNECT_LST_LEN) & 127;
else else
len = 0; len = 0;
HDWriteCORBSync(cad, nid, VERB_AMPLIFIER_GAIN_SET + 0xF07F); //set I/O amp #0 HDWriteCORBSync(cad, nid, VERB_AMPLIFIER_GAIN_SET + 0xF07F); //set I/O amp #0
@ -324,7 +353,7 @@ U0 HDTraverse(I64 cad, I64 nid)
switch (type) switch (type)
{ {
case AWT_OUTPUT: case AWT_OUTPUT:
if (FALSE) //if disabled if (FALSE) //if disabled // ????
HDWriteCORBSync(cad, nid, VERB_CHAN_STREAM_ID_SET + 0x00); HDWriteCORBSync(cad, nid, VERB_CHAN_STREAM_ID_SET + 0x00);
else else
HDWriteCORBSync(cad, nid, VERB_CHAN_STREAM_ID_SET + 0x10); HDWriteCORBSync(cad, nid, VERB_CHAN_STREAM_ID_SET + 0x10);
@ -332,7 +361,7 @@ U0 HDTraverse(I64 cad, I64 nid)
HDWriteCORBSync(cad, nid, VERB_PROCESS_STATE_SET + 0x01); HDWriteCORBSync(cad, nid, VERB_PROCESS_STATE_SET + 0x01);
break; break;
case AWT_INPUT: case AWT_INPUT:
if (TRUE) //if disabled if (TRUE) //if disabled // ????
HDWriteCORBSync(cad, nid, VERB_CHAN_STREAM_ID_SET + 0x00); HDWriteCORBSync(cad, nid, VERB_CHAN_STREAM_ID_SET + 0x00);
else else
HDWriteCORBSync(cad, nid, VERB_CHAN_STREAM_ID_SET + 0x20); HDWriteCORBSync(cad, nid, VERB_CHAN_STREAM_ID_SET + 0x20);
@ -348,7 +377,7 @@ U0 HDTraverse(I64 cad, I64 nid)
U0 HDRun(Bool in, Bool out) U0 HDRun(Bool in, Bool out)
{ {
U32 * _d; U32 *_d;
if (hda.bar) if (hda.bar)
{ {
if (out) if (out)
@ -369,7 +398,7 @@ U0 HDRun(Bool in, Bool out)
U0 HDStop(Bool in, Bool out) U0 HDStop(Bool in, Bool out)
{ {
U32 * _d; U32 *_d;
if (hda.bar) if (hda.bar)
{ {
if (out) if (out)
@ -397,20 +426,20 @@ U0 HDSnd(F64 freq, I64 waveform = WF_SQUARE, F64 amp = 1.0)
U0 HDFillBuf(SND_OUT_CONTAINER *buf, I64) U0 HDFillBuf(SND_OUT_CONTAINER *buf, I64)
{ {
I64 i, size = SND_BUF_LEN* sizeof(SND_OUT_CONTAINER); I64 i, size = SND_BUF_LEN * sizeof(SND_OUT_CONTAINER);
if (!hda.o_tmp_buf) if (!hda.o_tmp_buf)
hda.o_tmp_buf = SysMAlloc(size); hda.o_tmp_buf = SysMAlloc(size);
MemSet(hda.o_tmp_buf, 0, size); MemSet(hda.o_tmp_buf, 0, size);
for (i = 0; i < HD_TONES; i++) for (i = 0; i < HD_TONES; i++)
SndWaveAddBuf(hda.tone_swcs[i], hda.o_tmp_buf, SndWaveAddBuf(hda.tone_swcs[i], hda.o_tmp_buf, SND_BUF_LEN / SND_OCHANNELS, hda.freq, hda.waveform, snd_vol * hda.amp);
SND_BUF_LEN / SND_OCHANNELS, hda.freq,
hda.waveform, snd_vol *hda.amp);
MemCopy(buf, hda.o_tmp_buf, size); MemCopy(buf, hda.o_tmp_buf, size);
} }
U0 HDAudioTaskEndCB() U0 HDAudioTaskEndCB()
{ {
I64 i; I64 i;
HDStop(FALSE, TRUE); HDStop(FALSE, TRUE);
fp_snd = NULL; fp_snd = NULL;
for (i = 0; i < HD_TONES; i++) for (i = 0; i < HD_TONES; i++)
@ -425,6 +454,7 @@ U0 HDAudioTaskEndCB()
public U0 HDTonesInit() public U0 HDTonesInit()
{ {
I64 i; I64 i;
if (hda.bar) if (hda.bar)
{ {
for (i = 0; i < HD_TONES; i++) for (i = 0; i < HD_TONES; i++)
@ -442,12 +472,13 @@ U0 HDAudioTask(I64)
//I didn't feel like messing around with PCI interrupts //I didn't feel like messing around with PCI interrupts
//so this task polls every millisecond to know when to //so this task polls every millisecond to know when to
//switch buffers. //switch buffers.
I64 i, next_obuf_trigger = SND_BUF_LEN* sizeof(SND_OUT_CONTAINER) / 2, I64 i, next_obuf_trigger = SND_BUF_LEN * sizeof(SND_OUT_CONTAINER) / 2,
obuf_rollover = 0, obuf_rollover = 0,
next_ibuf_trigger = SND_BUF_LEN* sizeof(SND_IN_CONTAINER), next_ibuf_trigger = SND_BUF_LEN * sizeof(SND_IN_CONTAINER),
ibuf_rollover = 0; ibuf_rollover = 0;
U32 *pos_in_obuf = hda.bar + OSTR0 + STRLPIB, U32 *pos_in_obuf = hda.bar + OSTR0 + STRLPIB,
*pos_in_ibuf = hda.bar + ISTR0 + STRLPIB; *pos_in_ibuf = hda.bar + ISTR0 + STRLPIB;
Fs->task_end_cb = &HDAudioTaskEndCB; Fs->task_end_cb = &HDAudioTaskEndCB;
for (i = 0; i < HD_TONES; i++) for (i = 0; i < HD_TONES; i++)
hda.tone_swcs[i] = SndWaveCtrlNew; hda.tone_swcs[i] = SndWaveCtrlNew;
@ -463,35 +494,32 @@ U0 HDAudioTask(I64)
hda.audio_task_started = TRUE; //This flag is probably not necessary hda.audio_task_started = TRUE; //This flag is probably not necessary
while (TRUE) while (TRUE)
{ {
if (next_obuf_trigger - obuf_rollover <= *pos_in_obuf< next_obuf_trigger - obuf_rollover + if (next_obuf_trigger - obuf_rollover <=
(HD_POS_BUF_MULTIPLES - 1) *SND_BUF_LEN* sizeof(SND_OUT_CONTAINER)) *pos_in_obuf <
next_obuf_trigger - obuf_rollover + (HD_POS_BUF_MULTIPLES - 1) * SND_BUF_LEN * sizeof(SND_OUT_CONTAINER))
{ {
next_obuf_trigger += SND_BUF_LEN* sizeof(SND_OUT_CONTAINER); next_obuf_trigger += SND_BUF_LEN * sizeof(SND_OUT_CONTAINER);
if (next_obuf_trigger - obuf_rollover >= if (next_obuf_trigger - obuf_rollover >= HD_POS_BUF_MULTIPLES * SND_BUF_LEN * sizeof(SND_OUT_CONTAINER))
HD_POS_BUF_MULTIPLES *SND_BUF_LEN* sizeof(SND_OUT_CONTAINER)) obuf_rollover += HD_POS_BUF_MULTIPLES * SND_BUF_LEN * sizeof(SND_OUT_CONTAINER);
obuf_rollover += HD_POS_BUF_MULTIPLES *SND_BUF_LEN *
sizeof(SND_OUT_CONTAINER);
if (fp_snd_fill_buf) if (fp_snd_fill_buf)
{ {
LBts(&snd_flags, Sf_FILLING_OUT); LBts(&snd_flags, Sf_FILLING_OUT);
(*fp_snd_fill_buf)(hda.ostr0_buf[snd_obuf_num & 1], snd_obuf_num); (*fp_snd_fill_buf)(hda.ostr0_buf[snd_obuf_num & 1], snd_obuf_num);
if (IsMute) if (IsMute)
MemSet(hda.ostr0_buf[snd_obuf_num & 1], 0, MemSet(hda.ostr0_buf[snd_obuf_num & 1], 0, SND_BUF_LEN * sizeof(SND_OUT_CONTAINER));
SND_BUF_LEN* sizeof(SND_OUT_CONTAINER));
LBtr(&snd_flags, Sf_FILLING_OUT); LBtr(&snd_flags, Sf_FILLING_OUT);
} }
snd_obuf_num++; snd_obuf_num++;
} }
if (next_ibuf_trigger - ibuf_rollover <= *pos_in_ibuf< next_ibuf_trigger - ibuf_rollover + (HD_POS_BUF_MULTIPLES - 1) * if (next_ibuf_trigger - ibuf_rollover <=
SND_BUF_LEN* sizeof(SND_IN_CONTAINER)) *pos_in_ibuf <
next_ibuf_trigger - ibuf_rollover + (HD_POS_BUF_MULTIPLES - 1) * SND_BUF_LEN * sizeof(SND_IN_CONTAINER))
{ {
next_ibuf_trigger += SND_BUF_LEN* sizeof(SND_IN_CONTAINER); next_ibuf_trigger += SND_BUF_LEN* sizeof(SND_IN_CONTAINER);
if (next_ibuf_trigger - ibuf_rollover >= if (next_ibuf_trigger - ibuf_rollover >= HD_POS_BUF_MULTIPLES * SND_BUF_LEN * sizeof(SND_IN_CONTAINER))
HD_POS_BUF_MULTIPLES *SND_BUF_LEN* sizeof(SND_IN_CONTAINER)) ibuf_rollover += HD_POS_BUF_MULTIPLES * SND_BUF_LEN * sizeof(SND_IN_CONTAINER);
ibuf_rollover += HD_POS_BUF_MULTIPLES *SND_BUF_LEN *
sizeof(SND_IN_CONTAINER);
if (fp_snd_copy_buf) if (fp_snd_copy_buf)
(*fp_snd_copy_buf)(hda.istr0_buf[snd_obuf_num & 1], snd_ibuf_num); (*fp_snd_copy_buf)(hda.istr0_buf[snd_obuf_num & 1], snd_ibuf_num);
snd_ibuf_num++; snd_ibuf_num++;
@ -504,15 +532,18 @@ U0 HDAudioTask(I64)
U0 HDRst() U0 HDRst()
{ {
U32 d, *_d; U32 d, *_d;
HDStop(TRUE, TRUE); HDStop(TRUE, TRUE);
_d = hda.bar + HD_GCTL; _d = hda.bar + HD_GCTL;
*_d = 0; //rst *_d = 0; //rst
do { do
{
Sleep(1); Sleep(1);
d = *_d; d = *_d;
} while (d & 1); } while (d & 1);
*_d = 1; *_d = 1;
do { do
{
Sleep(1); Sleep(1);
d = *_d; d = *_d;
} while (!(d & 1)); } while (!(d & 1));
@ -552,28 +583,26 @@ U0 HDAudioUncachedInit()
public Bool HDAudioInit(I64 hd_bus, I64 hd_dev, I64 hd_fun) public Bool HDAudioInit(I64 hd_bus, I64 hd_dev, I64 hd_fun)
{ {
I64 i; I64 i;
U32 * _d; U32 *_d;
U16 w, *_w; U16 w, *_w;
U8 * _b; U8 *_b;
if (hda.bar) if (hda.bar)
HDAudioEnd; HDAudioEnd;
else else
HDAudioUncachedInit; HDAudioUncachedInit;
if (PCIReadU16(hd_bus, hd_dev, hd_fun, 0) == 0x8086 && if (PCIReadU16(hd_bus, hd_dev, hd_fun, 0) == 0x8086 && (hda.bar = PCIReadU32(hd_bus, hd_dev, hd_fun, 0x10) & ~(0x1F)))
(hda.bar = PCIReadU32(hd_bus, hd_dev, hd_fun, 0x10) &~(0x1F)))
{ {
PCIWriteU16(hd_bus, hd_dev, hd_fun, 0x04, PCIWriteU16(hd_bus, hd_dev, hd_fun, 0x04, PCIReadU16(hd_bus, hd_dev, hd_fun, 0x04) | 0x406);
PCIReadU16(hd_bus, hd_dev, hd_fun, 0x04) | 0x406);
HDRst; HDRst;
hda.corb = CAllocAligned(HD_CORB_ENTRIES* sizeof(U32), 128, hda.hc); hda.corb = CAllocAligned(HD_CORB_ENTRIES * sizeof(U32), 128, hda.hc);
_d = hda.bar + HD_CORBLBASE; _d = hda.bar + HD_CORBLBASE;
*_d = hda.corb(I64).u32[0]; *_d = hda.corb(I64).u32[0];
_d = hda.bar + HD_CORBUBASE; _d = hda.bar + HD_CORBUBASE;
*_d = hda.corb(I64).u32[1]; *_d = hda.corb(I64).u32[1];
hda.rirb = CAllocAligned(HD_RIRB_ENTRIES* sizeof(I64), 128, hda.hc); hda.rirb = CAllocAligned(HD_RIRB_ENTRIES * sizeof(I64), 128, hda.hc);
_d = hda.bar + HD_RIRBLBASE; _d = hda.bar + HD_RIRBLBASE;
*_d = hda.rirb(I64).u32[0]; *_d = hda.rirb(I64).u32[0];
_d = hda.bar + HD_RIRBUBASE; _d = hda.bar + HD_RIRBUBASE;
@ -581,11 +610,15 @@ public Bool HDAudioInit(I64 hd_bus, I64 hd_dev, I64 hd_fun)
_w = hda.bar + HD_CORBRP; _w = hda.bar + HD_CORBRP;
*_w = 0x8000; //Rst read ptr *_w = 0x8000; //Rst read ptr
do { Yield; do
{
Yield;
w = *_w; w = *_w;
} while (!(w & 0x8000)); } while (!(w & 0x8000));
*_w = 0x0000; //Rst read ptr *_w = 0x0000; //Rst read ptr
do { Yield; do
{
Yield;
w = *_w; w = *_w;
} while (w & 0x8000); } while (w & 0x8000);
@ -602,28 +635,27 @@ public Bool HDAudioInit(I64 hd_bus, I64 hd_dev, I64 hd_fun)
_w = hda.bar + HD_RIRBWP; _w = hda.bar + HD_RIRBWP;
hda.rirb_rp = *_w; hda.rirb_rp = *_w;
hda.ostr0_bdl = CAllocAligned( HD_BDL_ENTRIES* sizeof(CHDBufDesc), 128, hda.hc); hda.ostr0_bdl = CAllocAligned(HD_BDL_ENTRIES * sizeof(CHDBufDesc), 128, hda.hc);
_d = hda.bar + OSTR0 + STRBDPL; _d = hda.bar + OSTR0 + STRBDPL;
*_d = hda.ostr0_bdl(I64).u32[0]; *_d = hda.ostr0_bdl(I64).u32[0];
_d = hda.bar + OSTR0 + STRBDPU; _d = hda.bar + OSTR0 + STRBDPU;
*_d = hda.ostr0_bdl(I64).u32[1]; *_d = hda.ostr0_bdl(I64).u32[1];
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
hda.ostr0_bdl[i].buf = hda.ostr0_buf[i] = hda.ostr0_bdl[i].buf = hda.ostr0_buf[i] = CAllocAligned(SND_BUF_LEN * sizeof(SND_OUT_CONTAINER), 128, hda.hc);
CAllocAligned( SND_BUF_LEN* sizeof(SND_OUT_CONTAINER), 128, hda.hc); hda.ostr0_bdl[i].len = SND_BUF_LEN * sizeof(SND_OUT_CONTAINER);
hda.ostr0_bdl[i].len = SND_BUF_LEN* sizeof(SND_OUT_CONTAINER);
hda.ostr0_bdl[i].ctrl = 1; hda.ostr0_bdl[i].ctrl = 1;
} }
hda.istr0_bdl = CAllocAligned( HD_BDL_ENTRIES* sizeof(CHDBufDesc), 128, hda.hc); hda.istr0_bdl = CAllocAligned(HD_BDL_ENTRIES * sizeof(CHDBufDesc), 128, hda.hc);
_d = hda.bar + ISTR0 + STRBDPL; _d = hda.bar + ISTR0 + STRBDPL;
*_d = hda.istr0_bdl(I64).u32[0]; *_d = hda.istr0_bdl(I64).u32[0];
_d = hda.bar + ISTR0 + STRBDPU; _d = hda.bar + ISTR0 + STRBDPU;
*_d = hda.istr0_bdl(I64).u32[1]; *_d = hda.istr0_bdl(I64).u32[1];
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
hda.istr0_bdl[i].buf = hda.istr0_buf[i] = CAllocAligned( SND_BUF_LEN* sizeof(SND_IN_CONTAINER), 128, hda.hc); hda.istr0_bdl[i].buf = hda.istr0_buf[i] = CAllocAligned(SND_BUF_LEN * sizeof(SND_IN_CONTAINER), 128, hda.hc);
hda.istr0_bdl[i].len = SND_BUF_LEN* sizeof(SND_IN_CONTAINER); hda.istr0_bdl[i].len = SND_BUF_LEN * sizeof(SND_IN_CONTAINER);
hda.istr0_bdl[i].ctrl = 1; hda.istr0_bdl[i].ctrl = 1;
} }
@ -639,7 +671,7 @@ public Bool HDAudioInit(I64 hd_bus, I64 hd_dev, I64 hd_fun)
_d = hda.bar + OSTR0 + STRLPIB; _d = hda.bar + OSTR0 + STRLPIB;
*_d = 0; *_d = 0;
_d = hda.bar + OSTR0 + STRCBL; _d = hda.bar + OSTR0 + STRCBL;
*_d = HD_POS_BUF_MULTIPLES *SND_BUF_LEN* sizeof(SND_OUT_CONTAINER); *_d = HD_POS_BUF_MULTIPLES * SND_BUF_LEN * sizeof(SND_OUT_CONTAINER);
_w = hda.bar + OSTR0 + STRLVI; _w = hda.bar + OSTR0 + STRLVI;
*_w = 1; //last valid idx *_w = 1; //last valid idx
_w = hda.bar + OSTR0 + STRFMT; _w = hda.bar + OSTR0 + STRFMT;
@ -648,7 +680,7 @@ public Bool HDAudioInit(I64 hd_bus, I64 hd_dev, I64 hd_fun)
_d = hda.bar + ISTR0 + STRLPIB; _d = hda.bar + ISTR0 + STRLPIB;
*_d = 0; *_d = 0;
_d = hda.bar + ISTR0 + STRCBL; _d = hda.bar + ISTR0 + STRCBL;
*_d = HD_POS_BUF_MULTIPLES *SND_BUF_LEN* sizeof(SND_IN_CONTAINER); *_d = HD_POS_BUF_MULTIPLES * SND_BUF_LEN * sizeof(SND_IN_CONTAINER);
_w = hda.bar + ISTR0 + STRLVI; _w = hda.bar + ISTR0 + STRLVI;
*_w = 1; //last valid idx *_w = 1; //last valid idx
_w = hda.bar + ISTR0 + STRFMT; _w = hda.bar + ISTR0 + STRFMT;
@ -693,5 +725,4 @@ Bool HDAudioScan()
HDAudioScan; HDAudioScan;
# #help_index ""
help_index ""