久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ALSA Audio API 使用指南

 John.Bouson 2012-08-08
ALSA Audio API 使用指南
此文檔旨在提供一個(gè)對ALSA Audio API的介紹,。它并非是一個(gè)API的完全參考手冊,它也沒有涉及許多特定的方面,,很多復(fù)雜的軟件會涉及那些特定的方面,。然而它試著給一位合理的熟練的程序員提供足夠多的相關(guān)知識和信息,而并非給那些使用API來編寫簡單程序的不熟悉ALSA的新手,。
文檔中所有的代碼都遵循GNU Public License,。如果你試圖在其它的準(zhǔn)則下使用ALSA來編寫程序,那么我將建議你尋找其他的文檔,。

內(nèi)容介紹
         ,。理解音頻接口
         ,。一個(gè)典型的音頻應(yīng)用程序
         。一個(gè)最簡單的回放程序
         ,。一個(gè)最簡單的捕獲數(shù)據(jù)程序
         ,。一個(gè)最簡單的驅(qū)動中斷程序
         。一個(gè)最簡單的全雙工程序
         ,。如何使用API
                   ,。打開設(shè)備
                   。設(shè)置參數(shù)
                   ,。接收和傳輸數(shù)據(jù)
         。為何你會要去忘記這里所講述的
一,、理解音頻接口
我們先來了解下音頻接口的基本設(shè)計(jì)。對于一位應(yīng)用程序開發(fā)者,,你不需要擔(dān)心硬件水平如何操作,,它們?nèi)坑稍O(shè)備驅(qū)動來搞定(這些驅(qū)動是由ALSA來提供的一些組件)。但是,,如果你想寫出高效和簡潔的軟件你必須要對它們有個(gè)概念上的了解,。
音頻接口是一種設(shè)備,該設(shè)備可以讓電腦對外接收和向外發(fā)送音頻數(shù)據(jù),。在電腦那一端,,音頻數(shù)據(jù)用一串比特流來表示,就像其它種類的數(shù)據(jù)一樣,。雖然如此,,音頻接口發(fā)送和接收音頻數(shù)據(jù)即可以用模擬信號(時(shí)刻變化的電壓)也可以用數(shù)字信號(一些比特流)。無論用什么來接收發(fā)送數(shù)據(jù),,電腦用來表示一段音頻的比特流在往外傳輸前都要被轉(zhuǎn)化為模擬信號,;同樣的,被聲卡接收的外部信號在被電腦使用前也需要被轉(zhuǎn)化為數(shù)字信號,。這兩方面的轉(zhuǎn)化也是音頻接口的用途所在,。【注:raison d'etre為法語,,意為:存在的目的或理由】
聲卡內(nèi)部有一個(gè)硬件緩存區(qū)域,。當(dāng)聲卡接收到外界聲音信號時(shí),通過計(jì)算機(jī)它將信號轉(zhuǎn)化為可用的比特流并存儲在用來發(fā)送數(shù)據(jù)給計(jì)算機(jī)的硬件緩存中,。當(dāng)緩存存儲了足夠多的數(shù)據(jù)時(shí),,聲卡中斷計(jì)算機(jī)告知它數(shù)據(jù)已經(jīng)準(zhǔn)備好了。一個(gè)相似的過程將會發(fā)生在將數(shù)據(jù)從計(jì)算機(jī)傳送到外界時(shí),。此過程中聲卡中斷計(jì)算機(jī)并通知它緩存有空間,,計(jì)算機(jī)將會往里面存儲數(shù)據(jù),。聲卡接著將那些數(shù)據(jù)轉(zhuǎn)化成所要求的任何格式并將其傳送到外界,,并且傳輸,。有一點(diǎn)是十分重要的,,那就是聲卡循環(huán)使用這塊緩存。也就是說,,當(dāng)?shù)搅司彺娴哪┒藭r(shí),,會將開始的數(shù)據(jù)擦除用來存數(shù)據(jù)。
為了保證這個(gè)過程的正確執(zhí)行,,有一些變量需要設(shè)置,。它們包括:
。當(dāng)在計(jì)算機(jī)使用的比特流和外界使用的模擬信號之間轉(zhuǎn)化時(shí)聲卡要用什么樣的格式,?
,。聲卡的采樣率是多少?
。當(dāng)有多少數(shù)據(jù)時(shí)聲卡才中斷計(jì)算機(jī),?
,。硬件緩存要設(shè)置為多大?
頭兩個(gè)問題是控制音頻數(shù)據(jù)質(zhì)量的基礎(chǔ),。后兩個(gè)問題影響著音頻信號的延遲,。這個(gè)術(shù)語涉及到以下兩個(gè)方面的延遲
1.       數(shù)據(jù)從外界到達(dá)聲卡與轉(zhuǎn)化成計(jì)算機(jī)中可用的數(shù)據(jù)之間的延遲(稱為:內(nèi)部延遲)
2.       數(shù)據(jù)被計(jì)算機(jī)傳輸,,并傳輸?shù)酵饨绲难舆t(稱為:外部延遲)
雖然一些程序不需要關(guān)心這兩方面的東西,,但對很多音頻相關(guān)軟件它們都十分重要,。

