我最近一直在尝试制作一款允许用户说话的游戏,然后以有趣的声音播放他所说的话。
问题是,只有当有人在iphone附近讲话时才会进行录音(我已经管理过这部分,我一直有一个录音机处于活动状态并获得它的平均值和峰值值)。
问题在于我想播放用户所说的内容。 我一直在寻找,唯一的方法就是音频队列服务,因为它允许保存到内存。从我的角度来看,将声音保存到文件并播放它会因文件分配而出现问题。
我还没有找到关于如何保存到内存的任何教程,所以如果有人有一个ideea如何做到这一点或如何保存到文件和播放没有问题(现在声音被切断前0.5秒是听到了,fps也下降了20。)
我目前的代码是:
void AudioInputCallback(
void *inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp *inStartTime,
UInt32 inNumberPacketDescriptions,
const AudioStreamPacketDescription *inPacketDescs)
RecordState* recordState = (RecordState*)inUserData;
if(!recordState->recording)
{
printf("Not recording, returning\n");
}
printf("Writing buffer %d\n", (int)recordState->currentPacket);
//What to put here to save to memory?
recordState->currentPacket += inNumberPacketDescriptions;
AudioQueueEnqueueBuffer(recordState->queue, inBuffer, 0, NULL);
}
void AudioOutputCallback(
void* inUserData,
AudioQueueRef outAQ,
AudioQueueBufferRef outBuffer)
{
PlayState* playState = (PlayState*)inUserData;
if(!playState->playing)
{
printf("Not playing, returning\n");
return;
}
printf("Queuing buffer %d for playback\n",(int) playState->currentPacket);
AudioStreamPacketDescription* packetDescs;
UInt32 bytesRead;
UInt32 numPackets = 8000;
OSStatus status;
//What to put here to read from memory?
status = AudioQueueEnqueueBuffer(
playState->queue,
outBuffer,
0,
packetDescs);
playState->currentPacket += numPackets;
AudioQueueFreeBuffer(playState->queue, outBuffer);
}