3 Sound Blaster DSP support
7 Andrew Greenwood (silverblade@reactos.org)
13 Functions documented in sbdsp.h
15 Currently, input/output switches and PC speaker volume
16 level are not supported.
18 The I/O switches are used for muting/unmuting mic, etc.
27 SbMixerReset(IN PUCHAR BasePort
)
29 WRITE_SB_MIXER_REGISTER(BasePort
, SB_MIX_RESET
);
30 /* Are we meant to send anything else? */
37 OUT PUCHAR PackedLevel
)
40 return STATUS_INVALID_PARAMETER_3
;
44 case SB_MIX_MASTER_LEFT_LEVEL
:
45 case SB_MIX_MASTER_RIGHT_LEVEL
:
46 case SB_MIX_VOC_LEFT_LEVEL
:
47 case SB_MIX_VOC_RIGHT_LEVEL
:
48 case SB_MIX_MIDI_LEFT_LEVEL
:
49 case SB_MIX_MIDI_RIGHT_LEVEL
:
50 case SB_MIX_CD_LEFT_LEVEL
:
51 case SB_MIX_CD_RIGHT_LEVEL
:
52 case SB_MIX_LINE_LEFT_LEVEL
:
53 case SB_MIX_LINE_RIGHT_LEVEL
:
54 case SB_MIX_MIC_LEVEL
:
55 case SB_MIX_LEGACY_MIC_LEVEL
: /* is this correct? */
58 return STATUS_INVALID_PARAMETER_2
;
60 *PackedLevel
= Level
<< 3;
61 return STATUS_SUCCESS
;
64 case SB_MIX_INPUT_LEFT_GAIN
:
65 case SB_MIX_INPUT_RIGHT_GAIN
:
66 case SB_MIX_OUTPUT_LEFT_GAIN
:
67 case SB_MIX_OUTPUT_RIGHT_GAIN
:
70 return STATUS_INVALID_PARAMETER_2
;
72 *PackedLevel
= Level
<< 6;
73 return STATUS_SUCCESS
;
76 case SB_MIX_VOC_LEVEL
: /* legacy */
77 case SB_MIX_MASTER_LEVEL
:
78 case SB_MIX_FM_LEVEL
:
79 case SB_MIX_CD_LEVEL
:
80 case SB_MIX_LINE_LEVEL
:
81 case SB_MIX_TREBLE_LEFT_LEVEL
: /* bass/treble */
82 case SB_MIX_TREBLE_RIGHT_LEVEL
:
83 case SB_MIX_BASS_LEFT_LEVEL
:
84 case SB_MIX_BASS_RIGHT_LEVEL
:
87 return STATUS_INVALID_PARAMETER_2
;
89 *PackedLevel
= Level
<< 4;
90 return STATUS_SUCCESS
;
94 return STATUS_INVALID_PARAMETER_1
;
99 SbMixerUnpackLevelData(
101 IN UCHAR PackedLevel
,
105 return STATUS_INVALID_PARAMETER_3
;
109 case SB_MIX_MASTER_LEFT_LEVEL
:
110 case SB_MIX_MASTER_RIGHT_LEVEL
:
111 case SB_MIX_VOC_LEFT_LEVEL
:
112 case SB_MIX_VOC_RIGHT_LEVEL
:
113 case SB_MIX_MIDI_LEFT_LEVEL
:
114 case SB_MIX_MIDI_RIGHT_LEVEL
:
115 case SB_MIX_CD_LEFT_LEVEL
:
116 case SB_MIX_CD_RIGHT_LEVEL
:
117 case SB_MIX_LINE_LEFT_LEVEL
:
118 case SB_MIX_LINE_RIGHT_LEVEL
:
119 case SB_MIX_MIC_LEVEL
:
121 *Level
= PackedLevel
>> 3;
122 return STATUS_SUCCESS
;
125 case SB_MIX_INPUT_LEFT_GAIN
:
126 case SB_MIX_INPUT_RIGHT_GAIN
:
127 case SB_MIX_OUTPUT_LEFT_GAIN
:
128 case SB_MIX_OUTPUT_RIGHT_GAIN
:
130 *Level
= PackedLevel
>> 6;
131 return STATUS_SUCCESS
;
134 case SB_MIX_VOC_LEVEL
: /* legacy */
135 case SB_MIX_MASTER_LEVEL
:
136 case SB_MIX_FM_LEVEL
:
137 case SB_MIX_CD_LEVEL
:
138 case SB_MIX_LINE_LEVEL
:
139 case SB_MIX_TREBLE_LEFT_LEVEL
: /* bass/treble */
140 case SB_MIX_TREBLE_RIGHT_LEVEL
:
141 case SB_MIX_BASS_LEFT_LEVEL
:
142 case SB_MIX_BASS_RIGHT_LEVEL
:
144 *Level
= PackedLevel
>> 4;
145 return STATUS_SUCCESS
;
149 return STATUS_INVALID_PARAMETER_1
;
159 UCHAR PackedLevel
= 0;
162 Status
= SbMixerPackLevelData(Line
, Level
, &PackedLevel
);
166 case STATUS_SUCCESS
:
169 case STATUS_INVALID_PARAMETER_1
:
170 return STATUS_INVALID_PARAMETER_2
;
172 case STATUS_INVALID_PARAMETER_2
:
173 return STATUS_INVALID_PARAMETER_3
;
179 DbgPrint("SbMixerSetLevel: Line 0x%x, raw level 0x%x, packed 0x%x\n", Line
, Level
, PackedLevel
);
181 WRITE_SB_MIXER_REGISTER(BasePort
, Line
);
182 WRITE_SB_MIXER_DATA(BasePort
, PackedLevel
);
184 return STATUS_SUCCESS
;
193 UCHAR PackedLevel
= 0;
197 return STATUS_INVALID_PARAMETER_3
;
199 WRITE_SB_MIXER_REGISTER(BasePort
, Line
);
200 PackedLevel
= READ_SB_MIXER_DATA(BasePort
);
202 Status
= SbMixerUnpackLevelData(Line
, PackedLevel
, Level
);
206 case STATUS_SUCCESS
:
209 case STATUS_INVALID_PARAMETER_1
:
210 return STATUS_INVALID_PARAMETER_2
;
212 case STATUS_INVALID_PARAMETER_2
:
213 return STATUS_INVALID_PARAMETER_3
;
219 DbgPrint("SbMixerGetLevel: Line 0x%x, raw level 0x%x, packed 0x%x\n", Line
, Level
, PackedLevel
);
221 return STATUS_SUCCESS
;
225 SbMixerEnableAGC(IN PUCHAR BasePort
)
228 WRITE_SB_MIXER_REGISTER(BasePort
, SB_MIX_AGC
);
229 WRITE_SB_MIXER_DATA(BasePort
, 1);
233 SbMixerDisableAGC(IN PUCHAR BasePort
)
236 WRITE_SB_MIXER_REGISTER(BasePort
, SB_MIX_AGC
);
237 WRITE_SB_MIXER_DATA(BasePort
, 0);
241 SbMixerIsAGCEnabled(IN PUCHAR BasePort
)
244 WRITE_SB_MIXER_REGISTER(BasePort
, SB_MIX_AGC
);
245 return (READ_SB_MIXER_DATA(BasePort
) != 0);