二,、一個(gè)典型的音頻應(yīng)用程序
下面是一個(gè)典型的音頻應(yīng)用程序的大致結(jié)構(gòu):
      open_the_device();
      set_the_parameters_of_the_device();
      while (!done) {
           /* one or both of these */
           receive_audio_data_from_the_device();
           deliver_audio_data_to_the_device();
      }
      close the device
        
三、一個(gè)最簡單的回放程序
下面這段程序開啟聲卡回放,,設(shè)置成雙聲道,,16bit(采樣位數(shù)),44.1KHZ,,交叉存儲,,常規(guī)的讀寫(不用mmap)。然后傳送一些隨即的數(shù)據(jù)給聲卡,,退出,。它也許反映了最簡單的ALSA Audio API的用法,,但它并不是一個(gè)真正可運(yùn)行的程序。
四,、一個(gè)最簡單的捕獲數(shù)據(jù)程序
這段程序打開聲卡捕獲數(shù)據(jù),,設(shè)置為雙聲道,16bit,,44.1KHZ,,交叉存儲,常規(guī)的讀寫,。然后讀一些數(shù)據(jù),,退出。它并非實(shí)際運(yùn)行程序,。
五,、一個(gè)最簡單的驅(qū)動中斷程序
這段程序打開聲卡回放,配置成雙聲道,,16bit,,44.1KHZ,交叉存儲,,常規(guī)讀寫,。它將等待聲卡直到聲卡準(zhǔn)備好回放數(shù)據(jù),同時(shí)傳輸一些數(shù)據(jù)給它,。這種設(shè)計(jì)可以使你的程序很容易的通過一種回調(diào)驅(qū)動機(jī)制來和系統(tǒng)綁定,,這樣的軟件比如:JACK,LADSPA,,CoreAudio,,VST等。
       
六,、一個(gè)最簡單的全雙工程序
全 雙工可以通過上面提到的回放和捕獲設(shè)計(jì)來合并實(shí)現(xiàn),。雖然很多現(xiàn)有的音頻程序使用了這種設(shè)計(jì),但這篇文章中認(rèn)為這是有很大缺陷的,。上面的中斷驅(qū)動樣例在多數(shù) 情況下是一個(gè)很基本也很好的設(shè)計(jì)模式,。然而,它在擴(kuò)展成全雙工時(shí)也是十分復(fù)雜的,。這正是我為何要建議你忘記我前面所說的,。

名詞術(shù)語:
Capture
         從外界獲取音頻數(shù)據(jù)(和“錄音”不同,錄音意味著將數(shù)據(jù)存儲起來,,它并不是ALSA庫的API),。
Playback
         將音頻播放出來,使能被聽見,這也許并不是必須的,。
Duplex
         捕獲和回放在同一聲卡同一時(shí)刻同時(shí)發(fā)生的情況
Xrun
一旦聲卡開始運(yùn)行,,便一直持續(xù)直到被要求停止。它將收集數(shù)據(jù)給計(jì)算機(jī)使用并且(或者)發(fā)送計(jì)算機(jī)中的數(shù)據(jù)給外界,。但有很多種情況你的程序并非可以控制聲卡正常的進(jìn)行,。在回放的時(shí)候,當(dāng)聲卡需要從計(jì)算機(jī)中收到數(shù)據(jù)時(shí),,而此時(shí)并沒有,,xrun便可以強(qiáng)迫它使用在硬件緩存中留有的舊數(shù)據(jù)。這種情況叫做“下溢”,。在捕獲的時(shí)候,,聲卡也許要傳送數(shù)據(jù)給計(jì)算機(jī),但此時(shí)計(jì)算機(jī)沒有空間來存儲,,因此,,聲卡會重寫部分硬件緩存中沒有及時(shí)送出的數(shù)據(jù)。這種情況叫做“上溢”,。簡單的說,,我們用詞“xrun”來概括其中的一個(gè)或幾個(gè)。
Pcm
         Pulse Code Modulation(脈沖編碼調(diào)制),。這個(gè)詞(還有縮寫)描述了一種用數(shù)字化形式表示模擬信號的方法,。這種方法幾乎被所有的計(jì)算機(jī)音卡所使用,它在ALSA API中用“audio”來簡稱,。
