AUParamInfo() 似乎不存在于 iOS7 框架(CoreAudio、AudioUnit、AudioToolbox)中。我想知道获取一个单元的所有参数的方法是什么。也就是说,不知道它是什么类型或子类型的单元,因为如果不是,答案将是在音频单元参数参考中查找。
3 回答
Greg 的回答是正确的,因为 kAudioUnitProperty_ParameterList 是要查询以最终获取单元的所有参数的正确属性 ID。但是,获取所有参数的方法有点复杂:
- 用于
AudioUnitGetPropertyInfo
查看属性是否可用,如果可用,则取回其数据大小(请注意,整个信息的数据大小可能是一个集合,而不是属性的任何类型的单个元素的数据大小)。 使用
AudioUnitGetProperty
正确的方式取回财产。此外,此时,如果您返回的属性是元素集合而不是单个元素,则您必须AudioUnitGetProperty
为每个元素调用一次。具体来说,你会称之为dataSize / sizeof(TypeToHoldSingleInstanceOfYourProperty)
时间。// Get number of parameters in this unit (size in bytes really): UInt32 parameterListSize = 0; AudioUnitGetPropertyInfo(_audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, 0, ¶meterListSize, NULL); // Get ids for the parameters: AudioUnitParameterID *parameterIDs = malloc(parameterListSize); AudioUnitGetProperty(_audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, 0, parameterIDs, ¶meterListSize); AudioUnitParameterInfo parameterInfo_t; UInt32 parameterInfoSize = sizeof(AudioUnitParameterInfo); UInt32 parametersCount = parameterListSize / sizeof(AudioUnitParameterID); for(UInt32 pIndex = 0; pIndex < parametersCount; pIndex++){ AudioUnitGetProperty(_audioUnit, kAudioUnitProperty_ParameterInfo, kAudioUnitScope_Global, parameterIDs[pIndex], ¶meterInfo_t, ¶meterInfoSize); // do whatever you want with each parameter... }
不确定这是否会有所帮助,但文档指出:
要从音频单元获取参数信息,主机应用程序首先获取音频单元的 kAudioUnitProperty_ParameterList 属性的值,该属性由 SDK 中的超类为您提供。此属性的值是为音频单元定义的参数 ID 的列表。然后,主机可以查询每个参数 ID 的 kAudioUnitProperty_ParameterInfo 属性。
(来自音频单元编程指南)
这是一个Swift 5版本提案
1 - 定义一个方便的结构来存储我们的信息
/// Swifty AudioUnit parameters array
struct AudioUnitParameter: CustomStringConvertible {
var id: Int
var name: String = ""
var minValue: Float
var maxValue: Float
var defaultValue: Float
var unit: Int
init(_ info: AudioUnitParameterInfo, id: UInt32) {
self.id = Int(id)
if let cfName = info.cfNameString?.takeUnretainedValue() {
name = String(cfName)
}
minValue = Float(info.minValue)
maxValue = Float(info.maxValue)
defaultValue = Float(info.defaultValue)
unit = Int(info.unit.rawValue)
}
var description: String {
"Parameter [id: \(id)] : \(name) [\(minValue)..\(maxValue)] \(unit)"
}
}
2 - 在 AudioUnit 类上添加一个方便的参数获取器
extension AudioUnit {
/// Returns an array with audioUnit parameters descriptions
var parameters: [AudioUnitParameter] {
var out = [AudioUnitParameter]()
// Get number of parameters in this unit (size in bytes really):
var parameterListSize: UInt32 = 0
let parameterSize = MemoryLayout<AudioUnitParameterID>.size
AudioUnitGetPropertyInfo(self, kAudioUnitProperty_ParameterList,
kAudioUnitScope_Global,
0, ¶meterListSize, nil);
let numberOfParameters = Int(parameterListSize) / parameterSize
// Get ids for the parameters:
let parameterIds = UnsafeMutablePointer<UInt32>.allocate(capacity: Int(parameterListSize))
AudioUnitGetProperty(self, kAudioUnitProperty_ParameterList,
kAudioUnitScope_Global,
0, parameterIds, ¶meterListSize);
var info = AudioUnitParameterInfo()
var infoSize = UInt32(MemoryLayout<AudioUnitParameterInfo>.size)
for i in 0 ..< numberOfParameters {
let id = parameterIds[i]
AudioUnitGetProperty(self, kAudioUnitProperty_ParameterInfo,
kAudioUnitScope_Global,
id, &info, &infoSize);
out += [AudioUnitParameter(info, id: id)]
}
return out
}
}
用法:
if let params = myDLSSynthAudioUnit.parameters {
params.forEach { print($0) }
}
Property [0] : Tuning [-1200.0..1200.0] 9
Property [1] : Volume [-120.0..40.0] 13
Property [2] : Reverb Volume [-120.0..40.0] 13
我们还可以为 Unit 整数代码实现一个字符串 getter。只需从 Apple 复制所有参数AudioUnitParameterUnit
。
extension AudioUnitParameterUnit {
var name: String { ["Generic", "Indexed", "Boolean", "Percent", ... ][rawValue] }
}