声音的控制和播放Word文件下载.docx
《声音的控制和播放Word文件下载.docx》由会员分享,可在线阅读,更多相关《声音的控制和播放Word文件下载.docx(9页珍藏版)》请在冰点文库上搜索。
main.cwgdriver.c命令:
“mknodwgdriver.oc123o-m666” 三者的节点是统一的,本次实验,统一设定为123;
2,要统一节点文件的文件名,本次实验中,统一设定为“wgdriver”要将main.c中原“shidriver”全部改为“wgdriver”同样的,也要在wgdriver文件中,做相应的修改;
3,再所有的修改都完成之后,才可以按上面的操作步骤进行实验,不然是不会得到实验现象的!
4,如果遇到设备节点加载失败,则运行命令:
cat/proc/devices查看节点使用情况
利用命令:
/sbin/rmmod123删除被占用的节点,然后再从新加载节点
实验中使用的程序
main.c
#include<
fcntl.h>
linux/ioctl.h>
curses.h>
#defineTIMERIOMAGIC'
s'
#defineTIMERIOCSINIT_IOW(TIMERIOMAGIC,0,int)
#defineTIMERIOCSDAT_IOW(TIMERIOMAGIC,1,int)
#defineTIMERIOCSTART_IOW(TIMERIOMAGIC,2,int)
#defineTIMERIOCSTOP_IOW(TIMERIOMAGIC,3,int)
#defineTIMER_MAJOR123
#defineTIMER_NAME"
wgdriver"
#defineSUCCESS0
unsignedintmediant[]={0x11be,0x0fd0,0x0e16,0x0d52,0x0bdc,0x0a91,0x0969,0x0871,0x1eb6,0x8971};
intfd;
voidstartmusic()
{
inti;
charmusic[]={3,3,4,5,5,4,3,2,0,1,1,2,3,3,2,2,2,0,3,3,4,5,5,4,3,2,0,1,1,2,3,2,1,1,1};
for(i=0;
i<
sizeof(music);
i++)
{
if(music[i]==0)
ioctl(fd,TIMERIOCSDAT,0x20);
else
ioctl(fd,TIMERIOCSDAT,mediant[music[i]-1]);
ioctl(fd,TIMERIOCSTART,0);
usleep(500000);
ioctl(fd,TIMERIOCSTOP,0);
usleep(1000);
if(i==sizeof(music)-1)
break;
}
}
main()
intget_val,i;
fd=open("
./wgdriver"
O_RDONLY);
if(fd<
0)
printf("
ERROR"
);
else
OK"
printf("
fd=%d\n"
fd);
ioctl(fd,TIMERIOCSINIT,0);
initok\n"
ioctl(fd,TIMERIOCSTART,0);
startok\n"
while
(1)
{
ioctl(fd,TIMERIOCSINIT,0);
get_val=getchar();
aa"
switch(get_val)
{
case'
1'
:
ioctl(fd,TIMERIOCSDAT,mediant[0]);
break;
2'
ioctl(fd,TIMERIOCSDAT,mediant[1]);
3'
ioctl(fd,TIMERIOCSDAT,mediant[2]);
4'
ioctl(fd,TIMERIOCSDAT,mediant[3]);
5'
ioctl(fd,TIMERIOCSDAT,mediant[4]);
6'
ioctl(fd,TIMERIOCSDAT,mediant[5]);
7'
ioctl(fd,TIMERIOCSDAT,mediant[6]);
case'
x'
ioctl(fd,TIMERIOCSDAT,mediant[7]);
y'
ioctl(fd,TIMERIOCSDAT,mediant[8]);
z'
ioctl(fd,TIMERIOCSDAT,mediant[9]);
a'
startmusic();
default:
break;
}
usleep(100000);
}
close(fd);
return0;
Wgdriver.c
#defineMODULE
#define__KERNEL__
//#define__NOVERSIONS__
linux/kernel.h>
linux/module.h>
linux/fs.h>
linux/init.h>
asm/io.h>
staticintdevicevalue=0;
intshi_open(structinode*inode,structfile*file)
devicevalue++;
intshi_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)
unsignedintvalue=0;
printk("
<
1>
ioctl\n"
switch(cmd)
caseTIMERIOCSINIT:
outb_p(0xb6,0x43);
printk("
INIT!
\n"
break;
caseTIMERIOCSTART:
outb_p(0x03,0x61);
START!
caseTIMERIOCSDAT:
value=(unsignedint)arg;
outb_p((char)(value&
0x00ff),0x42);
outb_p((char)(value>
>
8),0x42);
SETDATA!
caseTIMERIOCSTOP:
outb_p(0x00,0x61);
ERRORCOMMANDS!
intshi_release(structinode*inode,structfile*file)
devicevalue--;
structfile_operationsshi_fops={
open:
shi_open,
ioctl:
shi_ioctl,
release:
shi_release,
};
intinit_module()
charret;
ret=register_chrdev(TIMER_MAJOR,TIMER_NAME,&
shi_fops);
initmoduleok\n"
returnSUCCESS;
voidcleanup_module(void)
intret;
ret=unregister_chrdev(TIMER_MAJOR,TIMER_NAME);
MODULE_LICENSE("
GPL"
MODULE_AUTHOR("
SHI"
制作自己的音乐:
将main.c中的
charmusic[]={3,3,4,5,5,4,3,2,0,1,1,2,3,3,2,2,2,0,3,3,4,5,5,4,3,2,0,1,1,2,3,2,1,1,1};
修改为自己想要的音乐,可以是
music[]={5,5,0,4,4,2,2,2,5,3,3,5,5,2,3,4,6,7,2,6,2,7,1,8,3,7,4,7};
可以添加一个新的声调
intmediant[]={0x11be,0x0fd0,0x0e16,0x0d52,0x0bdc,0x0a91,0x0969,0x0871,0x1eb6,0x8971,0x1223,0x6532};
再在case选择语句中添加:
8'
9'
再做完成程序的编译,运行之后,按“8”,“9”键,就有相应的声音出来;
即时发生:
主要有三处地方需要修改:
while
(1)
{initscr();
//第一处
get_val=getch();
//第二处
endwin();
//第三处
再用gcc–omainmain.c–lcurses代替原来的gcc–omainmain.c
完成以上的改变,就可以做到即时发声
实验小结:
实验中,我们需要添加一些别的音调,这些音调产生的原理是“分频”即,将8253最大的发生频率进行分频,得到的就是我们想要的频率