招募一起翻译的小伙伴,有意者请私信我!
翻译进度表:
1.2014/10/7完整目录以及1.3
2.本项目暂时冷冻,目前忙于WP客户端开发
2.本项目暂时冷冻,目前忙于WP客户端开发
1.音频单元提供快速、模块化的音频处理
1.1iOS中的音频单元
1.1.1音效单元
1.1.2混响单元
1.1.3I/O单元
1.1.4格式转换单元
1.2协调一致地使用这两个音频单元API
1.3使用identifier来指定和获取音频单元
为在运行时找到音频单元,可以先在一个音频组件描述中指定它的类型,子类型和生产商键值。你可以通过音频单元或者音频处理流程图API来完成这项工作。清单1-1显示如下。
清单1-1 创建一个音频组件描述来标识一个音频单元
AudioComponentDescription ioUnitDescription;
ioUnitDescription.componentType = kAudioUnitType_Output;
ioUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;
ioUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
ioUnitDescription.componentFlags = 0;
ioUnitDescription.componentFlagsMask = 0;
这个描述指定了一个音频单元——远程I/O单元。与该类型以及其他类型对应的键列举在《 Identifier Keys for Audio Units》注意,所有iOS音频单元的 componentManufacturer字段都 使用
kAudioUnitManufacturer_Apple作为键值。
为创建一个通配的描述,需要将type/subtype字段中的一个或者多个设为0。例如,为匹配所有I/O单元,需要将清单1-1中的componentSubType字段设为0。
当手头上有一个描述可用时,你就可以使用两者中的任一API来获取一个指向指定音频单元(集)的库的引用。音频单元API如清单1-2所示。
清单1-2使用音频单元API获取一个音频单元实例
AudioComponent foundIoUnitReference = AudioComponentFindNext (
NULL,
&ioUnitDescription
);
AudioUnit ioUnitInstance;
AudioComponentInstanceNew (
foundIoUnitReference,
&ioUnitInstance
);
将NULL传给AudioComponentFindNext的第一个参数,告诉该函数去找到第一个(
按系统定义顺序)匹配该描述的系统音频单元。如果你传入的是一个先前找到的音频单元的引用,该函数会定位到下一个匹配该描述的音频单元。这个用法使你可以通过重复调用AudioComponetFindNext来获取所有音频单元的引用。
AudioComponentFindNext调用的第二个参数指向清单1-1中定义的音频单元描述。
AudioComponentFindNext函数的结果是一个指向定义该音频单元的动态链接库的引用。将该引用传给AudioComponentInstanceNew函数来实例该音频单元,如清单1-2所示。
代替地,你可以使用音频处理流程图API来实例一个音频单元,清单1-3显示如何实现。
清单1-3使用音频处理流程图API来获取音频单元实例
// Declare and instantiate an audio processing graph
AUGraph processingGraph;
NewAUGraph (&processingGraph);
// Add an audio unit node to the graph, then instantiate the audio unit
AUNode ioNode;
AUGraphAddNode (
processingGraph,
&ioUnitDescription,
&ioNode
);
AUGraphOpen (processingGraph); // indirectly performs audio unit instantiation
// Obtain a reference to the newly-instantiated I/O unit
AudioUnit ioUnit;
AUGraphNodeInfo (
processingGraph,
ioNode,
NULL,
&ioUnit
);
该代码清单引入了AUNode,一个表示在一个音频处理图上下文中的一个音频单元的不透明类型。你在AUGraphNodeInfo函数调用的输出,也即是ioUnit参数中,获得一个指向新的音频单元实例的引用。
AUGraphAddNode调用的第二个参数指向清单1-1中定义的音频单元描述。
获得一个音频单元实例后,你可以配置它。为实现这个,你需要学习两个音频单元特征,scope和element。