轉 alsa錄音放音執行流程詳解

前言:

??? linux中,無論是oss還是alsa體系,錄音和放音的數據流必須分析清楚。先分析alsa驅動層,然后關聯到alsa庫層和應用層。

?

鏈接分析:

??? core/pcm_native.c文件中.mmap = snd_pcm_mmap調用snd_pcm_mmap_data(substream, file, area);進一步調用substream->ops->mmap(substream, area);根據soc/pxa/pxa3xx-pcm.c文件中.mmap = pxa3xx_pcm_mmap,可知dma_mmap_writecombine(, ,runtime->dma_addr,);函數被調用。上一章分析過soc/pxa/pxa3xx-pcm.c文件中pxa3xx_pcm_hw_params()函數會創建鏈表,根據dma_buff_phys = runtime->dma_addr;和dma_desc->dsadr = dma_buff_phys;可知runtime->dma_addr為dma內存端地址,且此地址由alsa庫層傳遞進來。又根據dma_desc->dtadr = prtd->params->dev_addr和soc/pxa/pxa3xx-ac97.c文件中.dev_addr = __PREG(PCDR),可知dma外設端地址為ac97控制器中fifo讀寫寄存器PCDR。至此,第一條鏈路建立完畢:FIFO通過DMA和內存交互。待續1 。

??? ac97接口或者i2s或者pcm接口可以將cpu和codec(wm9714/alc5620/alc5621)連接起來,配置好格式:pcm接口必須配置采樣率、采樣位數、通道數和傳送格式;i2s接口必須配置采樣率、采樣位數、通道數和對齊方式;ac97接口比較靈活,可以認為cpu這端不用配置,只需要在codec端配置就行了。當然,電源、時鐘、IO任何數字芯片都得配置。最后不能混淆數據接口和控制接口的慨念,i2s和pcm只能傳輸音頻數據,訪問codec的寄存器必須通過i2c等控制接口,ac97接口分時傳輸控制和數據。codec中的adc、dac通過ac97等接口同cpu的fifo交互數據。第二條鏈路建立完畢。待續2 。

??? alsa_lib源碼中pcm.c文件中snd_pcm_readi(,buffer,size)調用pcm_local.h文件中_snd_pcm_readi(,buffer,size);進一步調用pcm->fast_ops->readi(pcm->fast_op_arg, buffer, size);根據pcm_hw.h文件中.readi = snd_pcm_hw_readi可知,ioctl(fd, SNDRV_PCM_IOCTL_READI_FRAMES, &xferi);被調用。內核中,根據/soc/pcm_native.c文件中.unlocked_ioctl = snd_pcm_capture_ioctl,可知snd_pcm_capture_ioctl1被調用,根據SNDRV_PCM_IOCTL_READI_FRAMES參數可知snd_pcm_lib_read(substream, xferi.buf, xferi.frames);被調用,最終snd_pcm_lib_read1(,,,,snd_pcm_lib_read_transfer)被調用。根據transfer被調用可知snd_pcm_lib_read_transfer被調用,然后調用copy_to_user(buf, hwbuf, frames_to_bytes(runtime, frames)),可知,將dma端內存的數據拷貝到alsa_lib提供的一個指針所指的內存,alsa庫函數snd_pcm_readi、snd_pcm_writei實現了內存到內存的交互,或者近似地認為是內存到音頻文件的交互。至此最后一條鏈路建立完畢。待續3 。

?

執行分析:

??? 錄音:mic接到codec,經過adc變成數字信號,經過待續2中ac97等接口存儲到cpu的fifo中,經過待續1中的dma傳輸存儲到內存,經過待續3中alsa_lib中snd_pcm_readi接口傳給錄音軟件,經過編碼,進而形成音頻文件。

??? 放音:播放軟件將音頻文件解碼,并通過待續3中snd_pcm_writei接口逐漸傳遞到和dma相關的內存,經過待續2中dma傳遞給cpu的fifo,再經過ac97等接口傳遞給dac,最后傳給連接在codec上的speaker。

?

心得:

??? 1.ac97數據傳輸頗復雜,分時復用,cpu端fifo和codec端adc/dac關系要對應好。比如,cpu端的pcm left fifo占用slot3,那么adc只有配置成slot3才能把數據傳遞給它,如果配置成slot6,那就傳給cpu的mic in fifo了。錄音單聲道通常選擇slot6,錄音雙聲道通常兩個adc分別選擇slot3和slot4。

