mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2024-12-25 23:10:32 +00:00
Reformat HDAudio.ZC
This commit is contained in:
parent
2fd8527fdb
commit
f2490f75bc
1 changed files with 275 additions and 244 deletions
|
@ -1,11 +1,11 @@
|
||||||
//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_RATE 48000
|
||||||
#define SND_SAMPLE_BITS 24
|
#define SND_SAMPLE_BITS 24
|
||||||
#define SND_OCHANNELS 2
|
#define SND_OCHANNELS 2
|
||||||
|
@ -13,17 +13,16 @@ help_index "Sound/HDAudio"
|
||||||
#define SND_OUT_CONTAINER I32
|
#define SND_OUT_CONTAINER I32
|
||||||
#define SND_IN_CONTAINER I16
|
#define SND_IN_CONTAINER I16
|
||||||
#define SND_BUF_LEN 0x400
|
#define SND_BUF_LEN 0x400
|
||||||
#define SND_BUF_TIME_mS(SND_BUF_LEN / SND_OCHANNELS *1000.0 / \
|
#define SND_BUF_TIME_mS (SND_BUF_LEN / SND_OCHANNELS * 1000.0 / SND_SAMPLE_RATE)
|
||||||
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;
|
||||||
|
|
||||||
|
@ -34,18 +33,23 @@ I64 snd_flags;
|
||||||
#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_8_BIT 0
|
||||||
#define HD_16_BIT 1
|
#define HD_16_BIT 1
|
||||||
#define HD_20_BIT 2
|
#define HD_20_BIT 2
|
||||||
#define HD_24_BIT 3
|
#define HD_24_BIT 3
|
||||||
#define HD_32_BIT 4
|
#define HD_32_BIT 4
|
||||||
#define HD_48kHz 0
|
#define HD_48kHz 0
|
||||||
#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_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_CORB_ENTRIES 256
|
||||||
#define HD_RIRB_ENTRIES 256
|
#define HD_RIRB_ENTRIES 256
|
||||||
#define HD_BDL_ENTRIES 256
|
#define HD_BDL_ENTRIES 256
|
||||||
|
|
||||||
#define HD_GCTL 0x08
|
#define HD_GCTL 0x08
|
||||||
#define HD_STATESTS 0x0E
|
#define HD_STATESTS 0x0E
|
||||||
#define HD_GSTS 0x10
|
#define HD_GSTS 0x10
|
||||||
|
@ -60,6 +64,7 @@ I64 snd_flags;
|
||||||
#define HD_RIRBWP 0x58
|
#define HD_RIRBWP 0x58
|
||||||
#define HD_RIRBCTL 0x5C
|
#define HD_RIRBCTL 0x5C
|
||||||
#define HD_RIRBSTS 0x5D
|
#define HD_RIRBSTS 0x5D
|
||||||
|
|
||||||
#define STRCTL 0x00
|
#define STRCTL 0x00
|
||||||
#define STRSTS 0x03
|
#define STRSTS 0x03
|
||||||
#define STRLPIB 0x04
|
#define STRLPIB 0x04
|
||||||
|
@ -78,6 +83,7 @@ I64 snd_flags;
|
||||||
#define OSTR1 0x120
|
#define OSTR1 0x120
|
||||||
#define OSTR2 0x140
|
#define OSTR2 0x140
|
||||||
#define OSTR3 0x160
|
#define OSTR3 0x160
|
||||||
|
|
||||||
#define VERB_GET_PARAM 0xF0000
|
#define VERB_GET_PARAM 0xF0000
|
||||||
#define VERB_CONNECT_SEL_GET 0xF0100
|
#define VERB_CONNECT_SEL_GET 0xF0100
|
||||||
#define VERB_CONNECT_SEL_SET 0x70100
|
#define VERB_CONNECT_SEL_SET 0x70100
|
||||||
|
@ -193,12 +199,27 @@ I64 snd_flags;
|
||||||
#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;
|
||||||
};
|
};
|
||||||
|
@ -207,33 +228,35 @@ class CHDBufDesc
|
||||||
|
|
||||||
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_OUT_CONTAINER *ostr0_buf[2],
|
||||||
|
*o_tmp_buf;
|
||||||
SND_IN_CONTAINER *istr0_buf[2];
|
SND_IN_CONTAINER *istr0_buf[2];
|
||||||
CTask * task;
|
CTask *task;
|
||||||
I64 waveform;
|
I64 waveform;
|
||||||
F64 freq, amp;
|
F64 freq, amp;
|
||||||
CSndWaveCtrl *tone_swcs[HD_TONES];
|
CSndWaveCtrl *tone_swcs[HD_TONES];
|
||||||
U8 rirb_rp, corb_wp;
|
U8 rirb_rp, corb_wp;
|
||||||
Bool audio_task_started, in_running, out_running;
|
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 ""
|
|
Loading…
Reference in a new issue