ALSA 学习笔记

Linux的ALSA音频框架学习笔记 ALSA(Advanced Linux Sound Architecture,高级 Linux 声音架构)是 Linux 系统中音频处理的核心框架,负责管理音频硬件、提供统一的音频接口,支持复杂的音频功能(如多设备并发、硬件混音、采样率转换等)。ALSA 的核心用户空间库,提供统一的 API(如 PCM 播放 / 录制、音量控制、设备枚举等),封装了内核接口的复杂细节(如 ioctl 调用、内存映射等)。核心层通过一系列精心设计的数据结构,将分散的音频功能(如 PCM、控制、MIDI 等)组织成有机整体。 阅读详情

ALSA 学习笔记

8/19/2009 11:19:31 PM
 ALSA 学习笔记
ALSA项目网址: http://www.alsa-project.org/main/index.php/Main_Page
   因为项目用的kernel为2.6.17,所以以下分析都是基于2.6.17版本,在这个版本里,没有asoc等。                           

1 整体架构

  Application
 ---------------
  Alsa-lib                   User Space
-------------------------------------
   Alsa                      Kernel Space
 -------
  sound driver
 ----------------------------------
   Hardware
 
 Application : 比如aplay ,它不是直接调用Kernel所提供的接口,而是调用ALSA-lib 的接口。所以应用程序只要#include "asound.h"
 并链接libasound .
 对于上面的架构,在某一时刻只能有一个程序打开声卡并占有它,此时其它程序打开的话,会返回busy.如要支持同时可以多个应用程序打开声卡,需要支持
 混音功能,有些声卡支持硬件混音,但大部分声卡不支持硬件混音,需要软件混音。这时需要ESD,pulseAudio等,架构变为:
   App1    App2
 ---------------
    ESD , pulseaudio
  -------------------- 
  Alsa-lib                   User Space
-------------------------------------
   Alsa                      Kernel Space
 -------
  sound driver
 ----------------------------------
   Hardware
  此时,应用程序将调用ESD,pulseaudio等混音器提供的接口。对于ESD,很多程序支持,比如mplayer . 对于pulseaudio ,有相应的patch .
  Alsa本身也提供混音的plugin,dmix .
    App1    App2
 ---------------
   Alsa-lib (dmix)           User Space
-------------------------------------
   Alsa                      Kernel Space
 -------
  sound driver
 ----------------------------------
   Hardware
  此架构和架构1,应用程序不需要做任何修改,只需要修改asound.conf
  架构1的asound.conf的例子:
  pcm.!default {  
   type hw   
    card 0  
    }
ctl.!default { 
    type hw    
    card 0
     }
   架构3的asound.conf的例子:   
   pcm.card0 {
    type hw
    card 0
}
pcm.!default {
    type plug
    slave.pcm "dmixer"
}
pcm.dmixer  {
    type dmix
    ipc_key 1025
    slave {
        pcm "hw:0,0"
        period_time 0
        period_size 4096
        buffer_size 16384
        periods 128
        rate 44100
    }
    bindings {
        0 0
        1 1
    }
}
 关于配置,可以参考这个网站:
  http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html

对于period_size和buffer_size,要注意,我将他们修改为1024 ,8192.在我们的平台上用dmix会出现underrun!!! 信息。

 

