引言

上文ALSA音频架构 – snd_pcm_open函数分析已经获取了aplay中对应的播放API writei_func = snd_pcm_writei;,本文将具体分析该API在哪里调用。

aplay处理数据流顺序图

代码详细分析

1、对参数进行解析,存储在全局变量hwparams,配置回调writei_func = snd_pcm_writei;
2、调用snd_pcm_open打开PCM设备,将回调关联具体的写入接口snd_pcm_hw_writei
3、调用playback根据文件类型选择具体的播放API,本文以PCM数据流为例,所以具体的接口为playback_raw
4、playback_raw对具体的数据进行解析
playback_raw的函数原型如下

static int playback_raw(char *name, int *loaded)
{init_raw_data();pbrec_count = calc_count();playback_go(fd, *loaded, pbrec_count, FORMAT_RAW, name);return 0;
}

playback_raw主要完成的工作
调用calc_count获取数据流大小
调用playback_go进行具体的操作

5、playback_go首先会调用set_params进行具体的参数配置,然后调用pcm_write进行写入数据流
set_params主要设置了播放的数据流的文件格式、通道数、采样率等,函数原型如下

static void set_params(void)
{snd_pcm_hw_params_t *params;snd_pcm_sw_params_t *swparams;snd_pcm_uframes_t buffer_size;int err;size_t n;unsigned int rate;snd_pcm_uframes_t start_threshold, stop_threshold;snd_pcm_hw_params_alloca(&params); // 分配结构体snd_pcm_hw_params_t snd_pcm_sw_params_alloca(&swparams);err = snd_pcm_hw_params_any(handle, params);...err = snd_pcm_hw_params_set_access(handle, params,  // 设置存取权限SND_PCM_ACCESS_RW_INTERLEAVED);...err = snd_pcm_hw_params_set_format(handle, params, hwparams.format);  // 设置文件格式if (err < 0) {error(_("Sample format non available"));show_available_sample_formats(params);prg_exit(EXIT_FAILURE);}err = snd_pcm_hw_params_set_channels(handle, params, hwparams.channels);  // 设置通道数if (err < 0) {error(_("Channels count non available"));prg_exit(EXIT_FAILURE);}rate = hwparams.rate;err = snd_pcm_hw_params_set_rate_near(handle, params, &hwparams.rate, 0);  // 设置码率
...
err = snd_pcm_hw_params(handle, params);
...
snd_pcm_hw_params_get_period_size(params, &chunk_size, 0);
snd_pcm_hw_params_get_buffer_size(params, &buffer_size);  // 获取一个周期有多少帧数据

pcm_write调用函数指针writei_funcsnd_pcm_hw_writei完成数据流的写入,函数原型如下

static ssize_t pcm_write(u_char *data, size_t count)
{...while (count > 0 && !in_aborting) {if (test_position)do_test_position();check_stdin();r = writei_func(handle, data, count); //写入数据...}
}

至此aplay的播放在用户空间层面的操作已经完成,接下来即进入驱动层进行具体的操作。

aplay的播放流程

1、snd_pcm_open通过SND_PCM_STREAM_PLAYBACK打开设备获取snd_pcm_t句柄
2、snd_pcm_hw_params_alloca分配snd_pcm_hw_params_t PCM设备属性
3、snd_pcm_hw_params_any 初始化PCM设备属性
4、snd_pcm_hw_params_set_access设置存取权限
5、snd_pcm_hw_params_set_format设置格式
6、snd_pcm_hw_params_set_channels设置通道
7、snd_pcm_hw_params_set_rate_near设置码率
8、snd_pcm_hw_paramssnd_pcm_hw_params_t PCM设备属性回写设备
9、snd_pcm_hw_params_get_period_size获取每周期的数据帧数
10、snd_pcm_writei按帧写入数据
11、snd_pcm_drainsnd_pcm_close关闭PCM设备

ALSA音频架构 -- aplay播放流程分析相关推荐

  1. ALSA音频架构 -- snd_pcm_open函数分析

    引言 alsa-lib主要是给抽象出来的一套ALSA应用程序的用户空间库,供具体的应用程序调用.alsa-utils 主要是相关的操作APP,可以充当官方demo,供开发人员参考.前文已经给出ALSA ...

  2. 嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得

    **************************************************************************************************** ...

  3. alsa音频架构2-ASoc

    设计ASoc的目的是为嵌入式系统片上处理器音频单元或外部的音频解码芯片提供更好的ALSA支持 ASoC有多个组件组成snd_soc_platform/snd_soc_codec/snd_soc_dai ...

  4. arecord录制音频和aplay播放音频用法说明

    目录 前言 二.选项说明 1.arecord 2.aplay 三.举例 总结 前言 之前为了测试linein功能,用到了arecord和aplay命令,特此记录总结. 一.命令格式 录制音频Usage ...

  5. 声卡设备alsa音频架构1

    最近研讨声卡设备,稍微总结一下,后以继续补充: 第一分部 alsa子系统症结构结体对象等 1.声卡设备类型定义 #define SNDRV_DEV_TOPLEVEL ((__force snd_dev ...

  6. ALSA音频架构之声卡设备信息

    alsa基础知识 安卓中alsa源码路径:external\tinyalsa\ 使用mm编译生成五个小工具和一个so库. 工具生成/system/bin/中: tinycap tinyhostless ...

  7. linux音频时钟bclk,linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系

    转:https://blog.csdn.net/lugandong/article/details/72468831 一. 拿512fs说话: 看图知道采样的位深是32bit(位),左右声道各占了8* ...

  8. VLC架构及流程分析

    0x00 前置信息 VLC是一个非常庞大的工程,我从它的架构及流程入手进行分析,涉及到一些很细的概念先搁置一边,日后详细分析. 0x01 源码结构(Android Java相关的暂未分析) # bui ...

  9. ALSA音频工具amixer,aplay,arecord

    ALSA音频工具amixer,aplay,arecord http://www.cnblogs.com/cslunatic/p/3227655.html ALSA音频工具编译安装 ========== ...

  10. Linux ALSA音频框架分析五:HDA Driver分析

    Linux ALSA音频框架分析五:HDA Driver分析 一 概述 HDA(High Definition Audio)是intel设计的用来取代AC97的音频标准,硬件架构上由hda dodec ...

最新文章

  1. 【Postgresql】触发器某个字段更新时执行,行插入或更新执行
  2. 【RxSwift】flatMapLatest、 Error事件中断序列
  3. python easygui_极客养成记/Python一点也不难/第四节
  4. react-native在windows环境下的项目启动
  5. 容器:开启应用微观时代
  6. mysql初体验学习笔记_【MySQL】mycli初体验
  7. 如何在Linux中找到您的IP地址
  8. HDFS Shell基本操作总结
  9. 拉普拉斯算子属于卷积方法吗_论文笔记 - 图卷积神经网络综述
  10. 一年太久,研究员决定不等补丁直接披露 Safari 0day 详情
  11. python入门教程pdf-《python基础教程第三版》高清版PDF免费下载
  12. 算法设计与分析第四章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
  13. excel转置怎么操作_数据粘贴只会Ctrl+C就out了,五种选择性粘贴方法,让操作更高效...
  14. pbs转换html,pbs 脚本实例说明.docx
  15. 关于SMP IRQ affinity
  16. 使用Manjaro作为OpenStreetMap瓦片服务器
  17. 主板各种插针接口与机箱(电源)的接法
  18. 计算机主机版最重要的部件,电脑配件中到底哪个最为重要
  19. 守望者的逃离(贪心,动态规划)
  20. 有创意的LED电子骰子

热门文章

  1. 自制的一个小地图生成器
  2. tplink迷你路由器中继模式_tplink迷你型无线路由器怎么中继模式
  3. Silvaco Vcsel example01 解析
  4. 群雄逐鹿,AI如何落地刷脸支付
  5. 2021-2027全球与中国兽医临床试验业务市场现状及未来发展趋势
  6. css垂直居中怎么设?文字上下居中和图片垂直居中
  7. 机器人潘森护盾_新版潘森无伤抗塔 E技能护盾机制全解析
  8. 网络爬虫——超级鹰源码下载
  9. linux xps文件,Master PDF:PDF和XPS文件编辑神器
  10. android dex文件是什么,关于android:apk文件中classes.dex文件的作用