Channel
Frame
         一個(gè)采樣是描述某一時(shí)刻的單通道下一個(gè)信號點(diǎn)的聲音信號的振幅的信號值,。當(dāng)我們談及數(shù)字音頻時(shí),我們經(jīng)常談到的是代表所有通道的一個(gè)信號點(diǎn)的數(shù)據(jù),。它是單個(gè)通道采樣的一個(gè)集合,,叫做"幀"。當(dāng)我們依據(jù)幀來表示一段時(shí)間時(shí),,它粗略的等于人們用一組采樣來衡量,,但前者更精確(?,?,?);更重要的是,,當(dāng)我們在討論代表一個(gè)時(shí)刻所有通道的數(shù)據(jù)量時(shí),幀是唯一能引起人們感官感受的標(biāo)準(zhǔn),。幾乎所有的ALSA Audio API使用幀作為衡量音頻質(zhì)量的標(biāo)準(zhǔn),。
Interleaved
         一種將同一時(shí)刻所有通道音頻數(shù)據(jù)依次存取的交叉存儲形式。參看:不交叉存儲。
Non-interleaved
         一種將每個(gè)通道的數(shù)據(jù)按順序存儲的存儲形式,,不同的通道的數(shù)據(jù)存儲在另一個(gè)緩存中或者同一個(gè)緩存的其他地方,。和交叉存儲對比。
Sample clock
         時(shí) 鐘源,,用來決定采樣的傳送,,接收時(shí)刻。一些音卡允許你使用外部時(shí)鐘,,比如“全球時(shí)鐘信號”(經(jīng)常在一些工作室中使用),,還有使用來自數(shù)字?jǐn)?shù)據(jù)的時(shí)鐘信號的 “自動同步信號”。所有的聲卡內(nèi)部都必須至少有一個(gè)采樣時(shí)鐘源,,典型的是一種小的晶體時(shí)鐘,。一些聲卡不允許改變時(shí)鐘頻率,一些則有不是很精準(zhǔn)的時(shí)鐘(比如,44.1khz)(,?,??),。沒有兩個(gè)時(shí)鐘能夠以同一個(gè)時(shí)鐘頻率運(yùn)行,,如果你需要兩個(gè)采樣時(shí)鐘進(jìn)行同步,他們必須要和同一個(gè)采樣時(shí)鐘進(jìn)行同步,。(,?暈了)

七、如何使用API
1.打開設(shè)備
         ALSA將捕獲和回放的用API分開,。,。。(估計(jì)是說用同一個(gè)api來實(shí)現(xiàn)了吧,,沒寫了)

2.設(shè)置參數(shù)
         上面提到了要使聲卡工作需要設(shè)置很多的參數(shù),。然而,由于你的程序?qū)⒉粫?shí)際的直接的去和硬件打交道,,所以我們使用了兩個(gè)不同的設(shè)置參數(shù)的方式來替帶用設(shè)備驅(qū)動來控制硬件:
硬件參數(shù)
下面的參數(shù)可以直接影響聲卡的硬件
采樣率
         如果聲卡有模擬i/o的情況下,,當(dāng)聲卡準(zhǔn)備好了A/D或D/A轉(zhuǎn)換時(shí),這個(gè)可以控制聲卡的速率,。對于全數(shù)字的聲卡,,它控制用于移動數(shù)字?jǐn)?shù)據(jù)進(jìn)出外部的時(shí)鐘的速度。在一些聲卡中,,其它的硬件指定設(shè)置也許意味著你的程序不能控制這個(gè)值(比如,,當(dāng)聲卡用一個(gè)外部時(shí)鐘源來決定采樣率時(shí))。

采樣格式
         這個(gè)控制了用于從聲卡傳輸數(shù)據(jù)的采樣格式,。它也許和硬件直接支持的格式不符,。

