Mac OS X では、ユーザーが選択したサウンド カードからオーディオ ストリームを取得して、PCM バッファを出力しようとしています。
この時点で、正常なデバイスにアクセスし、a を使用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
後で始めます。
AudioUnitSetProperty
実際には、それぞれでエラー -50 が発生しましたstreamConverterUnit
。
に慣れている人からのフィードバックが欲しいのですがCoreAudio
、この設定フローは適切ですか? なぜこのエラー -50 が発生するのでしょうか?
敬具、ヨアン