Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用AudioUnitEffect进行AudioUnitRender?_Ios_Core Audio - Fatal编程技术网

Ios 如何使用AudioUnitEffect进行AudioUnitRender?

Ios 如何使用AudioUnitEffect进行AudioUnitRender?,ios,core-audio,Ios,Core Audio,我正在尝试在audioUnit混音器的回调中使用audioUnit效果进行AudioUnitRender,但没有成功 我的混音器进入RemoteIO单元并在其回调中处理音频数据(来自文件)。很好用 然后,我将AudioUnit效果节点(混响)添加到图形中,并将其链接到AudioUnit。“我的效果”节点未连接到图形中的任何对象 AudioComponentDescription auEffectDescription; auEffectDescription.componentType

我正在尝试在audioUnit混音器的回调中使用audioUnit效果进行AudioUnitRender,但没有成功

我的混音器进入RemoteIO单元并在其回调中处理音频数据(来自文件)。很好用

然后,我将AudioUnit效果节点(混响)添加到图形中,并将其链接到AudioUnit。“我的效果”节点未连接到图形中的任何对象

AudioComponentDescription auEffectDescription;
auEffectDescription.componentType           = kAudioUnitType_Effect;
auEffectDescription.componentSubType        = kAudioUnitSubType_Reverb2;
auEffectDescription.componentManufacturer   = kAudioUnitManufacturer_Apple;
auEffectDescription.componentFlags          = 0;
auEffectDescription.componentFlagsMask      = 0;
我知道AudioGraph(zerokidz.com/AudioGraph)示例中描述的StreamFormat问题,并已按照AudioGraph中的说明设置了效果单元的StreamFormat

因此,我知道存在streamformat兼容性问题(请参阅)。我的ASBD:

[AudioUnitEffect]------------------------------
[AudioUnitEffect] Sample Rate:       44100
[AudioUnitEffect] Format ID:          lpcm
[AudioUnitEffect] Format Flags:         41
[AudioUnitEffect] Bytes per Packet:      4
[AudioUnitEffect] Frames per Packet:     1
[AudioUnitEffect] Bytes per Frame:       4
[AudioUnitEffect] Channels per Frame:    2
[AudioUnitEffect] Bits per Channel:     32
[AudioUnitEffect]------------------------------

[AudioUnitMixer]------------------------------
[AudioUnitMixer] Sample Rate:       44100
[AudioUnitMixer] Format ID:          lpcm
[AudioUnitMixer] Format Flags:       3116
[AudioUnitMixer] Bytes per Packet:      4
[AudioUnitMixer] Frames per Packet:     1
[AudioUnitMixer] Bytes per Frame:       4
[AudioUnitMixer] Channels per Frame:    2
[AudioUnitMixer] Bits per Channel:     32
[AudioUnitMixer]------------------------------
我已经了解(如果我错了,请纠正我)我的效果是在Float32中,而我的混音器使用AudioUnitSampleType(SInt32)。在调用AudioUnitRender之前和之后,我尝试了各种转换数据缓冲区的方法。我曾尝试将混音器的ASBD与AudioUnit效果相匹配,但我得到了一些可怕的失真(如果效果使用Float32类型(我想介于[-1,+1]之间),这是正常的)

苹果博士说:

*效果单位流格式注释

在输入范围上,按如下方式管理流格式: -如果输入由音频单元连接馈送,则从该连接获取其流格式。 -如果输入由渲染回调函数提供,请在总线上设置完整的应用程序流格式。使用与回调提供的数据相同的流格式。在输出范围上,设置与输入相同的完整流格式。 *

我觉得这没什么帮助

无论如何,一定有一种方法可以用特效单元制作音频渲染器。有人成功了吗?谢谢

安德烈


我的混音器回调:

static OSStatus mainMixerCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{  
SoundEngine* se = (SoundEngine*)inRefCon;

// init buffers with zeros
memset((Byte *)ioData->mBuffers[0].mData, 0, ioData->mBuffers[0].mDataByteSize);
memset((Byte *)ioData->mBuffers[1].mData, 0, ioData->mBuffers[1].mDataByteSize);

// Render the Audio Track (works fine)
AudioUnitRender((AudioUnit)se.auTrack,ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);

//  Effect (fails when there. Error:-50)
AudioUnitRender((AudioUnit)se.auEffect, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
    return noErr;
}

到现在为止,您可能已经解决了您的问题,但只是为了记录:缓冲区需要有一个通道,因此您需要设置两个音频缓冲区,每个通道一个,而不是现在的两个通道一个。

谢谢,我一定会检查这一点。