2 ALSA kernel
2.1 目录
    Alsa-driver包括很多在开发中的驱动,以及一些2.2,2.4 linux内核版本的支持。当这些驱动稳定后,将移入alsa-kernel中,并最终在linux kernel
  的sound目录下.
          sound
                /core
                        /oss
                        /seq
                                /oss
                                /instr
               /drivers
                        /mpu401
                        /opl3
                /i2c
                        /l3
                /synth
                        /emux
                /pci
                        /(cards)
                /isa
                        /(cards)
                /arm
                /ppc
                /sparc
                /usb
                /pcmcia /(cards)
                /oss
      core目录是alsa的核心,
      core/oss目录主要是为了支持PCM和mixer的OSS模拟,rawmidi OSS模拟放在alsa的rawmidi文件里主要是因为它相当小。这样很多以前支持OSS
      的应用程序也可以在Alsa上运行。
      core/seq , alsa 音序器.core/seq/oss是alsa对OSS音序器模拟。
      driver目录包含各种芯片驱动。
      I2C目录,alsa i2c组件。尽管linux 有标准的i2c层,但alsa对于一些声卡有自己的i2c代码,原因是声卡仅仅需要一些简单的操作而标准的
      I2C API 对于此目的太复杂。
      PCI目录,主要是给PCI总线上的PCI声卡
      ISA目录,主要是给ISA总线上的ISA声卡
      arm, ppc, and sparc目录,这些架构下的某些声卡驱动,如pxa2xx-pcm.c PXA处理器的
      USB目录,USB-audio 驱动
      pcmcia,
      OSS目录, OSS架构的文件,不属于alsa
     
   2.2 接口    
    Alsa kernel为上层主要提供以下接口:
    1 control interface 提供灵活的方式管理注册的声卡和对存在的声卡进行查询。
    2 PCM interface  提供管理数字音频的捕捉和回放。
    3 原始 MIDI 接口
    一种标准电子音乐指令集。 这些 API 提供访问声卡上的 MIDI 总线。这些原始借口直接工作在 The MIDI
