huisedediao / XBEchoCancellation

基于audio unit的回音消除
154 stars 32 forks source link

你好有一个AudioUnitSetProperty的问题请教 #1

Closed cnsuer closed 6 years ago

cnsuer commented 6 years ago

这里设置 kAudioUnitScope_Input 则element为 0, kAudioUnitScope_Output则为1 .为什么是反着来呢?

CheckError(AudioUnitSetProperty(augStruct->remoteIOUnit,
                                kAudioUnitProperty_StreamFormat,
                                kAudioUnitScope_Input,
                                0,
                                &streamFormat,
                                sizeof(streamFormat)),
           "kAudioUnitProperty_StreamFormat of bus 0 failed");

CheckError(AudioUnitSetProperty(augStruct->remoteIOUnit,
                                kAudioUnitProperty_StreamFormat,
                                kAudioUnitScope_Output,
                                1,
                                &streamFormat,
                                sizeof(streamFormat)),
           "kAudioUnitProperty_StreamFormat of bus 1 failed");

AURenderCallbackStruct input;
input.inputProc = InputCallback_xb;
input.inputProcRefCon = (__bridge void *)(self);
CheckError(AudioUnitSetProperty(augStruct->remoteIOUnit,
                                kAudioOutputUnitProperty_SetInputCallback,
                                kAudioUnitScope_Output,
                                1,
                                &input,
                                sizeof(input)),
           "couldnt set remote i/o render callback for output");

AURenderCallbackStruct output;
output.inputProc = outputRenderTone_xb;
output.inputProcRefCon = (__bridge void *)(self);
CheckError(AudioUnitSetProperty(augStruct->remoteIOUnit,
                                kAudioUnitProperty_SetRenderCallback,
                                kAudioUnitScope_Input,
                                0,
                                &output,
                                sizeof(output)),
           "kAudioUnitProperty_SetRenderCallback failed");

而这里设置的kAudioUnitScope_Input 为什么对应的是1呢?

(AudioUnitSetProperty(augStruct->remoteIOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &inputEnableFlag, sizeof(inputEnableFlag)), "Open input of bus 1 failed")

请教下怎么样判断该写1 还是0 ?

huisedediao commented 6 years ago

1.这里设置 kAudioUnitScope_Input 则element为 0, kAudioUnitScope_Output则为1 .为什么是反着来呢?

首先这里纠正下,不是设置kAudioUnitScope_Input的Element0 和设置kAudioUnitScope_Output的Element1,而是设置Element0的kAudioUnitScope_Input 和 Element1的kAudioUnitScope_Output。

Element0控制输出端,Element1控制输入端。Element0和Element1都有 input Scope 和 output Scope。

这里设置的是麦克风采集到的音频数据的StreamFormat和即将播放的pcm数据的StreamFormat。

对于录音功能(麦克风采集音频数据),硬件如何工作的对我们来说不必理会,我们只需要获取到Element1的输出端的数据,即Element1的output Scope。 对于播放音频数据,同样发声设备如何工作的我们不必理会,我们只要把音频数据传给Element0的输入端,即Element0的input Scope。

2.而这里设置的kAudioUnitScope_Input 为什么对应的是1呢? 这里是打开麦克风采集声音的功能,使麦克风的输入端能够采集声音,即开启Element1的input Scope,

3.请教下怎么样判断该写1 还是0 ? 根据具体情况来,判断操作的是Element0还是Element1,然后判断是要对input Scope进行设置还是对output Scope进行设置。例如用mixUnit的时候,设置输入流数量的时候,设置的就是Element1的input Scope

cnsuer commented 6 years ago

谢谢..恍然大悟,是我理解有问题,谢谢,非常感谢