linux平台下读取声音并播放
来源:互联网 发布:软件开发人员培训学校 编辑:程序博客网 时间:2024/05/22 06:56
平台:linux
windows下读取声音应用windows下的API,那么如果直接移植到嵌入式等系统下的话,是肯定执行不出来的。那么,就得改成在linux下可以执行的方式。(以上个人意见,不一定对哈!)
下面给出linux下读取音频并播放的程序,在linux下调试通过。
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <linux/soundcard.h>
#define OPEN_DSP_FAILED 0x00000001 /*打开 dsp 失败!*/
#define SAMPLERATE_STATUS 0x00000002 /*samplerate status failed*/
#define SET_SAMPLERATE_FAILED 0x00000003 /*set samplerate failed*/
#define CHANNELS_STATUS 0x00000004 /*Channels status failed*/
#define SET_CHANNELS_FAILED 0x00000005 /*set channels failed*/
#define FMT_STATUS 0x00000006 /*FMT status failed*/
#define SET_FMT_FAILED 0x00000007 /*set fmt failed*/
#define OPEN_FILE_FAILED 0x00000008 /*opem filed failed*/
int P8100_Audio_Play(char *pathname,int nSampleRate,int nChannels,int fmt)
{
int dsp_fd,mix_fd,status,arg;
dsp_fd = open("/dev/dsp" , O_RDWR); /*open dsp*/
if(dsp_fd < 0)
{
return OPEN_DSP_FAILED;
}
arg = nSampleRate;
status = ioctl(dsp_fd,SOUND_PCM_WRITE_RATE,&arg); /*set samplerate*/
if(status < 0)
{
close(dsp_fd);
return SAMPLERATE_STATUS;
}
if(arg != nSampleRate)
{
close(dsp_fd);
return SET_SAMPLERATE_FAILED;
}
arg = nChannels; /*set channels*/
status = ioctl(dsp_fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if(status < 0)
{
close(dsp_fd);
return CHANNELS_STATUS;
}
if( arg != nChannels)
{
close(dsp_fd);
return SET_CHANNELS_FAILED;
}
arg = fmt; /*set bit fmt*/
status = ioctl(dsp_fd, SOUND_PCM_WRITE_BITS, &arg);
if(status < 0)
{
close(dsp_fd);
return FMT_STATUS;
}
if(arg != fmt)
{
close(dsp_fd);
return SET_FMT_FAILED;
}/*到此设置好了DSP的各个参数*/
FILE *file_fd = fopen(pathname,"r");
if(file_fd == NULL)
{
close(dsp_fd);
return OPEN_FILE_FAILED;
}
int num = 3*nChannels*nSampleRate*fmt/8;
int get_num;
char buf[num];
while(feof(file_fd) == 0)
{
get_num = fread(buf,1,num,file_fd);
write(dsp_fd,buf,get_num);
if(get_num != num)
{
close(dsp_fd);
fclose(file_fd);
return 0;
}
}
close(dsp_fd);
fclose(file_fd);
return 0;
}
int main()
{
int value;
//千万注意播放文件的路径!!!
// value = P8100_Audio_Play("/windows/C/WINDOWS/Media/Windows Startup.wav",44100,2,16);//如果不在同一个工作目录下则使用绝对路径,但是移植时要注意这个问题。
value = P8100_Audio_Play("22.wav",44100,2,16); //如果此代码和音频文件在一个工作目录下,则直接写音频文件名。也可使用相对路径,即代码和音频所在文件夹在一个工作目录下,相对路径格式“voice\\22.wav” ,其中voice是存放音频的文件夹,这样就可以很方便的移植了。至于\\这个就是路径的有的一个\就可以,有的得两个,因为有一个\是转义字符。
fprintf(stderr,"value is %d",value);
return 0;
}
好了就这些吧,说的越多错误就越多!毕竟水平有限!
- linux平台下读取声音并播放
- linux下ALSA播放声音的源程序
- linux下ALSA播放声音的源程序
- 解决linux下cocos2dx不能播放声音
- 多平台声音播放方案
- linux命令行播放声音
- 在Linux下使用Openal来播放声音类
- linux下声音的录制与播放 /dev/dsp
- Linux下使用ALSA来播放声音 - 基本使用方法
- 在Linux下使用Openal来播放声音类
- Linux平台下用OpenCV读取文件夹内图片并显示
- wince下的声音播放
- linux alsa pcm 播放声音
- linux alsa pcm 播放声音
- linux alsa pcm 播放声音
- Android平台游戏声音播放实践
- cocos2d-html5 各平台声音播放总结
- 直接读取raw文件下的视频文件并播放
- 虚拟机试练windows 2008 故障转移集群 MSCS
- windows xp版本以上dos递归删除文件夹
- 异常:Listener refused the connection with the follow ing error:
- LINUX df显示磁盘的相关信息
- 贫穷的根源
- linux平台下读取声音并播放
- python类型转换
- struts.xml配置文件(package,namespace,action)
- 发的飞洒
- 串口API使用中的一点心得
- 删除SVN文件
- spring定时器quartz 时间设定 cron表达式
- “黑暗面程序员”接口与继承的区别
- 程序员必看的十部好莱坞电影