gpt4 book ai didi

core-audio - 带有 AVAudioEngine 的自定义 AVAudioUnit 在设置提供程序 block 上崩溃

转载 作者:行者123 更新时间:2023-12-04 01:21:04 28 4
gpt4 key购买 nike

我有以下代码块,它应该创建一个产生正弦波的 AVAudioNode,但是它在标有 -[AUAudioUnitV2Bridge setOutputProvider:]: unrecognized selector sent to instance 的行上崩溃。

有什么想法可能是错的吗?

// TEST  
AudioComponentDescription mixerDesc;
mixerDesc.componentType = kAudioUnitType_Generator;
mixerDesc.componentSubType = kAudioUnitSubType_ScheduledSoundPlayer;
mixerDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
mixerDesc.componentFlags = 0;
mixerDesc.componentFlagsMask = 0;

[AVAudioUnit instantiateWithComponentDescription:mixerDesc options:kAudioComponentInstantiation_LoadInProcess completionHandler:^(__kindof AVAudioUnit * _Nullable audioUnit, NSError * _Nullable error) {
NSLog(@"here");

// Crashes here
audioUnit.AUAudioUnit.outputProvider = ^AUAudioUnitStatus(AudioUnitRenderActionFlags *actionFlags, const AudioTimeStamp *timestamp, AUAudioFrameCount frameCount, NSInteger inputBusNumber, AudioBufferList *inputData)
{
const double amplitude = 0.2;
static double theta = 0.0;
double theta_increment = 2.0 * M_PI * 880.0 / 44100.0;
const int channel = 0;
Float32 *buffer = (Float32 *)inputData->mBuffers[channel].mData;

memset(inputData->mBuffers[channel].mData, 0, inputData->mBuffers[channel].mDataByteSize);
memset(inputData->mBuffers[1].mData, 0, inputData->mBuffers[1].mDataByteSize);

// Generate the samples
for (UInt32 frame = 0; frame < inputBusNumber; frame++)
{
buffer[frame] = sin(theta) * amplitude;

theta += theta_increment;
if (theta >= 2.0 * M_PI)
{
theta -= 2.0 * M_PI;
}
}

return noErr;
};

}];

更新

感觉像这样的事情是正确的方法,但是唉,状态抛出错误,回调从未调用过。:
    AVAudioUnitGenerator *unit = [[AVAudioUnitGenerator alloc] init];

// TEST
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Generator;
desc.componentSubType = kAudioUnitSubType_ScheduledSoundPlayer;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;

[AVAudioUnit instantiateWithComponentDescription:desc options:kAudioComponentInstantiation_LoadInProcess completionHandler:^(__kindof AVAudioUnit * _Nullable audioUnit, NSError * _Nullable error) {
NSLog(@"here");

self.audioNode = audioUnit;

OSStatus status;
AudioUnit *unit = audioUnit.audioUnit;

UInt32 numBuses = 1;
status = AudioUnitSetProperty(unit, kAudioUnitProperty_ElementCount, kAudioUnitScope_Output, 0, &numBuses, sizeof(UInt32));
NSLog(@"status: %d", status);


AURenderCallbackStruct rcbs;
rcbs.inputProc = callback2;
rcbs.inputProcRefCon = (__bridge void * _Nullable)(self);


status = AudioUnitSetProperty(unit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Output, 0, &rcbs, sizeof(rcbs));
NSLog(@"status: %d", status);

}];

最佳答案

正是错误消息所说的。在实例化您请求的 audioUnit 类型并确保 AUAudioUnit 不为零后,此代码使其明确:

if (![audioUnit.AUAudioUnit respondsToSelector:@selector(outputProvider)]) {
NSLog(@"selector method not found in this instance of an AUAudioUnit");
}

头文件并没有声称绝对需要在所有音频单元中实现此方法。

稍后添加:如果您只想让您的代码为 AVAudioUnit 合成样本,而不关心特定的 API 或代码结构,那么:
获取 AVAudioUnit 实例的 AudioUnit 属性;创建一个 AURenderCallback 函数;用这个 C 函数填充 AURenderCallbackStruct;然后在 AudioUnit 上为 kAudioUnitProperty_SetRenderCallback 执行 AudioUnitSetProperty。即使没有可用的 outputProvider 方法,这似乎也不会崩溃。

关于core-audio - 带有 AVAudioEngine 的自定义 AVAudioUnit 在设置提供程序 block 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798284/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com