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 "precomp.h" 17 18 BOOLEAN 19 SbDspIsValidInputRate( 20 IN UCHAR MajorVersion, 21 IN UCHAR MinorVersion, 22 IN USHORT Rate, 23 IN BOOLEAN Stereo) 24 { 25 if ( MajorVersion == 1 ) 26 { 27 if ( Stereo ) 28 return FALSE; 29 30 return ( ( Rate >= 4000 ) && ( Rate <= 13000 ) ); 31 } 32 else if ( MajorVersion == 2 ) 33 { 34 if ( Stereo ) 35 return FALSE; 36 37 if ( MinorVersion == 0 ) 38 return ( ( Rate >= 4000 ) && ( Rate <= 15000 ) ); 39 else 40 return ( ( Rate >= 4000 ) && ( Rate <= 44100 ) ); 41 } 42 else if ( MajorVersion == 3 ) 43 { 44 if ( Stereo ) 45 return FALSE; 46 47 return ( ( Rate >= 4000 ) && ( Rate <= 13000 ) ); 48 } 49 else /* 4.00 and above */ 50 { 51 return ( ( Rate >= 5000 ) && ( Rate <= 44100 ) ); 52 } 53 } 54 55 BOOLEAN 56 SbDspIsValidOutputRate( 57 IN UCHAR MajorVersion, 58 IN UCHAR MinorVersion, 59 IN USHORT Rate, 60 IN BOOLEAN Stereo) 61 { 62 if ( MajorVersion == 1 ) 63 { 64 if ( Stereo ) 65 return FALSE; 66 67 return ( ( Rate >= 4000 ) && ( Rate <= 23000 ) ); 68 } 69 else if ( MajorVersion == 2 ) 70 { 71 if ( Stereo ) 72 return FALSE; 73 74 if ( MinorVersion == 0 ) 75 return ( ( Rate >= 4000 ) && ( Rate <= 23000 ) ); 76 else 77 return ( ( Rate >= 4000 ) && ( Rate <= 44100 ) ); 78 } 79 else if ( MajorVersion == 3 ) 80 { 81 if ( ! Stereo ) 82 return ( ( Rate >= 4000 ) && ( Rate <= 44100 ) ); 83 else 84 return ( ( Rate >= 11025 ) && ( Rate <= 22050 ) ); 85 } 86 else /* 4.00 and above */ 87 { 88 return ( ( Rate >= 5000 ) && ( Rate <= 44100 ) ); 89 } 90 } 91 92 /* Internal routine - call only after submitting one of the rate commands */ 93 NTSTATUS 94 SbDsp4WriteRate( 95 IN PUCHAR BasePort, 96 IN USHORT Rate, 97 IN ULONG Timeout) 98 { 99 NTSTATUS Status; 100 101 /* NOTE - No check for validity of rate! */ 102 103 /* Write high byte */ 104 Status = SbDspWrite(BasePort, (Rate & 0xff00) >> 8, Timeout); 105 if ( Status != STATUS_SUCCESS ) 106 return Status; 107 108 /* Write low byte */ 109 Status = SbDspWrite(BasePort, Rate & 0xff, Timeout); 110 if ( Status != STATUS_SUCCESS ) 111 return Status; 112 113 return Status; 114 } 115 116 NTSTATUS 117 SbDsp4SetOutputRate( 118 IN PUCHAR BasePort, 119 IN USHORT Rate, 120 IN ULONG Timeout) 121 { 122 NTSTATUS Status; 123 124 /* NOTE - No check for validity of rate! */ 125 126 /* Prepare to write the output rate */ 127 Status = SbDspWrite(BasePort, SB_DSP_OUTPUT_RATE, (Rate & 0xff00) >> 8); 128 if ( Status != STATUS_SUCCESS ) 129 return Status; 130 131 return SbDsp4WriteRate(BasePort, Rate, Timeout); 132 } 133 134 NTSTATUS 135 SbDsp4SetInputRate( 136 IN PUCHAR BasePort, 137 IN USHORT Rate, 138 IN ULONG Timeout) 139 { 140 NTSTATUS Status; 141 142 /* NOTE - No check for validity of rate! */ 143 144 /* Prepare to write the input rate */ 145 Status = SbDspWrite(BasePort, SB_DSP_OUTPUT_RATE, (Rate & 0xff00) >> 8); 146 if ( Status != STATUS_SUCCESS ) 147 return Status; 148 149 return SbDsp4WriteRate(BasePort, Rate, Timeout); 150 } 151 152