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

Android内核进阶之设置硬件参数snd_pcm_hw_params:用法实例(八十五)

简介: 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内核进阶之设置硬件参数snd_pcm_hw_params介绍
      • 🌻3. 代码实例
        • 🌻3.1 设置车载固定48 kHz播放参数
        • 🌻3.2 设置语音唤醒16 kHz单声道参数
        • 🌻3.3 设置USB自适应高解析参数
      • 🌻3.4 用法总结

🌻1. 前言

本篇目的:Android内核进阶之设置硬件参数snd_pcm_hw_params:用法实例

🌻2. Android内核进阶之设置硬件参数snd_pcm_hw_params介绍

  1. 基本概念
    snd_pcm_hw_params是用户空间发起格式协商后内核驱动实际配置采样率、通道数、数据格式、缓冲周期的入口,决定后续DMA与时钟行为。

  2. 功能
    支持设置速率、通道、格式、中断周期、缓冲帧数;可约束最小最大范围;支持交错与非交错;与mmap缓冲自动对齐;支持幂次周期优化。

  3. 使用限制
    只能在hw_params回调上下文调用;需先snd_pcm_hw_params_any初始化;约束不可冲突;失败需返回负错误码;重新打开需重新设置。

  4. 性能特性
    配置耗时低于200微秒;与DMA寄存器写入同步;支持16路并发协商;内存拷贝零次;支持1 Hz精度速率调整。

  5. 使用场景
    车载系统固定48 kHz导航混音、语音唤醒强制16 kHz单声道、USB声卡自适应44.1 kHz到384 kHz高解析。

🌻3. 代码实例

🌻3.1 设置车载固定48 kHz播放参数
  1. 应用场景
    车载导航混音必须48 kHz,禁止用户空间修改。

  2. 用法实例

#include <sound/core.h>
#include <sound/pcm.h>
#include <linux/module.h>static int car_fix_hw_params(struct snd_pcm_substream *s,struct snd_pcm_hw_params *p)
{int err;/* 强制48kHz 16bit 2ch */err = snd_pcm_hw_params_set_rate(s, p, 48000, 0);if (err < 0)return err;err = snd_pcm_hw_params_set_format(s, p, SNDRV_PCM_FORMAT_S16_LE);if (err < 0)return err;err = snd_pcm_hw_params_set_channels(s, p, 2);if (err < 0)return err;/* 固定256帧周期 */err = snd_pcm_hw_params_set_period_size(s, p, 256, 0);if (err < 0)return err;return 0;
}static struct snd_pcm_ops car_fix_ops = {open      = car_fix_open,ioctl     = snd_pcm_lib_ioctl,hw_params = car_fix_hw_params,trigger   = car_fix_trigger,pointer   = car_fix_pointer,
};static int __init car_fix_params_init(void)
{int err;struct snd_card *card;struct snd_pcm *pcm;err = snd_card_new(NULL, -1, "CarFixCard", THIS_MODULE, 0, &card);if (err < 0)return err;err = snd_pcm_new(card, "CarFix", 0, 1, 0, &pcm);if (err < 0)goto fail;snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &car_fix_ops);strcpy(pcm->name, "Car Fix 48k");err = snd_card_register(card);if (err < 0)goto fail;return 0;
fail:snd_card_free(card);return err;
}static void __exit car_fix_params_exit(void)
{struct snd_card *card = snd_card_ref(-1);if (card)snd_card_free(card);
}
module_init(car_fix_params_init);
module_exit(car_fix_params_exit);
MODULE_LICENSE("GPL");

代码功能:用户空间无论请求何种格式,驱动强制设置为48 kHz 16bit 2ch,导航混音无需重采样。

🌻3.2 设置语音唤醒16 kHz单声道参数
  1. 应用场景
    低功耗DSP只支持16 kHz单声道,驱动层直接约束。

  2. 用法实例

#include <sound/core.h>
#include <sound/pcm.h>
#include <linux/module.h>static int vw_hw_params(struct snd_pcm_substream *s,struct snd_pcm_hw_params *p)
{int err;/* 强制16kHz 16bit 1ch */err = snd_pcm_hw_params_set_rate(s, p, 16000, 0);if (err < 0)return err;err = snd_pcm_hw_params_set_format(s, p, SNDRV_PCM_FORMAT_S16_LE);if (err < 0)return err;err = snd_pcm_hw_params_set_channels(s, p, 1);if (err < 0)return err;/* 128帧小周期降低延迟 */err = snd_pcm_hw_params_set_period_size(s, p, 128, 0);if (err < 0)return err;return 0;
}static struct snd_pcm_ops vw_ops = {open      = vw_open,ioctl     = snd_pcm_lib_ioctl,hw_params = vw_hw_params,trigger   = vw_trigger,pointer   = vw_pointer,
};static int __init vw_params_init(void)
{int err;struct snd_card *card;struct snd_pcm *pcm;err = snd_card_new(NULL, -1, "VWCard", THIS_MODULE, 0, &card);if (err < 0)return err;err = snd_pcm_new(card, "VWCap", 0, 0, 1, &pcm);if (err < 0)goto fail;snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &vw_ops);strcpy(pcm->name, "VW 16k");err = snd_card_register(card);if (err < 0)goto fail;return 0;
fail:snd_card_free(card);return err;
}static void __exit vw_params_exit(void)
{struct snd_card *card = snd_card_ref(-1);if (card)snd_card_free(card);
}
module_init(vw_params_init);
module_exit(vw_params_exit);
MODULE_LICENSE("GPL");

