news 2026/3/16 12:45:38

Android ALSA驱动进阶之设置访问掩码snd_pcm_access_mask_set:用法实例(九十九)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android ALSA驱动进阶之设置访问掩码snd_pcm_access_mask_set:用法实例(九十九)

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

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

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

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


🍉🍉🍉文章目录🍉🍉🍉

      • 🌻1. 前言
      • 🌻2. Android ALSA驱动进阶之snd_pcm_access_mask_set介绍
      • 🌻3. 代码实例
        • 🌻3.1 在车载系统中支持MMAP访问
        • 🌻3.2 在语音唤醒中支持RW访问
        • 🌻3.3 在USB声卡中支持多种访问模式
      • 🌻3.4 用法总结

🌻1. 前言

本篇目的:Android ALSA驱动进阶之设置访问掩码snd_pcm_access_mask_set:用法实例

🌻2. Android ALSA驱动进阶之snd_pcm_access_mask_set介绍

  1. 基本概念
    snd_pcm_access_mask_set用于设置PCM访问掩码,指定驱动支持的访问模式,如MMAP、RW等,用户空间根据掩码选择访问方式。

  2. 功能
    支持设置MMAP、RW、MMAP_VALID等模式;与snd_pcm_access_mask_test配合使用;可内联调用;返回值为void。

  3. 使用限制
    必须在PCM初始化阶段调用;掩码值必须为合法的snd_pcm_access_t;不可在中断上下文调用;需要临时变量保存掩码。

  4. 性能特性
    单次写操作;耗时低于10 ns;内存占用少于1字节;支持16路并发;编码体积增加不到16字节。

  5. 使用场景
    车载系统支持MMAP访问、语音唤醒支持RW访问、USB声卡支持多种访问模式。

🌻3. 代码实例

🌻3.1 在车载系统中支持MMAP访问
  1. 应用场景
    车载系统需要支持内存映射访问,以便高效处理音频数据。

  2. 用法实例

#include<sound/core.h>#include<sound/pcm.h>#include<linux/module.h>staticstructsnd_pcm*pcm;staticintcar_hw_params(structsnd_pcm_substream*s,structsnd_pcm_hw_params*p){returnsnd_pcm_lib_malloc_pages(s,params_buffer_bytes(p));}staticstructsnd_pcm_opscar_ops={open=car_open,ioctl=snd_pcm_lib_ioctl,hw_params=car_hw_params,trigger=car_trigger,pointer=car_pointer,};staticint__initcar_access_init(void){interr;structsnd_card*card;err=snd_card_new(NULL,-1,"CarCard",THIS_MODULE,0,&card);if(err<0)returnerr;err=snd_pcm_new(card,"CarPlay",0,1,0,&pcm);if(err<0)gotofail;snd_pcm_set_ops(pcm,SNDRV_PCM_STREAM_PLAYBACK,&car_ops);snd_pcm_access_mask_set(pcm->runtime->access_mask,SNDRV_PCM_ACCESS_MMAP);strcpy(pcm->name,"Car Access");err=snd_card_register(card);if(err<0)gotofail;return0;fail:snd_card_free(card);returnerr;}staticvoid__exitcar_access_exit(void){structsnd_card*card=snd_card_ref(-1);if(card)snd_card_free(card);}module_init(car_access_init);module_exit(car_access_exit);MODULE_LICENSE("GPL");

代码功能:通过snd_pcm_access_mask_set设置支持MMAP访问模式,用户空间可通过mmap高效访问音频数据。

🌻3.2 在语音唤醒中支持RW访问
  1. 应用场景
    语音唤醒模块需要支持读写访问,以便灵活处理音频数据。

  2. 用法实例

#include<sound/core.h>#include<sound/pcm.h>#include<linux/module.h>staticstructsnd_pcm*pcm;staticintvw_hw_params(structsnd_pcm_substream*s,structsnd_pcm_hw_params*p){returnsnd_pcm_lib_malloc_pages(s,params_buffer_bytes(p));}staticstructsnd_pcm_opsvw_ops={open=vw_open,ioctl=snd_pcm_lib_ioctl,hw_params=vw_hw_params,trigger=vw_trigger,pointer=vw_pointer,};staticint__initvw_access_init(void){interr;structsnd_card*card;err=snd_card_new(NULL,-1,"VWCard",THIS_MODULE,0,&card);if(err<0)returnerr;err=snd_pcm_new(card,"VWCap",0,0,1,&pcm);if(err<0)gotofail;snd_pcm_set_ops(pcm,SNDRV_PCM_STREAM_CAPTURE,&vw_ops);snd_pcm_access_mask_set(pcm->runtime->access_mask,SNDRV_PCM_ACCESS_RW);strcpy(pcm->name,"VW Access");err=snd_card_register(card);if(err<0)gotofail;return0;fail:snd_card_free(card);returnerr;}staticvoid__exitvw_access_exit(void){structsnd_card*card=snd_card_ref(-1);if(card)snd_card_free(card);}module_init(vw_access_init);module_exit(vw_access_exit);MODULE_LICENSE("GPL");

