怎么用c语言控制声卡 显卡

格式:PDF ? 页数:3 ? 上传日期: 18:51:02 ? 瀏览次数:56 ? ? 2990积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

}

在很久之前声卡还是很奢侈的時候,几乎所有的声音都是由这个喇叭发出的所有的电脑都配有这个喇叭,就是发出开机时那个嘟的喇叭实验室里突然有一个软件用這个喇叭来作为电话终端的铃声。某同学静音了也没有禁掉这个声音我感觉很好玩,在网上随便搜了一下还真有在Windows下可以控制喇叭的API。

 
其中关于Beep函数的用法为:
















网上还看到直接在C语言中嵌入ASM汇编语言实现的例子不过在这里好像跑不通。有了这个功能恶搞一下别人的PC終于声情并茂了,呵呵

低八度 中八度 高八度







}

  摘要:详细地分析了PC/AT机系统嘚DMA(直接存储器存取)控制器结构及其传输方式并给出了C语言编程实例。

  DMA是英文DiretMemorAccess的缩写即直接存储器存取,DMA传输是PC机与外设

  高速数据交换的重要方法其一个典型应用是应用于声卡的录放音过程中,录音时CPU首先设置好声卡和DMA的传输参数。当启动DMA数据传输(即開始录音)后即由DMA控制器DMAC)按管PC总线进行数据传输,每次传输结束后DMA控制器便归还总线控制权,并申请CPU中断告之数据传输完毕,然後由中断服务程序将DMA数据缓冲区中数据取走并准备下次数据传输(即录音)由于在传输过程中无需CPU干沙,因此在录音期间CPU可以执行其它程序这样既极大地提高了数据传输速度又提高了CPU的执行效率,正是由于DMA的这些优点所以目前在工业控制领域的数据采集过程中都大量哋采用了DMA数据传输方法。但是由于DMA编程的资料较少,因此DMA编程一直是硬件编程方面的一个难点本文将以C语言为例详细介绍DMA编程方法。

  PC/AT使用两片8237A-5芯片组成级连结构每片8237A-5芯片内部有4个独立的通道,分别以通道O-通道7表示但由于通道4被用作第0片和第1片的级连,因此PC/AT系统-┅共能提供7个通道的DMA数据传输在这7个通道中,除通道2作为软盘DMA传输服务通道0留给SDIC通信透配器外,其余通道01,35.6和7均留作扩充使用,茬这7个DMA通道中通道0~3按8位数据最大传输64KB设计;面通道5-7按16位数据最大传输64K字(128KB)设计,它们都支持寻址16MB空间的能力

  2、DMA通道地址产生方式

  8237A-5只能管理16位地址(AI5-A0),但为了寻址PC/AT机的24位地址空间寻址在DMA系统中将PCAT机的16M空间分为多个物理页面,从面保证了在DMA周期内只需16位地址寻址因此DMA系统中为每个通道设置了一个DMA页面寄存器,用以存放此物理页面号

  对于8位传输通道0~3,由于芯片的地址使用字节边界即A15-A0为16位长的字节地址,因此每页64KB而对于16位传输通道5-7,由于芯片的地址使用字边界即A16-AI(A0固定为0)为16位长的字地址,因此每页可达128KB计算地址偏移和计数个数时尤其应该性意两者区别,对于DOS管理下的1M常规内存页面分布图1所示:

  从DMA通道地址产生方式,我们可以看出DMA控制器仅能在-个物理页面内传输数据因此当数据跨页面存放时,我们必须分多次对其进行数据传输从面保证每次传输时数据都在同一页面内。

  DMA控制器(DMAC)共有16个端口地址和4个页面寄存器地址共分为两大类:控制DMA状态及设置数据地址。

  在设置DMA传输数据时要用到3个端口,分别是:页面寄存器地址(偏移)寄存器和数据计数器,表1给出了每个通道及其相应1/O口地址

  在控制DMAC的状态时,要用到另外3个端ロ分别是:方式寄存器,屏蔽寄存器和清除寄存器

  (1)方式寄存器(地址为0Bh或D6h,分别为8位通道和16位通道地址)

  此方式寄存器鼡于设置DMA的数据传输方式其控制字格式如图2所示。

  例如:我们经常用到的两个方式字为(假定选DMA通道1):

  45h:DMA写(即内存一1/0卡)

  49h:DMA读(即1/0卡一内存)

  (2)屏戴寄存器(地址为0Ah或D4h分別为8位通道和16位通道地址)

  此屏蔽寄存器用于使某个DMA通道屏蔽或开放DMA请求,其控制字格式如图3所示

  (3)清除寄存器(地址为0Qh或D8h,分别为8位通道和16位通道地址)

  当输出0到此端口时将停止由屏蔽寄存器(地址为0Ah或D4h)所选定的DMA通道所有正在进行的过程。DMA编程

  通常对某个DMA通道编程的步骤如下:

  (1)保存原有中断向量,设置新中斷向量编写中断服务程序,其主要内容为下一次DMA传输编程输出EO(中断结束)至中断控制器;或者是直接转出(当不需再次DMA传输时);

  (2)DMAC初始化,包括设置方式控制字屏数控制字及本次传输数据的页面号,页面地址偏移及传输数据个数,必须特别注意的是DMAC的数据计數器比要传输的实际个数要少1;

  (3)开放该通道允许DMA中断请求;

  计数等为考虑通用性,使用了目前普遍使用

  (4)在程序结束时恢复中断向量

  笔者已编制了一个对DMA进行编控制的的TurboC2.0编程,程序也可以不加修改地使程序此程序包括几个有关DMAC编程的通用用于BorlandC++系统Φ,程序中假设I/0卡函数如DMAC控制块参数的获得,中断向量产生的硬件中断号是DREQ5使用DMA通道及恢复设置,DMAC初始化暂停DMA传输通道号1,读者在應用过程中应根据实际I/O卡提继续DMA传输终止DMA传输,读取已传输供的硬件中断号及DMA通道号作相应修改

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信