事件上,程序员只需要管理协议和时间。
    4 Timer 接口  为支持声音的同步事件提供访问声卡上的定时器。
    5 音序器接口  一个比原始MIDI接口高级的MIDI编程和声音同步高层接口。它可以处理很多的MIDI协议和定时器。
    6 mixer接口   控制发送信号和控制声音大小的声卡上的设备。/dsp/mixer,OSS中存在。
   
   我们主要关心1,2接口
  
   2.3 声卡的管理
   2.3.1 卡 
   对于每一个声卡,一个“卡”的记录必须分配。
   “卡”的记录是声卡的总部,它管理着声卡上的所有的设备(或者组件)的列表,例如PCM,Mixer,MIDI等等。
   数据结构为:snd_card
   其中 number : 第几个声卡,最大为SNDRV_CARDS 8个,对于我们的系统,只有一个声卡的话,number为0
      id     : 声卡的string
         devices : 设备列表
         proc_root :proc文件的根
         private_data:声卡的私有数据
         controls  :声卡的控制接口列表
      还有一些电源管理等
  
   调用snd_card_new来创建一个声卡实体。
  snd_card_new(index, id, module, extra_size);
  其中extra_size为private_data内存空间的大小,在snd_card_new中分配。

  2.3.2 设备(组件)
    卡实例创建后,我们可以attach一个组件(设备)给一个卡的实例。在alsa驱动中,一个组件用结构snd_device对象表示。
    一个组件可以是一个PCM实例,一个控制实例,一个原始MIDI接口等。它调用snd_device_new创建。
     snd_device_new(card, snd_device_type_t, device_data, &ops);
     在control.c ,pcm.c,info.c,Rawmidi.c以及timer.c中,都有snd_device_new的调用,分别创建类型为control,PCM等的deice.
     数据结构为:snd_device
 struct list_head list;  /* list of registered devices */
 struct snd_card *card;  /* card which holds this device */
 snd_device_state_t state; /* state of the device */
 snd_device_type_t type;  /* device type */
 void *device_data;  /* device structure */
 struct snd_device_ops *ops; /* operations */
 snd_device_ops包含了注册,unregister,free等函数。 
 在snd_card_new中,我们创建了一个control的device ,而snd_pcm_new创建了一个pcm的device
 
  2.3.3 注册与释放
  snd_card_register 调用它后,device 文件可以被外界访问。之前,不能安全被外界所访问。
  snd_card_free 一般在退出的时候调用,这样将把所有的组件都自动释放掉。


  2.4   PCM接口
  ALSA PCM中间层非常强大,驱动只需要实现底层的函数以访问硬件。
  每个卡最多可以有4个PCM实例。
  一个PCM实例包含playback(回放)和capture(录音)流,数据结构为:snd_pcm,其中struct snd_pcm_str streams[2]; stream[0]代表
  playback,stream[1]代表capture.
  每一个pcm流包括一个或者多个pcm子流,
  一些声卡支持多个playback功能。例如,emu10k1有一个PCM回放的32位立体声子流(substream),此时,每次打开,一个空闲的子流自动选择并
  打开,同时,如果只有一个子流存在并已经打开了,接下来的打开要么被阻塞要么返回EAGAIN,但是这些在你的驱动中不需要关心,PCM中间层会
  管理这些工作。
  snd_pcm_new创建一个实体,
  int snd_pcm_new(struct snd_card *card, char *id, int device,
  int playback_count, int capture_count,
         struct snd_pcm ** rpcm)
   device :  第几个pcm实体,从0开始
   playback_count: 回放子流数目 
   capture_count:  录音子流数目
  
  流的数据结构:snd_pcm_str
  其中 stream 表示方向,是playback还是capture
     substream_count子流数目
     struct snd_pcm_substream *substream;子流的指针,指向第一个子流,根据第一个,可以找到下一个(substream->next)
 
  snd_pcm_new_stream创建一个流 ,在snd_pcm_new中被调用。
 
   子流(substream)的数据结构:snd_pcm_substream
   其中 stream 表示方向,是playback还是capture
      buffer_bytes_max 表示最大的环形buffer大小
       dma_buffer     ?????
      dma_max       最大 
   struct snd_pcm_ops *ops; 子流的操作函数,snd_pcm_set_ops会设置ops
    struct snd_pcm_runtime *runtime;
     next  下一个substream,对于只有一个playback的子流,为NULL
  struct snd_timer *timer;  ????
  
  snd_pcm_ops 定义了一系列硬件操作函数,比如open , ioctrl , trigger等
  1 open callback :
     static int snd_xxx_open(struct snd_pcm_substream *substream);
     这个函数在一个子流被打开时调用(snd_pcm_open_substream函数调用)
     调用关系为:
     在 snd_pcm_f_ops中 .open = snd_pcm_playback_open
    snd_pcm_playback_open ---> snd_pcm_open_file---> snd_pcm_open_substream ---> snd_xxx_open
    snd_pcm_f_ops的open ,当你对/dev/snd/PCMC0D0 open时候被调用
    我们的驱动主要是分配substream->runtime,并调用request_irq把中断处理函数和runtime关联起来。
   
    2 close callback
  static int snd_xxx_close(struct snd_pcm_substream *substream);
  这个函数在一个子流被关闭时调用
     调用关系为:
     在 snd_pcm_f_ops中 .release = snd_pcm_release
    snd_pcm_release --->  snd_pcm_release_substream ---> snd_xxx_close
    snd_pcm_f_ops的release ,当你对/dev/snd/PCMC0D0 close时候被调用   
    我们的驱动主要是调用free_irq把中断处理函数和runtime释放掉。
    (是否有内存泄露,因为在open函数里对runtimer 用kmalloc了,在close函数里应该kfree(runtime)???
   
     3 ioctl callback
     一般用snd_pcm_lib_ioctl
    
     4 hw_params callback
     static int snd_xxx_hw_params(struct snd_pcm_substream *substream,
                               struct snd_pcm_hw_params *hw_params);
      调用关系为:
     在 snd_pcm_f_ops中 .unlocked_ioctl = snd_pcm_playback_ioctl
          snd_pcm_playback_ioctl --> snd_pcm_playback_ioctl1
      -->snd_pcm_common_ioctl1 ---> snd_pcm_hw_params_user --->  snd_pcm_hw_params ---> snd_xxx_hw_params
        
    snd_pcm_f_ops的unlocked_ioctl,当你对/dev/snd/PCMC0D0 进行ioctl(int fd, int command, (char *) argstruct)调用时,文件系统的do_ioctl
    会先判断unlocked_ioctl函数是否为空,不为空则调用filp->f_op->unlocked_ioctl ,其中command为   SNDRV_PCM_IOCTL_HW_PARAMS   .
    这个函数在 应用程序设置硬件参数时被调用,也就是说,当pcm子流的buffer大小,周期大小,格式等被定义的时候.
    许多硬件的设置必须在这个回调函数中做,包括buffer的分配.buffer的分配可以调用snd_pcm_lib_malloc_pages函数.
    我们的驱动好像只有buffer的分配,没做别的处理,会不会有问题 ????
   
    5 hw_free callback
    static int snd_xxx_hw_free(struct snd_pcm_substream *substream);
    释放在 hw_params中分配的资源
   
    6 prepare callback
    static int snd_xxx_prepare(struct snd_pcm_substream *substream);
          调用关系为:
     在 snd_pcm_f_ops中 .unlocked_ioctl = snd_pcm_playback_ioctl
          snd_pcm_playback_ioctl --> snd_pcm_playback_ioctl1
      -->snd_pcm_common_ioctl1 ---> snd_pcm_prepare --> snd_pcm_do_prepare ---> snd_xxx_prepare
      IO命令为 SNDRV_PCM_IOCTL_PREPARE.
      你可以在这个函数里设置格式类型,采样率等,它和hw_params的区别在于 prepare回调函数在每次snd_pcm_prepare都会被调用
      例如,underrun后的恢复等
      在这个函数里,你可以通过runtime记录substream->runtime得到一些值,例如,目前的采样率,格式类型,声道数目,runtime->rate, runtime->format or runtime->channels
      分配的内存设置在 runtime->dma_area,大小和周期分别为runtime->buffer_size和runtime->period_size.
     
      我们的驱动这个函数有问题 .
     
     
     7 trigger callback
      static int snd_xxx_trigger(struct snd_pcm_substream *substream, int cmd);
          调用关系为:
     在 snd_pcm_f_ops中 .unlocked_ioctl = snd_pcm_playback_ioctl
          snd_pcm_playback_ioctl --> snd_pcm_playback_ioctl1
      -->snd_pcm_common_ioctl1 ---> snd_pcm_drain --> snd_pcm_do_drain_init ---> snd_xxx_trigger
      IO命令为 SNDRV_PCM_IOCTL_DRAIN
    
     这个callback函数是原子的,也就是不能调用会sleep的函数,trigger回调函数应当尽量小,只是triggering DMA,其他的操作在 hw_params和
     perpare里面做.
     我们的驱动实现了start,stop,SUSPEND 和  RESUME, 没有实现pause,unpause.还调用了msleep???? 这不对
     mdelay是一个让CPU空转,一直等待到批定的时间后才退出  
     msleep是让当前进程休眠,让出CPU给其它进程使用,等到时间到了之后再唤醒  
     msleep不能用于中断上下文中  
        
     8 pointer callback
     static snd_pcm_uframes_t snd_xxx_pointer(struct snd_pcm_substream *substream)
     该回调函数在PCM中间层咨询在buffer中当前硬件位置的时候被调用,位置以frames计算,范围为0到buffer_size - 1.
 调用关系为:
     snd_pcm_period_elapsed --> snd_pcm_update_hw_ptr_pos ---> snd_xxx_pointer
     在中断处理函数中,snd_pcm_period_elapsed被调用,然后PCM中间层更新位置,并计算剩余空间,并唤醒睡着的线程.
    SNDRV_PCM_POS_XRUN ????
   
    9 其他的callback非强制的,我们驱动没实现他们.
      
    
  
 设置好硬件操作函数后,你可以预先分配buffer,调用
 snd_pcm_lib_preallocate_pages_for_all
 该函数将更新子流的dma_max 以及 dma_buffer , 其中dma_buffer中的area 代表内存区域
 
 PCM实例的释放,一般不需要,PCM中间层会自动释放其中的内存的,除非你在初始化的时候,分配了一些特殊的变量(用kmalloc),
 此时在退出函数里,用kfree掉。
 
 2.4.2. runtime
 当一个PCM子流打开时,一个PCM的runtime实例被分配并赋给substream-〉runtime 。
runtime保持大多数你需要控制PCM的信息,hw_params and sw_params配置的拷贝,buffer的指针等
数据结构:snd_pcm_runtime
包括 hw  :hw_params 信息
硬件描述符(struct snd_pcm_hardware)包含了基本硬件配置的定义.首先,你将在open 回调函数里定义它.
需要说明的是:runtime实例保持着描述符的copy,不是对已经的描述符的指针,也就是说,在open 回调函数中,你可以修改runtime->hw
根据你的需要.

 
 2.4.3 中断处理
 中断处理函数在声卡驱动中的作用:更新buffer的位置并在buffer位置越过以前设置的period size时,告诉PCM中间层.调用snd_pcm_period_elapsed函数
 将告诉PCM中间层.
 在snd_pcm_hw_params中会对period_size进行设置.
 有以下几种声卡类型产生中断的方式:
 1)在周期边界产生中断
   最常用的方式
 2)高频率的timer中断
   用于那些不产生中断的芯片
   我们的实现:
 对于位置pcm_buf_pos ,在prepare调用的时候设为0,在中断的时候,每次会传60个bytes,每次加上60,循环.
 然后调用snd_pcm_period_elapsed函数通知上层.
 
 在中断中调用spin_lock ???? 为了多处理器吗???

 

 

