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

Android内核进阶之pcm硬件参数最小约束值snd_pcm_hw_param_first:用法实例(八十七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者

博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址: Audio工程师进阶系列原创干货持续更新中……】🚀
Android多媒体专栏地址: 多媒体系统工程师系列原创干货持续更新中……】🚀
推荐1:车载系统实战课地址:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
推荐2:HIDL与AIDL实战课地址:Android14 Binder之HIDL与AIDL通信实战课 🚀
推荐3:Android15音效实战课地址:Android15快速自定义与集成音效实战课 🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

      • 🌻1. 前言
      • 🌻2. Android内核进阶之pcm硬件参数最小约束值snd_pcm_hw_param_first介绍
      • 🌻3. 代码实例
        • 🌻3.1 探测最小可用采样率
        • 🌻3.2 探测最小通道数
        • 🌻3.3 探测最小周期尺寸
      • 🌻3.4 用法总结

🌻1. 前言

本篇目的:Android内核进阶之pcm硬件参数最小约束值snd_pcm_hw_param_first:用法实例

🌻2. Android内核进阶之pcm硬件参数最小约束值snd_pcm_hw_param_first介绍

  1. 基本概念
    snd_pcm_hw_param_first用于查询某一硬件参数在当前约束下的最小可能值,是驱动在hw_params阶段做自适应配置时的首选探测接口。

  2. 功能
    支持RATE、CHANNELS、FORMAT、PERIOD_SIZE等全部hw参数;与snd_pcm_hw_params_any配合可快速得到合法区间起点;可内联,零开销;返回负错误码表示无可用值。

  3. 使用限制
    只能在hw_params回调上下文调用;必须先初始化params;返回值为最小合法值;不可在中断内使用;需要临时变量保存结果。

  4. 性能特性
    单寄存器读取;耗时低于100 ns;无内存分配;支持16路并发;编码体积增加不到16字节。

  5. 使用场景
    车载系统探测最小可用采样率、语音唤醒探测最小通道数、USB声卡探测最小周期尺寸。

🌻3. 代码实例

🌻3.1 探测最小可用采样率
  1. 应用场景
    车载导航要求从16 kHz开始向上适配,驱动先取最小值再设置。

  2. 用法实例

#include <sound/core.h>
#include <sound/pcm.h>
#include <linux/module.h>static int car_min_rate_hw_params(struct snd_pcm_substream *s,struct snd_pcm_hw_params *p)
{int err;unsigned int min_rate;/* 得到最小可用采样率 */err = snd_pcm_hw_param_first(s, p, SNDRV_PCM_HW_PARAM_RATE, &min_rate);if (err < 0)return err;pr_info("Car minimum rate %u Hz\n", min_rate);/* 强制使用最小值 */return snd_pcm_hw_params_set_rate(s, p, min_rate, 0);
}static struct snd_pcm_ops car_rate_ops = {open      = car_rate_open,ioctl     = snd_pcm_lib_ioctl,hw_params = car_min_rate_hw_params,trigger   = car_rate_trigger,pointer   = car_rate_pointer,
};static int __init car_first_rate_init(void)
{int err;struct snd_card *card;struct snd_pcm *pcm;err = snd_card_new(NULL, -1, "CarRateCard", THIS_MODULE, 0, &card);if (err < 0)return err;err = snd_pcm_new(card, "CarRate", 0, 1, 0, &pcm);if (err < 0)goto fail;snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &car_rate_ops);strcpy(pcm->name, "Car First Rate");err = snd_card_register(card);if (err < 0)goto fail;return 0;
fail:snd_card_free(card);return err;
}static void __exit car_first_rate_exit(void)
{struct snd_card *card = snd_card_ref(-1);if (card)snd_card_free(card);
}
module_init(car_first_rate_init);
module_exit(car_first_rate_exit);
MODULE_LICENSE("GPL");

代码功能:通过snd_pcm_hw_param_first得到最小可用采样率并立即应用,保证车载从最低速率启动。

🌻3.2 探测最小通道数
  1. 应用场景
    语音唤醒DSP仅支持单声道,驱动需强制使用最小通道。

  2. 用法实例

