用system函數(shù),通過命令行的方式可以播放音樂文件。 如果linux下變成,用exec函數(shù)族,調(diào)用播放器以命令的方式進(jìn)行播放。 execlp ("sox", "sox", wav, "-t", "ossdsp", "/dev/dsp", NULL);
為南州晴隆等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及南州晴隆網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站制作、南州晴隆網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
你如果是想調(diào)用,你有好幾種選擇。Linux 下面的解碼器很多的。
比如 ffmpeg ,比如 mplayer 、gstreamer 。
ffmpeg 只有解碼功能,開發(fā)調(diào)用你還需要自己寫輸出到聲卡的代碼。還有 mplayer ,他本身就可以直接拿來用,命令行程序,也可以作為后臺播放器,你寫控制界面來控制他的運行。gstreamer 一般都在圖形界面下面作為后臺解碼器,應(yīng)該他也能用在字符界面。這個是專門的解碼器,沒有自己的界面。相對來說對調(diào)用功能再開發(fā)的支持比較好。
你如果開發(fā)圖形界面的播放器,首選還是 gstreamer 。
錄音:mic接到codec,經(jīng)過adc變成數(shù)字信號,經(jīng)過待續(xù)2中ac97等接口存儲到cpu的fifo中,經(jīng)過待續(xù)1中的dma傳輸存儲到內(nèi)存,經(jīng)過待續(xù)3中alsa_lib中snd_pcm_readi接口傳給錄音軟件,經(jīng)過編碼,進(jìn)而形成音頻文件。
放音:播放軟件將音頻文件解碼,并通過待續(xù)3中snd_pcm_writei接口逐漸傳遞到和dma相關(guān)的內(nèi)存,經(jīng)過待續(xù)2中dma傳遞給cpu的fifo,再經(jīng)過ac97等接口傳遞給dac,最后傳給連接在codec上的speaker。
心得:
1.ac97數(shù)據(jù)傳輸頗復(fù)雜,分時復(fù)用,cpu端fifo和codec端adc/dac關(guān)系要對應(yīng)好。比如,cpu端的pcm left fifo占用slot3,那么adc只有配置成slot3才能把數(shù)據(jù)傳遞給它,如果配置成slot6,那就傳給cpu的mic in fifo了。錄音單聲道通常選擇slot6,錄音雙聲道通常兩個adc分別選擇slot3和slot4。
2.wav音頻文件大小計算:要測試錄音是否丟禎,就必然要計算文件大小,通常的方法是:根據(jù)錄音時間,用公式:錄音時間(單位s)x采樣率x(采樣位數(shù)/8)x通道數(shù)。比如,錄音時間5秒,采樣率8kHz,位數(shù)16位,通道數(shù)1,那么5x8000x(16/8)x1=80k,實際的wav文件大小稍大于80k就對了。還有一種計算文件大小的方法:通常音頻系統(tǒng)要用dma,也會用到dma中斷,可以在dma中斷中打印計數(shù),次數(shù)xdma中斷周期字節(jié)就行了。
3.數(shù)據(jù)交換的大小問題:待續(xù)1中DMA傳輸必須和FIFO的特性匹配:若FIFO位寬是16位,深度是16,并且半滿時向DMA發(fā)出請求(握手),則鏈表式DMA必須配置成傳輸位寬16位,1次突發(fā)16字節(jié),才能保證不丟失位數(shù)和數(shù)據(jù)個數(shù)。待續(xù)2中cpu端FIFO位數(shù)要和codec端adc/dac采樣位數(shù)匹配,i2s/pcm接口可以配置成一樣的值,比如16位,ac97接口復(fù)雜一點,cpu端不用配置,那么采樣位數(shù)是多少呢?若cpu端fifo一個聲道位寬16位,codec端adc/dac位寬18位,ac97通道20位,則傳輸?shù)絝ifo端就被截取到有效的16位,整體采樣位數(shù)16位,adc/dac的性能沒有充分發(fā)揮而已。待續(xù)3中snd_pcm_readi、snd_pcm_writei函數(shù)第三個參數(shù)表示讀寫數(shù)據(jù)的大小,單位是禎,不是字節(jié)。雙聲道16位格式一禎大小為4字節(jié)