⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oss--跨平台的音频接口简介.htm

📁 介绍声卡编程的一些资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<b>1) 头文件定义</b><table bgcolor="#CCCCCC" border="1" cellpadding="5" cellspacing="0" width="100%"><tr><td><pre><code>/** Standard includes*/#include &lt;ioctl.h&gt;#include &lt;unistd.h&gt;#include &lt;fcntl.h&gt;#include &lt;sys/soundcard.h&gt;/** 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, &amp;format) == -1) {/* fatal error */perror("SNDCTL_DSP_SETFMT");exit(1);}if (format != AFMT_S16_LE) {/* 本设备不支持选择的采样格式. */}在设置采样格式之前,可以先测试设备能够支持那些采样格式,方法如下:int mask;if (ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &amp;mask) == -1) {/* Handle fatal error ... */}if (mask &amp; 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, &amp;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, &amp;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), &amp;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, &amp;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&amp; (1 &lt;&lt; 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">&nbsp;&nbsp;<a href="/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/index.shtml&amp;origin=dwhead" class="mainlink">关于 IBM</a><span class="divider">&nbsp;&nbsp;|&nbsp;&nbsp;</span><a href="/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/privacy/index.shtml&amp;origin=dwhead" class="mainlink">隐私条约</a><span class="divider">&nbsp;&nbsp;|&nbsp;&nbsp;</span><a href="/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/legal/index.shtml&amp;origin=dwhead" class="mainlink">使用条款</a><span class="divider">&nbsp;&nbsp;|&nbsp;&nbsp;</span><a href="/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/contact/index.shtml&amp;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 + -