通道數(shù)
         這個(gè)完全可以自定義。

數(shù)據(jù)接入和布局
         數(shù)據(jù)接入控制了程序從聲卡接收傳送數(shù)據(jù)的方式。有兩個(gè)參數(shù)來設(shè)置4種情況,。一個(gè)參數(shù)是是否使用“讀寫”模塊,,該模塊中有相應(yīng)的用于傳輸數(shù)據(jù)的函數(shù)調(diào)用。另一個(gè)選項(xiàng)是用“映射模式”,,該模式通過拷貝內(nèi)存區(qū)域的數(shù)據(jù)來傳輸數(shù)據(jù),,這個(gè)API僅僅需要在開始和結(jié)束的時(shí)候注明一下即可。
         數(shù)據(jù)布局是指數(shù)據(jù)的存儲是交叉存儲還是非交叉存儲,。

中斷間隔
         這個(gè)決定了讀或?qū)懲暾麄€(gè)硬件緩存需要發(fā)生多少次中斷,。它能根據(jù)一些指定的時(shí)間段來設(shè)置,也可以根據(jù)一段時(shí)間的長短來設(shè)置,。設(shè)置決定了在聲卡向計(jì)算機(jī)發(fā)出中斷之前積累的空間中或數(shù)據(jù)中的幀數(shù),。它控制著延遲。

緩存大小
         這決定了硬件緩存的大小,。它可以用時(shí)間長短或幀數(shù)來指定,。

軟件參數(shù)
這些參數(shù)控制著硬件驅(qū)動的操作而不是硬件本身。很多使用ALSA Audio API的程序什么參數(shù)都不需要設(shè)置,,一些只需要設(shè)置其中的一部分,。

什么時(shí)候打開設(shè)備
         當(dāng)你打開聲卡設(shè)備的時(shí)候,ALSA確認(rèn)它并沒有在被使用——沒有數(shù)據(jù)正在傳輸,。假如,,此時(shí),你想要開始數(shù)據(jù)傳輸,,有幾個(gè)選項(xiàng)需要設(shè)置,。
         此處的控制關(guān)鍵是開端,開端定義了自動開啟設(shè)備所需要達(dá)到的空間/數(shù)據(jù)包含的幀數(shù),。如果為回放設(shè)置了一個(gè)非0值,,那在設(shè)備開始運(yùn)作之前就要先填充硬件緩存。如果設(shè)置成0,,那么最開始寫入數(shù)據(jù)給設(shè)備(或者試圖開始捕獲流數(shù)據(jù))將會開啟設(shè)備,。
你可以用snd_pcm_start來明確的打開設(shè)備,但如果是回放的話要求緩存中預(yù)先填充數(shù)據(jù),。如果你沒有預(yù)填數(shù)據(jù)而想開始回放,,函數(shù)則會返回-EPIPE,表明現(xiàn)在沒有數(shù)據(jù)在向硬件緩存中傳,。

Xruns有什么作用
         如果xrun發(fā)生了,,如果被請求了,設(shè)備將通過幾個(gè)步驟來處理它,。選項(xiàng)包括停止設(shè)備,,用于回放的硬件緩存的全部或部分靜音,。
        
         停止極限
                   如果可用的數(shù)據(jù)/空間的幀數(shù)達(dá)到或超過了這個(gè)值,,設(shè)備將停止聲卡,。
         靜音極限
如果用于回放流的可用的空間幀數(shù)達(dá)到或超過了這個(gè)值,設(shè)備將往硬件緩存中填充靜音數(shù)據(jù),。
靜音大小
         當(dāng)靜音極限到達(dá)時(shí),,這個(gè)值決定了往硬件緩存中寫入多少靜音數(shù)據(jù)。

喚醒所需的最小可用空間/數(shù)據(jù),。
         使用poll(2)或者select(2)來控制音頻數(shù)據(jù)的傳輸?shù)某绦蚩梢栽O(shè)置這個(gè)值來控制在什么時(shí)候喚醒程序,,這些時(shí)候與硬件緩存的狀態(tài)相關(guān)。

傳輸塊大小
         這個(gè)決定了傳入/出數(shù)據(jù)給硬件緩存時(shí)所用的幀數(shù),。

還有一些其他的軟件參數(shù)此處沒有提及,。

接收和傳輸數(shù)據(jù)
沒有寫

八、為何你會要去忘記這里所講述的
,。,。。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多