2012-07-10 39 views
1

在Mac OS X上,我尝试从用户选择的声卡获取音频流,并使用PCM缓冲区出来。AudioUnit,配置一个图形转换帧并将其发送到回调?

目前,我可以访问良好的设备,并使用AudioDeviceIOProc获取硬件原生流描述的缓冲区。

现在我想用我的选定设备使用AUGraph将我的缓冲区转换为自定义ASBD并在AURenderCallback上得到它。

这里是我的设置代码(NSString* deviceUID and AudioStreamBasicDescription streamDescription在参数被传递给我的设置功能):

 // get the AudioDeviceID 
    AudioValueTranslation avt = {&deviceUID, 
     sizeof(deviceUID), 
     &_inDevice, 
     sizeof(_inDevice)}; 
    UInt32 avt_len = sizeof(avt); 
    osstat = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &avt_len, &avt); 

    osstat = NewAUGraph(&_inputGraph); 

    AudioComponentDescription streamConverterDesc; 
    streamConverterDesc.componentType = kAudioUnitType_FormatConverter; 
    streamConverterDesc.componentSubType = kAudioUnitSubType_AUConverter; 
    streamConverterDesc.componentManufacturer = kAudioUnitManufacturer_Apple; 
    streamConverterDesc.componentFlags = streamConverterDesc.componentFlagsMask = 0; 

    AUNode streamConverterNode; 
    osstat = AUGraphAddNode(_inputGraph, &streamConverterDesc, &streamConverterNode); 

    AudioUnit streamConverterUnit; 
    osstat = AUGraphNodeInfo(_inputGraph, streamConverterNode, NULL, &streamConverterUnit); 

    osstat = AudioUnitSetProperty(streamConverterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &streamDescription, sizeof(streamDescription)); 

    osstat = AudioUnitSetProperty(streamConverterUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &_inDevice, sizeof(_inDevice)); 

    AudioComponentDescription streamReaderDesc; 
    streamReaderDesc.componentType = kAudioUnitType_Output; 
    streamReaderDesc.componentSubType = kAudioUnitSubType_GenericOutput; 
    streamReaderDesc.componentManufacturer = kAudioUnitManufacturer_Apple; 
    streamReaderDesc.componentFlags = streamReaderDesc.componentFlagsMask = 0; 

    AUNode streamReaderNode; 
    osstat = AUGraphAddNode(_inputGraph, &streamReaderDesc, &streamReaderNode); 

    AudioUnit streamReaderUnit; 
    osstat = AUGraphNodeInfo(_inputGraph, streamReaderNode, NULL, &streamReaderUnit); 

    AURenderCallbackStruct callback; 
    callback.inputProc = EIRenderCallback; 
    callback.inputProcRefCon = self; 
    osstat = AudioUnitSetProperty(streamReaderUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Output, 0, &callback, sizeof(callback)); 
    osstat = AudioUnitSetProperty(streamReaderUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &streamDescription, sizeof(streamDescription)); 

    osstat = AUGraphConnectNodeInput(_inputGraph, streamConverterNode, 1, streamReaderNode, 0); 

    osstat = AUGraphOpen(_inputGraph); 
    osstat = AUGraphInitialize(_inputGraph); 

我开始我的AUGraph后。

其实我在AudioUnitSetPropertystreamConverterUnit上得到了错误-50。

我想有一个反馈,从人们习惯了CoreAudio,这个设置流程是好的吗?为什么这个错误-50,我应该怎么做才能完成一个工作设置?

最好的问候, 约恩

回答

2

尝试调用AudioUnitSetProperty()在图中的单位之前调用AUGraphOpen()。

相关问题