8 This checks the read or write status port of the device.
13 PSOUND_BLASTER_PARAMETERS SBDevice
,
16 ULONG timeout
= SB_TIMEOUT
;
19 while ( ( ! ready
) && ( timeout
> 0 ) )
21 if ( SbRead(SBDevice
, Port
) & 0x80 )
32 PSOUND_BLASTER_PARAMETERS SBDevice
,
35 if ( ! WaitToWrite(SBDevice
) )
38 DPRINT("Writing 0x%x to Sound Blaster card (data)\n", Data
);
39 SbWrite(SBDevice
, SB_WRITE_DATA_PORT
, Data
);
46 PSOUND_BLASTER_PARAMETERS SBDevice
,
49 if ( ! WaitToWrite(SBDevice
) )
52 *Data
= SbRead(SBDevice
, SB_READ_DATA_PORT
);
53 DPRINT("Read 0x%x from Sound Blaster card (data)\n", *Data
);
60 PSOUND_BLASTER_PARAMETERS SBDevice
)
62 BOOLEAN acked
= FALSE
;
65 SbWriteReset(SBDevice
, 0x01);
66 for (timeout
= 0; timeout
< 30000; timeout
++ );
67 SbWriteReset(SBDevice
, 0x00);
69 DPRINT("Waiting for SB to acknowledge our reset request\n");
71 if ( ! WaitToRead(SBDevice
) )
73 DPRINT("Didn't get an ACK :(\n");
79 while ( ( ! acked
) && ( timeout
< SB_TIMEOUT
) )
81 acked
= ( SbReadDataWithoutWait(SBDevice
) == SB_DSP_READY
);
87 DPRINT("Didn't get an ACK :(\n");
96 PSOUND_BLASTER_PARAMETERS SBDevice
)
98 UCHAR MajorVer
, MinorVer
;
100 DPRINT("Querying DSP version\n");
102 if ( ! SbWriteData(SBDevice
, SbGetDspVersion
) )
105 if ( ! WaitToRead(SBDevice
) )
108 if ( SbReadData(SBDevice
, &MajorVer
) )
110 if ( SbReadData(SBDevice
, &MinorVer
) )
112 DPRINT("Version %d.%d\n", MajorVer
, MinorVer
);
114 SBDevice
->dsp_version
= (MajorVer
* 256) + MinorVer
;
116 if ( SBDevice
->dsp_version
< 0x0200 )
118 else if ( ( SBDevice
->dsp_version
& 0xFF00 ) == 0x0200 )
119 return SoundBlaster2
;
120 else if ( ( SBDevice
->dsp_version
& 0xFF00 ) == 0x0300 )
121 return SoundBlasterPro
;
122 else if ( SBDevice
->dsp_version
>= 0x0400 )
123 return SoundBlaster16
;
134 IsSampleRateCompatible(
135 PSOUND_BLASTER_PARAMETERS SBDevice
,
144 PSOUND_BLASTER_PARAMETERS SBDevice
,
147 /* Only works for DSP v4.xx */
148 DPRINT("Setting sample rate\n");
150 SbWriteData(SBDevice
, SbSetOutputRate
);
151 SbWriteData(SBDevice
, SampleRate
/ 256);
152 SbWriteData(SBDevice
, SampleRate
% 256);
159 PSOUND_BLASTER_PARAMETERS SBDevice
)
161 DPRINT("Enabling speaker\n");
163 return SbWriteData(SBDevice
, SbEnableSpeaker
);
168 PSOUND_BLASTER_PARAMETERS SBDevice
)
170 DPRINT("Disabling speaker\n");
172 return SbWriteData(SBDevice
, SbDisableSpeaker
);
177 PSOUND_BLASTER_PARAMETERS SBDevice
,
182 DPRINT("Initializing output with %d channels at %d bits/sample\n", Channels
, BitDepth
);
184 UCHAR command
= 0xc6, mode
= 0x00;
186 if ( ( Channels
< 1 ) || ( Channels
> 2 ) )
189 if ( ( BitDepth
!= 8 ) && ( BitDepth
!= 16 ) )
194 case 8 : command
= 0xc6; break;
195 case 16 : command
= 0xb6; break;
200 case 1 : mode
= 0x00; break;
201 case 2 : mode
= 0x20; break;
204 first_byte
= (BitDepth
== 16) ? 0xb6 : 0xc6;
205 second_byte
= (Channels
== 1) ? 0x20 : 0x00;
208 if ( SBDevice
->dsp_version
< 0x0400 )
210 /* TODO: Additional programming required */
214 SbWriteData(SBDevice
, command
);
215 SbWriteData(SBDevice
, mode
);
216 SbWriteData(SBDevice
, BlockSize
% 256);
217 SbWriteData(SBDevice
, BlockSize
/ 256);
219 DPRINT("Finished programming the DSP\n");