当前位置: 技术问答>linux和unix
ac97 audio driver同時讀寫問題.
来源: 互联网 发布时间:2016-05-06
本文导语: 最近在一個開發版上測試voip的程式, 但發現該開發版的audio driver(OSS)並沒有同時讀寫的功能 ,是否有誰能給個指引,同時讀寫是否代表著,read時禁止write,而write時禁止read呢 我用過semaphores處理過,不過結果還是不行 ...
最近在一個開發版上測試voip的程式,
但發現該開發版的audio driver(OSS)並沒有同時讀寫的功能
,是否有誰能給個指引,同時讀寫是否代表著,read時禁止write,而write時禁止read呢
我用過semaphores處理過,不過結果還是不行
但發現該開發版的audio driver(OSS)並沒有同時讀寫的功能
,是否有誰能給個指引,同時讀寫是否代表著,read時禁止write,而write時禁止read呢
我用過semaphores處理過,不過結果還是不行
|
使用的同一个中断号的原因啊,那它上面這樣的作法也不行囉
===============================================================
可以做到,你要贴出play_interrupt();与record_interrupt();的代码
据猜测,完全可以在各自的中断处理函数中检测自己的状态来确定是否处理中断,这样就可以做到了。
实在想不出在只有一个DMA中断的情况下如何支持全双工,你想要支持全双工的话,看一下芯片资料,看能否使用两个DMA通道来实现,否则就白搭。。。。。。
===============================================================
可以做到,你要贴出play_interrupt();与record_interrupt();的代码
据猜测,完全可以在各自的中断处理函数中检测自己的状态来确定是否处理中断,这样就可以做到了。
实在想不出在只有一个DMA中断的情况下如何支持全双工,你想要支持全双工的话,看一下芯片资料,看能否使用两个DMA通道来实现,否则就白搭。。。。。。
|
if((retval = request_irq(IRQ_ACTL, wb_dsp_irq, SA_INTERRUPT, "wb audio", NULL))){
printk("wb_audio_init : Request IRQ errorn");
goto quit;
}
if(audio_dev.play_buf_addr == NULL){
free_irq(IRQ_ACTL, NULL);
MSG("Not enough memoryn");
return -ENOMEM;
}
audio_dev.record_buf_addr = dma_alloc_coherent(NULL, 128*1024, (dma_addr_t *)&phaddrrecord, GFP_KERNEL);
if(audio_dev.record_buf_addr == NULL){
free_pages(audio_dev.play_buf_addr, AUDIO_BUFFER_ORDER);
free_irq(IRQ_ACTL, NULL);
MSG("Not enough memoryn");
return -ENOMEM;
}
===============================================================================================
从这儿可看出,不能实现全双工
printk("wb_audio_init : Request IRQ errorn");
goto quit;
}
if(audio_dev.play_buf_addr == NULL){
free_irq(IRQ_ACTL, NULL);
MSG("Not enough memoryn");
return -ENOMEM;
}
audio_dev.record_buf_addr = dma_alloc_coherent(NULL, 128*1024, (dma_addr_t *)&phaddrrecord, GFP_KERNEL);
if(audio_dev.record_buf_addr == NULL){
free_pages(audio_dev.play_buf_addr, AUDIO_BUFFER_ORDER);
free_irq(IRQ_ACTL, NULL);
MSG("Not enough memoryn");
return -ENOMEM;
}
===============================================================================================
从这儿可看出,不能实现全双工
|
你的OSS只所以不是双工的,是因为你的OSS驱动中人为地设置了一个独占标志,其原因是其中的DMA传输部分有一个BUG,那些人不去找BUG的原因,却简单项地做了一个读写限制,我原来就遇到这个问题,不晓得你们是不是类似的问题
|
OSS框架音频驱动读写和控制是分开的,读写在dsp部分实现,控制在Mixer这边,具体看你的芯片相关的。