Core Audio Apis 学习笔记(一)

      Vista 后的Windows SDK multimedia API 函数有很大的改进,这一系列就是主要学习Audio parts ---- core Audio APIs, 学习主要资料是来自Microsoft MSDN, 目的是完善项目中的声卡控制模块。

      The core audio APIs provide the means for audio applications to access audio endpoint devices such as headphones and microphones. The core audio APIs serve as the foundation for higher-level audio APIs such as Microsoft DirectSound and the Windows multimedia waveXxx functions. Most applications communicate with the higher-level APIs, but some applications with special requirements might need to communicate directly with the core audio APIs.

     大家可以阅读这篇blog,先了解一下Core Audio APIs 音量控制的新特点(Core Aduio API--Vista中音量控制的新特点).

 

     The Core audo APIs 包括下面几种分类APIs:

      Multimedia Device (MMDevice) API.  --- 开发者可以枚举系统中的音频终端设备通过这些APIs 函数

      Windows Audio Session API (WASAPI). --- 开发者可以通过这些APIs 函数来创建和管理音频数据流与终端音频设备的交换

      DeviceTopology API. --- Clients use this API to directly access the topological features (for example, volume controls and multiplexers) that lie along the data paths inside hardware devices in audio adapters.

      EndpointVolume API. --- 控制音频终端设备的音量APIs.

 

     下面来看看Multimedia device一些sample code

     在Mixer APIs 下,设备枚举有以下几步要做, 先通过

     MIXERCPAS mixcaps;

     unsigned long iNumDevs, i;

     /* Get the mixer number of the system */

     iNumDevs = mixerGetNumDevs();

 

     然后再通过通过APIs 函数等到当前混音有多少个目标线路,再通过目标线路找到与些相关的源线路, 枚举线路的同时也能等到各个线路的control 也就控件,我们就是通过这些控件来控制声卡。

    下面是我通过mixer API 把我机子音频系统的相关信息:

枚举音频设备:设备名称=主声音捕获驱动程序| GUID={00000000-0000-0000-0000-000000000000}。
枚举音频设备:设备名称=立体声混音 (Realtek High Definition Audio)| GUID={A7CB8540-9D7F-4BC8-A3B9-8432F976FEC5}。
枚举音频设备:设备名称=麦克风 (Realtek High Definition Audio)| GUID={962A0738-DDAE-4800-838F-55D1A77BA4CA}。
枚举音频设备:默认音频输出设备ID=0。
枚举音频设备:默认音频输入设备ID=1。

枚举音频设备:找到音频设备(扬声器 (Realtek High Definition Au|0|)。
枚举音频设备:主通道 控制数=2 线路ID=4294901760 状态=0x00000001 类型=0x00000004|0 设备ID=0 声道=1 控制=2 别名=音量 名称=主音量
枚举音频设备:控制项 范围=0--1 控制ID=1 类型=0x20010002 控制标志=1 控制数=0 别名=静音 名称=静音
枚举音频设备:控制项 范围=0--65535 控制ID=2 类型=0x50030001 控制标志=1 控制数=0 别名=音量 名称=音量

枚举音频设备:子通道 控制数=0 线路ID=0 状态=0x80000001 类型=0x00001005 设备ID=0 声道=1 控制=2 别名=CD 音频 名称=CD 音频
枚举音频设备:控制项 范围=0--1 控制ID=3 类型=0x20010002 控制标志=1 控制数=0 别名=静音 名称=静音
枚举音频设备:控制项 范围=0--65535 控制ID=4 类型=0x50030001 控制标志=1 控制数=0 别名=音量 名称=音量

枚举音频设备:子通道 控制数=0 线路ID=65536 状态=0x80000001 类型=0x00001008 设备ID=0 声道=1 控制=2 别名=音量 名称=主音量
枚举音频设备:控制项 范围=0--1 控制ID=5 类型=0x20010002 控制标志=1 控制数=0 别名=静音 名称=静音
枚举音频设备:控制项 范围=0--65535 控制ID=6 类型=0x50030001 控制标志=1 控制数=0 别名=音量 名称=音量

枚举音频设备:找到音频设备(麦克风 (Realtek High Definition Au|1|)。
枚举音频设备:主通道 控制数=1 线路ID=4294901760 状态=0x00000001 类型=0x00000007|2 设备ID=1 声道=1 控制=2 别名=音量 名称=主音量
枚举音频设备:控制项 范围=0--1 控制ID=1 类型=0x20010002 控制标志=1 控制数=0 别名=静音 名称=静音
枚举音频设备:控制项 范围=0--65535 控制ID=2 类型=0x50030001 控制标志=1 控制数=0 别名=音量 名称=音量

枚举音频设备:子通道 控制数=0 线路ID=0 状态=0x80000001 类型=0x00001003 设备ID=0 声道=1 控制=2 别名=音量 名称=主音量
枚举音频设备:控制项 范围=0--1 控制ID=3 类型=0x20010002 控制标志=1 控制数=0 别名=静音 名称=静音
枚举音频设备:控制项 范围=0--65535 控制ID=4 类型=0x50030001 控制标志=1 控制数=0 别名=音量 名称=音量

枚举音频设备:找到音频设备(立体声混音 (Realtek High Definition |2|)。
枚举音频设备:主通道 控制数=1 线路ID=4294901760 状态=0x00000001 类型=0x00000007|2 设备ID=0 声道=1 控制=2 别名=音量 名称=主音量
枚举音频设备:控制项 范围=0--1 控制ID=1 类型=0x20010002 控制标志=1 控制数=0 别名=静音 名称=静音
枚举音频设备:控制项 范围=0--65535 控制ID=2 类型=0x50030001 控制标志=1 控制数=0 别名=音量 名称=音量

枚举音频设备:子通道 控制数=0 线路ID=0 状态=0x80000001 类型=0x00001000 设备ID=0 声道=1 控制=2 别名=音量 名称=主音量
枚举音频设备:控制项 范围=0--1 控制ID=3 类型=0x20010002 控制标志=1 控制数=0 别名=静音 名称=静音
枚举音频设备:控制项 范围=0--65535 控制ID=4 类型=0x50030001 控制标志=1 控制数=0 别名=音量 名称=音量

 

     上面列举了mixer api枚举音频设备的简单过程,下面来说说core audio apis是如何来枚举系统音频设备,目前我的理解来看core audio apis要比mixer apis枚举音频设备要简单一点。

     在Vista后,音频设备通过ERole, EDataFlow 二个参数可以更方便快捷的来获取自己想要控制的设备或线路:

     EDataFlow 有三个常用的变量:

     eAll : 会列举出系统中所有的音频设备包括Render --- 扬声器, Capture --- Microphone, Stereo Mixer

     eRender: 会列举出系统中所有的音频播放设备

     eCapture: 会列举出系统中所有音频采集设备

 

     ERole 也有三个常用的变量:

     eConsole, eCommunications, eMultimedia 这些介绍可以详细看(Core Aduio API--Vista中音量控制的新特点).

    

    如我要找到Microphone这个终端设备,可能按下来这样传控制参数:

    IMMDevice *device;

    EnumAudioDevice(&device, eCapture, eCommunications);

    然后你去完善一下EnumAudioDevice() function

 

   

    

 

    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值