代码功能:通过snd_pcm_access_mask_set设置支持RW访问模式,用户空间可通过read/write灵活处理音频数据。

🌻3.3 在USB声卡中支持多种访问模式
  1. 应用场景
    USB声卡需要支持多种访问模式,以便用户空间根据需求选择。

  2. 用法实例

#include<sound/core.h>#include<sound/pcm.h>#include<linux/module.h>staticstructsnd_pcm*pcm;staticintusb_hw_params(structsnd_pcm_substream*s,structsnd_pcm_hw_params*p){returnsnd_pcm_lib_malloc_pages(s,params_buffer_bytes(p));}staticstructsnd_pcm_opsusb_ops={open=usb_open,ioctl=snd_pcm_lib_ioctl,hw_params=usb_hw_params,trigger=usb_trigger,pointer=usb_pointer,};staticint__initusb_access_init(void){interr;structsnd_card*card;err=snd_card_new(NULL,-1,"USBCard",THIS_MODULE,0,&card);if(err<0)returnerr;err=snd_pcm_new(card,"USBDup",0,1,1,&pcm);if(err<0)gotofail;snd_pcm_set_ops(pcm,SNDRV_PCM_STREAM_PLAYBACK,&usb_ops);snd_pcm_set_ops(pcm,SNDRV_PCM_STREAM_CAPTURE,&usb_ops);snd_pcm_access_mask_set(pcm->runtime->access_mask,SNDRV_PCM_ACCESS_MMAP);snd_pcm_access_mask_set(pcm->runtime->access_mask,SNDRV_PCM_ACCESS_RW);strcpy(pcm->name,"USB Access");err=snd_card_register(card);if(err<0)gotofail;return0;fail:snd_card_free(card);returnerr;}staticvoid__exitusb_access_exit(void){structsnd_card*card=snd_card_ref(-1);if(card)snd_card_free(card);}module_init(usb_access_init);module_exit(usb_access_exit);MODULE_LICENSE("GPL");

代码功能:通过snd_pcm_access_mask_set设置支持MMAP和RW访问模式,用户空间可根据需求选择访问方式。

🌻3.4 用法总结

代码关键字功能描述典型应用
snd_pcm_access_mask_set MMAP设置MMAP访问模式车载系统
snd_pcm_access_mask_set RW设置RW访问模式语音唤醒
snd_pcm_access_mask_set MMAP RW设置多种访问模式USB声卡
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 6:36:32

失业期PHP程序员所有的心魔和恐惧其实都是纸老虎的知识体系

“失业期PHP程序员所有的心魔和恐惧其实都是纸老虎。” 这完全正确。真正束缚我们的&#xff0c;往往不是技术本身&#xff0c;而是由未知、不确定性和自我怀疑编织成的内心幻象。 让我们来系统性地拆解这些“纸老虎”&#xff0c;把恐惧还原为可以解决的具体问题。 核心认知&a…

作者头像 李华
网站建设 2026/3/4 21:31:34

童年持续被父母打骂和打压的孩子,为什么造成的创伤和痛苦会持续一生?

童年时期持续遭受父母打骂和打压所造成的创伤&#xff0c;之所以可能持续影响人的一生&#xff0c;涉及心理学、神经科学和社会学的复杂交互。这些早期经历不仅仅是“过去的事件”&#xff0c;更是塑造个体大脑结构、心理模式和人际关系基础的深层力量。 一、大脑与神经系统的“…

作者头像 李华
网站建设 2026/3/13 22:01:44

原生PHP重复下单如何处理的庖丁解牛

在原生 PHP 系统中处理“重复下单”问题&#xff0c;本质是解决幂等性&#xff08;Idempotency&#xff09;——即多次相同请求只产生一次有效结果。这不是一个简单的“if 判断”&#xff0c;而是一个涉及前端、网络、后端、数据库、并发控制的系统性问题。一、问题本质&#x…

作者头像 李华
网站建设 2026/3/16 5:32:10

$cache->setex($cacheKey, 86400, serialize($result));的庖丁解牛

$cache->setex($cacheKey, 86400, serialize($result)); 是在使用 Redis&#xff08;或其他兼容客户端&#xff09;实现带过期时间的缓存写入的经典语句。它虽只一行代码&#xff0c;却融合了缓存策略、序列化机制、内存管理、时间语义四大核心概念。一、语法拆解&#xff1…

作者头像 李华
网站建设 2026/3/4 1:06:27

如何快速上手Piper:游戏鼠标配置的终极指南

如何快速上手Piper&#xff1a;游戏鼠标配置的终极指南 【免费下载链接】piper GTK application to configure gaming devices 项目地址: https://gitcode.com/gh_mirrors/pip/piper Piper是一款专为Linux系统设计的开源游戏鼠标配置工具&#xff0c;它通过GTK图形界面让…

作者头像 李华