编译方法
gcc -o main main.c -lasound
- 注: 这个程序必须链接到alsalib库,通过在编译时需要加上-lasound选项。有些alsa库函数使用dlopen函数以及浮点操作,所以您可能还需要加上-ldl,-lm选项。
alsa显示详细参数信息
#include <alsa/asoundlib.h>
int main()
{
int val;
printf("ALSA library version: %s\n",SND_LIB_VERSION_STR);
printf("\nPCM stream types:\n");
for (val = 0; val <= SND_PCM_STREAM_LAST; val++){
printf(" %s\n",snd_pcm_stream_name((snd_pcm_stream_t)val));
}
printf("\nPCM access types:\n");
for (val = 0; val <= SND_PCM_ACCESS_LAST; val++)
{
printf(" %s\n",snd_pcm_access_name((snd_pcm_access_t)val));
}
printf("\nPCM formats:\n");
for(val = 0; val <= SND_PCM_FORMAT_LAST; val++)
{
if(snd_pcm_format_name((snd_pcm_format_t)val)!= NULL)
{
printf(" %s (%s)\n",snd_pcm_format_name((snd_pcm_format_t)val),snd_pcm_format_description((snd_pcm_format_t)val));
}
}
printf("\nPCM subformats:\n");
for (val = 0; val <= SND_PCM_SUBFORMAT_LAST;val++)
{
printf(" %s (%s)\n",snd_pcm_subformat_name((snd_pcm_subformat_t)val),snd_pcm_subformat_description((snd_pcm_subformat_t)val));
}
printf("\nPCM states:\n");
for (val = 0; val <= SND_PCM_STATE_LAST; val++){
printf(" %s\n",snd_pcm_state_name((snd_pcm_state_t)val));
}
return 0;
}
alsa 播放音频代码
#include <alsa/asoundlib.h>
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
snd_pcm_uframes_t frames = 1024;//一个周期多少帧
snd_pcm_access_t access_mode = SND_PCM_ACCESS_RW_INTERLEAVED;//访问模式:交错访问
snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;//采样位数:16位,小端存储
int channel = 2;
unsigned int simple_rate = 44100;//采样率
//int dir;//设备采样率与输入采样的偏差
char *buffer = NULL;//缓冲区数据
int size;//缓冲区大小
int main()
{
/* 1. 打开pcm设备 */
int rc = snd_pcm_open(&handle, "default",SND_PCM_STREAM_PLAYBACK, 0);
if (rc < 0) {
printf("open device failed\n");
return 0;
}
/* 分配一个硬件参数对象 */
snd_pcm_hw_params_alloca(¶ms);
snd_pcm_hw_params_any(handle, params);/* 使用默认值填充参数对象. */
/* 设置硬件参数 */
snd_pcm_hw_params_set_access(handle, params,access_mode);/* 交错模式 Interleaved mode */
snd_pcm_hw_params_set_format(handle, params,format);/* 采样位数 Signed 16-bit little-endian format */
snd_pcm_hw_params_set_channels(handle, params, channel);/* 通道数 Two channels (stereo) */
snd_pcm_hw_params_set_rate_near(handle, params,&simple_rate, NULL);/* 采样率 44100 bits/second sampling rate (CD quality) */
snd_pcm_hw_params_set_period_size_near(handle,params, &frames, NULL);//设置一个周期的多少帧
rc = snd_pcm_hw_params(handle, params);/* 将设置好的参数写入驱动 */
if (rc < 0) {
printf("unable to set hw parameters: %s\n",snd_strerror(rc));
return 0;
}
do{
rc = snd_pcm_writei(handle, buffer, frames);
if( rc>0 && rc<frames ){
printf("short write\n");
}else if(rc == -EPIPE){
printf("underrun occurred\n");
snd_pcm_prepare(handle);
}else if (rc < 0){
printf("error from writei: %s\n",snd_strerror(rc));
break;
}
}while(1);
snd_pcm_drain(handle);
snd_pcm_close(handle);
}