当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 求助高手,声卡编程C程序(附代码与解释)
帖子发表于 : 2009-08-26 22:19 

注册: 2009-07-29 0:31
帖子: 110
送出感谢: 0 次
接收感谢: 0 次
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/ioctl.h>
#include<fcntl.h>
#include<linux/soundcard.h>
#define audio_device "/dev/dsp"
#define sample_size 16 //定义比特率 16位
#define sample_rate 44100 //定义采样率 这里为44100HZ
int play_sound(char* filename){
struct stat stat_buf; //定义stat结构体,获取文件信息
unsigned char* buf=NULL; //buf作为存取 stat_size内存空间的变量
int handle,fd; //分别定义指针和文件描述符
int result; //定义播放音乐的返回值
int arg,status; //arg用来传递sample_size,sample_rate参数,status保存状态
fd=open(filename,O_RDONLY); //打开文件
/* 文件 描述不存在,则错误处理*/
if(fd<0)
return -1;
/* 获取文件状态参数*,不存在则出错处理*/
if(fstat(fd,&stat_buf)){
close(fd);
return -1;
}
/* 获取文件大小信息(int类型)*/
if(!stat_buf.st_size){
close(fd);
return -1;
}
/*buf存取文件大小的malloc内存分配函数*/
buf=malloc(stat_buf.st_size);
if(!buf){
close(fd);
return -1;
}
/*读取文件(即WAV文件)*/
if(read(fd,buf,stat_buf.st_size)<0){
free(buf);
close(fd);
return -1;
}
/*指针函数跟文件描述符差不多,打开 声卡设备,可写入*/
handle=open(audio_device,O_WRONLY);
if(handle==-1){
perror("cant open sound device");
return -1;
}
/*arg传递采样率,交给status调用ioctl函数完成对声卡的设置*/
arg=sample_rate;
status=ioctl(handle,SOUND_PCM_WRITE_RATE,&arg);
if(status==-1){
perror("error in sound_pcm_write_rate");
return -1;
}
/*arg传递比特数,交给status调用ioctl函数完成对声卡的设置*/
arg=sample_size;
status=ioctl(handle,SOUND_PCM_WRITE_BITS,&arg);
if(status==-1){
perror("error in sound_pcm_write_bits");
return -1;
}
/*写入文件的值存入result*/
result=write(handle,buf,stat_buf.st_size);
if(result==-1){
perror("fail to play");
return -1;
}
/*清空buf,释放内存;关闭文件描述符;关闭指针;返回结果进行播放*/
free(buf);
close(fd);
close(handle);
return result;
}
/*主函数 调用 声频文件,返回值为上面的result,注意不是int,写上WAV的路径*/
void main(void){
play_sound("/1.wav"); //写上你自己歌的路径
}

保存为playsound.c


我把代码解释都写很清楚了,这段代码 直接gcc 后,可以播放WAV文件,但是音质实在不敢恭维,请问 如何优化这段代码,另外 如何 可以支持 MP3播放功能
希望大家都来测试下 gcc -o playsound playsound.c


请测试的时候保护好自己 耳朵,扬声器调轻点,会有噪音 :em09


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 求助高手,声卡编程C程序(附代码与解释)
帖子发表于 : 2009-08-29 4:14 

注册: 2007-03-23 11:41
帖子: 26
送出感谢: 0 次
接收感谢: 0 次
我没有运行这个程序,不过我估计你的问题是整个程序在一个thread上。你应该把读取文件和播放声音放成至少2个thread,并且播放之前先读取一段音频作为缓冲


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 求助高手,声卡编程C程序(附代码与解释)
帖子发表于 : 2009-08-29 20:53 

注册: 2009-07-29 0:31
帖子: 110
送出感谢: 0 次
接收感谢: 0 次
:em02 多谢指点,我才学到 进程通信,线程的编程还不会


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 求助高手,声卡编程C程序(附代码与解释)
帖子发表于 : 2011-05-08 12:41 

注册: 2011-05-08 12:06
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
ubuntu 下怎么弄出那个/dev/dsp呀?? 谢谢


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 求助高手,声卡编程C程序(附代码与解释)
帖子发表于 : 2011-05-08 13:51 
头像

注册: 2010-04-23 20:40
帖子: 1950
地址: 浙江·杭州
系统: Arch Linux
送出感谢: 2
接收感谢: 31
为啥不用 PulseAudio ?


_________________
我是 Giumo Clanjor(哆啦比猫/兰威举)
Where there is a hacker, there is art. | Develop for Developers. (C & perl5)
博客 | Clanjor Prods.
类 C 语言到 brainfuck 编译器


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译