请教一下:使用AudioUnit输出具有时序的正弦波,具体功能为输出20KHZ XX毫秒、0KHZ yy毫秒、20K zz毫秒.....当0kHz的持续时间
超过1.66ms时,接下来的正弦波就会异常(有周期性,感觉像是叠加了某个信号)具体看下图。
我的思路是,填充0KHZ进入buffer之后但没完全输出,此时20KHZ填充进来,导致buffer中的数据重叠,但不知如何处理好,请求支援,万分感谢!
-(void)initSignal
//使用类似采样,从sin中提取值用于音频回调时输出。
{
for (UInt32 frame = 0; frame < 4096;) {
double dVal = sin(2 * M_PI * ((double)frame) / 4.0 / (((double)SAMPLE_RATE) / ((double)FREQUENCY)));//0
SInt16 val = (SInt16)(dVal * MAX_VALUE);//0
SInt16 valMinu = (SInt16)-val;//0
genSpace[frame] = 0;
genSignal[frame++] = (SInt8)(val & 0x00FF);
genSpace[frame] = 0;
genSignal[frame++] = (SInt8)(((UInt16)(val & 0xFF00)) >> 8);
genSpace[frame] = 0;
genSignal[frame++] = (SInt8)(valMinu & 0x00FF);
genSpace[frame] = 0;
genSignal[frame++] = (SInt8)(((UInt16)(valMinu & 0xFF00)) >> 8);
}
}
OSStatus RenderTone(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
NSLog(@"RenderTone come in");
int audio_length = inNumberFrames;
SInt8 *buffer0 = (SInt8 *)ioData->mBuffers[0].mData;
SInt8 *buffer1 = (SInt8 *)ioData->mBuffers[1].mData;
SignalManager *signalManager = (__bridge SignalManager *)inRefCon;
NSMutableArray *array = signalManager->_signalSpaceList;
SInt8 *genSignal = signalManager->genSignal;
SInt8 *genSpace = signalManager->genSpace;
for (int i = 0; i < audio_length;)
{
if (array.count <= 0)
{ // caution: avoid array out of index
if (i < audio_length)
{
memcpy(buffer0 + i, genSpace, audio_length - i);
memcpy(buffer1 + i, genSpace, audio_length - i);
}
[signalManager pause];
break;
}
Signal *signal = [array objectAtIndex:0];
if (i + signal.length < audio_length)
{
if (signal.isSignal)
{
memcpy(buffer0 + i, genSignal, signal.length);//发送20KHZ信号
memcpy(buffer1 + i, genSignal, signal.length);
}
else
{
memcpy(buffer0 + i, genSpace, signal.length);
//发送0KHZ信号,当此信号长度超过1.66ms就会造成20KHZ波形混乱
memcpy(buffer1 + i, genSpace, signal.length);
}
i += signal.length;
[array removeObjectAtIndex:0];
}
else
{
if (signal.isSignal)
{
memcpy(buffer0 + i, genSignal, audio_length - i);
memcpy(buffer1 + i, genSignal, audio_length - i);
}
else
{
memcpy(buffer0 + i, genSpace, audio_length - i);
memcpy(buffer1 + i, genSpace, audio_length - i);
}
signal.length -= (audio_length - i);
break;
}
}
//NSLog(@"RenderTone go out");
return noErr;
}