В последнее время я пытался создать игру, которая позволила бы пользователю говорить, а затем играть то, что он говорил, забавным голосом.
Загвоздка в том, что запись выполняется только тогда, когда кто-то разговаривает возле iphone (я управлял этой частью, у меня постоянно активен рекордер и я получаю его средние и пиковые значения).
Проблема в том, что я хочу воспроизвести то, что сказал пользователь.
Я искал вокруг, и единственный способ сделать это, кажется, Audio Queue Services из-за того, что он позволяет экономить в памяти. С моей точки зрения, сохранение звука в файл и его воспроизведение имеют проблемы из-за размещения файлов.
Я не нашел ни одного учебного пособия о том, как сохранить в память, так что, если у кого-то есть идеи, как это сделать или как сохранить в файл и воспроизвести без проблем (теперь звук отключается в первые 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);
}