PCM中的file_operation :
   当调用snd_pcm_new时,
       snd_pcm_new ---> snd_pcm_dev_register --> snd_register_device 此函数更新snd_minor结构,
      
    而在 alsa_sound_init中,register_chrdev(major , "alsa",&snd_fops);当一个alsa主设备打开时,会调用snd_fops中的open函数,
    也就是snd_open( 在sound.c中),而snd_open会根据snd_minor替换其file_ops,如果minor是PCM设备,将用PCM的file_operation
    (snd_pcm_new中更新了)
 

Linux ALSA驱动框架分析之(二):pcm逻辑设备的创建 pcm设备的主要功能就是: playback,把用户空间的应用程序发过来的PCM数据进行D/A转换,转化为人耳可以辨别的模拟音频。 capture,把麦克风或者其他输入源的模拟信号进行A/D转换,把模拟的声音信号转变CPU能够处理的数字信号。 声卡可以包含多个pcm设备。一个pcm实例由一个playback stream和一个capture stream组成,这两个stream又分别有一个或多个substreams组成。 snd_pcm结构体描述一个pcm设备,定义如下: struct snd_pcm 阅读详情

相关推荐

audio驱动之简单介绍

文章目录audio驱动原理概述audio驱动中的一些术语以及概念audio驱动代码的文件组织结构查看声卡设备的一些常用命令查看声卡的设备文件查看声卡0下面挂载的设备查看某个具体pcm设备的信息查看注册的所有pcm设备的设备名称 audio驱动原理概述 ASoC 被分为 Machine, Platform 和 Codec 三大部件,Platform 驱动的主要作用是完成音频数据的管理, 最终通过 C...

