嵌入式爱好者

查看: 6227|回复: 1

ok2440III开发板Linux下声卡问题

[复制链接]

1

主题

2

帖子

1

积分

扫一扫,手机访问本帖
发表于 2010-3-22 09:36:20 | 显示全部楼层 |阅读模式
我现在用ok2440III跑linux,用光盘上的linux镜像文件启动系统,用光盘上的record.c文件录制声音文件,但是执行到status = read(fd2, buf, 960)时就退出程序了,没有报任何错误,请问这是什么原因,附record.c文件:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <linux/soundcard.h>

#include <errno.h>

#define max(a, b) ((a) > (b)? (a):(b))

#define LENGTH         3
#define RATE                 8000
#define SIZE                 8
#define CHANNELS         2        //立体声的时候没有“嗡嗡”声

int open_dsp(const char *dev_name)
{
        int fd;
        int arg;
        int status;

        fd = open(dev_name, O_RDWR);
        if (fd < 0) {
                return fd;
        }
        arg =

        arg = CHANNELS;
        status = ioctl(fd, SNDCTL_DSP_CHANNELS, &arg);
        if (status < 0)
                perror("SNDCTL_DSP_CHANNELS ioctl failed");

        status = ioctl(fd, SOUND_PCM_READ_CHANNELS, &arg);
        if(status < 0)
                perror("ioctl :SNDCTL_DSP_CHANNELS error!\n");
        if (arg != CHANNELS)
                perror("unable to set number of channels!\n");
       
        arg = RATE;
        status = ioctl(fd, SNDCTL_DSP_SPEED, &arg);
        if (status < 0)
                perror("SOUND_PCM_WRITE_WRITE ioctl failed");
        if(arg != RATE) {
                perror("unable to set DSP speed!\n");
        }

        return fd;
}

int main(int argc, char **argv)
{
        int i, j;
        int fd2=0;
        int maxfd;
        fd_set rset;
        int status;
        unsigned char buf[9600];
        unsigned short *pp;
        char dev_name[256];
        static unsigned short k=0;

        int fd;
        fd = open("audio.wav", O_RDWR | O_CREAT);
        if(fd < 0) {
                printf("wrong when creat file!\n");
                exit(0);
        }

        sprintf(dev_name, "/dev/dsp");
        if(argc == 2)
        {
                strncpy(dev_name, argv[1], 128);
        }

        printf("dev_name = [%s]\n", dev_name);
        fd2 = open_dsp(dev_name);
        if (fd2 < 0) {
                perror("open of /dev/dsp failed");
                return fd2;
        }

        i = 0;
        for(;;)
        {
                //read from /dev/dsp
                status = read(fd2, buf, 960);
                if(status <= 0) {
                        printf("read from /dev/dsp wrong!\n");
                        close(fd2);
                        break;
       
                // write to file
                status = write(fd, buf, 960);
                if(status < 0) {
                        printf("write to file wrong!\n");
                }
        }

        return 0;
}
回复

使用道具 举报

1

主题

2

帖子

1

积分

 楼主| 发表于 2010-3-23 09:43:32 | 显示全部楼层
版主帮忙分析一下原因吧,多谢了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-1-8 19:40

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表