当前位置: 首页 > news >正文

ALSA基础知识总结

1. ALSA主要流程

  1. 创建snd_card的实例

  2. 初始化snd_card的成员变量

  3. 创建声卡的逻辑设备,例如PCM、Control

  4. 向系统注册snd_card

2. PCM逻辑设备

2.1 PCM设备的主要功能

  • playback:将用户程序发来的PCM数据进行D/A转换

  • capture: 将麦克风或其他输入源的模拟型号进行A/D转换

2.2 snd_card与pcm关系

  • 一个snd_card实例可以包含多个pcm实例

  • 一个pcm实例有一个playback流和一个cpature流组成

  • playback流由一个或则多个substreams组成

  • capture流由一个或则多个substreams组成

2.3 snd_pcm结构体

2.3.1 snd_pcm结构体:

structsnd_pcm{structsnd_card*card;//所属声卡structlist_healist;intdevice;/* pcm设备的编号 */...charid[64];charname[80];//streams[0]为playback(播放)//streams[1]为capture(录音)structsnd_pcm_strstreams[2];...};

2.3.2 snd_pcm_str的结构体

structsnd_pcm_str{/* 0为playback,1为capture */intstream;structsnd_pcm*pcm;/* -- substreams -- */unsignedintsubstream_count;//substreams的个数unsignedintsubstream_opened;structsnd_pcm_substream*substream;//子流...structdevicedev;};

2.3.3 snd_pcm_substream的结构体

structsnd_pcm_substream{structsnd_pcm*pcm;structsnd_pcm_str*pstr;void*private_data;/* copied from pcm->private_data */intnumber;/* 子流编号 */charname[32];/* substream name */intstream;/* stream (direction) */size_tbuffer_bytes_max;/* limit ring buffer size */structsnd_dma_bufferdma_buffer;size_tdma_max;/* 由具体驱动设置ops */conststructsnd_pcm_ops*ops;/* pcm设备运行时的信息 */structsnd_pcm_runtime*runtime;...structsnd_pcm_substream*next;// 指向下一个子流};
  • 其中的ops字段用于操作对应的设备,它可以由驱动程序调用snd_pcm_set_ops()函数来设置

  • runtime字段用于记录重要的软件和硬件运行环境和参数

2.3.4 snd_pcm挂到snd_card下

pcm注册时,会得到一个次设备号,根据这个次设备号,记录到对应的snd_minor数组中。

操作函数替换的主要逻辑如下伪代码所示:

unsignedintminor=iminor(inode);structsnd_minor*mptr=NULL;conststructfile_operations*new_fops;if(minor>=ARAY_SIZE(snd_minors))return-ENODEV;//以次设备号为下标在snd_minors数组中找到对应的snd_minormptr=snd_minors[minor];...//从snd_minor得到file_operationsnew_fops=fops_get(mptr->f_ops);...//替换原来的file_operationsreplace_fops(file,new_fops);if(file->f_op->open)err=file->f_op->open(inode,file);

整个过程就是,声卡驱动程序会注册声卡(这只是一个实例,相当于虚拟的设备?用于连接各逻辑设备),然后将对应的pcm设备等的ops设置好。

http://www.cnnetsun.cn/news/462616.html

相关文章:

  • MCEdit 2.0地图编辑器:3大核心功能解析与实战应用
  • 如何快速掌握网页长截图:Chrome扩展的终极完整指南
  • 楼层设备系统架构标准:楼宇运维中ICT设施稳定性的底层支撑
  • Supabase替代Firebase:AI配置Auth与Storage模块
  • 【VSCode加载提速终极指南】:揭秘9大卡顿元凶及优化策略
  • 5个Applite性能调优技巧:让你的macOS软件管理快如闪电
  • 网页完整截图解决方案:告别传统截图的局限性
  • RxJS操作符选型:AI推荐map与switchMap使用时机
  • 老旧Mac系统兼容性升级完整指南:从发现问题到完美运行
  • KLayout版图设计工具实战指南:从环境搭建到高效应用
  • OpenCore Legacy Patcher终极指南:让老款Mac重获新生的免费神器
  • JWT令牌设计缺陷?VibeThinker指出签名泄露风险
  • AMD Ryzen SDT调试工具:释放处理器性能潜力的终极武器
  • 如何快速将PNG转换为SVG:图像矢量化的完整指南
  • MCEdit 2.0地图编辑神器:从零开始打造你的专属Minecraft世界
  • Chrome全页截图插件:智能捕获网页完整内容
  • Mapshaper:地理数据处理的神器,零基础也能轻松上手
  • WorkshopDL使用全攻略:轻松下载Steam创意工坊模组
  • 网站普查监测、对标诊断主要包含哪些方面
  • YuukiPS启动器:原神多账号管理与网络优化全攻略
  • 关于sdk测试,这些你都知道吗?
  • 模型元素太多看花眼?,一文掌握VSCode过滤黑科技
  • DockDoor 终极指南:macOS窗口预览与快速切换神器
  • Chrome全页截图终极指南:一键保存完整网页的免费神器
  • 终极免费!一键搞定完整网页长截图解决方案
  • 如何快速掌握Sketch MeaXure:设计师必备的智能标注工具终极指南
  • 仅限内部分享:VSCode云端智能体会话的5个隐藏功能
  • 突破限制!ncmdumpGUI网易云音乐NCM文件完美解密指南
  • 终极Dock增强工具:macOS窗口管理神器完全指南
  • 终极指南:如何免费解锁WeMod专业版完整功能