Ios Core Audio Matrix混音器在设置输入或输出元素的数量时会卡住并滥用内存
我设法用核心音频和Swift创建并使用了简单的音频图,但我找不到使用矩阵混音器的正确方法。 当我试图设置元素的数量时,程序似乎进入了一个无限循环,最终使用了大量内存,再也不会返回 这可能和我们所说的不太一样 重现该行为的最简单代码如下:Ios Core Audio Matrix混音器在设置输入或输出元素的数量时会卡住并滥用内存,ios,swift,core-audio,audiounit,Ios,Swift,Core Audio,Audiounit,我设法用核心音频和Swift创建并使用了简单的音频图,但我找不到使用矩阵混音器的正确方法。 当我试图设置元素的数量时,程序似乎进入了一个无限循环,最终使用了大量内存,再也不会返回 这可能和我们所说的不太一样 重现该行为的最简单代码如下: var graph = AUGraph() var filePlayerAU = AudioUnit() var mixerAU = AudioUnit() var outputAU = AudioUnit() NewA
var graph = AUGraph()
var filePlayerAU = AudioUnit()
var mixerAU = AudioUnit()
var outputAU = AudioUnit()
NewAUGraph(&graph)
// Add file player node
var filePlayerNode = AUNode()
var filePlayerDesc = AudioComponentDescription(componentType: OSType(kAudioUnitType_Generator),
componentSubType: OSType(kAudioUnitSubType_AudioFilePlayer),
componentManufacturer: OSType(kAudioUnitManufacturer_Apple),
componentFlags: 0, componentFlagsMask: 0)
CheckResult("Adding file player node", status: AUGraphAddNode(graph, &filePlayerDesc, &filePlayerNode))
// Add matrix mixer node
var mixerNode = AUNode()
var mixerDesc = AudioComponentDescription(componentType: OSType(kAudioUnitType_Mixer),
componentSubType: OSType(kAudioUnitSubType_MatrixMixer),
componentManufacturer: OSType(kAudioUnitManufacturer_Apple),
componentFlags: 0, componentFlagsMask: 0)
CheckResult("Adding matrix mixer node", status: AUGraphAddNode(graph, &mixerDesc, &mixerNode))
// Add output node
var outputNode = AUNode()
var outputDesc = AudioComponentDescription(componentType: OSType(kAudioUnitType_Output),
componentSubType: OSType(kAudioUnitSubType_RemoteIO),
componentManufacturer: OSType(kAudioUnitManufacturer_Apple),
componentFlags: 0, componentFlagsMask: 0)
CheckResult("Adding output node", status: AUGraphAddNode(graph, &outputDesc, &outputNode))
// Graph must be opened before we can get node info, i.e. the Audio Units
CheckResult("Opening graph", status: AUGraphOpen(graph))
CheckResult("Getting file player node info", status: AUGraphNodeInfo(graph, filePlayerNode, nil, &filePlayerAU))
CheckResult("Getting mixer node info", status: AUGraphNodeInfo(graph, mixerNode, nil, &mixerAU))
CheckResult("Getting output node info", status: AUGraphNodeInfo(graph, outputNode, nil, &outputAU))
var outputBusNumber: AudioUnitParameterValue = 1
var propSize = UInt32(sizeof(AudioUnitParameterValue))
// Setting default parameters for the mixer unit
CheckResult("Setting mixer output elements count", status: AudioUnitSetProperty(mixerAU, AudioUnitPropertyID(kAudioUnitProperty_ElementCount), OSType(kAudioUnitScope_Output), 0, &outputBusNumber, propSize))
当执行最后一行时,程序挂起,内存使用率达到最高。我试着先把图表连接起来,但没有任何区别。有没有关于如何做到这一点的提示
CheckResult功能在以下位置可用:
func CheckResult(msg:String, status:OSStatus) {
print(msg + ": ")
switch(Int(status)) {
case 0:
println("OK")
// AudioToolbox
case kAUGraphErr_NodeNotFound:
println("Error:kAUGraphErr_NodeNotFound")
case kAUGraphErr_OutputNodeErr:
println("Error:kAUGraphErr_OutputNodeErr")
case kAUGraphErr_InvalidConnection:
println("Error:kAUGraphErr_InvalidConnection")
case kAUGraphErr_CannotDoInCurrentContext:
println("Error:kAUGraphErr_CannotDoInCurrentContext")
case kAUGraphErr_InvalidAudioUnit:
println("Error:kAUGraphErr_InvalidAudioUnit")
case kAudioToolboxErr_InvalidSequenceType :
println("kAudioToolboxErr_InvalidSequenceType")
case kAudioToolboxErr_TrackIndexError :
println("kAudioToolboxErr_TrackIndexError")
case kAudioToolboxErr_TrackNotFound :
println("kAudioToolboxErr_TrackNotFound")
case kAudioToolboxErr_EndOfTrack :
println("kAudioToolboxErr_EndOfTrack")
case kAudioToolboxErr_StartOfTrack :
println("kAudioToolboxErr_StartOfTrack")
case kAudioToolboxErr_IllegalTrackDestination :
println("kAudioToolboxErr_IllegalTrackDestination")
case kAudioToolboxErr_NoSequence :
println("kAudioToolboxErr_NoSequence")
case kAudioToolboxErr_InvalidEventType :
println("kAudioToolboxErr_InvalidEventType")
case kAudioToolboxErr_InvalidPlayerState :
println("kAudioToolboxErr_InvalidPlayerState")
case kAudioUnitErr_InvalidProperty :
println("kAudioUnitErr_InvalidProperty")
case kAudioUnitErr_InvalidParameter :
println("kAudioUnitErr_InvalidParameter")
case kAudioUnitErr_InvalidElement :
println("kAudioUnitErr_InvalidElement")
case kAudioUnitErr_NoConnection :
println("kAudioUnitErr_NoConnection")
case kAudioUnitErr_FailedInitialization :
println("kAudioUnitErr_FailedInitialization")
case kAudioUnitErr_TooManyFramesToProcess :
println("kAudioUnitErr_TooManyFramesToProcess")
case kAudioUnitErr_InvalidFile :
println("kAudioUnitErr_InvalidFile")
case kAudioUnitErr_FormatNotSupported :
println("kAudioUnitErr_FormatNotSupported")
case kAudioUnitErr_Uninitialized :
println("kAudioUnitErr_Uninitialized")
case kAudioUnitErr_InvalidScope :
println("kAudioUnitErr_InvalidScope")
case kAudioUnitErr_PropertyNotWritable :
println("kAudioUnitErr_PropertyNotWritable")
case kAudioUnitErr_InvalidPropertyValue :
println("kAudioUnitErr_InvalidPropertyValue")
case kAudioUnitErr_PropertyNotInUse :
println("kAudioUnitErr_PropertyNotInUse")
case kAudioUnitErr_Initialized :
println("kAudioUnitErr_Initialized")
case kAudioUnitErr_InvalidOfflineRender :
println("kAudioUnitErr_InvalidOfflineRender")
case kAudioUnitErr_Unauthorized :
println("kAudioUnitErr_Unauthorized")
case kAudioFileUnspecifiedError:
println("kAudioFileUnspecifiedError")
case kAudioFileUnsupportedFileTypeError:
println("kAudioFileUnsupportedFileTypeError")
case kAudioFileUnsupportedDataFormatError:
println("kAudioFileUnsupportedDataFormatError")
case kAudioFileUnsupportedPropertyError:
println("kAudioFileUnsupportedPropertyError")
case kAudioFileBadPropertySizeError:
println("kAudioFileBadPropertySizeError")
case kAudioFilePermissionsError:
println("kAudioFilePermissionsError")
case kAudioFileNotOptimizedError:
println("kAudioFileNotOptimizedError")
case kAudioFileInvalidChunkError:
println("kAudioFileInvalidChunkError")
case kAudioFileDoesNotAllow64BitDataSizeError:
println("kAudioFileDoesNotAllow64BitDataSizeError")
case kAudioFileInvalidPacketOffsetError:
println("kAudioFileInvalidPacketOffsetError")
case kAudioFileInvalidFileError:
println("kAudioFileInvalidFileError")
case kAudioFileOperationNotSupportedError:
println("kAudioFileOperationNotSupportedError")
case kAudioFileNotOpenError:
println("kAudioFileNotOpenError")
case kAudioFileEndOfFileError:
println("kAudioFileEndOfFileError")
case kAudioFilePositionError:
println("kAudioFilePositionError")
case kAudioFileFileNotFoundError:
println("kAudioFileFileNotFoundError")
default:
println("huh? (OSStatus: \(status))")
}
}
事实证明,问题在于AudioUnitParameterValue的使用,它只应与AudioUnitSetParameter一起使用 一旦类型更改为UInt32,问题就会消失 非常感谢苹果开发论坛上的OOper指出了我愚蠢的错误