我有一个 iOS/Objective-C 程序,它使用单个音频单元在按下按钮时播放生成的信号。我想添加如下功能:
a) 当第一次按下按钮时,会在某种数值数组中生成一个信号。
b) 然后音频开始,渲染回调访问(并播放)生成的信号。
鉴于我当前的代码,我觉得这些添加将只是几行,但我在语法、要使用的变量类型、如何跟踪当前样本等方面遇到问题。我已经包含了现在的相关代码:
按下按钮:
- (IBAction)startPressed:(id)sender {
[self setupAudioPlayer];
[self createSignal];
[self playAudio];
}
来自 setupAudioPlayer 的一行:
input.inputProcRefCon=&mySignal; // mySignal is an instance var
音频创作:
-(void)createSignal{
int beepLength=0.020*Fs; // Fs is sampling frequency
float beepFrequency=440; // Hz
// Declare some kind of numeric array "mySignal", which is an instance var.
mySignal=...?
// Generate audio signal (pure tone)
for (int i=1; i<=beepLength; i++) {
float t=i/Fs;
mySignal[i]=sinf(2*M_PI*beepFrequency*t);
}
}
渲染回调:
OSStatus RenderTone(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
const int channel1 = 0;
Float32 *buffer = (Float32 *)ioData->mBuffers[channel1].mData;
// This is where things get hazy
Float32 *mySignal=(Float32 *)inRefCon;
for (UInt32 frame = 0; frame < inNumberFrames; frame++)
{
buffer[frame]=mySignal[?];
}
return noErr;
}
所以,总结一下我的问题:应该如何定义 mySignal ?如何从 RenderTone 访问这个实例变量(我上面的“模糊”代码只是一个猜测)?如何在 RenderTone 中跟踪当前样本?这种方法还有什么遗漏/不可靠的吗?
感谢您的阅读和任何帮助,非常感谢!
(我已经看到将视图控制器实例的引用传递给渲染回调的示例代码,然后以这种方式访问实例变量。但是,也许错误地,我在其他地方读到这不是好的形式,因为它可能涉及太多具有如此严格的时序要求的回调的计算开销。)