LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1948|回复: 1

alsa驱动的问题,大家帮看看

[复制链接]
发表于 2008-10-4 10:04:25 | 显示全部楼层 |阅读模式
我的音频驱动打算使用alsa接口,内核是2.6.20.3。在内核中配置了alsa的支持(把涉及alsa的选项都选上了)。声卡是uda1341,我自己写的驱动,采用模块加载方式。这是init部分的代码,大家帮看看
static struct snd_card *card;
static  __init int uda1341_init(void){
    int err=0;
   
    struct s3c2440_uda1341 *chip;
    printk(KERN_INFO "hello\n");
    card=snd_card_new(-1,id,THIS_MODULE,sizeof(struct s3c2440_uda1341));
    if(card==NULL){
        printk("error occured when snd_card_new\n");
        return -ENOMEM;
    }
    chip=card->private_data;
    spin_lock_init(&chip->s[0].dma_lock);
    spin_lock_init(&chip->s[1].dma_lock);
    card->private_free=snd_s3c2440_uda1341_free;
    chip->card=card;
    chip->samplerate=AUDIO_RATE_DEFAULT;
    if((err=snd_card_s3c2440_uda1341_pcm(chip,0))<0)
        goto nodev;
    init_iis_bus();
    init_uda1341();
    if((err=init_audio_dma(chip))<0){
        printk("error occured when init dma");
        goto nodev;
    }
    strcpy(card->driver,"uda1341");
    strcpy(card->shortname,"uda1341");
    if((err=snd_card_register(card))==0){
        printk(KERN_INFO "uda1341 initialized\n");
        return 0;
    }
nodev:
    snd_card_free(card);
    return err;
}

module_init(uda1341_init);

init_iis_bus();
init_uda1341();
init_audio_dma()
这几句是对S3C2440的IIS总线,UDA1341以及DMA进行配置,后面出现的问题与应该没有啥关系,大伙儿可以不管它。。
另外,我移植了alsa lib到开发板上,再写了个小的测试程序到开发板上,问题出现了:
当执行./a.out plughw:0,0的时候:
[root@FriendlyARM /]# ./a.out  plughw:0,0
ALSA lib pcm.c:2145snd_pcm_open_noupdate) Unknown PCM plughw:0,0
cant open audio device plughw:0,0 (No such file or directory)
我看了/dev下的文件,有pcmC0D0c,pcmC0D0p,dsp,mixer这几个设备,/proc/asound这个目录也生成了,但却没有/dev/snd这个目录,请问这是为什么呢。。。
谢谢。。。

测试程序(在ubuntu8.04上运行没问题):
#include<stdio.h>
#include<stdlib.h>
#include<alsa/asoundlib.h>
#define BUFSIZE 128
//这里的rate,通道数,格式并不是乱取的,这个要与音频的格式相符合

int main(int argc,char *argv[]){
    int i;
    int err;
    char buf[BUFSIZE];
    snd_pcm_t *playback_handle;
    int rate=22050;
    int channels=1;
    snd_pcm_hw_params_t *hw_params;
    char *pcm_name="plughw:0,0";
    int fd=open("gx.wav",O_RDONLY);
//    char *pcm_name=argv[1];

    if((err=snd_pcm_open(&playback_handle,argv[1],SND_PCM_STREAM_PLAYBACK,0))<0){
        fprintf(stderr,"cant open audio device %s (%s)\n",argv[1],snd_strerror(err));
        exit(1);
    }
    if((err=snd_pcm_hw_params_malloc(&hw_params))<0){
        fprintf(stderr,"cant open allocate parameter structure  (%s)\n",snd_strerror(err));
        exit(1);
    }
    if((err=snd_pcm_hw_params_any(playback_handle,hw_params))<0){
        fprintf(stderr,"cant open initialize hw parameter structure  (%s)\n",snd_strerror(err));
        exit(1);
    }
    if((err=snd_pcm_hw_params_set_access(playback_handle,hw_params,SND_PCM_ACCESS_RW_INTERLEAVED))<0){
        fprintf(stderr,"cant set access type  (%s)\n",snd_strerror(err));
        exit(1);
    }
    if((err=snd_pcm_hw_params_set_format(playback_handle,hw_params,SND_PCM_FORMAT_U8))<0){
        fprintf(stderr,"cant open set format (%s)\n",snd_strerror(err));
        exit(1);
    }
    if((err=snd_pcm_hw_params_set_rate_near(playback_handle,hw_params,&rate,0))<0){
        fprintf(stderr,"cant set rate   (%s)\n",snd_strerror(err));
        exit(1);
    }
    if((err=snd_pcm_hw_params_set_channels(playback_handle,hw_params,channels))<0){
        fprintf(stderr,"cant set channels  (%s)\n",snd_strerror(err));
        exit(1);
    }
    if((err=snd_pcm_hw_params(playback_handle,hw_params))<0){
        fprintf(stderr,"cant open set parameter   (%s)\n",snd_strerror(err));
        exit(1);
    }
    snd_pcm_hw_params_free(hw_params);
    if((err=snd_pcm_prepare(playback_handle))<0){
        fprintf(stderr,"cant prepare audio interface for use  (%s)\n",snd_strerror(err));
        exit(1);
    }
    //一帧的位数=通道数×位数

    while(1){
        err=read(fd,buf,BUFSIZE);
        if(err==0)
            break;
        if((err=snd_pcm_writei(playback_handle,buf,BUFSIZE/8))!=BUFSIZE){
            fprintf(stderr,"write to audio interface failed (%s)\n",snd_strerror(err));
            exit(1);
        }
    }
    snd_pcm_close(playback_handle);
    exit(0);
}
发表于 2008-10-17 02:07:15 | 显示全部楼层
楼主,你alsa驱动的问题现在怎么样了?我现在也正在调这个驱动。你碰到的问题我遇到过,不过我用的是aplay做的测试。你需要自己创建/dev/snd这个目录,并且用mknod创建相应的节点。

我现在的问题是:播放音乐时听到只是嗡的声音,没有别的。但dma确实是工作起来了,也不知道是哪儿出了问题。我的代码主要参考了sound/arm/sa11xx-uda1341.c中的结构。

楼主要不给个邮箱,我们可以讨论讨论。呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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