??? 2.wav音頻文件大小計算:要測試錄音是否丟禎,就必然要計算文件大小,通常的方法是:根據錄音時間,用公式:錄音時間(單位s)x采樣率x(采樣位數/8)x通道數。比如,錄音時間5秒,采樣率8kHz,位數16位,通道數1,那么5x8000x(16/8)x1=80k,實際的wav文件大小稍大于80k就對了。還有一種計算文件大小的方法:通常音頻系統要用dma,也會用到dma中斷,可以在dma中斷中打印計數,次數xdma中斷周期字節就行了。

??? 3.數據交換的大小問題:待續1中DMA傳輸必須和FIFO的特性匹配:若FIFO位寬是16位,深度是16,并且半滿時向DMA發出請求(握手),則鏈表式DMA必須配置成傳輸位寬16位,1次突發16字節,才能保證不丟失位數和數據個數。待續2中cpu端FIFO位數要和codec端adc/dac采樣位數匹配,i2s/pcm接口可以配置成一樣的值,比如16位,ac97接口復雜一點,cpu端不用配置,那么采樣位數是多少呢?若cpu端fifo一個聲道位寬16位,codec端adc/dac位寬18位,ac97通道20位,則傳輸到fifo端就被截取到有效的16位,整體采樣位數16位,adc/dac的性能沒有充分發揮而已。待續3中snd_pcm_readi、snd_pcm_writei函數第三個參數表示讀寫數據的大小,單位是禎,不是字節。雙聲道16位格式一禎大小為4字節。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253392.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jenkins之qq企業郵箱配置

一、配置qq企業郵箱 1、登錄jenkins后臺管理,選擇 系統管理 ? 系統設置 2、SMTP server配置 3、郵件通知配置 配置ssl等參數 點擊 高級 4、發送郵件測試 總結:郵箱配置不成程分析 1、管理員賬號和默認發送賬號不一致。2、smtp服務器設置不正確;qq企業…

關于iOS里的做動畫方法的差別與注意事項

CoreAnimation與UIView.animation... 這兩個方式的主要差別在于,前者如果不主動設置,那么在動畫做完以后,會恢復原狀。后者則不會,動畫做完后是什么樣,控件就是什么樣。 UIView.animation...是什么 首先我們來做一個動…

mysql-5.7 持久化統計信息詳解

一、持久化統計信息的意義: 統計信息用于指導mysql生成執行計劃,執行計劃的準確與否直接影響到SQL的執行效率;如果mysql一重啟 之前的統計信息就沒有了,那么當SQL語句來臨時,那么mysql就要收集統計信息然后再生成SQL語…

關于傳感器”英寸“計量

傳感器上的n是指對角線長度為16mm或18mm的n倍 以英寸代指的傳感器大小稱為靶面尺寸。 在CCD/CMOS出現之前,攝像機是利用一種叫作“光導攝像管(Vidicon Tube)”的成像器件感光成像的,這是一種特殊設計的電子管,其直徑的…

關于USB-AUDIO使用ALSA編程的一點問題

轉載自:http://blog.chinaunix.net/uid-25272011-id-3153434.html 最近在調試一款原相PAP7501攝像頭中的USB的麥克風,USB層走的應該是標準的UAC協議,具體可以見USB的官網:http://www.usb.org/developers/devclass_docs#approved&a…

讓input變成不可編輯狀態的方法

有時候&#xff0c;我們希望表單中的文本框是只讀的&#xff0c;讓用戶不能修改其中的信息&#xff0c;如使<input type"text" name"input1" value"中國"> 的內容&#xff0c;"中國"兩個字不可以修改。實現的方式歸納一下&#…

npm run dev 在本地調試出現跨域問題解決方法

npm run dev 在本地調試出現跨域問題 在localhost:8080調試時會出現跨域問題&#xff0c;如圖&#xff1a; 我的項目是用webpack作為前端自動化構建工具&#xff0c;可以在webpack-dev-server中配置跨域。webpack-dev-server是一個小型的nodejs服務器&#xff0c;是基于express…

alsa聲音編程介紹

http://blog.csdn.net/q553716434/article/details/7881552 period(周期):硬件中中斷間的間隔時間。它表示輸入延時。 聲卡接口中有一個指針來指示聲卡硬件緩存區中當前的讀寫位置。只要接口在運行&#xff0c;這個指針將循環地指向緩存區中的某個位置。 frame size sizeof(o…

五、python模塊以及包

