ReactOS 0.4.16-dev-2293-g4d8327b
hdac_stream.cpp File Reference
#include "driver.h"
Include dependency graph for hdac_stream.cpp:

Go to the source code of this file.

Functions

void hdac_stream_start (PHDAC_STREAM stream)
 
void hdac_stream_clear (PHDAC_STREAM stream)
 
void hdac_stream_stop (PHDAC_STREAM stream)
 
void hdac_stream_reset (PHDAC_STREAM stream)
 
UINT16 hdac_format (PHDAC_STREAM stream)
 
void hdac_stream_setup (PHDAC_STREAM stream)
 

Function Documentation

◆ hdac_format()

UINT16 hdac_format ( PHDAC_STREAM  stream)

Definition at line 67 of file hdac_stream.cpp.

67 {
68 UINT16 format = 0;
69
70 switch (stream->streamFormat.SampleRate) {
71 case 8000:
72 format = HDA_RATE(48, 1, 6);
73 break;
74 case 9600:
75 format = HDA_RATE(48, 1, 5);
76 break;
77 case 11025:
78 format = HDA_RATE(44, 1, 4);
79 break;
80 case 16000:
81 format = HDA_RATE(48, 1, 3);
82 break;
83 case 22050:
84 format = HDA_RATE(44, 1, 2);
85 break;
86 case 32000:
87 format = HDA_RATE(48, 2, 3);
88 break;
89 case 44100:
90 format = HDA_RATE(44, 1, 1);
91 break;
92 case 48000:
93 format = HDA_RATE(48, 1, 1);
94 break;
95 case 88200:
96 format = HDA_RATE(44, 2, 1);
97 break;
98 case 96000:
99 format = HDA_RATE(48, 2, 1);
100 break;
101 case 176400:
102 format = HDA_RATE(44, 4, 1);
103 break;
104 case 192000:
105 format = HDA_RATE(48, 4, 1);
106 break;
107 }
108
109 {
110 UINT16 channels = stream->streamFormat.NumberOfChannels;
111 if (channels == 0 || channels > 8)
112 return 0;
113 format |= channels - 1;
114
115 switch (stream->streamFormat.ContainerSize) {
116 case 8:
118 break;
119 case 16:
121 break;
122 case 20:
124 break;
125 case 24:
127 break;
128 case 32:
130 break;
131 }
132 }
133 return format;
134}
unsigned short UINT16
Definition: actypes.h:129
#define AC_FMT_BITS_20
Definition: hda_verbs.h:194
#define AC_FMT_BITS_32
Definition: hda_verbs.h:196
#define AC_FMT_BITS_8
Definition: hda_verbs.h:192
#define AC_FMT_BITS_16
Definition: hda_verbs.h:193
#define AC_FMT_BITS_24
Definition: hda_verbs.h:195
int This channels
Definition: rdpsnd_libao.c:37
#define HDA_RATE(base, mult, div)
Definition: regfuncs.h:49
Definition: format.c:58
Definition: parse.h:23

Referenced by HDA_AllocateCaptureDmaEngine(), HDA_AllocateRenderDmaEngine(), HDA_ChangeBandwidthAllocation(), and hdac_stream_setup().

◆ hdac_stream_clear()

void hdac_stream_clear ( PHDAC_STREAM  stream)

Definition at line 21 of file hdac_stream.cpp.

21 {
23 stream_write8(stream, SD_STS, SD_INT_MASK); /* to be sure */
24 if (stream->stripe)
26
27 stream->running = FALSE;
28}
#define FALSE
Definition: types.h:117
#define SD_CTL_STRIPE_MASK
#define SD_INT_MASK
#define SD_CTL_DMA_START
#define stream_update8(ctx, reg, mask, val)
Definition: regfuncs.h:65
#define stream_write8(ctx, reg, data)
Definition: regfuncs.h:64

Referenced by hdac_stream_reset(), hdac_stream_setup(), and hdac_stream_stop().

◆ hdac_stream_reset()

void hdac_stream_reset ( PHDAC_STREAM  stream)

Definition at line 37 of file hdac_stream.cpp.

37 {
39
42 int timeout = 300;
43
44 UCHAR val;
45 do {
47 if (val)
48 break;
49 } while (--timeout);
50
51 val &= ~SD_CTL_STREAM_RESET;
52 stream_write8(stream, SD_CTL, val);
54
55 timeout = 300;
56 /* waiting for hardware to report that the stream is out of reset */
57 do {
59 if (!val)
60 break;
61 } while (--timeout);
62
63 if (stream->posbuf)
64 *stream->posbuf = 0;
65}
GLuint GLfloat * val
Definition: glext.h:7180
#define SD_CTL_STREAM_RESET
void hdac_stream_clear(PHDAC_STREAM stream)
Definition: hdac_stream.cpp:21
#define KeStallExecutionProcessor(MicroSeconds)
Definition: precomp.h:27
#define stream_read8(ctx, reg)
Definition: regfuncs.h:63
Definition: dhcpd.h:248
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by ADSPPrepareDSP(), HDA_AllocateDmaBufferWithNotification(), HDA_SetDmaEngineState(), and HDA_SetupDmaEngineWithBdl().

