ALSA声卡12_从零编写之添加音量控制_学习笔记

发布者:EnchantedWish最新更新时间:2024-07-16 来源: elecfans关键字:音量控制 手机看文章 扫描二维码
随时随地手机看文章

1、设置音量时应用程序的调用过程

(1)strace分析: amixer cset numid=1 30 (设置音量)
/dev/snd/controlC0
open
SNDRV_CTL_IOCTL_CARD_INFO
SNDRV_CTL_IOCTL_PVERSION
SNDRV_CTL_IOCTL_ELEM_INFO
SNDRV_CTL_IOCTL_ELEM_READ
SNDRV_CTL_IOCTL_ELEM_WRITE : snd_ctl_elem_write_user

(2)应用程序调用SNDRV_CTL_IOCTL_ELEM_WRITE时,驱动程序调用snd_ctl_elem_write_user函数,这个函数从用户空间把一些参数拷贝进来,然后调用函数snd_ctl_elem_write

(3)函数snd_ctl_elem_write

找到一个snd_kcontrol结构体,然后调用snd_control结构体的put函数。


(4)这个snd_kcontrol结构体是谁提供的

ASOC驱动程序分为3大块(machine,codec,platform),应该在codec这一块来提供的,因为它跟声卡密切相关。去调节音量的时候肯定要调整它



2、写程序(uda1341.c(codec))

(1)结构体snd_kcontrol_new

static const struct snd_kcontrol_new uda1341_vol_control = 
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, //表示snd_kcontrol结构体用于哪一类设备(表示进行参数设置)
    .name = 'Master Playback Volume',  //音量控制,每个声卡驱动程序的snd_kcontrol各不相同,为什么应用程序都可以调整它的音量,对于某些常用的属性,它们都有固定的名字。应用程序根据名字找到它的snd_kcontrol项,调用里面的put函数。
.info = uda1341_info_vol,  //获得一些信息,如音量范围是多少
.get  = uda1341_get_vol,//获得当前的音量值
.put  = uda1341_put_vol, //设置音量
};


(2) 获得音量信息,比如最小值最大值

/*
 * 获得音量信息,比如最小值最大值
 */
int uda1341_info_vol(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;//音量值的类型是整数
uinfo->count = 2;//声道数是双声道的
uinfo->value.integer.min = 0;//最小整数,
uinfo->value.integer.max = 63;//最大整数,
return 0;
}

因为uda1341的音量控制是6位的(0表示最大音量,63表示最小音量),而应用程序中0表示最小音量,值越大表示音量越大


(3)获得当前音量值

/*
 * 获得当前音量值
 */
int uda1341_get_vol(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);


    ucontrol->value.integer.value[1] =  //这里   表示ucontrol->value.integer.value[0] 等于ucontrol->value.integer.value[1] ,因为是双声道
ucontrol->value.integer.value[0] = 63 - snd_soc_read(codec, UDA1341_DATA00);//读寄存器DAT00的值,因为驱动程序的值和应用程序的值大小是相反的,uda1341不支持寄存器的读操作,要想得到一个寄存器的值,是去读某个cache(这个cache保存的是设置寄存器的值)
return 0;
}

(4) 设置当前音量值

/*
 * 设置当前音量值
 */
int uda1341_put_vol(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
unsigned int val;


val = 63 - ucontrol->value.integer.value[0];//应用程序传进来的值写到寄存器里面要反转


    snd_soc_write(codec, UDA1341_DATA00, val);//把值val写到寄存器DATA00中去
    
return 0;
}

3、结构体snd_kcontrol_new和内核部分的连接

(1)probe函数

static int uda1341_soc_probe(struct snd_soc_codec *codec)
{
    int ret;
    uda1341_init_regs(codec);
    
ret = snd_soc_add_codec_controls(codec, &uda1341_vol_control, 1);
    return ret;
}


4、测试


amixer  controls查看控制项

amixer cget numid=1表示查看当前音量

amixer cset numid=1 30设置音量



5、Input Mux

因为不同的板子的麦克风通道不同(在uda1341),用同一驱动,想录音时应用程序应该设置input mux选项。



表明它能选择哪个麦克风通道,当前是哪一个麦克风通道,设置哪一个麦克风通道


值uda134x_mixer_enum[2]是数组的第2项


6、

让板子使用内核自带的驱动程序


查看设备节点和控制项(input mux在倒数第二项)


查看控制项第11项的值(当前值是0)


若选择第1个通道(模拟通道)最后1个参数表明第几个通道


关键字:音量控制 引用地址:ALSA声卡12_从零编写之添加音量控制_学习笔记

上一篇:ALSA声卡09_从零编写之参数设置_学习笔记
下一篇:ALSA声卡16_编写ALSA声卡应用程序_学习笔记

推荐阅读最新更新时间:2026-03-22 10:49

