给声卡加个“软”音量开关

Author: 申刚 Date: 1997-01-01

  现在越来越多的电脑配备了声卡。并有许多的游戏软件和应用程序因较好地运用了它而增色不少。
  但目前大多数的游戏和程序没有设计音乐的音量开关。运行的时候,音量较大,使得音箱没有音量控制旋钮的用户在有些时候不得不关掉那美妙的音乐。
  虽然大多数声卡没有安装音量控制开关,但其内部却拥有控制音量大小的寄存器。我们可以通过改变该寄存器值的大小,控制声卡内部放大器的放大倍数,从而为其设置一个“软”音量控制开关。
  下面就是以声霸卡及其兼容声卡为例,用Turbo C编写的一个内存驻留程序。该程序在TINY模式下编译、链结后转换为COM文件(由于该程序应用了一些Turbo C的扩展功能,使用其它C语言的读者,请相应调整)。使用时需在运行游戏之前,首先加载该程序(驻留后,大约占5.2K内存)。调节音量的时候,按ALT+〈[〉键减小音量,ALT+〈]〉键增大音量。
  注意:由于目前大量的游戏软件使用自己的键盘中断处理程序,因此在这种情况之下,本程序不能被激活。解决的方法如下:
  首先,仍是驻留本程序,然后,再加载例如FPE、GB、GW等游戏工具。使用的时候,先激活游戏工具,再用ALT+〈[〉或ALT+〈]〉调节音量。满意后,可退出游戏工具返回游戏。
  程序volume.c如下:
  #include "dos.h"
  #include "bios.h"
  #include "stdio.h"
  #define LEFT_BACKET  26   /*左[键按下的位置码*/
  #define RIGHT_BACKET   27   /*右]键按下的位置码*/
  #define  ALT_DOWN    56   /*ALT键按下的位置码*/
  #define ALT_UP  184   /*ALT键放开的位置码*/
  void set_volume(void);
  void key_clear(void);
  void interrupt(*old_int9)(void);
  void interrupt new_int9(void);
  unsigned char Volume=10,ALT_Sign=0,Key;
  void set_volume(void)
  {  outportb(0x224,0x22);   /*置端口0X224为0X22,选放大器为调节对象*/
     outportb(0x225,Volume*17);}   /*该端口寄存器的高4位与低4位分别控制声卡的左、右声道音量*/
  void key_clear(void)   /*该函数为清除键盘端口的键值*/
  { Key=inportb(0x61);
  outportb(0x61,Key|0x80);
  outportb(0x61,Key);
  outportb(0x20,0x20);}
  void interrupt new_int9(void)
  {  Key=inportb(0x60);
  if( Key==ALT_DOWN)
      ALT_Sign=1;
  if(Key==ALT_UP)
      ALT_Sign=0;
  if(Key==RIGHT_BACKET &&ALT_Sign==1)   /*如果同时按下ALT键和]键则音量增大*/
  {  if (Volume<15)
    Volume++;
    set_volume();
    key_clear();
    return;}
    else   /*如果同时按下ALT键和[键则音量减小*/
    { if(Key==LEFT-BACKET&&ALT-Sign==1)
    { if (Volume!=0)
    Volume--;
    set_volume();
    key_clear();
    return;}}
    (*old_int9)();}
    void main(void)   /*由于本程序未对程序重复加载进行判断,因而不要重复运行*/
    {  old_int9=getvect(0x09);
    setvect(0x09,new_int9);
    puts("copyright(c) shen gang 1997,1998");
    puts("sound blaster volume contorller installed");
    keep(3,320);}   /*如果没有转换为COM文件或使用TC++、BC++,则应增大KEEP中的320处的值*/