karaskass的博客 4594

Alsa学习笔记

    ALSA 学习笔记   因为项目用的kernel为2.6.17,所以以下分析都是基于2.6.17版本,在这个版本里,没有asoc等。                           1 整体架构Application ---------------Alsa-lib                   User Space-------------------

激情成就梦想--关注移动互联网 4778

Linux驱动学习--USB Audio 音频设备

一、引言 本文来简单介绍下linux中的UAC设备 二、音频设备的基础知识 数字音频设备(有时也称codec,PCM,DSP,ADC/DAC设备):播放或录制数字化的声音。 主要指标: 采样速率 (电话为8K,DVD为96K) channel数目 (单声道,立体声) 采样分辨率(8-bit,16-bit) mixer(混频器) :用来控制多个输入、输出的音量,也控制输入(microphone,li...

文艺小少年的博客 5460

ALSA Timer

0. 前言 本文主要介绍alsa-timer相关代码的分析内容。 1. 介绍 官方文档可以参见下面的链接: ALSA Timer 官网上对Timer的介绍很简单,我根据自己的使用情况总结如下: Timer被设计为使用声卡内部的定时器,但是也可以被其它定时器驱动,比如内核中的 snd_timer.ko 就是一个基于系统定时器的Timer。 Timer使用循环Buffer来存储信息。

p_fly的博客 1467

一文梳理金融风控建模全流程(Python)

。借助A卡模型,银行或金融机构能够根据申请人的个人信息和历史数据,对其进行风险评估。这种评估能够帮助金融机构判断借款人是否具备偿还贷款的能力和意愿。

weixin_43420291的博客 4776

电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程

本文详细介绍了如何使用STM32驱动AD9959信号发生器模块,从硬件接线到软件调试的全流程。AD9959作为高性能DDS芯片,适用于电子设计竞赛中的信号生成需求。文章包含硬件连接指南、寄存器配置解析、多通道控制技巧以及常见问题解决方案,帮助参赛者快速掌握AD9959的应用。

weixin_31858171的博客 367

ALSA学习笔记--基本数据流--XRUN分析--参数含义

撰写这份ALSA学习笔记,初衷在于记录自己在探索过程中的点点滴滴,从最初的迷茫与困惑,到逐步理解并掌握ALSA的核心概念与编程技巧。我希望通过这份笔记,不仅能够帮助自己巩固所学知识,更能够为同样在这条道路上摸索的同行者提供一份参考与指引。

qq_50193247的博客 2080

MatterPort3D 数据集下载

【代码】MatterPort3D 数据集下载。

qq_44106838的博客 6783

ALSA学习笔记

文章目录一、概述二、系统架构 一、概述         ALSA(Advanced Linux Sound Architecture),高级Linux声音架构的简称。在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。在Linux 2.6的内核版本后,ALSA成为了默认的声音子系统,用来替换2.4系列内核中的OSS(Open Sound

hezhanran的博客 3676

SPI协议详解(图文并茂+超详细)

先说串口 因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料 因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。 如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步; 双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。 传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示; 如果您注意到

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 33万+

电池模拟器【 电化学模型深度解析:PNGV模型原理与应用(专业科普版)】

1. 模型起源PNGV(Partnership for a New Generation of Vehicles)模型诞生于1993年美国“新一代汽车合作计划”,旨在提升混合动力汽车电池系统的建模精度。该模型最初针对铅酸电池设计,后经改进广泛用于锂离子电池、镍氢电池等动态特性仿真。2. 模型定位PNGV属于**等效电路模型(ECM)**的进阶版本,介于简单Rint模型与复杂电化学模型(如P2D模型)之间,兼顾计算效率与精度,是BMS(电池管理系统)中SOC/SOH估算的主流选择。PNGV模型凭借。

优快云-新能源汽车研发测试专业博主 1698

ALSA学习笔记 (1) ALSA 简介

1. ALSA接口 1.1 对用户空间的接口 1.1.1 设备节点: /dev/snd/目录下 controlC0:声卡0控制文件 pcmC0D0c:声卡0,设备0,录制声音流操作文件 pcmC0D0p:声卡0,设备1,播放音乐流操作文件 pcmC0D1c pcmC0D1p 。。。。。。。。 1.1.2 proc文件系统 /proc/asound/ 1.1.3 debug 文件系统节点 /sys/kernel/debug/asoc/ 1.2 对驱动的接口 (1) 声卡相关的接口 (2) PCM流的接口

小丑王 1435

Pyinstaller打包为可执行文件编码错误的问题

Pyinstaller打包为可执行文件编码错误的问题 写好的python程序在vscode上运行没有任何问题,将程序利用pyinstaller打包后,运行程序发生了错误。 错误代码 UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xce in position 20-21:invalid cotinuation byte 网上找到的解决方案是: 1.在命令行中输入 chcp 65001 2.按正常方式进行封装 pyinstaller

xuefeng_he的博客 1559

alsa声卡学习笔记

ALSA由下面几部分组成: 1.       Driver 内核驱动程序,包括硬件相关的和一些公共代码。有近30万行代码,太庞大的了,只选择性的看了core里一些代码。比如粗略的浏览了一遍《Writing an ALSA Driver》,写得不错。 2.       Library 用户空间的函数库,这是给应用程序使用的。要包含头文件asoundlib.h,链接共享库libasound

jacob的专栏 1646

Android 15.0 添加自定义服务,并生成jar给第三方app调用

在15.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能

安卓兼职framework和app工程师的博客 668

学Simulink——基于新型动力与推进系统的场景实例:混合动力无人机的续航能力优化

通过本次 Simulink 仿真,你已掌握:✅混合动力系统架构设计✅内燃机、电机、电池联合建模✅三种能量管理策略(规则型、功率跟随、优化型)✅续航能力仿真与对比分析✅参数调优与优化方法核心收获混合动力是突破续航瓶颈的有效路径能量管理策略(EMS)决定系统效率电池SOC管理是关键Simulink 支持复杂多能源系统的协同仿真掌握混合动力无人机技术,你将具备设计长航时巡检机、应急通信平台、边境巡逻系统的能力。

xiaoheshang_123的博客 100

Alsa音频驱动学习笔记

ALSA 学习笔记    因为项目用的kernel为2.6.17,所以以下分析都是基于2.6.17版本,在这个版本里,没有asoc等。                            1 整体架构 Application --------------- Alsa-lib                   User Space -------------------------

逸轩168 1025

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ALSA-LINUX音频框架学习笔记

简单的alsa-lib基本调用

weixin_63090351的博客 3543

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ALSA学习笔记 (3)PCM

ALSA学习笔记 (3)PCM1. 概述2. 示例代码2.1 创建pcm实例2.2 设置PCM设备的操作函数2.3 定义PCM的操作函数2.4 定义硬件参数3. 创建pcm实例代码分析5 PCM逻辑设备的注册6 PCM信息运行时指针6.1 硬件描述6.2 运行状态6.3 私有数据7 结构图 1. 概述 每个pcm实例对应一个pcm设备文件。一个pcm实例由一个playback stream和一个capture stream组成,而每个 pcm stream由一个或多个pcm子流组成。当一个子流已经存在,并且

小丑王 3098

ALSA学习笔记 (2) 声卡

ALSA学习笔记 (2) 声卡1. snd_card 描述声卡的结构体2 创建声卡的步骤2.1 创建一个 card 实例2.2 创建声卡的芯片专用数据2.3 设定驱动 ID 和名字2.4 创建声卡的逻辑设备2.5 注册声卡3 snd_card_new4 snd_card_register5. 关于声卡的其它接口5.1. 声卡管理5.2. 声卡逻辑设备管理5.3. Linux模块和设备相关5.4. 内存管理 1. snd_card 描述声卡的结构体 对于每个声卡,都需要有一个snd_card结构体来描

小丑王 1800

alsa plugin 学习笔记

 1, 自定义plugin的使用1.1 .asoundrc    pcm.myplug{        type plug        slave {                pcm "hw:1,0"                rate 48000                channels 2        }   }参考 /etc/alsa/alsa.conf来定义,实际和pl

1220

ALSA学习笔记 (4)Control

ALSA学习笔记 (4)Control1. 如何创建一个control1.1 定义一个snd_kcontrol_new结构体1.2 回调函数1.2.1 info 函数1.2.2 get 函数1.2.3 put 函数1.3 创建并添加一个 snd_kcontrol 1. 如何创建一个control 1.1 定义一个snd_kcontrol_new结构体 static struct snd_kcontrol_new my_control __devinitdata = { .face = SNDRV_CTL_

小丑王 822

JZ2440 ALSA声卡11_编写ALSA声卡应用程序_学习笔记

1、体验 (1)ALSA声卡使用体验:使用arecord录音,使用aplay播放,在Alsa-utils里面) 准备: cd linux-3.4.2 patch -p1 < ../linux-3.4.2_alsa_wm8976_uda1341_jz2440_mini2440_tq2440.patch  //打补丁 cp config_wm8976_jz2440 .config 或 ...

485
上一篇: 用ALSA驱动声卡流程详解
下一篇: 怎样分配大于2MByte的连续内存
gracioushe
博客等级 码龄25年 62粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值