我正在尝试将kAudioUnitSubType添加到iOS 5中的AUGraph,但是当我添加它并调用AUGraphInitialize时,会返回错误代码-10868(kAudioUnitErr_FormatNotSupported)。
这是我的AudioComponentDescription:
AudioComponentDescription varispeedDescription;
varispeedDescription.componentType = kAudioUnitType_FormatConverter;
varispeedDescription.componentSubType = kAudioUnitSubType_Varispeed;
varispeedDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
varispeedDescription.componentFlags = 0;
varispeedDescription.componentFlagsMask = 0;
如果我在初始化图表之前打印图表的状态,我会得到以下结果:
AudioUnitGraph 0x918000:
Member Nodes:
node 1: 'auou' 'rioc' 'appl', instance 0x16dba0 O
node 2: 'aumx' 'mcmx' 'appl', instance 0x1926f0 O
node 3: 'aufc' 'vari' 'appl', instance 0x193b00 O
Connections:
node 2 bus 0 => node 3 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
node 3 bus 0 => node 1 bus 0 [ 2 ch, 0 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
Input Callbacks:
{0x39a5, 0x172e24} => node 2 bus 0 [2 ch, 44100 Hz]
{0x39a5, 0x172e24} => node 2 bus 1 [2 ch, 44100 Hz]
CurrentState:
mLastUpdateError=0, eventsToProcess=F, isRunning=F
正如您所看到的,从Varispeed设备到Remote IO设备的连接显示了一种非常奇怪的格式。更奇怪的是,如果我在模拟器上运行它而不是在我的开发设备上运行,则显示的格式是16位小端整数,解交织。如果我尝试在Varispeed单元的输入或输出范围上设置流格式,我会得到相同的错误代码-10868。
我在输入范围的每个Multichannel混音器总线上设置为流格式的asbd如下:
stereoFormat.mSampleRate = sampleRate;
stereoFormat.mFormatID = kAudioFormatLinearPCM;
stereoFormat.mFormatFlags = kAudioFormatFlagsCanonical;
stereoFormat.mFramesPerPacket = 1;
stereoFormat.mChannelsPerFrame = 2;
stereoFormat.mBitsPerChannel = 16;
stereoFormat.mBytesPerPacket = 4;
stereoFormat.mBytesPerFrame = 4;
我没有使用规范格式的音频单元是因为我正在从AVAssetReader读取样本,我无法配置输出8.24有符号整数样本。
如果我从图表中取出Varispeed单元并将多通道混音器单元连接到远程IO单元的输入,则图形初始化并播放正常。知道我做错了吗?
答案 0 :(得分:2)
你的io单位要求32bit浮点数并从varispeed单位收到8.24,因此格式错误。
你可以在varispeed的输出上设置流格式,以匹配io单元的输入格式,如下所示:
AudioStreamBasicDescription asbd;
UInt32 asbdSize = sizeof (asbd);
memset (&asbd, 0, sizeof (asbd));
AudioUnitGetProperty(ioaudiounit , kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &asbd, &asbdSize);
AudioUnitSetProperty(varipseedaudiounit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &asbd, sizeof(asbd));