Ошибка -10877 при добавлении AUConverter в AUGraph - PullRequest
1 голос
/ 24 августа 2011

Я работаю с примером проекта Apple MixerHost, который настраивает график обработки аудиоустройства, состоящего из аудиоустройства многоканального микшера, подключенного к удаленному аудиоустройству ввода / вывода. Я пытаюсь поместить аудиоустройство преобразователя формата между ними, чтобы я мог преобразовать формат вывода микшера.

Копирование настроек двух существующих аудиоустройств кажется простым, и когда я вывожу настройки графика, это выглядит правильно:

Member Nodes:
node 1: 'auou' 'rioc' 'appl', instance 0x1cdf10 O  
node 2: 'aufc' 'conv' 'appl', instance 0x1ce890 O  
node 3: 'aumx' 'mcmx' 'appl', instance 0x1ceba0 O  
Connections:
node   3 bus   0 => node   2 bus   1
node   2 bus   0 => node   1 bus   0  [ 2 ch,      0 Hz, 'lpcm' (0x0000000C) 16-bit little-endian signed integer]

Однако, когда я инициализирую график, я получаю ошибку -10877, неверный элемент, и график не запускается. Кто-нибудь может увидеть, что не так? Вот полный код настройки:

NSLog (@"Configuring and then initializing audio processing graph");
OSStatus result = noErr;

//............................................................................
// Create a new audio processing graph.
result = NewAUGraph (&processingGraph);

if (noErr != result) {[self printErrorMessage: @"NewAUGraph" withStatus: result]; return;}


//............................................................................
// Specify the audio unit component descriptions for the audio units to be
//    added to the graph.

// I/O unit
AudioComponentDescription ioUnitDescription;
ioUnitDescription.componentType          = kAudioUnitType_Output;
ioUnitDescription.componentSubType       = kAudioUnitSubType_RemoteIO;
ioUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
ioUnitDescription.componentFlags         = 0;
ioUnitDescription.componentFlagsMask     = 0;

// Converter unit
AudioComponentDescription ConverterUnitDescription;
ConverterUnitDescription.componentType          = kAudioUnitType_FormatConverter;
ConverterUnitDescription.componentSubType       = kAudioUnitSubType_AUConverter;
ConverterUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
ConverterUnitDescription.componentFlags         = 0;
ConverterUnitDescription.componentFlagsMask     = 0;

// Multichannel mixer unit
AudioComponentDescription MixerUnitDescription;
MixerUnitDescription.componentType          = kAudioUnitType_Mixer;
MixerUnitDescription.componentSubType       = kAudioUnitSubType_MultiChannelMixer;
MixerUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
MixerUnitDescription.componentFlags         = 0;
MixerUnitDescription.componentFlagsMask     = 0;


//............................................................................
// Add nodes to the audio processing graph.
NSLog (@"Adding nodes to audio processing graph");

AUNode   mixerNode;      // node for Multichannel Mixer unit
AUNode   converterNode;  // node for AU Converter unit
AUNode   ioNode;         // node for I/O unit

// Add the nodes to the audio processing graph
result =    AUGraphAddNode (
                processingGraph,
                &ioUnitDescription,
                &ioNode);
if (noErr != result) {[self printErrorMessage: @"AUGraphNewNode failed for I/O unit" withStatus: result]; return;}

result =    AUGraphAddNode (
                processingGraph,
                &ConverterUnitDescription,
                &converterNode
            );
if (noErr != result) {[self printErrorMessage: @"AUGraphNewNode failed for Converter unit" withStatus: result]; return;}

result =    AUGraphAddNode (
                processingGraph,
                &MixerUnitDescription,
                &mixerNode
            );
if (noErr != result) {[self printErrorMessage: @"AUGraphNewNode failed for Mixer unit" withStatus: result]; return;}


//............................................................................
// Open the audio processing graph

// Following this call, the audio units are instantiated but not initialized
//    (no resource allocation occurs and the audio units are not in a state to
//    process audio).
result = AUGraphOpen (processingGraph);

if (noErr != result) {[self printErrorMessage: @"AUGraphOpen" withStatus: result]; return;}


//............................................................................
// Obtain the audio unit instances from their corresponding nodes.

AudioUnit                       mixerUnit;
AudioUnit                       converterUnit;
AudioUnit                       ioUnit;

result =    AUGraphNodeInfo (
                processingGraph,
                ioNode,
                NULL,
                &ioUnit
            );
if (noErr != result) {[self printErrorMessage: @"AUGraphNodeInfo" withStatus: result]; return;}

result =    AUGraphNodeInfo (
                processingGraph,
                converterNode,
                NULL,
                &converterUnit
            );
if (noErr != result) {[self printErrorMessage: @"AUGraphNodeInfo" withStatus: result]; return;}

result =    AUGraphNodeInfo (
                processingGraph,
                mixerNode,
                NULL,
                &mixerUnit
            );
if (noErr != result) {[self printErrorMessage: @"AUGraphNodeInfo" withStatus: result]; return;}


//............................................................................
// Audio Unit Setup

// Set the mixer unit's output sample rate format. This is the only aspect of the output stream
//    format that must be explicitly set.
NSLog (@"Setting sample rate for mixer unit output scope");
result = AudioUnitSetProperty (
             mixerUnit,
             kAudioUnitProperty_SampleRate,
             kAudioUnitScope_Output,
             0,
             &graphSampleRate,
             sizeof (graphSampleRate)
         );
if (noErr != result) {[self printErrorMessage: @"AudioUnitSetProperty (set mixer unit output stream format)" withStatus: result]; return;}


//............................................................................
// Connect the nodes of the audio processing graph

NSLog (@"Connecting the mixer output to the input of the converter unit input element");
result = AUGraphConnectNodeInput (
             processingGraph,
             mixerNode,         // source node
             0,                 // source node output bus number
             converterNode,     // destination node
             1                  // destination node input bus number
         );
if (noErr != result) {[self printErrorMessage: @"AUGraphConnectNodeInput" withStatus: result]; return;}

NSLog (@"Connecting the converter output to the input of the I/O unit output element");
result = AUGraphConnectNodeInput (
             processingGraph,
             converterNode,     // source node
             0,                 // source node output bus number
             ioNode,            // destination node
             0                  // destination node input bus number
         );
if (noErr != result) {[self printErrorMessage: @"AUGraphConnectNodeInput" withStatus: result]; return;}


//............................................................................
// Initialize audio processing graph

// Diagnostic code
// Call CAShow if you want to look at the state of the audio processing 
//    graph.
NSLog (@"Audio processing graph state immediately before initializing it:");
CAShow (processingGraph);

NSLog (@"Initializing the audio processing graph");
// Initialize the audio processing graph, configure audio data stream formats for
//    each input and output, and validate the connections between audio units.
result = AUGraphInitialize (processingGraph);

if (noErr != result) {[self printErrorMessage: @"AUGraphInitialize" withStatus: result]; return;}

1 Ответ

5 голосов
/ 11 октября 2011

Я только что нашел ответ!Вот проблема:

node   3 bus   0 => node   2 bus   1

Формат потока не определен, поэтому что-то не так.

Я не проверял это на устройстве AUConverter, но с устройством iPodEQ, которое вы используететолько один элемент.Затем вы подключаете выход микшера к входу scope выходной шины, то есть

result = AUGraphConnectNodeInput (
             processingGraph,
             mixerNode,         // source node
             0,                 // source node output bus number
             converterNode,     // destination node
             0                  // destination node input bus number
         );

HTH.:)

...