linux下ALSA API采集声音遇到的坑

alsa 的api网上一大把,昨天抄了个抓取程序放在自己的程序中,一读数据就崩溃,折腾了好久


alsa 声卡数据抓取函数原型:
snd_pcm_sframes_t snd_pcm_readi (snd_pcm_t * pcm,  const void * buffer,    snd_pcm_uframes_t size);

调用如下:
      #define  FRAME_SIZE 160
      uint8_t buf[FRAME_SIZE*4];
    snd_pcm_readi (pcm,  buf,   sizeof(buf));  ----调用后,程序挂掉

        后来:
      #define  FRAME_SIZE 160
      uint8_t buf[FRAME_SIZE*4*100];
    snd_pcm_readi (pcm,  buf,  FRAME_SIZE*4);  ----调用后,程序OK了, 显然与缓冲区有关系, 百思不得其解

早上来, 继续郁闷。 偶然看看函数原型, 发现了第三个参数:
       snd_pcm_uframes_t size        这个size不会是 frame_size吧?
      #define  FRAME_SIZE 160
      uint8_t buf[FRAME_SIZE*4];
    snd_pcm_readi (pcm,  buf, FRAME_SIZE);  ----调用后,程序OK了


再看: snd_pcm_sframes_t snd_pcm_writei (snd_pcm_t * pcm,   const void * buffer, snd_pcm_uframes_t size )
也是这样子

      

          

ALSA(Advanced Linux Sound Architecture)是Linux内核中的音频驱动框架,它提供了一套完整的音频处理流程,包括音频采集、音频处理和音频播放等功能。ALSA框架的设计目标是提供一个高效、灵活、可靠的音频处理框架,让开发人员能够方便地开发音频应用程序。 ALSA框架的核心包括以下几个组件: 1. 驱动程序:驱动程序是ALSA框架的核心组件,负责管理音频设备硬件,并提供音频数据输入输出的接口。ALSA驱动程序一般由硬件厂商或开源社区开发,可以通过内核模块的形式加载到Linux内核中。 2. 应用程序接口:ALSA框架提供了一套完整的应用程序接口,包括ALSA库和ALSA命令行工具。ALSA库提供了一组API,让开发人员能够方便地访问ALSA驱动程序提供的音频数据输入输出接口。ALSA命令行工具则提供了一组命令行工具,让用户能够方便地对音频设备进行配置和管理。 3. 中间件:ALSA框架还提供了一些中间件组件,如MIDI子系统、混音器子系统等,用于提供更高级的音频处理功能。 ALSA框架的音频处理流程如下: 1. 音频采集:当音频设备接收到音频信号时,ALSA驱动程序将音频信号采集到内存中,并通过DMA(直接内存访问)将音频数据写入音频缓冲区。 2. 音频处理:ALSA驱动程序将音频信号从音频缓冲区读取到内存中,然后对音频数据进行处理。音频处理包括音频格式转换、音频采样率转换、音频混音等处理。 3. 音频播放:ALSA驱动程序将处理后的音频数据从内存中读取到音频缓冲区,并通过DMA将音频数据传输到音频设备中进行播放。 总之,ALSA框架提供了一套完整的音频处理流程,让开发人员能够方便地开发音频应用程序,并提供了一组API和命令行工具,方便用户对音频设备进行配置和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值