歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Tiny6410聲卡驅動——錄音與回放

在Linux下,音頻設備程序的實現與文件系統的操作密切相關。Linux將各種設備以文件的形式給出統一的接口,這樣的設計使得對設備的編程與對文件的操作基本相同,對Linux內核的系統調用也基本一致,從而簡化了設備編程。

如何對各種音頻設備進行操作是在Linux上進行音頻編程的關鍵,通過內核提供的一組系統調用,應用程序能夠訪問聲卡驅動程序提供的各種音頻設備接口,這是在Linux下進行音頻編程最簡單也是最直接的方法。

聲卡不是Linux控制台的一部分,它是一個特殊的設備。聲卡主要提供3個重要的特征:

  • 數字取樣輸入/輸出
  • 頻率調制輸出
  • MIDI接口

這3個特征都有它們自己的設備驅動程序接口

 

 

  • 數字取樣的接口是/dev/dsp
  • 頻率調制的接口/dev/sequencer
  • MIDI接口是/dev/midi

 

混音設備(如音量、平衡或者貝斯)可以通過/dev/mixer接口來控制。

為了滿足兼容性的需要,還提供了一個/dev/audio設備,該設備可用於讀SUN_law的聲音數據,但它是映射到數字取樣設備的。

 

1、音頻編程接口

程序員可以使用ioctl()來操作這些設備,ioctl()請求是在linux/soundcard.h中定義的,它們以SNDCTL_開頭。

 

  • 首先使用open系統調用建立起與硬件間的聯系,此時返回的文件描述符將作為隨後操作的標識;
  • 接著使用read系統調用從設備接收數據,或者使用write系統調用向設備寫入數據,而其他所有不符合讀/寫這一基本模式的操作都可以由ioctl系統調用來完成;
  • 最後,使用close系統調用告訴Linux內核不會再對該設備做進一步的處理。

 

 

1.1.open系統調用

系統調用open可以獲得對聲卡的訪問權,同時還能為隨後的系統調用做好准備,其函數原型如下所示:

 

int open(const char *pathname, int flags, int mode);

 

  • 參數pathname是將要被打開的設備文件的名稱,對於聲卡來講一般是/dev/dsp。
  • 參數flags用來指明應該以什麼方式打開設備文件,它可以是O_RDONLY、O_WRONLY或者O_RDWR,分別表示以只讀、只寫或者讀寫的方式打開設備文件;
  • 參數mode通常是可選的,它只有在指定的設備文件不存在時才會用到,指明新創建的文件應該具有怎樣的權限。如果open系統調用能夠成功完成,它將返回一個正整數作為文件標志符,在隨後的系統調用中需要用到該標志符。

如果open系統調用失敗,它將返回-1,同時還會設置全局變量errno,指明是什麼原因導致了錯誤的發生。

 

 

1.2.read系統調用

read用來從聲卡讀取數據,其函數原型如下所示:

 

int read(int fd, char *buf, size_t count);

 

  • 參數fd是設備文件的標志符,它是通過之前的open系統調用獲得的;
  • 參數buf是指向緩沖區的字符指針,它用來保存從聲卡獲得的數據;
  • 參數count則用來限定從聲卡獲得的最大字節數。

 

如果read系統調用成功完成,它將返回從聲卡實際讀取的字節數,通常情況會比count的值小一些;如果read系統調用失敗,它將返回-1,同時還會設置全局變量errno,來指明是什麼原因導致了錯誤的發生。

1.3.write系統調用

write用來向聲卡寫入數據,其函數原型如下所示: size_t write(int fd, const char *buf, size_t count); 系統調用write和系統調用read在很大程度是類似的,差別只在於write是向聲卡寫入數據,而read則是從聲卡讀入數據。
  • 參數fd同樣是設備文件的標志符,它也是通過之前的open系統調用獲得的;
  • 參數buf是指向緩沖區的字符指針,它保存著即將向聲卡寫入的數據;
  • 參數count則用來限定向聲卡寫入的最大字節數。
如果write系統調用成功完成,它將返回向聲卡實際寫入的字節數;如果write系統調用失敗,它將返回-1,同時還會設置全局變量errno,來指明是什麼原因導致了錯誤的發生。無論是read還是write,一旦調用之後,Linux內核就會阻塞當前應用程序,直到數據成功地從聲卡讀出或者寫入為止。

1.4.ioctl系統調用

系統調用ioctl可以對聲卡進行控制,凡是對設備文件的操作不符合讀/寫基本模式的,都是通過ioctl來完成的,它可以影響設備的行為,或者返回設備的狀態,其函數原型如下所示: int ioctl(int fd, int request, ...);
  • 參數fd是設備文件的標志符,它是在設備打開時獲得的,如果設備比較復雜,那麼對它的控制請求相應地也會有很多種,
  • 參數request的目的就是用來區分不同的控制請求;
通常說來,在對設備進行控制時還需要有其他參數,這要根據不同的控制請求才能確定,並且可能是與硬件設備直接相關的。

1.5.close系統調用

當應用程序使用完聲卡之後,需要用close系統調用將其關閉,以便及時釋放占用的硬件資源,其函數原型如下所示: int close(int fd);
  • 參數fd是設備文件的標志符,它是在設備打開時獲得的。
一旦應用程序調用了close系統調用,Linux內核就會釋放與之相關的各種資源,因此建議在不需要的時候盡量及時關閉已經打開的設備。
 

2、音頻設備文件

  • /dev/sndstat
設備文件/dev/sndstat是聲卡驅動程序提供的最簡單的接口,通常它是一個只讀文件,作用也僅僅只限於匯報聲卡的當前狀態。一般說來,/dev/sndstat是提供給最終用戶來檢測聲卡的,不宜用於程序當中,因為所有的信息都可以通過ioctl系統調用來獲得。
  • /dev/dsp
聲卡驅動程序提供的/dev/dsp是用於數字采樣和數字錄音的設備文件,它對於Linux下的音頻編程來講非常重要。向該設備寫數據即意味著激活聲卡上的D/A轉換器進行放音,而從該設備讀數據則意味著激活聲卡上的A/D轉換器進行錄音。目前,許多聲卡都提供有多個數字采樣設備,它們在Linux下可以通過/dev/dsp等設備文件進行訪問。
  • /dev/audio
/dev/audio類似於/dev/dsp,它兼容於Sun工作站上的音頻設備,使用的是mu-law編碼方式。由於設備文件/dev/audio主要出於對兼容性的考慮,所以在新開發的應用程序中最好不要嘗試用它,而應該以/dev/dsp進行替代。對於應用程序來說,同一時刻只能使用/dev/audio或者/dev/dsp其中之一,因為它們是相同硬件的不同軟件接口。
  • /dev/mixer
在聲卡的硬件電路中,混音器(mixer)是一個很重要的組成部分,它的作用是將多個信號組合或者疊加在一起,對於不同的聲卡來說,其混音器的作用可能各不相同。運行在Linux內核中的聲卡驅動程序一般都會提供/dev/mixer這一設備文件,它是應用程序對混音器進行操作的軟件接口。
  • /dev/sequencer
目前大多數聲卡驅動程序還會提供/dev/sequencer設備文件,用來對聲卡內建的波表合成器進行操作,或者對MIDI總線上的樂器��行控制,通常只用於計算機音樂軟件中。  

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-12/93638p2.htm

Copyright © Linux教程網 All Rights Reserved