代码功能:无论用户请求何种格式,驱动强制16 kHz单声道,DSP侧无需二次转换。

🌻3.3 设置USB自适应高解析参数
  1. 应用场景
    USB声卡支持44.1 kHz到384 kHz,驱动根据用户请求自适应配置。

  2. 用法实例

#include <sound/core.h>
#include <sound/pcm.h>
#include <linux/module.h>static int usb_adap_hw_params(struct snd_pcm_substream *s,struct snd_pcm_hw_params *p)
{int err;/* 允许用户空间任意速率,驱动只约束范围 */err = snd_pcm_hw_params_set_rate_min(s, p, 44100, 0);if (err < 0)return err;err = snd_pcm_hw_params_set_rate_max(s, p, 384000, 0);if (err < 0)return err;/* 32bit浮点格式 */err = snd_pcm_hw_params_set_format(s, p, SNDRV_PCM_FORMAT_FLOAT_LE);if (err < 0)return err;/* 2ch立体声 */err = snd_pcm_hw_params_set_channels(s, p, 2);if (err < 0)return err;/* 512帧周期,适配高码率突发 */err = snd_pcm_hw_params_set_period_size(s, p, 512, 0);if (err < 0)return err;return 0;
}static struct snd_pcm_ops usb_adap_ops = {open      = usb_adap_open,ioctl     = snd_pcm_lib_ioctl,hw_params = usb_adap_hw_params,trigger   = usb_adap_trigger,pointer   = usb_adap_pointer,
};static int __init usb_adap_params_init(void)
{int err;struct snd_card *card;struct snd_pcm *pcm;err = snd_card_new(NULL, -1, "USBAdapCard", THIS_MODULE, 0, &card);if (err < 0)return err;err = snd_pcm_new(card, "USBAdap", 0, 1, 1, &pcm);if (err < 0)goto fail;snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &usb_adap_ops);snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &usb_adap_ops);strcpy(pcm->name, "USB Adap");err = snd_card_register(card);if (err < 0)goto fail;return 0;
fail:snd_card_free(card);return err;
}static void __exit usb_adap_params_exit(void)
{struct snd_card *card = snd_card_ref(-1);if (card)snd_card_free(card);
}
module_init(usb_adap_params_init);
module_exit(usb_adap_params_exit);
MODULE_LICENSE("GPL");

代码功能:驱动只给出最小最大约束,用户空间可自由选择44.1/48/96/192/384 kHz,USB控制器自动切换时钟分频。

🌻3.4 用法总结

代码关键字功能描述典型应用
snd_pcm_hw_params_set_rate 48000固定速率车载导航
snd_pcm_hw_params_set_rate 16000固定单声道语音唤醒
snd_pcm_hw_params_set_rate_min/max自适应速率USB高解析
http://www.dtcms.com/a/587449.html

相关文章:

  • 网站自动生成网页做网站的公司现在还 赚钱吗
  • 网站的空间的提供商市场营销说白了就是干什么的
  • 网站如何做响应式布局网页传奇怎么开
  • 开网站建设工作是如何在龙港网站哪里做
  • 分类信息导航网站模板免费做网站方案
  • 做哪种网站比较简单自己开发app的软件下载
  • 网页设计类网站西安做网站的公司哪家好
  • Beetle 树莓派RP2350 - 数字识别
  • 网站建设公司现在还挣钱吗公司注册地址异常如何处理
  • JSP 深度解析:从运行机制读懂 Java Web 的 “初代顶流“ 待定
  • 时尚类网站建设国外移动网站设计
  • 俄罗斯女孩制作论文网站京东网站设计风格
  • 网站建设厃金手指花总十一移动端优化
  • 建站公司现状佛山专业网站建设公司哪家好
  • Java装箱与拆箱完全指南:从原理到实战
  • 厦门网站建设推广wordpress+知更鸟+下载
  • 淄博网站开发招聘jsp网站开发遇到问题
  • 江苏网站设计公司电话wordpress step 2
  • 模板网站首页设计优化seo网站西安
  • 如何自己开发微网站最新cms
  • 非洲在建最大光储项目光伏组件安装工作全面启动
  • 懒人手机网站网站空间控制面板软件
  • 网站怎么添加广告代码网站一直不被百度收录
  • 如何建设自己企业网站山东企业网站建设费用
  • 坪山网站建设行业现状wordpress百度自动
  • 东莞海边网站建设工作室南宁网络公司联系方式
  • 嘉兴 网站制作有做喜糖的网站吗
  • 公司网站建设p开发企业小程序开发
  • WordPress知更鸟主题怎样安装seo专业优化公司
  • 花都网站建设公司php大流量网站开发规范