Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmixer.c
Go to the documentation of this file.
00001 /* 00002 ReactOS Sound System 00003 Sound Blaster DSP support 00004 Mixer routines 00005 00006 Author: 00007 Andrew Greenwood (silverblade@reactos.org) 00008 00009 History: 00010 2 July 2008 - Created 00011 00012 Notes: 00013 Functions documented in sbdsp.h 00014 00015 Currently, input/output switches and PC speaker volume 00016 level are not supported. 00017 00018 The I/O switches are used for muting/unmuting mic, etc. 00019 */ 00020 00021 #include "precomp.h" 00022 00023 VOID 00024 SbMixerReset(IN PUCHAR BasePort) 00025 { 00026 WRITE_SB_MIXER_REGISTER(BasePort, SB_MIX_RESET); 00027 /* Are we meant to send anything else? */ 00028 } 00029 00030 NTSTATUS 00031 SbMixerPackLevelData( 00032 IN UCHAR Line, 00033 IN UCHAR Level, 00034 OUT PUCHAR PackedLevel) 00035 { 00036 if ( ! PackedLevel ) 00037 return STATUS_INVALID_PARAMETER_3; 00038 00039 switch ( Line ) 00040 { 00041 case SB_MIX_MASTER_LEFT_LEVEL : 00042 case SB_MIX_MASTER_RIGHT_LEVEL : 00043 case SB_MIX_VOC_LEFT_LEVEL : 00044 case SB_MIX_VOC_RIGHT_LEVEL : 00045 case SB_MIX_MIDI_LEFT_LEVEL : 00046 case SB_MIX_MIDI_RIGHT_LEVEL : 00047 case SB_MIX_CD_LEFT_LEVEL : 00048 case SB_MIX_CD_RIGHT_LEVEL : 00049 case SB_MIX_LINE_LEFT_LEVEL : 00050 case SB_MIX_LINE_RIGHT_LEVEL : 00051 case SB_MIX_MIC_LEVEL : 00052 case SB_MIX_LEGACY_MIC_LEVEL : /* is this correct? */ 00053 { 00054 if ( Level >= 0x20 ) 00055 return STATUS_INVALID_PARAMETER_2; 00056 00057 *PackedLevel = Level << 3; 00058 return STATUS_SUCCESS; 00059 } 00060 00061 case SB_MIX_INPUT_LEFT_GAIN : 00062 case SB_MIX_INPUT_RIGHT_GAIN : 00063 case SB_MIX_OUTPUT_LEFT_GAIN : 00064 case SB_MIX_OUTPUT_RIGHT_GAIN : 00065 { 00066 if ( Level >= 0x04 ) 00067 return STATUS_INVALID_PARAMETER_2; 00068 00069 *PackedLevel = Level << 6; 00070 return STATUS_SUCCESS; 00071 } 00072 00073 case SB_MIX_VOC_LEVEL : /* legacy */ 00074 case SB_MIX_MASTER_LEVEL : 00075 case SB_MIX_FM_LEVEL : 00076 case SB_MIX_CD_LEVEL : 00077 case SB_MIX_LINE_LEVEL : 00078 case SB_MIX_TREBLE_LEFT_LEVEL : /* bass/treble */ 00079 case SB_MIX_TREBLE_RIGHT_LEVEL : 00080 case SB_MIX_BASS_LEFT_LEVEL : 00081 case SB_MIX_BASS_RIGHT_LEVEL : 00082 { 00083 if ( Level >= 0x10 ) 00084 return STATUS_INVALID_PARAMETER_2; 00085 00086 *PackedLevel = Level << 4; 00087 return STATUS_SUCCESS; 00088 } 00089 00090 default : 00091 return STATUS_INVALID_PARAMETER_1; 00092 }; 00093 } 00094 00095 NTSTATUS 00096 SbMixerUnpackLevelData( 00097 IN UCHAR Line, 00098 IN UCHAR PackedLevel, 00099 OUT PUCHAR Level) 00100 { 00101 if ( ! Level ) 00102 return STATUS_INVALID_PARAMETER_3; 00103 00104 switch ( Line ) 00105 { 00106 case SB_MIX_MASTER_LEFT_LEVEL : 00107 case SB_MIX_MASTER_RIGHT_LEVEL : 00108 case SB_MIX_VOC_LEFT_LEVEL : 00109 case SB_MIX_VOC_RIGHT_LEVEL : 00110 case SB_MIX_MIDI_LEFT_LEVEL : 00111 case SB_MIX_MIDI_RIGHT_LEVEL : 00112 case SB_MIX_CD_LEFT_LEVEL : 00113 case SB_MIX_CD_RIGHT_LEVEL : 00114 case SB_MIX_LINE_LEFT_LEVEL : 00115 case SB_MIX_LINE_RIGHT_LEVEL : 00116 case SB_MIX_MIC_LEVEL : 00117 { 00118 *Level = PackedLevel >> 3; 00119 return STATUS_SUCCESS; 00120 } 00121 00122 case SB_MIX_INPUT_LEFT_GAIN : 00123 case SB_MIX_INPUT_RIGHT_GAIN : 00124 case SB_MIX_OUTPUT_LEFT_GAIN : 00125 case SB_MIX_OUTPUT_RIGHT_GAIN : 00126 { 00127 *Level = PackedLevel >> 6; 00128 return STATUS_SUCCESS; 00129 } 00130 00131 case SB_MIX_VOC_LEVEL : /* legacy */ 00132 case SB_MIX_MASTER_LEVEL : 00133 case SB_MIX_FM_LEVEL : 00134 case SB_MIX_CD_LEVEL : 00135 case SB_MIX_LINE_LEVEL : 00136 case SB_MIX_TREBLE_LEFT_LEVEL : /* bass/treble */ 00137 case SB_MIX_TREBLE_RIGHT_LEVEL : 00138 case SB_MIX_BASS_LEFT_LEVEL : 00139 case SB_MIX_BASS_RIGHT_LEVEL : 00140 { 00141 *Level = PackedLevel >> 4; 00142 return STATUS_SUCCESS; 00143 } 00144 00145 default : 00146 return STATUS_INVALID_PARAMETER_1; 00147 }; 00148 } 00149 00150 NTSTATUS 00151 SbMixerSetLevel( 00152 IN PUCHAR BasePort, 00153 IN UCHAR Line, 00154 IN UCHAR Level) 00155 { 00156 UCHAR PackedLevel = 0; 00157 NTSTATUS Status; 00158 00159 Status = SbMixerPackLevelData(Line, Level, &PackedLevel); 00160 00161 switch ( Status ) 00162 { 00163 case STATUS_SUCCESS : 00164 break; 00165 00166 case STATUS_INVALID_PARAMETER_1 : 00167 return STATUS_INVALID_PARAMETER_2; 00168 00169 case STATUS_INVALID_PARAMETER_2 : 00170 return STATUS_INVALID_PARAMETER_3; 00171 00172 default : 00173 return Status; 00174 }; 00175 00176 DbgPrint("SbMixerSetLevel: Line 0x%x, raw level 0x%x, packed 0x%x\n", Line, Level, PackedLevel); 00177 00178 WRITE_SB_MIXER_REGISTER(BasePort, Line); 00179 WRITE_SB_MIXER_DATA(BasePort, PackedLevel); 00180 00181 return STATUS_SUCCESS; 00182 } 00183 00184 NTSTATUS 00185 SbMixerGetLevel( 00186 IN PUCHAR BasePort, 00187 IN UCHAR Line, 00188 OUT PUCHAR Level) 00189 { 00190 UCHAR PackedLevel = 0; 00191 NTSTATUS Status; 00192 00193 if ( ! Level ) 00194 return STATUS_INVALID_PARAMETER_3; 00195 00196 WRITE_SB_MIXER_REGISTER(BasePort, Line); 00197 PackedLevel = READ_SB_MIXER_DATA(BasePort); 00198 00199 Status = SbMixerUnpackLevelData(Line, PackedLevel, Level); 00200 00201 switch ( Status ) 00202 { 00203 case STATUS_SUCCESS : 00204 break; 00205 00206 case STATUS_INVALID_PARAMETER_1 : 00207 return STATUS_INVALID_PARAMETER_2; 00208 00209 case STATUS_INVALID_PARAMETER_2 : 00210 return STATUS_INVALID_PARAMETER_3; 00211 00212 default : 00213 return Status; 00214 }; 00215 00216 DbgPrint("SbMixerGetLevel: Line 0x%x, raw level 0x%x, packed 0x%x\n", Line, Level, PackedLevel); 00217 00218 return STATUS_SUCCESS; 00219 } 00220 00221 VOID 00222 SbMixerEnableAGC(IN PUCHAR BasePort) 00223 { 00224 /* Untested... */ 00225 WRITE_SB_MIXER_REGISTER(BasePort, SB_MIX_AGC); 00226 WRITE_SB_MIXER_DATA(BasePort, 1); 00227 } 00228 00229 VOID 00230 SbMixerDisableAGC(IN PUCHAR BasePort) 00231 { 00232 /* Untested... */ 00233 WRITE_SB_MIXER_REGISTER(BasePort, SB_MIX_AGC); 00234 WRITE_SB_MIXER_DATA(BasePort, 0); 00235 } 00236 00237 BOOLEAN 00238 SbMixerIsAGCEnabled(IN PUCHAR BasePort) 00239 { 00240 /* Untested... */ 00241 WRITE_SB_MIXER_REGISTER(BasePort, SB_MIX_AGC); 00242 return (READ_SB_MIXER_DATA(BasePort) != 0); 00243 } Generated on Sun May 27 2012 04:17:44 for ReactOS by
1.7.6.1
|