|
我的音频驱动打算使用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);
} |
|