Как записывать и воспроизводить из памяти, используя Audio Queue Services - PullRequest
1 голос
/ 12 августа 2010

В последнее время я пытался создать игру, которая позволила бы пользователю говорить, а затем играть то, что он говорил, забавным голосом.

Загвоздка в том, что запись выполняется только тогда, когда кто-то разговаривает возле 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);
}
...