/*************************************************************************** * NAME: MIXER.C ** COPYRIGHT: ** "Copyright (c) 1993, by FORTE ** ** "This software is furnished under a license and may be used, ** copied, or disclosed only in accordance with the terms of such ** license and with the inclusion of the above copyright notice. ** This software or any other copies thereof may not be provided or ** otherwise made available to any other person. No title to and ** ownership of the software is hereby transfered." **************************************************************************** * CREATION DATE: 10/04/93 *--------------------------------------------------------------------------* * VERSION DATE NAME DESCRIPTION *> 1.0 10/04/93 Original ***************************************************************************/ #include #include #include #include "forte.h" #include "ultraerr.h" #include "mixer.h" #include "gf1hware.h" #include "gf1os.h" extern ULTRA_DATA _gf1_data; ULTRA_MIXER _mixer_data; int UltraMixProbe(unsigned int base_port) { unsigned char val; val = inp(base_port+MIX_SEL_PORT); /* There may have to be some additional checks here if later versions */ /* of the card (post 3.6) might NOT have the ICS mixer. For now, anything */ /* later than 5 will have a mixer */ /* NOTE: Version 8-11 (0x08-x0B) is UltraMax. No ICS mixer on MAX */ if ((val >= 5 && val <=7) || (val >= 0x81 && val <= 0x90)) { _mixer_data.mixer_addr = base_port+MIX_SEL_PORT; _mixer_data.mixer_data = base_port+MIX_DATA_PORT; UltraMixMute(MIX_MIKE_IN,FALSE); UltraMixMute(MIX_LINE_IN,FALSE); UltraMixMute(MIX_CD_IN,FALSE); UltraMixMute(MIX_GF1_OUT,FALSE); UltraMixMute(MIX_CHAN_4,FALSE); UltraMixMute(MIX_MASTER,FALSE); return((int)val); } return(0); } #define FLIP_REV 5 /* Flip some mixer channels if this revision */ static unsigned char flip_left[6] = { 0x01, /* MIC IN */ 0x01, /* LINE IN */ 0x01, /* CD IN */ 0x02, /* GF1_OUT */ 0x01, /* UNUSED */ 0x02 }; /* MASTER OUT */ static unsigned char flip_right[6] = { 0x02, /* MIC IN */ 0x02, /* LINE IN */ 0x02, /* CD IN */ 0x01, /* GF1_OUT */ 0x02, /* UNUSED */ 0x01 }; /* MASTER OUT */ void UltraMixAttn(int chan, int left, int value, int revision) { unsigned char ctrl_addr; unsigned char attn_addr; unsigned char normal; ctrl_addr = chan << 3; /* Shift up to the channel address bits */ attn_addr = chan << 3; /* Shift up to the channel address bits */ if (left == MIX_LEFT) { ctrl_addr |= MIX_CTRL_LEFT; attn_addr |= MIX_ATTN_LEFT; if (_mixer_data.mute[chan] == TRUE) normal = 0; else if (revision == FLIP_REV) normal = flip_left[chan]; else normal = 0x01; } else { ctrl_addr |= MIX_CTRL_RIGHT; attn_addr |= MIX_ATTN_RIGHT; if (_mixer_data.mute[chan] == TRUE) normal = 0; else if (revision == FLIP_REV) normal = flip_right[chan]; else normal = 0x02; } ENTER_CRITICAL; outp(_mixer_data.mixer_addr,ctrl_addr); /* select the proper RL chan ... */ outp(_mixer_data.mixer_data,normal); /* set to normal mode */ outp(_mixer_data.mixer_addr,attn_addr); /* select the proper RL chan ... */ outp(_mixer_data.mixer_data,value); /* set the value */ LEAVE_CRITICAL; } void UltraMixXparent(int revision) { UltraMixAttn(MIX_MIKE_IN, MIX_LEFT, 0x7f, revision); UltraMixAttn(MIX_MIKE_IN, MIX_RIGHT, 0x7f, revision); UltraMixAttn(MIX_LINE_IN, MIX_LEFT, 0x7f, revision); UltraMixAttn(MIX_LINE_IN, MIX_RIGHT, 0x7f, revision); UltraMixAttn(MIX_CD_IN, MIX_LEFT, 0x7f, revision); UltraMixAttn(MIX_CD_IN, MIX_RIGHT, 0x7f, revision); UltraMixAttn(MIX_GF1_OUT, MIX_LEFT, 0x7f, revision); UltraMixAttn(MIX_GF1_OUT, MIX_RIGHT, 0x7f, revision); UltraMixAttn(MIX_CHAN_4, MIX_LEFT, 0x00, revision); /* Unused ... */ UltraMixAttn(MIX_CHAN_4, MIX_RIGHT, 0x00, revision); /* Unused ... */ UltraMixAttn(MIX_MASTER, MIX_LEFT, 0x7f, revision); UltraMixAttn(MIX_MASTER, MIX_RIGHT, 0x7f, revision); // On these rev boards, there is no enable/disable for mic or line in. // so use the ICS mixer to mute inputs. NOTE: They are UN-MUTED here so // that apps that are not aware of the ICS mixer will will work ... if (revision >= 0x81 && revision <= 0x91) { UltraMixMute(MIX_LINE_IN,FALSE); UltraMixMute(MIX_MIKE_IN,FALSE); } } void UltraMixMute(int chan,int flag) { _mixer_data.mute[chan] = flag; }