◆ hdac_stream_setup()

void hdac_stream_setup ( PHDAC_STREAM  stream)

Definition at line 136 of file hdac_stream.cpp.

136 {
137 /* make sure the run bit is zero for SD */
139
140 UINT val;
141 /* program the stream_tag */
142 val = stream_read32(stream, SD_CTL);
143 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
144 (stream->streamTag << SD_CTL_STREAM_TAG_SHIFT);
145 stream_write32(stream, SD_CTL, val);
146
147 /* program the length of samples in cyclic buffer */
148 stream_write32(stream, SD_CBL, stream->bufSz);
149
150 /* program the stream format */
151 /* this value needs to be the same as the one programmed */
153 stream_write16(stream, SD_FORMAT, format);
154
155 /* program the stream LVI (last valid index) of the BDL */
156 stream_write16(stream, SD_LVI, stream->numBlocks - 1);
157
158 /* program the BDL address */
159 /* lower BDL address */
161 stream_write32(stream, SD_BDLPL, bdlAddr.LowPart);
162 /* upper BDL address */
163 stream_write32(stream, SD_BDLPU, bdlAddr.HighPart);
164
165 //Enable position buffer
166 if (!(hda_read32(stream->FdoContext, DPLBASE) & HDA_DPLBASE_ENABLE)){
167 PHYSICAL_ADDRESS posbufAddr = MmGetPhysicalAddress(stream->FdoContext->posbuf);
168 hda_write32(stream->FdoContext, DPLBASE, posbufAddr.LowPart | HDA_DPLBASE_ENABLE);
169 }
170
171 /* set the interrupt enable bits in the descriptor control register */
173
174 stream->fifoSize = 0;
175 stream->fifoSize = stream_read16(stream, SD_FIFOSIZE) + 1;
176}
#define HDA_DPLBASE_ENABLE
Definition: hda_registers.h:63
#define SD_CTL_STREAM_TAG_SHIFT
UINT16 hdac_format(PHDAC_STREAM stream)
Definition: hdac_stream.cpp:67
unsigned int UINT
Definition: ndis.h:50
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress(IN PVOID Address)
Definition: stubs.c:685
#define stream_update32(ctx, reg, mask, val)
Definition: regfuncs.h:71
#define hda_read32(ctx, reg)
Definition: regfuncs.h:59
#define stream_read16(ctx, reg)
Definition: regfuncs.h:66
#define stream_read32(ctx, reg)
Definition: regfuncs.h:69
#define hda_write32(ctx, reg, data)
Definition: regfuncs.h:60
#define stream_write16(ctx, reg, data)
Definition: regfuncs.h:67
#define stream_write32(ctx, reg, data)
Definition: regfuncs.h:70
ULONG LowPart
Definition: typedefs.h:106

Referenced by ADSPPrepareDSP(), HDA_AllocateDmaBufferWithNotification(), HDA_ChangeBandwidthAllocation(), HDA_SetDmaEngineState(), and HDA_SetupDmaEngineWithBdl().

◆ hdac_stream_start()

void hdac_stream_start ( PHDAC_STREAM  stream)

Definition at line 3 of file hdac_stream.cpp.

3 {
4 hda_read32(stream->FdoContext, WALLCLK);
5
6 /* enable SIE */
7 hda_update32(stream->FdoContext, INTCTL, 1 << stream->idx, 1 << stream->idx);
8
9 /* set stripe control */
10 if (stream->stripe) {
11 UINT8 stripe_ctl = 1;
13 stripe_ctl);
14 }
15
16 /* set DMA start and interrupt mask */
18 stream->running = TRUE;
19}
unsigned char UINT8
Definition: actypes.h:128
#define TRUE
Definition: types.h:120
#define hda_update32(ctx, reg, mask, val)
Definition: regfuncs.h:61

Referenced by ADSPStartStopDSP(), and HDA_SetDmaEngineState().

◆ hdac_stream_stop()

void hdac_stream_stop ( PHDAC_STREAM  stream)

Definition at line 30 of file hdac_stream.cpp.

30 {
32
33 /* disable SIE */
34 hda_update32(stream->FdoContext, INTCTL, 1 << stream->idx, 0);
35}

Referenced by ADSPStartStopDSP(), HDA_SetDmaEngineState(), and ResetHDAController().