?? oss--跨平臺的音頻接口簡介.htm
字號:
<b>1) 頭文件定義</b><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>/** Standard includes*/#include <ioctl.h>#include <unistd.h>#include <fcntl.h>#include <sys/soundcard.h>/** Mandatory variables.*/#define BUF_SIZE 4096int audio_fd;unsigned char audio_buffer[BUF_SIZE];</code></pre></td></tr></table></p><p><b>2) 打開設備</b><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>if ((audio_fd = open(DEVICE_NAME, open_mode, 0)) == -1) {/* Open of device failed */perror(DEVICE_NAME);exit(1);}</code></pre></td></tr></table></p><p>open_mode有三種選擇:O_RDONLY,O_WRONLY和O_RDWR,分別表示只讀、只寫和讀寫。OSS建議盡量使用只讀或只寫,只有在全雙工的情況下(即錄音和放音同時)才使用讀寫模式。</p><p><span class="atitle3">2. 錄音</span><br /></p><p><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>int len;if ((len = read(audio_fd, audio_buffer, count)) == -1) {perror("audio read");exit(1);}</code></pre></td></tr></table></p><p>count為錄音數據的字節個數(建議為2的指數),但不能超過audio_buffer的大小。從讀字節的個數可以精確的測量時間,例如8kHZ 16-bit stereo的速率為8000*2*2=32000bytes/second,這是知道何時停止錄音的唯一方法。</p><p><span class="atitle3">3. 放音</span><br /></p><p>放音實際上和錄音很類似,只不過把read改成write即可,相應的audio_buffer中為音頻數據,count為數據的長度。</p><p>注意,用戶始終要讀/寫一個完整的采樣。例如一個16-bit的立體聲模式下,每個采樣有4個字節,所以應用程序每次必須讀/寫4的倍數個字節。</p><p>另外,由于OSS是一個跨平臺的音頻接口,所以用戶在編程的時候,要考慮到可移植性的問題,其中一個重要的方面是讀/寫時的字節順序。</p><p><span class="atitle3">4. 設置參數</span><br /></p><ul><li><p><b>設置采樣格式</b><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>int format;format = AFMT_S16_LE;if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1) {/* fatal error */perror("SNDCTL_DSP_SETFMT");exit(1);}if (format != AFMT_S16_LE) {/* 本設備不支持選擇的采樣格式. */}在設置采樣格式之前,可以先測試設備能夠支持那些采樣格式,方法如下:int mask;if (ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &mask) == -1) {/* Handle fatal error ... */}if (mask & AFMT_MPEG) {/* 本設備支持MPEG采樣格式 ... */}</code></pre></td></tr></table></p></li><li><p><b>設置通道數目</b><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>int channels = 2; /* 1=mono, 2=stereo */if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) {/* Fatal error */perror("SNDCTL_DSP_CHANNELS");exit(1);}if (channels != 2){/* 本設備不支持立體聲模式 ... */}</code></pre></td></tr></table></p></li><li><p><b>設置采樣速率</b><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>int speed = 11025;if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed)==-1) {/* Fatal error */perror("SNDCTL_DSP_SPEED");exit(Error code);}if ( /* 返回的速率(即硬件支持的速率)與需要的速率差別很大... */ ) {/* 本設備不支持需要的速率... */}</code></pre></td></tr></table></p></li></ul><p>音頻設備通過分頻的方法產生需要的采樣時鐘,因此不可能產生所有的頻率。驅動程序會計算出最接近要求的頻率來,用戶程序要檢查返回的速率值,如果誤差較小,可以忽略,但誤差不能太大。</p><p><a name="section3"><span class="atitle2">三、Mixer編程</span></a></p><p>對Mixer的控制,包括調節音量(volume)、選擇錄音音源(microphone,line-in)、查詢mixer的功能和狀態,主要是通過Mixer設備/dev/mixer的ioctl接口。相應的,ioctl接口提供的功能也分為三類:調節音量、查詢mixer的能力、選擇mixer的錄音通道。下面就分別介紹使用的方法:</p><p>下面的mixer_fd是對mixer設備執行open操作返回的文件描述符。</p><ul><li><p>調節音量</p><p>應用程序通過ioctl的SOUND_MIXER_READ和SOUND_MIXER_WIRTE功能號來讀取/設置音量。在OSS中,音量的大小范圍在0-100之間。使用方法如下:</p><p><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>int vol;if (ioctl(mixer_fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol) == -1) {/* 訪問了沒有定義的mixer通道... */</code></pre></td></tr></table></p><p>SOUND_MIXER_MIC是通道參數,表示讀microphone通道的音量,結果放置在vol中。如果通道是立體聲,那么vol的最低有效字節為左聲道的音量值,接著的字節為右聲道的音量值,另外的兩個字節不用。如果通道是單聲道,vol中左聲道與右聲道具有相同的值。</p></li><li><p>查詢mixer的能力</p><p><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>int mask;if (ioctl(mixer_fd, SOUND_MIXER_READ_xxxx, &mask) == -1) {/* Mixer 的沒有此能力... */}</code></pre></td></tr></table></p><p>SOUND_MIXER_READ_xxxx 中的xxxx代表具體要查詢的內容,比如檢查可用的mixer通道用SOUND_MIXER_READ_DEVMASK;檢查可用的錄音設備,用SOUND_MIXER_READ_RECMASK;檢查單聲道/立體聲,用SOUND_MIXER_READ_STEREODEVS;檢查mixer的一般能力,用SOUND_MIXER_READ_CAPS等等。所有通道的查詢的結果都放在mask中,所以要區分出特定通道的狀況,使用mask& (1 << channel_no)。</p></li><li><p>選擇mixer的錄音通道</p><p>首先可以通過SOUND_MIXER_READ_RECMASK檢查可用的錄音通道,然后通過SOUND_MIXER_WRITE_RECSRC選擇錄音通道。可以隨時通過SOUND_MIXER_READ_RECSRC查詢當前聲卡中已經被選擇的錄音通道。</p><p>OSS建議把mixer的用戶控制功能單獨出來形成一個通用的程序。但前提是,在使用mixer之前,首先通過API的查詢功能檢查聲卡的能力。在linux中,就有一個專門的mixer程序--aumix。</p></li></ul><p><a name="section4"><span class="atitle2">四、結束語</span></a></p><p>前面討論的是OSS中一些最基本的內容,實際上OSS中還有很多高級的特性,比如在音頻編程時十分重要的實時性問題,畫面與聲音的同步問題,這里都沒有介紹。如果讀者對這些特性感興趣的話,可以進一步參考[1]。另外,在[2]中,還可以下載使用OSS接口的樣例程序。</p><!-- CONTENT AREA SIDEBAR--><!-- Adjust to wider width if text is long--><!--<table align="right" border="1" cellpadding="5" cellspacing="0" width="30%"><tr><td background="/developerWorks/cn/i/bg-gold.gif"><b>Sidebar heading</b><br />[Text starts here following break tag] <p>[New paragraph goes here]</p></td></tr></table>--><!-- END CONTENT AREA SIDEBAR--><!-- RESOURCES--><p><a name="resources"><span class="atitle2">參考文獻</span></a></p><p><ul><!-- Comment out list item below if there is no forum for this article--><!-- <li>Participate in the <a href="javascript:void forumWindow()">discussion forum</a> on this article by clicking <b>Discuss</b> at the top or bottom of the article.</li> --><li>Open Sound SystemTM Programmer's Guide, version 1.11, <a href="http://www.opensound.com">http://www.opensound.com</a></li><li><a href="http://www.opensound.com">http://www.opensound.com</a></li></ul></p><!-- AUTHOR BIOS--><!-- Make author heading singular or plural as needed--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td><a name="author1"><span class="atitle2">關于作者</span></a><br /><p>湯凱,您可以通過 Mail 地址<a href="mailto:tangk73@hotmail.com">tangk73@hotmail.com</a> 與他取得聯系。</p> </td></tr></table><!-- END PAPER BODY--></td><td width="10"><img alt="" border="0" height="1" src="/developerWorks/cn/i/c.gif" width="10" /></td></tr></table><!-- <br clear="all" /><img alt="" border="0" height="10" src="/developerWorks/cn/i/c.gif" width="100" /><br /> --><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr valign="top"><td align="right" width="100%"><a href="#top">到頁首</a></td><td width="5"><img alt="" border="0" height="1" src="/developerWorks/cn/i/c.gif" width="5" /></td></tr><tr valign="top"><td bgcolor="#000000" colspan="2"><img alt="" border="0" height="1" src="/developerWorks/cn/i/c.gif" width="100" /></td></tr><tr valign="top"><td bgcolor="#FFFFFF" colspan="2"><img alt="" border="0" height="8" src="/developerWorks/cn/i/c.gif" width="100" /></td></tr></table><table border="0" cellpadding="10" cellspacing="0" width="100%"><tr valign="top"><td><form action="/developerWorks/cn/cnratings.nsf/RateArticle?CreateDocument" method="POST" name="getURL"><input name="ArticleTitle" type="HIDDEN" value="OSS--跨平臺的音頻接口簡介" /><input type="HIDDEN" name="url" value="" /><script language="javascript">getURL();</script><input name="Zone" type="HIDDEN" value="linux" /><input name="RedirectURL" type="HIDDEN" value="/developerWorks/cn/thankyou/feedback-linux.html" /><a name="rating"><b>您對這篇文章的看法如何?</b></a><table border="0" cellpadding="0" cellspacing="0" width="600"><tr><td colspan="5"><img alt="" border="0" height="8" src="/developerWorks/cn/i/c.gif" width="100" /></td></tr><tr valign="top"><td width="16%"><input name="Rating" type="RADIO" value="5" />真棒!(5)</td><td width="20%"><input name="Rating" type="RADIO" value="4" />好材料 (4)</td><td width="24%"><input name="Rating" type="RADIO" value="3" />一般;尚可 (3)</td><td width="22%"><input name="Rating" type="RADIO" value="2" />需提高 (2)</td><td width="18%"><input name="Rating" type="RADIO" value="1" />太差! (1)</td></tr></table><br /><b>建議?</b><br /><textarea cols="60" name="Comments" rows="5" wrap="virtual"></textarea><br /><br /><input type="SUBMIT" value="提交反饋意見" /></form></td></tr><tr valign="top"><td bgcolor="#FFFFFF"><img alt="" border="0" height="8" src="/developerWorks/cn/i/c.gif" width="100" /></td></tr></table><table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr><td align="right">(c) Copyright IBM Corp. 2001, (c) Copyright IBM China 2001, All Right Reserved</td></tr>
<tr valign="top">
<td height="21" class="bbg"> <a href="/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/index.shtml&origin=dwhead" class="mainlink">關于 IBM</a><span class="divider"> | </span><a href="/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/privacy/index.shtml&origin=dwhead" class="mainlink">隱私條約</a><span class="divider"> | </span><a href="/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/legal/index.shtml&origin=dwhead" class="mainlink">使用條款</a><span class="divider"> | </span><a href="/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/contact/index.shtml&origin=dwhead" class="mainlink">聯系 IBM</a></td>
</tr></table>
<script type="text/javascript" language="JavaScript1.2" src="//www.ibm.com/common/stats/stats.js"></script>
<noscript><img src="//stats.www.ibm.com/rc/images/uc.GIF?R=noscript" width="1" height="1" alt="" border="0" /></noscript></body></html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -