ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

mixer.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.