|
直接上代码吧!
- #include <sys/ioctl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/soundcard.h>
- #define BUF_SIZE 4096
- #define DEVICE_NAME "/dev/dsp"
- int audio_fd; //声卡
- FILE *file_fd; //文件
- int file_len; //文件长度
- unsigned char audio_buffer[BUF_SIZE];
- unsigned char *file_name_creat;
- unsigned int audio_rate;
- void delay(long x)
- {
- unsigned long i;
- for(i=0; i<x; i++);
- }
- int main(int argc, char *argv[])
- {
- if(argc != 3)
- {
- printf("RunFormat: \nAudPlay FILE_NAME SAMPLE_RATE\nExample:AudPlay AudRec.wav 48000") ;
- return -1;
- }
-
-
- file_name_creat = argv[1];
- sscanf(argv[2],"%d", &audio_rate);
- ///*设置采样速率*/
- int speed = audio_rate;
- int i=0;
- /*打开音频设备,准备放音*/
- if ((audio_fd = open(DEVICE_NAME, O_WRONLY)) == -1)
- {
- printf("open error\n");
- return -1;
- }
- /*设置通道数*/
- int channels = 2; /* 1=mono, 2=stereo */
- if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1)
- {
- /* Fatal error */
- printf("SNDCTL_DSP_CHANNELS error");
- return -1;
- }
- if (channels != 2)
- {
- /* 本设备不支持立体声模式 ... */
- printf("sep4020 oss driver does ");
- }
- /*设置采样速率*/
- speed = audio_rate;
- if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed)==-1)
- {
- /* Fatal error */
- printf("SNDCTL_DSP_SPEED error\n");
- return -1;
- }
- printf("the wav speed is %d\n",speed);
- /*打开并计算文件长度*/
- file_fd = fopen(file_name_creat, "r");
- fseek(file_fd,0,SEEK_END); //定位到文件末
- file_len = ftell(file_fd); //文件长度
- int loops = file_len/4096;
- /*重新定位到文件头*/
- fclose(file_fd);
- file_fd = fopen(file_name_creat, "r");
- /*播放wav文件*/
- for(i=0;i<loops;i++)
- {
- fread(audio_buffer, 4096, 1, file_fd);
- write(audio_fd,audio_buffer,4096);
- }
- /*关闭设备和文件*/
- fclose(file_fd);
- close(audio_fd);
- return 0;
- }
复制代码 已在TQ2440+2.6.30.4测试成功。
开始以为是AFMT_S16_LE格式的,一直发现速率不对,后来才发现不是。
uda1341是8bit采样。 支持32000、 44100、 48000等采样率。
运行命令:
./AudPlay 文件名 采样率 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|