【004_音频开发_基础篇_ALSA插件使用】

server/2024/9/23 9:34:36/

ALSA_0">004_音频开发_基础篇_ALSA插件使用

文章目录

  • 004_音频开发_基础篇_ALSA插件使用
    • 创作背景
    • `/etc/asound.conf` 示例分析

创作背景

学历代表过去、能力代表现在、学习力代表将来。 一个良好的学习方法是通过输出来倒逼自己输入。写博客既是对过去零散知识点的总结和复盘,也是参加了 零声教育 写博客活动。

零声教育体验课:https://xxetb.xetslk.com/s/3fbO81

本文是开发过程中的知识点总结,供大家学习交流使用,如有任何错误或不足之处,请在评论区指出。

/etc/asound.conf 示例分析

如下为我的设备的 ALSA 配置文件:

defaults.pcm.rate_converter "speexrate_medium"pcm.!default{type plugslave.pcm "softvol"slave.rate 48000# slave.pcm both
}ctl.!default{type hwcard 0
}pcm.softvol {type softvol# slave.pcm "rate_convert_to_48k"# slave.pcm "both"slave.pcm "dmixer_loopback"# slave.pcm pcm_out1_filecontrol {name "Master"card 0}min_dB -32.0max_dB 0.0resolution 100
}pcm.rate_convert_to_48k {type rate# slave.pcm "dmixer_loopback"slave.pcm "both"slave.rate 48000converter "speexrate_medium"
}pcm.dmixer_loopback {type dmixipc_key 556670slave {pcm "hw:Loopback,0,0"period_time 0period_size 1024buffer_size 8192rate 48000format S32_LE}
}ctl.dmixer_loopback {type hwcard Loopback
}pcm.loopback_capture {type hwcard Loopbackdevice 1subdevice 0
}pcm.audio_processing  {type asymplayback.pcm "both_plug"capture.pcm "loopback_capture"
}pcm.pcm_out1_file {type fileslave.pcm "both"file "/data/pcm-%r-%c-%b-%f.wav" format "wav"
}pcm.both_plug {type plugslave.pcm "both"
}pcm.both {type routeslave.pcm {type multislaves {a.pcm "hw:0,1"b.pcm "hw:0,3"a.channels 2b.channels 2}bindings {0.slave a0.channel 01.slave a1.channel 12.slave b2.channel 03.slave b3.channel 1}}ttable.0.0 1ttable.1.1 1ttable.0.2 1ttable.1.3 1
}pcm.dmixer_out_i2s {type dmixipc_key 8459ipc_key_add_uid trueslave {pcm "hw:0,1"format S32_LE}
}pcm.dmixer_out_spdif {type dmixipc_key 6532ipc_key_add_uid trueslave {pcm "hw:0,3"format S32_LE}
}

默认设备/默认控制器/plug插件

pcm.!default{type plugslave.pcm "softvol"slave.rate 48000# slave.pcm both
}ctl.!default{type hwcard 0
}
  • 第一部分定义了默认的 PCM(音频输出)设备。使用了一个插件类型为 plugPCM 设备,用于对其他 PCM 设备进行包装和处理。指定了子 PCM 设备为 softvol,同时设置了音频采样率为 48000 Hz
  • 第二部分定义了默认的控制设备。指定了控制设备的类型为硬件(hw),并将 card 设定为 0。这表示默认的控制设备将使用系统中的第一个硬件设备作为其 card

softvol__164">softvol 插件

pcm.softvol {
type softvol
# slave.pcm “rate_convert_to_48k”
# slave.pcm “both”
slave.pcm “dmixer_loopback”
# slave.pcm pcm_out1_file
control {
name “Master”
card 0
}
min_dB -32.0
max_dB 0.0
resolution 100
}

  • 定义了一个名为 softvolPCM 设备。用软件音量控制的插件 softvol
  • 注释的 # slave.pcm "rate_convert_to_48k" 把音频传入到 rate_convert_to_48k 虚拟设备,进行采样率转换(需要时使用)。
  • 注释的 # slave.pcm "both" 直接输出到 both 虚拟设备,both 再路由到 2 个物理声卡设备。
  • slave.pcm "dmixer_loopback" 输出到 loopback 虚拟声卡设备,供应用程序从 loopback 再次读出。
  • # slave.pcm pcm_out1_file 用于把音频直接写入到文件。
  • 控制设备的名称为 "Master"card 设定为 0。音量范围从 -32.0 分贝到 0.0 分贝,总共 16级,分辨率为 100(默认的设置范围为 0-255, 根据项目修改)。
  • 这个插件在系统启动后,不会马上自动创建,需要使用声卡的时候,才创建,所以在用 Master 控制音量前要先打开一下声卡。

采样率转换插件

pcm.rate_convert_to_48k {type rate# slave.pcm "dmixer_loopback"slave.pcm "both"slave.rate 48000converter "speexrate_medium"
}
  • 这个部分定义了一个名为 rate_convert_to_48kPCM 设备,用于进行音频采样率的转换。
  • 用了一个 rate 类型的插件。设置了音频采样率为 48000 Hz,指定了转换算法为 speexrate_medium