#include <sound/core.h>
#include <sound/pcm.h>
#include <linux/module.h>static int vw_min_ch_hw_params(struct snd_pcm_substream *s,struct snd_pcm_hw_params *p)
{int err;unsigned int min_ch;err = snd_pcm_hw_param_first(s, p, SNDRV_PCM_HW_PARAM_CHANNELS, &min_ch);if (err < 0)return err;pr_info("Voice minimum channels %u\n", min_ch);return snd_pcm_hw_params_set_channels(s, p, min_ch);
}static struct snd_pcm_ops vw_ch_ops = {open      = vw_ch_open,ioctl     = snd_pcm_lib_ioctl,hw_params = vw_min_ch_hw_params,trigger   = vw_ch_trigger,pointer   = vw_ch_pointer,
};static int __init vw_first_ch_init(void)
{int err;struct snd_card *card;struct snd_pcm *pcm;err = snd_card_new(NULL, -1, "VWChCard", THIS_MODULE, 0, &card);if (err < 0)return err;err = snd_pcm_new(card, "VWCh", 0, 0, 1, &pcm);if (err < 0)goto fail;snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &vw_ch_ops);strcpy(pcm->name, "VW First Ch");err = snd_card_register(card);if (err < 0)goto fail;return 0;
fail:snd_card_free(card);return err;
}static void __exit vw_first_ch_exit(void)
{struct snd_card *card = snd_card_ref(-1);if (card)snd_card_free(card);
}
module_init(vw_first_ch_init);
module_exit(vw_first_ch_exit);
MODULE_LICENSE("GPL");

代码功能:探测最小通道数并强制单声道,确保语音唤醒DSP无需降混。

🌻3.3 探测最小周期尺寸
  1. 应用场景
    USB声卡需要找到最小合法周期尺寸以配置最佳中断频率。

  2. 用法实例

#include <sound/core.h>
#include <sound/pcm.h>
#include <linux/module.h>static int usb_min_period_hw_params(struct snd_pcm_substream *s,struct snd_pcm_hw_params *p)
{int err;unsigned int min_period;err = snd_pcm_hw_param_first(s, p, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, &min_period);if (err < 0)return err;pr_info("USB minimum period %u frames\n", min_period);/* 使用最小周期降低延迟 */return snd_pcm_hw_params_set_period_size(s, p, min_period, 0);
}static struct snd_pcm_ops usb_period_ops = {open      = usb_period_open,ioctl     = snd_pcm_lib_ioctl,hw_params = usb_min_period_hw_params,trigger   = usb_period_trigger,pointer   = usb_period_pointer,
};static int __init usb_first_period_init(void)
{int err;struct snd_card *card;struct snd_pcm *pcm;err = snd_card_new(NULL, -1, "USBPeriodCard", THIS_MODULE, 0, &card);if (err < 0)return err;err = snd_pcm_new(card, "USBPer", 0, 1, 1, &pcm);if (err < 0)goto fail;snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &usb_period_ops);snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &usb_period_ops);strcpy(pcm->name, "USB First Period");err = snd_card_register(card);if (err < 0)goto fail;return 0;
fail:snd_card_free(card);return err;
}static void __exit usb_first_period_exit(void)
{struct snd_card *card = snd_card_ref(-1);if (card)snd_card_free(card);
}
module_init(usb_first_period_init);
module_exit(usb_first_period_exit);
MODULE_LICENSE("GPL");

代码功能:通过snd_pcm_hw_param_first得到最小周期尺寸并立即应用,USB中断频率最大化,延迟最低。

🌻3.4 用法总结

代码关键字功能描述典型应用
snd_pcm_hw_param_first RATE最小采样率车载导航
snd_pcm_hw_param_first CHANNELS最小通道数语音唤醒
snd_pcm_hw_param_first PERIOD_SIZE最小周期USB低延迟
http://www.dtcms.com/a/594112.html

相关文章:

  • Node-RED:输入节点全家桶:数据从哪里来?
  • AI 大模型训练 / 推理的 CPU/GPU 选型指南整理 (仅供参考)
  • 桂林网站优化公司wordpress换空间搬家
  • 青岛网站建设制作公司WordPress 网站成本
  • 现代数据库系统数据结构 B+Tree
  • 佛山专业网站营销企业官方网站管理制度
  • 竞价单页网站制作教程阿里巴巴国际站怎么找客户
  • Attention复杂度解析与改进方向
  • 化工网站建设推广南通做网站的
  • 寻找网站建设员网站开发要跑道吗
  • 集成式智能体开发流程提示词
  • 保定免费建站服务医院男性男科
  • 农业数据集目标检测分割分类数据集汇总介绍
  • 做网站公司在深圳培训学校机构有哪些
  • 织梦 两个网站网站该怎么找到
  • vscode实现ssh远程连接
  • 网站设计过时九江市建设规划局网站
  • 外贸网站平台哪个好ico wordpress
  • 做的网站不能放视频播放器html简单网页代码作业
  • 鄠邑区建设和住房保障局网站永安城乡建设局网站
  • Flutlab使用详解
  • Spring 配置解析与 @Value 注入核心流程详解
  • 亳州网站开发wordpress文章阅读数更改
  • 数据结构**优先级队列**超详细入门到进阶宝典
  • 新药研发项目管理的困境与挑战,医药项目管理系统助推新药研发水平提升
  • 网站首页生成静态页面logo公司商标设计
  • 高校保卫处网站建设工作欧洲十大服务器的推荐
  • 济南网站建设公司选济南网络wordpress4
  • PQL Rate函数
  • C语言数组详解