唉,我辛辛苦苦翻译好了,可是重新装系统被我格式化掉了!!!一番心血啊~~~ 那天给dark_enigma看的时候还好留了一半,所以,这一半已经是绝版了,贡献出来吧。另外的,看我是不是还有精力再翻译一遍了。唉……
I、前言
为了使装备了ASIO的通道,不管是输入还是输出,更具高效率和高灵活性,ASIO使用了较大的环形缓冲
。实际上使用了双缓冲机制,可以更加简单地连接许许多多不同的缓冲工具。一个缓冲区专门缓冲一个
信号通道的常用数据。这类似允许一个主控程序具有非常高效的处理算法(相对于交错缓存模型)。缓
冲区的大小在驱动程序中可以确认,以确保与硬件的最佳兼容性。
ASIO音频驱动为实际的数据缓冲区分配内存,这就是说ASIO允许硬件生产厂商为他们的产品选择最佳的
内存访问方式。DMA或者内存映射I/O都是接近同等效率被同时支持的。这是达到低延时这一主要目的的
一种方法。
自从现有的操作系统转变到多任务环境,具有很大的优势和平衡能力,ASIO支持所有的新特性(时间戳
事件通知和自适应数据预读/预处理)需要不同时操作,通常出现在抢先多任务操作系统,比如 MacOS
X, Windows 95/NT, IRIX, BeOS。这也将成为多处理器系统(SMP)或者网络分布式处理(一个个人计
算机系统不久将要实现的方向)。
II、工具指导
1、例化
宿主程序读取驱动并且“连接”到它自己。取决与操作系统,需要使用不同的方法。请参考第四章“宿
主函数API参考”和所提供的代码。
2、操作
改变状态的命令:
Init 为了应用程序使用ASIO初始化驱动程序。
获取硬件或者读取附加的驱动组件。
ASIOInit()
CreateBuffers 为音频缓冲区分配内存并且为音频通道分配硬件资源。
ASIOCreateBuffers()
Start 开始音频流处理
ASIOStart()
Stop 停止音频流处理
ASIOStop()
DisposeBuffers 回收音频通道使用的硬件资源和内存分配
ASIODisposeBuffers()
Exit 回收任何余下的资源并且把驱动返回到未初始化状态
ASIOExit()
3、由宿主程序查询驱动
ASIO API 提供一些由宿主程序和驱动发起的查询功能。
在驱动程序初始化以后,应用程序将查询一些或全部的下述性能:
ASIOGetChannels() 查询可用的音频通道数量
ASIOGetBufferSize() 获取支持的音频缓冲大小
ASIOCanSampleRate() 询问硬件/驱动程序支持那些明确的采样率
ASIOGetSampleRate() 获取当前的采样率
ASIOGetClockSources() 获取音频硬件可能的时钟选项
ASIOGetChannelInfo() 获取一个具体通道的信息(样本类型、名称、时钟组标识)
ASIOSetSampleRate() 设置一个内部时钟的采样率,如果选择外部时钟则需要使用一个基本采样率
ASIOSetClockSource() 设置硬件的时钟源
ASIOGetLatencies() 查询音频卡平均延时,相对于bufferSwitch()未加载时
注意:ASIOGetLatencies()必须ASIOCreateBuffers()创建的包含音频缓冲区,应用程序必须在创建缓
冲区以后再调用这个功能。在例子中的调用是预先由驱动程序负责优化过缓冲区大小的。
附加的查询是在ASIO 2.0中加入的,这些查询可以通过 ASIOFuture() 调用。
kAsioSupportTimeInfo 查询新的 bufferSwitchTimeInfo() 回叫的支持
kAsioSupportTimeCode 查询音频硬件的时间代码
kAsioSupportInputMonitor 查询直接输入监听支持
4、由驱动程序发起的查询
在准备状态以后,驱动程序可以通过 asioMessage() 查询应用程序以下回叫:
kAsioSelectorSupported 查询应用程序支持的那一个 asioMessage 选择
kAsioEngineVersion 为执行ASIO的版本查询宿主程序。宿主程序应该返回一个最高支持的版本。
宿主程序一般希望支持稍微低一些的版本。
5、音频流
音频流在 ASIOStart() 开始调用以后开始传输。先前使硬件流开始传输时,驱动将传出一个或多个
bufferSwitch() 或者 bufferSwitchTimeInfo() 回叫去填充它的第一个输出缓冲区。然后如果硬件还
没有提供任何输入数据的话,输入通道的缓冲区是被驱动程序用静音填充的。
在硬件不停的需要数据(音频输入)时驱动程序启动硬件流 bufferSwitch() 或
bufferSwitchTimeInfo() 回叫将被始终调用。驱动传递必须被处理的双缓冲部分的索引给应用程序。
在这以后返回回叫告诉应用程序读取所有的输入数据和提供所有的输出数据。
注意:为了减少驱动或者硬件解决必须进一步处理音频数据(比如拷贝数据到硬件)而产生的大量临时
缓冲,ASIO API 提供 ASIOOutputReady() 方法。ASIOOutputReady() 是当应用程序完成缓冲区处理时
调用的工具。这是为了在中断驱动需要立即响应 bufferSwitch() 或者 bufferSwitchTimeInfo() 的系
统(像苹果机)的驱动而准备的,这些系统不能在回叫一个低的电平中断时间内消耗太长的时间。相反
地,应用程序要在一个中止电平执行数据处理并且一完成处理就通知驱动程序。在一个基于线程的系统
(像Windows 95/98/NT 或者2000),回叫总是可以处理数据。
6、媒体同步(样本位置和系统时间)
为了驱动程序能获得宿主程序专门用来同步媒体的信息,在发生 bufferSwitch() 或
bufferSwitchTimeInfo() 回叫请求事件(中断或定时请求)时,音频缓冲区的第一个样本的当前系统
时间和样本位置将晚于回叫。宿主程序在 bufferSwitch() 回叫 ASIOGetSamplePosition() 或者当
bufferSwitchTimeInfo() 回叫这个信息时接收到的这个信息是一部分或者是回叫的参数。
下表显示了 bufferSwitchTimeInfo() 回叫(在44100Hz 1024个音频缓冲样本,系统时间开始是2000ms
)的回叫序列和它们的值
回叫次数: 0 1 2 3 4 5 6
缓冲索引: 0 1 0 1 0 1 0
系统时间(ms): 2000 2000 2023 2046 2069 2092 2116
样本位置: 0 1024 2024 3072 4096 5120 6144
请注意在上表中前两次回叫使用的是相同的系统时间,在硬件还没启动的时候。当ASIO装备了一个不断
的流模块,在开始的一些bufferSwitch回叫中的时间信息是忽略不计的。同步处理将在宿主程序检测到
一个不断的流处理开始。(可以假设流将在第三个bufferSwitch回叫之后不断地传输,一些结合驱动/
硬件的更完善的检测方法可能在硬件输出处理上检索到更多的音频数据。)
注意:系统时间时间戳是一个操作系统的参考时间。请参阅附录D “平台/操作系统的区别”获得更多你
所使用的操作系统中系统时间的信息。
7、驱动通知宿主程序
驱动可以在一些需要宿主程序特殊处理的事件出现时通知宿主程序。以下通知信息将通过
asioMessage()回叫传递。
kAsioResetRequest 驱动需要重置,以防一个意料不到的事件或者一次重新设置
kAsioBufferSizeChange 缓冲区大小需要改变,由使用者定义
一些应用程序还未支持这个功能,因此建议使用kAsioResetRequest代替
kAsioResyncRequest 驱动检测到欠载运行并且需要重新同步
kAsioLatenciesChanged 驱动检测到延时调整
注意:宿主程序必须推迟这些通知的处理,到一个“安全”的时间也就是当驱动程序完成了它对通知的处
理以后。特别是当回叫必须返回到驱动,但 kAsioResetRequest 在 asioMessage 回叫时卸载驱动是一
个致命错误,因为这时候已经被reset了。
sampleRateDidChange() 通知宿主程序驱动检测到一次采样率变化。
通常只有在使用一个外置时钟源的情况下会改变它的采样率。
III、函数应用
初始化/结束
ASIOError ASIOInit(ASIODriverInfo *info);
ASIOError ASIOExit(void);
开始/停止
ASIOError ASIOStart(void);
ASIOError ASIOStop(void);
查询方法和采样率
ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels);
ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency);
ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long
*granularity);
ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate);
ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate);
ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate);
ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources);
ASIOError ASIOSetClockSource(long reference);
ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp);
ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info);
缓冲准备
ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long
bufferSize, ASIOCallbacks *callbacks);
ASIOError ASIODisposeBuffers(void);
ASIOError ASIOOutputReady(void);
杂项
ASIOError ASIOControlPanel(void);
ASIOError ASIOFuture(long selector, void *params);
回叫
void (*bufferSwitch) (long doubleBufferIndex, ASIOBool directProcess);
ASIOTime* (*bufferSwitchTimeInfo) (ASIOTime* params, long doubleBufferIndex, ASIOBool
directProcess);
void (*sampleRateDidChange) (ASIOSampleRate sRate);
long (*asioMessage) (long selector, long value, void* message, double* opt);
1. 初始化/结束
--------------------------------------------------------------------
ASIOError ASIOInit(ASIODriverInfo *info);
目的: 初始化ASIO
参数: info 一个指向 ASIODriverInfo 结构的指针。
返回: 如果既没有输入也没有输出,ASE_NotPresent 将被返回。
ASE_NoMemory,ASE_HWMalfunction 是出错状态的返回值。
ASIODriverInfo 的结构
{
long asio版本;
I、前言
为了使装备了ASIO的通道,不管是输入还是输出,更具高效率和高灵活性,ASIO使用了较大的环形缓冲
。实际上使用了双缓冲机制,可以更加简单地连接许许多多不同的缓冲工具。一个缓冲区专门缓冲一个
信号通道的常用数据。这类似允许一个主控程序具有非常高效的处理算法(相对于交错缓存模型)。缓
冲区的大小在驱动程序中可以确认,以确保与硬件的最佳兼容性。
ASIO音频驱动为实际的数据缓冲区分配内存,这就是说ASIO允许硬件生产厂商为他们的产品选择最佳的
内存访问方式。DMA或者内存映射I/O都是接近同等效率被同时支持的。这是达到低延时这一主要目的的
一种方法。
自从现有的操作系统转变到多任务环境,具有很大的优势和平衡能力,ASIO支持所有的新特性(时间戳
事件通知和自适应数据预读/预处理)需要不同时操作,通常出现在抢先多任务操作系统,比如 MacOS
X, Windows 95/NT, IRIX, BeOS。这也将成为多处理器系统(SMP)或者网络分布式处理(一个个人计
算机系统不久将要实现的方向)。
II、工具指导
1、例化
宿主程序读取驱动并且“连接”到它自己。取决与操作系统,需要使用不同的方法。请参考第四章“宿
主函数API参考”和所提供的代码。
2、操作
改变状态的命令:
Init 为了应用程序使用ASIO初始化驱动程序。
获取硬件或者读取附加的驱动组件。
ASIOInit()
CreateBuffers 为音频缓冲区分配内存并且为音频通道分配硬件资源。
ASIOCreateBuffers()
Start 开始音频流处理
ASIOStart()
Stop 停止音频流处理
ASIOStop()
DisposeBuffers 回收音频通道使用的硬件资源和内存分配
ASIODisposeBuffers()
Exit 回收任何余下的资源并且把驱动返回到未初始化状态
ASIOExit()
3、由宿主程序查询驱动
ASIO API 提供一些由宿主程序和驱动发起的查询功能。
在驱动程序初始化以后,应用程序将查询一些或全部的下述性能:
ASIOGetChannels() 查询可用的音频通道数量
ASIOGetBufferSize() 获取支持的音频缓冲大小
ASIOCanSampleRate() 询问硬件/驱动程序支持那些明确的采样率
ASIOGetSampleRate() 获取当前的采样率
ASIOGetClockSources() 获取音频硬件可能的时钟选项
ASIOGetChannelInfo() 获取一个具体通道的信息(样本类型、名称、时钟组标识)
ASIOSetSampleRate() 设置一个内部时钟的采样率,如果选择外部时钟则需要使用一个基本采样率
ASIOSetClockSource() 设置硬件的时钟源
ASIOGetLatencies() 查询音频卡平均延时,相对于bufferSwitch()未加载时
注意:ASIOGetLatencies()必须ASIOCreateBuffers()创建的包含音频缓冲区,应用程序必须在创建缓
冲区以后再调用这个功能。在例子中的调用是预先由驱动程序负责优化过缓冲区大小的。
附加的查询是在ASIO 2.0中加入的,这些查询可以通过 ASIOFuture() 调用。
kAsioSupportTimeInfo 查询新的 bufferSwitchTimeInfo() 回叫的支持
kAsioSupportTimeCode 查询音频硬件的时间代码
kAsioSupportInputMonitor 查询直接输入监听支持
4、由驱动程序发起的查询
在准备状态以后,驱动程序可以通过 asioMessage() 查询应用程序以下回叫:
kAsioSelectorSupported 查询应用程序支持的那一个 asioMessage 选择
kAsioEngineVersion 为执行ASIO的版本查询宿主程序。宿主程序应该返回一个最高支持的版本。
宿主程序一般希望支持稍微低一些的版本。
5、音频流
音频流在 ASIOStart() 开始调用以后开始传输。先前使硬件流开始传输时,驱动将传出一个或多个
bufferSwitch() 或者 bufferSwitchTimeInfo() 回叫去填充它的第一个输出缓冲区。然后如果硬件还
没有提供任何输入数据的话,输入通道的缓冲区是被驱动程序用静音填充的。
在硬件不停的需要数据(音频输入)时驱动程序启动硬件流 bufferSwitch() 或
bufferSwitchTimeInfo() 回叫将被始终调用。驱动传递必须被处理的双缓冲部分的索引给应用程序。
在这以后返回回叫告诉应用程序读取所有的输入数据和提供所有的输出数据。
注意:为了减少驱动或者硬件解决必须进一步处理音频数据(比如拷贝数据到硬件)而产生的大量临时
缓冲,ASIO API 提供 ASIOOutputReady() 方法。ASIOOutputReady() 是当应用程序完成缓冲区处理时
调用的工具。这是为了在中断驱动需要立即响应 bufferSwitch() 或者 bufferSwitchTimeInfo() 的系
统(像苹果机)的驱动而准备的,这些系统不能在回叫一个低的电平中断时间内消耗太长的时间。相反
地,应用程序要在一个中止电平执行数据处理并且一完成处理就通知驱动程序。在一个基于线程的系统
(像Windows 95/98/NT 或者2000),回叫总是可以处理数据。
6、媒体同步(样本位置和系统时间)
为了驱动程序能获得宿主程序专门用来同步媒体的信息,在发生 bufferSwitch() 或
bufferSwitchTimeInfo() 回叫请求事件(中断或定时请求)时,音频缓冲区的第一个样本的当前系统
时间和样本位置将晚于回叫。宿主程序在 bufferSwitch() 回叫 ASIOGetSamplePosition() 或者当
bufferSwitchTimeInfo() 回叫这个信息时接收到的这个信息是一部分或者是回叫的参数。
下表显示了 bufferSwitchTimeInfo() 回叫(在44100Hz 1024个音频缓冲样本,系统时间开始是2000ms
)的回叫序列和它们的值
回叫次数: 0 1 2 3 4 5 6
缓冲索引: 0 1 0 1 0 1 0
系统时间(ms): 2000 2000 2023 2046 2069 2092 2116
样本位置: 0 1024 2024 3072 4096 5120 6144
请注意在上表中前两次回叫使用的是相同的系统时间,在硬件还没启动的时候。当ASIO装备了一个不断
的流模块,在开始的一些bufferSwitch回叫中的时间信息是忽略不计的。同步处理将在宿主程序检测到
一个不断的流处理开始。(可以假设流将在第三个bufferSwitch回叫之后不断地传输,一些结合驱动/
硬件的更完善的检测方法可能在硬件输出处理上检索到更多的音频数据。)
注意:系统时间时间戳是一个操作系统的参考时间。请参阅附录D “平台/操作系统的区别”获得更多你
所使用的操作系统中系统时间的信息。
7、驱动通知宿主程序
驱动可以在一些需要宿主程序特殊处理的事件出现时通知宿主程序。以下通知信息将通过
asioMessage()回叫传递。
kAsioResetRequest 驱动需要重置,以防一个意料不到的事件或者一次重新设置
kAsioBufferSizeChange 缓冲区大小需要改变,由使用者定义
一些应用程序还未支持这个功能,因此建议使用kAsioResetRequest代替
kAsioResyncRequest 驱动检测到欠载运行并且需要重新同步
kAsioLatenciesChanged 驱动检测到延时调整
注意:宿主程序必须推迟这些通知的处理,到一个“安全”的时间也就是当驱动程序完成了它对通知的处
理以后。特别是当回叫必须返回到驱动,但 kAsioResetRequest 在 asioMessage 回叫时卸载驱动是一
个致命错误,因为这时候已经被reset了。
sampleRateDidChange() 通知宿主程序驱动检测到一次采样率变化。
通常只有在使用一个外置时钟源的情况下会改变它的采样率。
III、函数应用
初始化/结束
ASIOError ASIOInit(ASIODriverInfo *info);
ASIOError ASIOExit(void);
开始/停止
ASIOError ASIOStart(void);
ASIOError ASIOStop(void);
查询方法和采样率
ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels);
ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency);
ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long
*granularity);
ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate);
ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate);
ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate);
ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources);
ASIOError ASIOSetClockSource(long reference);
ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp);
ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info);
缓冲准备
ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long
bufferSize, ASIOCallbacks *callbacks);
ASIOError ASIODisposeBuffers(void);
ASIOError ASIOOutputReady(void);
杂项
ASIOError ASIOControlPanel(void);
ASIOError ASIOFuture(long selector, void *params);
回叫
void (*bufferSwitch) (long doubleBufferIndex, ASIOBool directProcess);
ASIOTime* (*bufferSwitchTimeInfo) (ASIOTime* params, long doubleBufferIndex, ASIOBool
directProcess);
void (*sampleRateDidChange) (ASIOSampleRate sRate);
long (*asioMessage) (long selector, long value, void* message, double* opt);
1. 初始化/结束
--------------------------------------------------------------------
ASIOError ASIOInit(ASIODriverInfo *info);
目的: 初始化ASIO
参数: info 一个指向 ASIODriverInfo 结构的指针。
返回: 如果既没有输入也没有输出,ASE_NotPresent 将被返回。
ASE_NoMemory,ASE_HWMalfunction 是出错状态的返回值。
ASIODriverInfo 的结构
{
long asio版本;