Core Audio(二)
用户模式音频组件
在windows vista中,core audio apis充当用户模式音频子系统的基础,core audio apis作为用户模式系统组件的一个thin layer,它用来将用户模型客户端和内核模式音频驱动以及音频硬件区分隔开;高级音频接口,像DirectSound和 windows 多媒体函数(waveOutXxx waveInXxx),都是通过core audio apis进入音频设备,见下图:
core audio apis使用户对音频终端设备(audio endpoint device)保持友好,它用抽象概念用来代表一个用户可以直接操纵的物理设备,比如扬声器,头戴耳机和麦克风等;

核心音频api包含mmdeviceapi,wasapi,devicetopology api 和 endpointvolume api,它在Audiosed.dll和 Mmdevapi.dll 用户模型系统模块,是如下高级api的基础:
a.Media Foundation
b.Windows multimedia waveXxx and mixerXxx functions
c.DirectSound
d.DirectMusic
WAS API客户端通过endpoint buffer来传递数据给终端设备,System software and hardware components管理着数据从终端缓存到终端设备,这在一定程度上是有很大的透明度的。
(1)共享模式(shared mode):
有两种类型的endpoint buffer,第一种为共享模式,WASAPI的客户端打开了一个共享模式的音频流,然后客户端向endpoint buffer写入音频数据,window audio engine从这个buffer中读取数据;在这种模式下,客户端与其他进程中的程序共享着audio hardware,audio engine混合这些程序的流并且通过硬件播放这个混合后的流;audio engine是一个用户模型的系统组件(audiodg.dll);
(2)独占模式(exclusive mode):
于此相反,一个客户端采用独占模式打开一个音频流;
注意:
a.虽然这个图表示了共享和独占模式两个流,但同一时间只有一个流(同时一个与之相关的endpoint buffer)存在,究竟哪个存在,取决于客户端打开这个流的方式;
b.在独占模式中,客户端可以选择任何的endpoint device支持的的音频格式开打开流,而在共享模式下,客户端必须用目前audio engine使用的mix format;
c.win7中,加入的新的共享模式叫low-latence mode,低延时,适用于通信程序;
d.core audio api同时支持 pcm和非pcm流格式;然而,audio engine只可以配置PCM流,独占模式流可以采用非pcm格式;
音频引擎(audio engine)
audio engine运行在它自己的保护线程,它与程序运行的线程相分离;为了支持共享模式流,Windows audio service分配一个跨进程的endpoint buffer,应用程序和音频引擎都可以使用的;作为独占模式,endpoint buffer 住在可以被程序和音频硬件访问的内存块;
音频服务(audio service)
windows audio service是用于实现windows音频策略的模块,音频策略是用于在多个共享和竞争并存(使用相同的audio hardware)的程序中分配策略;windows audio service通过设置引擎的控制参数实现音频策略,其使命包括:
a.保持音频设备的音轨,这个音轨用户从系统中增加或移除
b.监控在系统中分配给音频设备的任务
c.管理各种缠上相似音频内容层级的任务组的音频流。(控制台,多媒体和通信)
d.为了许多种类中的每个音频内容控制混合输出流的音量等级
e.为音频流通知音频引擎处理在数据通道里的元素。
上图中,终端设备是一个插入音频适配器的扬声器,客户端程序向endpoint buffer写入音频数据,audio engine处理从buffer到endpoint device的传输细节;该图只展示了渲染流, 同样也支持捕获流,在共享模式下,多个客户端可以从音频硬件设备共享捕获流,在独占模式下,一个程序拥有设备捕获流的独占权限;
本文参考文档:http://msdn.microsoft.com/en-us/library/dd370802(v=vs.85).aspx
Core Audio(二)的更多相关文章
- 使用Core Audio实现VoIP通用音频模块
最近一直在做iOS音频技术相关的项目,由于单项直播SDK,互动直播SDK(iOS/Mac),短视频SDK,都会用到音频技术,因此在这里收集三个SDK的音频技术需求,开发一个通用的音频模块用于三个SDK ...
- Core Audio(一)
Core Audio APIs core audio apis是vista之后引入的,不使用与之前的windows版本:core audio apis提供访问endpoint devices,比如耳机 ...
- Core Audio 在Vista/Win7上实现
应用范围:Vista / win7, 不支持XP 1. 关于Windows Core Auido APIs 在Windowss Vista及Windows 7操作系统下,微软为应用程序提供了一套新的音 ...
- 小白开学Asp.Net Core《二》(补)
小白开学Asp.Net Core<二>(补) ——数据仓储层(Repositroy).服务层(Service) -------------------------------------- ...
- 小白开学Asp.Net Core《二》
小白开学Asp.Net Core<二> ——数据仓储层(Repositroy) 一.历史现象 在后端开发中,数据库操作是最频繁的,每一个开发人员都会接触,甚至不少开发人员每天的工作就是与数 ...
- 使用 Windows Core Audio APs 进行 Loopback Recording 并生成 WAV 文件
参考文档 COM Coding Practices Audio File Format Specifications Core Audio APIs Loopback Recording #inclu ...
- .net core 生成二维码
其实生成二维码的组件有很多种,如:QrcodeNet,ZKWeb.Fork.QRCoder,QRCoder等 我选QRCoder,是因为小而易用.支持大并发生成请求.不依赖任何库和网络服务. 既然是. ...
- spark core (二)
一.Spark-Shell交互式工具 1.Spark-Shell交互式工具 Spark-Shell提供了一种学习API的简单方式, 以及一个能够交互式分析数据的强大工具. 在Scala语言环境下或Py ...
- Asp.Net Core 生成二维码(NuGet使用QRCoder)
前言 功能:调用web api 接口 1.获取 jpeg 格式的二维码 2.获取中间带有logo 的二维码 3. 下载 jpeg,svg 格式的二维码 需要的NuGet 包: > QRCoder ...
随机推荐
- iOS的架构
根据多年的iOS开发经验,常用的iOS开发架构有:MVC.MVVM.CDD等,在这里我就不一一列举了. 做一个项目一般首先要搭建主流框架界面:常见的有TabBar控制器可以切换子控制器,上面又有Nav ...
- C语言学习笔记(一)_hello world程序中涉及的c语言元素
#include <stdio.h> //使用printf函数之前必须include<stdio.h> int main() { int i; //声明一个变量 printf( ...
- python 识别图片验证码报IOError
说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...
- Java 的replace和replaceAll的使用
(1)replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串. public String replace(char oldChar, ...
- 经典的找不到符号(symbol)错误 #iOS开发
使用BmobSDK的过程中,编译时出现了以下错误信息,意思是 -[BmobSRWebSocket _innerPumpScanner] 这个方法引用了 "_utf8_nextCharSafe ...
- kafka java实例
生产者 package com; import java.util.Properties; import java.util.concurrent.TimeUnit; import kafka.jav ...
- python学习之——selenium元素定位
web自动化测试按步骤拆分,可以分为四步操作:定位元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告. 其中定位元素尤为关键,此篇是使用webdriver通过页面各个 ...
- mina IoBuffer
mina IoBuffer 常用方法 Limit(int) 如果position>limit, position = limit,如果mark>limit, 重置mark Mark() ...
- [z]Oracle性能优化-读懂执行计划
http://blog.csdn.net/lifetragedy/article/details/51320192 Oracle的执行计划 得到执行计划的方式 Autotrace例子 ...
- java多线程详解(3)-线程的互斥与同步
前言:前一篇文章主要描述了多线程中访成员变量与局部变量问题,我们知道访成员变量有线程安全问题,在多线程程序中 我们可以通过使用synchronized关键字完成线程的同步,能够解决部分线程安全问题 在 ...