Alsa是Linux高级音频接口(百度文库无下载券抄来的)

Alsa是Linux高级音频接口。面对众多的音频设备,Alsa为Linux音频开发人员提供了一套标准的访问机制,使得音频开发变得十分容易。不信?下面我们就利用它编写一个简单的录音/播音程序,不过这需要你有一定的计算机语言基础。
一个典型的音频程序应该具有以下结构:   打开音频设备   为设备设置读写参数   向音频设备读/写音频数据   关闭设备, Alsa库为我们实现这些操作提供了丰富的接口。  

首先让我们封装一个打开音频设备的函数  
<pre name="code" class="cpp">snd_pcm_t *pcm_handle;  
bool device_open(int mode)
{
<span style="white-space:pre">	</span>if (snd_pcm_open (&pcm_handle, “default” , mode , 0) < 0)  
<span style="white-space:pre">	</span>return false;  
<span style="white-space:pre">	</span>return true; 
 }


 
 
snd_pcm_open是Alsa库提供的打开设备调用函数,这里我们指定打开缺省的音频设备,并根据参数mode将设备置为录音或是播放状态,如果设备打开成功,pcm_handle便指向该设备句柄,我们用全局变量保存起来,方便以后使用。
第二步是设置参数,参数设置不当将会导致音频设备无法正常工作。在设置参数前,我们需要了解一下各个参数的含义以及一些基本概念。
样本长度(sample): 样本是记录音频数据最基本的单位,常见的有8位和16位。   通道数(channel):该 参数为1表示单声道,2则是立体声。
桢(frame):桢记录了一个声音单元,其长度为样本长度与通道数的乘积。   采样率(rate):每秒钟采样次 数,该次数是针对桢而言。
周期(period):音频设备一次处理所需要的桢数,对于音频设备的数据访问以及音频数据的存储,都是以此 为单位。
交错模式(interleaved):是一种音频数据的记录方式,在交错模式下,数据以连续桢的形式存放,即首先记 录完桢1的左声道样本和右声道样本(假设为立体声格式),再开始桢2的记录。 而在非交错模式下,首先记录的是一个周期内所有桢的左声道样本,再记录右声 道样本,数据是以连续通道的方式存储。不过多数情况下,我们只需要使用交错 模式就可以了。
明白了各参数含义及关系后,我们开始设置参数: 
</pre><pre name="code" class="cpp">int bit_per_sample; //样本长度(bit)  
int period_size; //周期长度(桢数) <span style="font-family: 'Microsoft YaHei', 'Helvetica Neue', SimSun; text-indent: 2em;"> int chunk_byte; //周期长度(字节数)</span>
<span style="text-indent: 2em; font-family: 'Microsoft YaHei', 'Helvetica Neue', SimSun;">snd_pcm_hw_params_t *params; //定义参数变量 </span>
 <span style="text-indent: 2em; font-family: 'Microsoft YaHei', 'Helvetica Neue', SimSun;">bool device_setparams(){  snd_pcm_hw_params_t *hw_params;</span>
</pre><pre name="code" class="cpp">snd_pcm_hw_params_malloc (&hw_params); //为参数变量分配空间  
 
snd_pcm_hw_params_malloc (¶ms);
snd_pcm_hw_params_any ( pcm_handle, hw_params ); //参数初始化  
snd_pcm_hw_params_set_access ( pcm_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); //设置为交错模式
snd_pcm_hw_params_set_format( pcm_handle, hw_params, SND_FORMAT_S16_LE); //使用用16位样本
snd_pcm_hw_params_set_rate_near( pcm_handle, hw_params, 44100, 0); //设置采样率为44.1KHz
snd_pcm_hw_params_set_channels( pcm_handle, hw_params, 2); //设置为立体声  
snd_pcm_hw_params_get_period_size( hw_params, &period_size); //获取周期长度  
bit_per_sample = snd_pcm_hw_format_physical_width( hw_params.format ); //获取样本长度
chunk_byte = period_size * bit_per_sample * hw_params.channels / 8; //计算周期长度(字节数(bytes) = 每周期的桢数 * 样本长度(bit) * 通道数 / 8 )
snd_pcm_hw_params( pcm_handle, hw_params); //设置参数  params = hw_params; //保存参数,方便以后使用
snd_pcm_hw_params_free( hw_params); //释放参数变量空间  
return true;  
}



例程实例见:http://blog.csdn.net/evilcode/article/details/7594328

转载:http://blog.csdn.net/sepnic/article/details/6140824

原作者blog地址:http://blog.csdn.net/sepnic/   





你可能感兴趣的:(Alsa是Linux高级音频接口(百度文库无下载券抄来的))