2013-02-25 61 views
3

我一直在尋找網絡的答案几周沒有運氣。osx音頻單元多通道輸出

我有一個maudio profire 610多通道音頻接口。 如何正確設置AudioStreamBasicDescription以使用全部8個輸出通道? 目前它只適用於前2個頻道。

UInt32 busCount = 3; //numberOfOutputBusses; 
AudioStreamBasicDescription outputASBD2 = { 
    .mSampleRate  = 44100, 
    .mFormatID   = kAudioFormatLinearPCM, 
    .mFormatFlags  = kAudioFormatFlagsAudioUnitCanonical, 
    .mChannelsPerFrame = busCount, 
    .mFramesPerPacket = 1, 
    .mBitsPerChannel = sizeof(Float32) * 8, 
    .mBytesPerPacket = sizeof(Float32) * busCount, 
    .mBytesPerFrame = sizeof(Float32) * busCount 
}; 

AudioUnitSetProperty(*_unit, 
            kAudioUnitProperty_StreamFormat, 
            kAudioUnitScope_Output, 
            1, 
            &outputASBD2, 
            sizeof(AudioStreamBasicDescription); 

我工作的ofxaudiounit插件對了openFrameworks: https://github.com/antimodular/ofxAudioUnit

感謝。

回答

0

規範格式是非交錯的,所以每個緩衝區只有一個通道,所以.mBytesPerPacket.mBytesPerFrame應該是sizeof(Float32)。然後,你需要創建多個(busCount)緩衝區傳遞到AudioUnit喜歡的東西

AudioBufferList *bufferList = (AudioBufferList*)malloc(sizeof(AudioBufferList) + (sizeof(AudioBuffer) * (busCount - 1))); 
bufferList->mNumberBuffers = busCount; 
for (int i=0; i < bufferList->mNumberBuffers; i++) { 
    bufferList->mBuffers[i].mNumberChannels = 1; 
    bufferList->mBuffers[i].mDataByteSize = BUFFER_SIZE * sizeof(float); 
    bufferList->mBuffers[i].mData = malloc(BUFFER_SIZE * sizeof(float)); 
} 
+0

感謝。我會試試這個。 與此同時,如果我使用這些其他格式標誌中的任何一個,這種行爲必須改變嗎? kAudioFormatFlagIsSignedInteger kAudioFormatFlagsNativeEndian kAudioFormatFlagIsNonMixable 我真的不知道自己代表的是什麼。 再次感謝。 – stephanschulz 2013-03-02 13:07:09

+0

kAudioFormatFlagsAudioUnitCanonical包含NativeEndian。是的,如果您使用SignedInteger,則會發生變化,因爲SignedInteger似乎將所有內容都放入一個緩衝區中。我不知道IsNonMixable是什麼:) – iain 2013-03-02 13:15:13

1
 UInt32 propertySize; 
    Boolean writable = false; 
    OSStatus status = AudioUnitGetPropertyInfo(*_unit, 
              kAudioOutputUnitProperty_ChannelMap, 
              kAudioUnitScope_Output, 
              0, 
              &propertySize, &writable); 
    //SignalIf_(writable == false); 
    cout<<"writable "<<&writable<<endl; 

    long nChannels = propertySize/sizeof(SInt32); 
    long* channelMapPtr = (long*)malloc(propertySize); 

    cout<<"nChannels "<<nChannels<<endl; 

    UInt32 scratch = propertySize; 
    status = AudioUnitGetProperty(*_unit, 
            kAudioOutputUnitProperty_ChannelMap, 
            kAudioUnitScope_Output, 
            0, 
            channelMapPtr, 
            &scratch); 

    // channelMapPtr[0] = 0; 
    for (long i = 0; i < nChannels; i++) 
    { 
     channelMapPtr[i] = -1; 
    } 

channelMapPtr[3] = 0; 
channelMapPtr[5] = 1; 

    OFXAU_RET_BOOL(AudioUnitSetProperty(*_unit, 
             kAudioOutputUnitProperty_ChannelMap, 
             kAudioUnitScope_Output, 
             0, 
             channelMapPtr, 
             scratch),"setting output unit's device ID"); 

    free((void *)channelMapPtr);