- Sync with trunk up to r46941.
[reactos.git] / lib / drivers / sound / soundblaster / rate.c
1 /*
2 ReactOS Sound System
3 Sound Blaster DSP support
4 Sample rate routines
5
6 Author:
7 Andrew Greenwood (silverblade@reactos.org)
8
9 History:
10 2 July 2008 - Created (split from sbdsp.c)
11
12 Notes:
13 Functions documented in sbdsp.h
14 */
15
16 #include <ntddk.h>
17 #include <debug.h>
18
19 #include <sbdsp.h>
20
21 BOOLEAN
22 SbDspIsValidInputRate(
23 IN UCHAR MajorVersion,
24 IN UCHAR MinorVersion,
25 IN USHORT Rate,
26 IN BOOLEAN Stereo)
27 {
28 if ( MajorVersion == 1 )
29 {
30 if ( Stereo )
31 return FALSE;
32
33 return ( ( Rate >= 4000 ) && ( Rate <= 13000 ) );
34 }
35 else if ( MajorVersion == 2 )
36 {
37 if ( Stereo )
38 return FALSE;
39
40 if ( MinorVersion == 0 )
41 return ( ( Rate >= 4000 ) && ( Rate <= 15000 ) );
42 else
43 return ( ( Rate >= 4000 ) && ( Rate <= 44100 ) );
44 }
45 else if ( MajorVersion == 3 )
46 {
47 if ( Stereo )
48 return FALSE;
49
50 return ( ( Rate >= 4000 ) && ( Rate <= 13000 ) );
51 }
52 else /* 4.00 and above */
53 {
54 return ( ( Rate >= 5000 ) && ( Rate <= 44100 ) );
55 }
56 }
57
58 BOOLEAN
59 SbDspIsValidOutputRate(
60 IN UCHAR MajorVersion,
61 IN UCHAR MinorVersion,
62 IN USHORT Rate,
63 IN BOOLEAN Stereo)
64 {
65 if ( MajorVersion == 1 )
66 {
67 if ( Stereo )
68 return FALSE;
69
70 return ( ( Rate >= 4000 ) && ( Rate <= 23000 ) );
71 }
72 else if ( MajorVersion == 2 )
73 {
74 if ( Stereo )
75 return FALSE;
76
77 if ( MinorVersion == 0 )
78 return ( ( Rate >= 4000 ) && ( Rate <= 23000 ) );
79 else
80 return ( ( Rate >= 4000 ) && ( Rate <= 44100 ) );
81 }
82 else if ( MajorVersion == 3 )
83 {
84 if ( ! Stereo )
85 return ( ( Rate >= 4000 ) && ( Rate <= 44100 ) );
86 else
87 return ( ( Rate >= 11025 ) && ( Rate <= 22050 ) );
88 }
89 else /* 4.00 and above */
90 {
91 return ( ( Rate >= 5000 ) && ( Rate <= 44100 ) );
92 }
93 }
94
95 /* Internal routine - call only after submitting one of the rate commands */
96 NTSTATUS
97 SbDsp4WriteRate(
98 IN PUCHAR BasePort,
99 IN USHORT Rate,
100 IN ULONG Timeout)
101 {
102 NTSTATUS Status;
103
104 /* NOTE - No check for validity of rate! */
105
106 /* Write high byte */
107 Status = SbDspWrite(BasePort, (Rate & 0xff00) >> 8, Timeout);
108 if ( Status != STATUS_SUCCESS )
109 return Status;
110
111 /* Write low byte */
112 Status = SbDspWrite(BasePort, Rate & 0xff, Timeout);
113 if ( Status != STATUS_SUCCESS )
114 return Status;
115
116 return Status;
117 }
118
119 NTSTATUS
120 SbDsp4SetOutputRate(
121 IN PUCHAR BasePort,
122 IN USHORT Rate,
123 IN ULONG Timeout)
124 {
125 NTSTATUS Status;
126
127 /* NOTE - No check for validity of rate! */
128
129 /* Prepare to write the output rate */
130 Status = SbDspWrite(BasePort, SB_DSP_OUTPUT_RATE, (Rate & 0xff00) >> 8);
131 if ( Status != STATUS_SUCCESS )
132 return Status;
133
134 return SbDsp4WriteRate(BasePort, Rate, Timeout);
135 }
136
137 NTSTATUS
138 SbDsp4SetInputRate(
139 IN PUCHAR BasePort,
140 IN USHORT Rate,
141 IN ULONG Timeout)
142 {
143 NTSTATUS Status;
144
145 /* NOTE - No check for validity of rate! */
146
147 /* Prepare to write the input rate */
148 Status = SbDspWrite(BasePort, SB_DSP_OUTPUT_RATE, (Rate & 0xff00) >> 8);
149 if ( Status != STATUS_SUCCESS )
150 return Status;
151
152 return SbDsp4WriteRate(BasePort, Rate, Timeout);
153 }
154