【Linux系统编程应用】Linux音频编程接口
如何對(duì)各種音頻設(shè)備進(jìn)行操作是在Linux上進(jìn)行音頻編程的關(guān)鍵,通過內(nèi)核提供的一組系統(tǒng)調(diào)用,應(yīng)用程序能夠訪問聲卡驅(qū)動(dòng)程序提供的各種音頻設(shè)備接口,這是在Linux下進(jìn)行音頻編程最簡單也是最直接的方法。
1. 訪問音頻設(shè)備
無論是OSS還是ALSA,都是以內(nèi)核驅(qū)動(dòng)程序的形式運(yùn)行在Linux內(nèi)核空間中的,應(yīng)用程序要想訪問聲卡這一硬件設(shè)備,必須借助于Linux內(nèi)核所提供的系統(tǒng)調(diào)用(system call)。從程序員的角度來說,對(duì)聲卡的操作在很大程度上等同于對(duì)磁盤文件的操作:首先使用open系統(tǒng)調(diào)用建立起與硬件間的聯(lián)系,此時(shí)返回的文件描述符將作為隨后操作的標(biāo)識(shí);接著使用read系統(tǒng)調(diào)用從設(shè)備接收數(shù)據(jù),或者使用write系統(tǒng)調(diào)用向設(shè)備寫入數(shù)據(jù),而其它所有不符合讀/寫這一基本模式的操作都可以由ioctl系統(tǒng)調(diào)用來完成;最后,使用close系統(tǒng)調(diào)用告訴Linux內(nèi)核不會(huì)再對(duì)該設(shè)備做進(jìn)一步的處理。
open系統(tǒng)調(diào)用
系統(tǒng)調(diào)用open可以獲得對(duì)聲卡的訪問權(quán),同時(shí)還能為隨后的系統(tǒng)調(diào)用做好準(zhǔn)備,其函數(shù)原型如下所示:
如果open系統(tǒng)調(diào)用能夠成功完成,它將返回一個(gè)正整數(shù)作為文件標(biāo)識(shí)符,在隨后的系統(tǒng)調(diào)用中需要用到該標(biāo)識(shí)符。如果open系統(tǒng)調(diào)用失敗,它將返回-1,同時(shí)還會(huì)設(shè)置全局變量errno,指明是什么原因?qū)е铝隋e(cuò)誤的發(fā)生。
read系統(tǒng)調(diào)用
系統(tǒng)調(diào)用read用來從聲卡讀取數(shù)據(jù),其函數(shù)原型如下所示:
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count); 參數(shù)fd是設(shè)備文件的標(biāo)識(shí)符,它是通過之前的open系統(tǒng)調(diào)用獲得的;參數(shù)buf是指向緩沖區(qū)的字符指針,它用來保存從聲卡獲得的數(shù)據(jù);參數(shù)count則用來限定從聲卡獲得的最大字節(jié)數(shù)。如果read系統(tǒng)調(diào)用成功完成,它將返回從聲卡實(shí)際讀取的字節(jié)數(shù),通常情況會(huì)比count的值要小一些;如果read系統(tǒng)調(diào)用失敗,它將返回-1,同時(shí)還會(huì)設(shè)置全局變量errno,來指明是什么原因?qū)е铝隋e(cuò)誤的發(fā)生。
write系統(tǒng)調(diào)用
系統(tǒng)調(diào)用write用來向聲卡寫入數(shù)據(jù),其函數(shù)原型如下所示:
如果write系統(tǒng)調(diào)用成功完成,它將返回向聲卡實(shí)際寫入的字節(jié)數(shù);如果read系統(tǒng)調(diào)用失敗,它將返回-1,同時(shí)還會(huì)設(shè)置全局變量errno,來指明是什么原因?qū)е铝隋e(cuò)誤的發(fā)生。無論是read還是write,一旦調(diào)用之后Linux內(nèi)核就會(huì)阻塞當(dāng)前應(yīng)用程序,直到數(shù)據(jù)成功地從聲卡讀出或者寫入為止。
ioctl系統(tǒng)調(diào)用
系統(tǒng)調(diào)用ioctl可以對(duì)聲卡進(jìn)行控制,凡是對(duì)設(shè)備文件的操作不符合讀/寫基本模式的,都是通過ioctl來完成的,它可以影響設(shè)備的行為,或者返回設(shè)備的狀態(tài),其函數(shù)原型如下所示:
close系統(tǒng)調(diào)用
當(dāng)應(yīng)用程序使用完聲卡之后,需要用close系統(tǒng)調(diào)用將其關(guān)閉,以便及時(shí)釋放占用的硬件資源,其函數(shù)原型如下所示:
參數(shù)fd是設(shè)備文件的標(biāo)識(shí)符,它是在設(shè)備打開時(shí)獲得的。一旦應(yīng)用程序調(diào)用了close系統(tǒng)調(diào)用,Linux內(nèi)核就會(huì)釋放與之相關(guān)的各種資源,因此建議在不需要的時(shí)候盡量及時(shí)關(guān)閉已經(jīng)打開的設(shè)備。
總結(jié)
以上是生活随笔為你收集整理的【Linux系统编程应用】Linux音频编程接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux网络编程】原始套接字实例:发
- 下一篇: 【Linux系统编程应用】Linux音频