2012-03-28 40 views
5

Tôi gặp sự cố khi lắp bộ trộn vào AUGraph nếu không hoạt động OK trên cả Mac OS và iOS.Im lặng khi thêm kAudioUnitSubType_MultiChannelMixer vào AUGraph

đồ thị làm việc của tôi trông như thế này:

(My Audio render callback) <- [Format converter] <- [DefaultOutput] 

Bên cạnh đó, tôi có thể chèn thành công một đơn vị EQ như thế này:

(My Audio render callback) <- [Format converter] <- [GraphicEQ] <- [DefaultOutput] 

Mục tiêu của tôi là để chèn một đơn vị trộn nhưng không có EQ nên tôi có thể kiểm soát lượng đồ thị của mình một cách độc lập với khối lượng hệ thống trên iOS. Tuy nhiên, khi tôi thiết lập biểu đồ, có vẻ như trông OK, nhưng tất cả những gì tôi nhận được là sự im lặng.

Dưới đây là những gì mà đồ thị dưới trông giống như:

(My Audio render callback) <- [Format converter] <- [MultiChannelMixer] <- [DefaultOutput] 

... và đầu ra của CAShow:

AudioUnitGraph 0x397000: 
    Member Nodes: 
    node 1: 'auou' 'def ' 'appl', instance 0x8039704d O I 
    node 2: 'aumx' 'mcmx' 'appl', instance 0x8039704e O I 
    node 3: 'aufc' 'conv' 'appl', instance 0x8039704f O I 
    Connections: 
    node 3 bus 0 => node 2 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved] 
    node 2 bus 0 => node 1 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved] 
    Input Callbacks: 
    {0x100035d90, 0x10037cd60} => node 3 bus 0 [2 ch, 44100 Hz] 
    CurrentState: 
    mLastUpdateError=0, eventsToProcess=F, isRunning=T (1) 

Và, cuối cùng, các mã đó là thiết lập đồ thị với kiểm tra lỗi và iOS- mã cụ thể loại bỏ:

// A description of the output device we're looking for. 
AudioComponentDescription outputDescription; 
outputDescription.componentType = kAudioUnitType_Output; 
outputDescription.componentSubType = kAudioUnitSubType_DefaultOutput; 
outputDescription.componentManufacturer = kAudioUnitManufacturer_Apple; 
outputDescription.componentFlags = 0; 
outputDescription.componentFlagsMask = 0; 

// A description of the mixer unit 
AudioComponentDescription mixerDescription; 
mixerDescription.componentType = kAudioUnitType_Mixer; 
mixerDescription.componentSubType = kAudioUnitSubType_MultiChannelMixer; 
mixerDescription.componentManufacturer = kAudioUnitManufacturer_Apple; 
mixerDescription.componentFlags = 0; 
mixerDescription.componentFlagsMask = 0; 

// A description for the libspotify -> standard PCM device 
AudioComponentDescription converterDescription; 
converterDescription.componentType = kAudioUnitType_FormatConverter; 
converterDescription.componentSubType = kAudioUnitSubType_AUConverter; 
converterDescription.componentManufacturer = kAudioUnitManufacturer_Apple; 
converterDescription.componentFlags = 0; 
converterDescription.componentFlagsMask = 0;  

// Create an AUGraph 
OSErr status = NewAUGraph(&audioProcessingGraph); 

// Open the graph. AudioUnits are open but not initialized (no resource allocation occurs here) 
AUGraphOpen(audioProcessingGraph); 

// Add audio output... 
status = AUGraphAddNode(audioProcessingGraph, &outputDescription, &outputNode); 

// Add mixer 
status = AUGraphAddNode(audioProcessingGraph, &mixerDescription, &mixerNode); 

// Get mixer unit so we can change volume etc 
status = AUGraphNodeInfo(audioProcessingGraph, mixerNode, NULL, &mixerUnit); 

// Set mixer bus count 
UInt32 busCount = 1; 
status = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &busCount, sizeof(busCount)); 

// Create PCM converter 
status = AUGraphAddNode(audioProcessingGraph, &converterDescription, &inputConverterNode); 

// Connect converter to mixer 
status = AUGraphConnectNodeInput(audioProcessingGraph, inputConverterNode, 0, mixerNode, 0); 

// Connect mixer to output 
status = AUGraphConnectNodeInput(audioProcessingGraph, mixerNode, 0, outputNode, 0); 

// Set render callback 
AURenderCallbackStruct rcbs; 
rcbs.inputProc = AudioUnitRenderDelegateCallback; 
rcbs.inputProcRefCon = (__bridge void *)(self); 

status = AUGraphSetNodeInputCallback(audioProcessingGraph, inputConverterNode, 0, &rcbs); 

// Init Queue 
status = AUGraphInitialize(audioProcessingGraph); 

AUGraphUpdate(audioProcessingGraph, NULL); 
AUGraphStart(audioProcessingGraph); 
+0

vì vậy điều này đã làm việc với GraphicEQ thay vì máy trộn? Với cùng một cuộc gọi lại? bạn có thể làm cho nó hoạt động mà không cần gọi lại không? – hooleyhoop

Trả lời

13

... và tất nhiên là chỉ sau khi đăng câu hỏi của tôi ở đây, tôi vấp ngã khi câu trả lời.

Dường như, trên Mac OS ít nhất, âm lượng đầu vào trên bộ trộn mặc định là 0,0. Cài đặt âm lượng đầu vào theo cách thủ công cố định nó ngay lập tức:

status = AudioUnitSetParameter(mixerUnit, kMultiChannelMixerParam_Volume, kAudioUnitScope_Input, 0, 1.0, 0); 
+1

Để tôi cài đặt kAudioUnitScope_Output thay vì KAudioUnitScope_Input. – user523234

+2

FYI: Tôi phải đặt In-and Output để nhận tín hiệu. – hobotron

Các vấn đề liên quan