AudioToolbox连接节点时AUGraph失败错误kAudioUnitErr_PropertyNotWriteable

时间:2014-08-04 22:10:36

标签: ios audio core-audio audiounit audiotoolbox

我正在尝试使用调音台和io单元创建音频图表。 io单元将从麦克风接收音频并将其发送到混音器,混音器将其与外部声音混合,并将其播放回扬声器。我已经创建了如下的音频图,尽可能地遵循指南。但是,当我尝试将混音器节点连接到输出节点时,我不断收到错误-10865(kAudioUnitErr_PropertyNotWriteable)。有人可以告诉我出了什么问题吗?如果需要,我将包含更多代码,例如我的回调和私有变量。

NSLog(@"Creating audio graph");
sampleRate = 44100.0;

// Will check results
OSStatus result;

// Create the graph
result = NewAUGraph(&graph);
if(result != noErr)
    NSLog(@"Failed creating graph");

result = AUGraphInitialize(graph);
if(result != noErr)
    NSLog(@"Failed to initialize audio graph Error code: %d '%.4s", (int) result, (const char *)&result);

// Create audio nodes
AudioComponentDescription ioDescription;
ioDescription.componentType = kAudioUnitType_Output;
ioDescription.componentSubType = kAudioUnitSubType_RemoteIO;
ioDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
ioDescription.componentFlagsMask = 0;
ioDescription.componentFlags = 0;

AudioComponentDescription mixerDescription;
mixerDescription.componentType = kAudioUnitType_Mixer;
mixerDescription.componentSubType = kAudioUnitSubType_MultiChannelMixer;
mixerDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
mixerDescription.componentFlagsMask = 0;
mixerDescription.componentFlags = 0;

// Add nodes to the graph
AUNode ioNode;
AUNode mixerNode;

result = AUGraphAddNode(graph, &ioDescription, &ioNode);
if(result != noErr)
    NSLog(@"Failed to add microphone node");
result = AUGraphAddNode(graph, &mixerDescription, &mixerNode);
if(result != noErr)
    NSLog(@"Failed to add mixer node");

// Open the graph
result = AUGraphOpen(graph);
if(result != noErr)
    NSLog(@"Failed to open graph");

// Get the IO node
result = AUGraphNodeInfo(graph, ioNode, NULL, &ioUnit);
if(result != noErr)
    NSLog(@"Failed to fetch info from io node");

// Enable IO on the io node
UInt32 flag = 1;
result = AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &flag, sizeof(flag));
if(result != noErr)
    NSLog(@"Failed enabling IO on io unit");

// Get the mixer unit
result = AUGraphNodeInfo(graph, mixerNode, NULL, &mixerUnit);
if(result != noErr)
    NSLog(@"Failed to fetch info from mixer node");

// Set up the mixer unit bus count
UInt32 busCount = 2;
result = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &busCount, sizeof(busCount));
if(result != noErr)
    NSLog(@"Failed to set property mixer input bus count");

// Attach render callback to sound effect bus
UInt32 soundEffectBus = 1;

AURenderCallbackStruct inputCallbackStruct;
inputCallbackStruct.inputProc = &inputRenderCallback;
inputCallbackStruct.inputProcRefCon = soundStruct;

result = AUGraphSetNodeInputCallback(graph, mixerNode, soundEffectBus, &inputCallbackStruct);
if(result != noErr)
    NSLog(@"Failed to set mixer node input callback for sound effect bus");

// Set stream format for sound effect bus
UInt32 bytesPerSample = sizeof (AudioUnitSampleType);

stereoDescription.mFormatID = kAudioFormatLinearPCM;
stereoDescription.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
stereoDescription.mBytesPerPacket = bytesPerSample;
stereoDescription.mFramesPerPacket = 1;
stereoDescription.mBytesPerFrame = bytesPerSample;
stereoDescription.mChannelsPerFrame = 2;
stereoDescription.mBitsPerChannel = 8 * bytesPerSample;
stereoDescription.mSampleRate = sampleRate;

result = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, soundEffectBus, &stereoDescription, sizeof(stereoDescription));
if(result != noErr)
    NSLog(@"Failed to set stream description");

// Set mixer output sample rate
result = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, 0, &sampleRate, sizeof(sampleRate));
if(result != noErr)
    NSLog(@"Failed to set mixer output sample rate");

// Connect input to mixer
result = AUGraphConnectNodeInput(graph, ioNode, 1, mixerNode, 0);
if(result != noErr)
    NSLog(@"Failed to connect microphone node to mixer node");

此处出现错误

// Connect mixer to output
result = AUGraphConnectNodeInput(graph, mixerNode, 0, ioNode, 0);
if(result != noErr)
    NSLog(@"Failed to connect mixer to output node %d", result);

// Initialize the audio graph
CAShow(graph);

// Start the graph
result = AUGraphStart(graph);
if(result != noErr)
    NSLog(@"Failed to start audio graph");

NSLog(@"Graph started");

修改

我能够理解为什么会出现这个错误,我想我将调音台输出分配给io单元的输入通道(这是只读的,当然因为它来自麦克风)。但是,在切换之后,当我更改上面的代码时,我有这个错误

ERROR:     [0x196f982a0] 308: input bus 0 sample rate is 0

有人能帮帮我吗?有什么我忘记设置的吗?

1 个答案:

答案 0 :(得分:1)

根据错误信息,我建议你明确地在混音器的每个总线上设置流格式(输入和输出),这是肯定的。就个人而言,我没有在调音台上设置kAudioUnitProperty_SampleRate,我认为它没有意义(恕我直言,这对于硬件IO单元选择DAC的采样率有意义,它可能也有格式化的含义转换器单位)

相关问题