模塊&#xff1a;編寫的別的程序中重用一些代碼。 1 模塊的寫法&#xff1a; 創建一個.py文件&#xff0c;該文件中包含函數與變量。使用撰寫python解釋器本身的本地語言來編寫模塊。比如使用C代碼編寫python模塊&#xff0c;并且在編譯后&#xff0c;可以通過標準的python解釋…

jeecg選擇按鈕帶入其他單據值

前端的標簽 <input class"inputxt" id"fshimian" name"fshimian" ignore"ignore" datatype"*" value"${shizhePage.fshimian}" /> <t:choose hiddenName"fshimian" hiddenid"fname"…

alsa編程

alsa 編程 分類&#xff1a; linux 2012-08-18 20:13 124人閱讀 評論(0) 收藏 舉報 編程parametersbufferloopsaccessplayback轉載自&#xff1a;http://blog.csdn.net/spygg/article/details/7824750 ALSA(Advanced Linux Sound Architecture)是由內核驅動,標準的API庫和一系…

Fiddler4入門——手機抓包

一、下載工具包 百度搜索”fiddler 下載“ &#xff0c;安裝最新版本 下載的軟件安裝包為“fiddler_4.6.20171.26113_setup.exe”格式&#xff0c;雙擊安裝。安裝成功&#xff0c;在“開始”-“所有程序”&#xff0c;就會看見這樣的圖標&#xff0c;若是常用的話&#xff0c;也…

Node.js Performance

https://blog.risingstack.com/node-js-performance-monitoring-with-prometheus/轉載于:https://www.cnblogs.com/skating/p/7544838.html

(五)DOM4j進行XML文件的解析及生成

DOM4j本身還是需要使用SAX建立解析器&#xff0c;然后通過文檔依次找到根節點&#xff0c;再通過根節點查找每一個節點的內容. 1.寫操作 import java.io.File;import java.io.FileOutputStream;import java.util.Iterator; import org.dom4j.Document;import org.dom4j.Documen…

Linux系統基礎.作業

要求以root用戶登錄系統&#xff0c;右擊桌面打開終端&#xff0c;查看當前登陸Linux系統所使用的用戶名 查看哪些用戶在系統上工作 修改當前時間為2018年8月26號11:28 查看2015年10月份日歷 使用兩種方法查看ls命令的使用說明 清除屏幕 ctrlL使用“useradd tom”命令新建tom用…

Alsa中PCM參數設置

分類&#xff1a; LINUX 1) PCM設備的句柄.2) 指定同時可供回放或截獲的PCM流的方向3) 提供一些關于我們想要使用的設置選項的信息,比如緩沖區大小,采樣率,PCM數據格式等4) 檢查硬件是否支持設置選項.4.1) 初始化PCM變量4.2) 分配hwparams結構4.3) 打開PCM設備4.4) 以聲卡的全部…

java5

java基礎&#xff08;五&#xff09;命名規則&#xff1a; 名字中只能包含->字母、_、數字、$&#xff0c;且開頭不能為數字包名必須都小寫文件名首字母和后面英文文件單詞首字母都要大寫變量和方法名 首字母小寫&#xff0c;后面英文單詞首字母大寫java中的方法&#xff1a…

最新歷史版本 :H.265

原來對264有深入的研究&#xff0c;現在想詳細了解下265啦&#xff0c;愿265盡快廣泛的使用起來&#xff0c;人們可以享受無處不在的視覺盛宴。 H.265是ITU-T VCEG 繼H.264之后所制定的新的視頻編碼標準。H.265標準圍繞著現有的視頻編碼標準H.264&#xff0c;保留原來的某些技術…

凱撒密碼、GDP格式化輸出、99乘法表

1.愷撒密碼的編碼 sinput(請輸入明文:) print(密文為:) for i in s:print(chr(ord(i)3),end)運行結果為&#xff1a; 2.國家名稱 GDP總量&#xff08;人民幣億元&#xff09; 中國 &#xffe5;765873.4375 澳大利亞 &#xffe5; 78312.4375 &#xff08;國家名稱左對齊&am…

【BZOJ3453】XLkxc [拉格朗日插值法]

XLkxc Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss]Description 給定 k,a,n,d,p  f(i)1^k2^k3^k......i^k  g(x)f(1)f(2)f(3)....f(x)  求(g(a)g(ad)g(a2d)......g(and))mod p Input 第一行數據組數&#xff0c;(保證小于6)  以下每行四個整數 …