我的回调如下:
static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
AudioSampleType *outBuffer = (AudioSampleType *)ioData->mBuffers[0].mData;
memset(outBuffer, 0, sizeof(AudioSampleType)*inNumberFrames*kNumChannels);
//copy a sine wave into outBuffer
double max_aust = pow(2.f, (float)(sizeof(AudioSampleType)*8.0 - 1.f)) - 1.0;
for(int i = 0; i < inNumberFrames; i++) {
SInt16 val = (SInt16) (gSine2_[(int)phase2_] * max_aust);
outBuffer[2*i] = outBuffer[2*i+1] = (AudioSampleType)val;
phase2_ += inc2_;
if(phase2_ > 1024) phase2_ -= 1024;
}
return noErr;
}
这是一个超级基本的渲染回调,只能播放正弦波。它在模拟器上,它不在设备上。事实上,我无法从设备中获取音频。即使我添加了一个printf来检查outBuffer,它也会显示outBuffer充满了正弦波的样本。
我将会话类型设置为Ambiet,但我也尝试过playAndRecord和MediaPlayback。也没有运气。我首选的framesPerBuffer是1024(这是我在模拟器和设备上得到的)。我的采样率是44100hz。我已经尝试了48000以防万一。我也尝试过更改framesPerBuffer。
是否还有其他原因导致样品无法到达设备上的硬件?
更新: 我刚刚发现,如果我将耳机插入设备,我会听到听起来像正弦波的声音非常可怕。这让我觉得设备可能期望浮点而不是signed int,但是当我将值更改为-1到1时,就没有音频(设备或模拟器,因为引擎被设置为接受signed int而不是预期的,不是浮点)。
答案 0 :(得分:1)
如果没有看到更多的设置,我无法确定,但听起来很像你被AudioSampleType
(SInt16样本)和AudioUnitSampleType
之间的差异所困扰(已修复8.24)样本在SInt32
容器内)。几乎可以肯定,AudioUnitSampleType
是回调中预期的格式。 This post on the Core Audio mailing list does a very good job explaining the difference between the two, and why they exist.
答案 1 :(得分:0)
因为我不知道您的设置如何,我建议您阅读:http://www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html
示例代码用于单音发生器,如果您想要立体声填充第二个通道。
指向第二个通道缓冲区的指针是
const int secondChannel = 1;
Float32 *bufferSecondChannel = (Float32 *)ioData->mBuffers[secondChannel].mData;
希望这个帮助
答案 2 :(得分:0)
您可能需要设置音频会话(初始化,设置类别并激活它)
OSStatus activationResult = NULL;
result = AudioSessionSetActive (true);