pcm.both {type routeslave.pcm {type multislaves {a.pcm "hw:0,1"b.pcm "hw:0,3"a.channels 2b.channels 2}bindings {0.slave a0.channel 01.slave a1.channel 12.slave b2.channel 03.slave b3.channel 1}}ttable.0.0 1ttable.1.1 1ttable.0.2 1ttable.1.3 1
}pcm.dmixer_out_i2s {type dmixipc_key 8459ipc_key_add_uid trueslave {pcm "hw:0,1"format S32_LE}
}pcm.dmixer_out_spdif {type dmixipc_key 6532ipc_key_add_uid trueslave {pcm "hw:0,3"format S32_LE}
}

定义了一个名为 bothPCM 设备,它是一个路由 (route) 类型的 PCM 设备。
它的作用是将音频数据路由到2个硬件设备上。
在这个配置中,使用了一个多声道 (multi) 类型的 slave.pcm,指定了两个子 PCM 设备:hw:0,1hw:0,3,分别对应着系统中的两个硬件设备。每个子 PCM 设备都配置了两个声道 (channels),分别为 2bindings 部分定义了声道的路由关系,比如第一个声道 (0.channel) 从第一个子 PCM 设备 (a) 的第一个声道 (0.slave a) 获取音频数据,第二个声道 (1.channel) 从第一个子 PCM 设备 (a) 的第二个声道 (1.slave a) 获取音频数据,以此类推。ttable 部分定义了混音比例,例如 ttable.0.0 1 表示第一个声道的输出比例为 1

pcm.audio_processing

pcm.audio_processing  {type asymplayback.pcm "both_plug"capture.pcm "loopback_capture"
}

这部分定义了一个名为 audio_processingPCM 设备,它是一个异步 (asym) 设备。异步设备允许单独配置播放和捕获功能。在这个配置中,设置了播放音频数据传递给 both_plug PCM 设备,即将处理后的音频数据输出到 both_plug 设备。捕获音频数据来自于 loopback_capture PCM 设备,即从 loopback_capture 设备捕获音频数据进行处理。这样可以对输入和输出音频进行分开的处理和配置。


http://www.ppmy.cn/server/35762.html

相关文章

Vue学习笔记

Vue可以提升开发体验,因为它是组件化开发,复用性比较高 Vue 可以列表渲染,可以一次性渲染出来 Vue>react>Angular Vue是渐进式框架(逐渐增强的),简单复杂的页面都可以胜任 Vue是一个框架&#xf…

算法提高之股票买卖 V

算法提高之股票买卖 V 核心思想&#xff1a;状态机 一共有三种情况 &#xff1a; 空仓&#xff0c;持仓&#xff0c;冻结期f[i,j]表示第i天的状态j状态计算&#xff1a; 如下 #include <iostream>#include <cstring>#include <algorithm>using namespace …

linux命令行与shell脚本大全——学习笔记(7-8章)

第7章 理解Linux文件权限 用户、用户组、其他用户 用户权限是通过创建用户时分配的用户 ID&#xff08;user ID&#xff0c;UID&#xff09;来跟踪的。UID 是个数值&#xff0c;每个 用户都有一个唯一的 UID。但用户在登录系统时是使用登录名&#xff08;login name&#xff…

OceanBase 缺少 dbms_obfuscation_toolkit.md5 包函数的解决方案

因为 dbms_obfuscation_toolkit.md5 是一个 Oracle 不推荐继续使用的函数&#xff0c;所以 OceanBase 没有对其兼容&#xff0c;取而代之的是兼容了 dbms_crypto.hash&#xff0c;其用法详见这篇 KB 但是&#xff0c;并不是所有业务都接受修改源码&#xff0c;因为复杂系统里&…

如何利用IPIDEA代理IP优化数据采集效率?

一、 前言二、 IPIDEA介绍三、体验步骤四、实战训练五、结语 一、 前言 在全球化与信息化交织的当代社会&#xff0c;数据已成为驱动商业智慧与技术革新的核心引擎。网络&#xff0c;作为信息汇聚与交流的枢纽&#xff0c;不仅是人们获取知识的窗口&#xff0c;更是商业活动与技…

开发Web3 ETF的技术难点

开发Web3 ETF&#xff08;Exchange-Traded Fund&#xff0c;交易所交易基金&#xff09;软件时&#xff0c;需要注意以下几个关键问题。开发Web3 ETF软件是一个复杂的过程&#xff0c;涉及到金融、法律和技术多个领域的专业知识。开发团队需要综合考虑上述问题&#xff0c;以确…

15_Scala面向对象编程_访问权限

文章目录 Scala访问权限1.同类中访问2.同包不同类访问3.不同包访问4.子类权限小结 Scala访问权限 知识点概念 private --同类访问private[包名] --包私有&#xff1b; 同类同包下访问protected --同类&#xff0c;或子类 //同包不能访问(default)(public)默认public --公…

[Algorithm][BFS][最短路问题][迷宫中离入口最近的出口][最小基因变化][单词接龙][为高尔夫比赛砍树]详细讲解

0.原理讲解 最短路径是图里的常见问题本专题主要讲解边权为一的最短路问题 边权全都相同即可&#xff0c;并非只能为一 方法&#xff1a;从起点开始&#xff0c;来一次BFS即可如何找出最短路径是多长呢&#xff1f; 拓展的层数&#xff0c;就是最短路的长度 1.迷宫中离入口最…