reprodução iOS audio unit remoteIO durante a gravação
Eu fui cobrado para adicionar VOIP em um jogo (multi-plataforma, por isso não posso usar o kit de jogos da Apple para fazê-lo).
Por 3 ou 4 dias agora, eu estou tentando obter minha cabeça quebra em torno da unidade de áudio e remoteIO ... Eu esqueci dezenas de exemplos e tal, mas toda vez que é apenas aplicando um algoritmo simples para o PCM de entrada e reproduzi-lo de volta no alto-falante. De acordo com a documentação da Apple para fazer o VOIP, devemos usar o kAudioSessionCategory_PlayAndRecord.
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(audioCategory),
&audioCategory);
XThrowIfError(status, "couldn't set audio category");
1) Mas parece (para mim) que o playAndRecord sempre tocará o que vem do microfone (ou mais exatamente o callback do PerformThru //aurioTouch), estou errado ?
Eu tenho o retorno de chamada mais simples, não fazendo nada, mas AURender
static OSStatus PerformThru(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
OSStatus err = AudioUnitRender(THIS->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
if (err)
printf("PerformThru: error %d\n", (int)err);
return err
}
A partir desse retorno de chamada, pretendo enviar dados para o peer (não diretamente, é claro, mas os dados virão dele) ...
Eu não vejo como eu posso reproduzir uma saída diferente da entrada, exceto talvez com 2 unidades, uma gravação, uma tocando, mas não parece ser o que a Apple pretendia (ainda aumentando a documentação).
E, claro, não consigo encontrar nenhuma documentação sobre isso, a unidade de áudio ainda é praticamente não documentada ...
Alguém teria uma ideia sobre qual seria a melhor maneira de fazer isso?