ALSA声卡12_从零编写之添加音量控制_学习笔记
1、设置音量时应用程序的调用过程 (1)strace分析: amixer cset numid=1 30 (设置音量) /dev/snd/controlC0 open SNDRV_CTL_IOCTL_CARD_INFO SNDRV_CTL_IOCTL_PVERSION SNDRV_CTL_IOCTL_ELEM_INFO SNDRV_CTL_IOCTL_ELEM_READ SNDRV_CTL_IOCTL_ELEM_WRITE : snd_ctl_elem_write_user (2)应用程序调用SNDRV_CTL_IOCTL_ELEM_WRITE时,驱动程序调用snd_ctl_elem_write_user函数,这个函数从用户空间把
[单片机]
<font color='red'>ALSA</font><font color='red'>声卡</font>12_从零编写之添加<font color='red'>音量控制</font>_学习笔记
ALSA声卡07_分析调用过程_学习笔记
1、编译新的strace工具分析aplay和amixer应用程序对声卡的调用过程 (1)因为旧的strace工具不能识别不能识别alsa声卡驱动程序里面的ioctrl. (2)编译过程参考 http://blog.csdn.net/qingkongyeyue/article/details/52228729 (3)出现错误 需要建立相关的设备节点 播放声音和调整音量 (4)等待音频播放完,能得到一个完整的log,把log文件拷贝回windows下进行分析 2、调用分析(aplay.log)(搜索设备节点“/dev/snd”) strace分析: aplay Windows.wav 应用程序打开一个设备 节点的时候
[单片机]
<font color='red'>ALSA</font><font color='red'>声卡</font>07_分析调用过程_学习笔记
ALSA声卡08_从零编写之框架_学习笔记
1、整体框架 (1)图示((DAI(全称Digital Audio Interface)接口)) 在嵌入式系统里面,声卡驱动是ASOC,是在ALSA驱动上封装的一层,包括以下三大块 (2)程序框架 machine:s3c2440_uda1341.c codec: UDA1341,WM8976 platform:IIS ,DMA 2、s3c2440_uda1341.c(参考s3c24xx_uda134x.c) (1)分配一个平台为soc-audio的平台设备, 在这平台设备里面有一个核心结构体snd_soc_s3c24xx_uda134x设置到私有数据里面 snd_soc_s3c24xx_uda134x结构体
[单片机]
<font color='red'>ALSA</font><font color='red'>声卡</font>08_从零编写之框架_学习笔记
ALSA声卡_裸板之编译和测试(基于优龙FS2410开发板)
一、实验环境 1.1 虚拟机环境 a) Vmware版本:Vmware Workstation 12.5.7 b) Ubuntu版本:9.10 c) 内核版本:2.6.31.14 d) toolchain版本:arm-linux-gcc 3.4.5 1.2 开发板 优龙FS2410开发板,UDA1341声卡 1.3 调试器 硬件:百问网OpenJTAG 软件:OpenOCD、Eclipse 3.6 Helios 二、调试过程记录 1、开发板的JP1设置为NOR启动,然后通过u-boot和DNW的USB功能把sound.bin烧写到nandflash的地址0处,把windows.wav烧写到0x600
[单片机]
<font color='red'>ALSA</font><font color='red'>声卡</font>_裸板之编译和测试(基于优龙FS2410开发板)
高级linux声卡架构ALSA概述及特点
ALSA 介绍 ALSA 概述 ALSA(Advanced Linux Sound Architecture )是高级 linux 声卡架构简称,是目前Linux的主流音频体系结构, 提供了音频和MIDI的支持。 除了声音设备驱动,ALSA还捆绑了一个用户空间驱动的库用于应用开发。开发者可以使用这些 ALSA 驱动进行高级 API 开发,可以通过 ALSA 库达成与声音设备的内核(直接)交互。 ALSA 特点如下: 高效的支持所有类型音频接口,从消费类声卡到专业多声道音频接口; 完全模块化的声卡驱动; 用户空间库 (alsa-lib) 可简化应用程序编程并提供更高级别的功能; 支持较旧的开放声音系统 (OSS) API,为
[嵌入式]
高级linux<font color='red'>声卡</font>架构<font color='red'>ALSA</font>概述及特点
基于uda34x的ALSA声卡驱动之s3c24xx-pcm.c
#include linux/module.h #include linux/init.h #include linux/io.h #include linux/platform_device.h #include linux/slab.h #include linux/dma-mapping.h #include sound/core.h #include sound/pcm.h #include sound/pcm_params.h #include sound/soc.h #include asm/dma.h #include mach/hardware.h #include mach/dma.h #include ma
[单片机]
车载娱乐、导航和音量控制按钮的理想选择 C&K 推出带集成按钮的 ENC 系列 24 位光电编码开关
领先的高质量机电开关制造商 C&K 推出了一款新型光电旋转编码器 — 带集成按钮的 ENC 系列 24 位光电编码器。在对已经非常成功的 16 位光电编码器进行改进的基础上,我们开发了这款新型编码器。除了增加了 50% 的制动位置外, 该 24 位编码器还包含了直角连接器插座(用户经常对此提出要求), 从而让用户更容易地进行安装。中央编码器轴可以进行流畅和精准的旋转, 从而让模式选择和菜单导航等功能更易操作, 对用户的输入也能够进行快速和准确的回应。向下按压编码器轴可以激活集成按钮, 使编码器成为一种界面控制方式。这种一体化的简洁设计, 让编码器的操作变得像点击按钮一样容易。 新型 24 位中央选择开关触感平滑, 可实现快速旋
[汽车电子]
车载娱乐、导航和<font color='red'>音量控制</font>按钮的理想选择 C&K 推出带集成按钮的 ENC 系列 24 位光电编码开关
使用FET的压控衰减器(音量控制)电路
该电路采用衰减场效应晶体管(FET)分流信号到地面。这个R2是用来控制输出级(衰减等级),但是你可以用其他来源的电压信号来控制网格的FET如DAC输出,这是一种负面的信号电压会(你可以用DAC采用对称与供电系统)。 使用FET的压控 衰减器 (音量控制)电路:
[模拟电子]
使用FET的压控衰减器(<font color='red'>音量控制</font>)电路
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved