J'écris une classe qui ouvre une AudioQueue et analyse ses caractéristiques, puis, sous certaines conditions, peut commencer ou terminer l'écriture d'un fichier de cette AudioQueue qui est déjà instancié. Ceci est mon code (entièrement basé sur SpeakHere) qui ouvre la AudioQueue sans écrire quoi que ce soit à tmp:Comment commencer à écrire une AudioQueue existante en réponse à un événement?
void AQRecorder::StartListen() {
int i, bufferByteSize;
UInt32 size;
try {
SetupAudioFormat(kAudioFormatLinearPCM);
XThrowIfError(AudioQueueNewInput(&mRecordFormat,
MyInputBufferHandler,
this,
NULL, NULL,
0, &mQueue), "AudioQueueNewInput failed");
mRecordPacket = 0;
size = sizeof(mRecordFormat);
XThrowIfError(AudioQueueGetProperty(mQueue, kAudioQueueProperty_StreamDescription,
&mRecordFormat, &size), "couldn't get queue's format");
bufferByteSize = ComputeRecordBufferSize(&mRecordFormat, kBufferDurationSeconds);
for (i = 0; i < kNumberRecordBuffers; ++i) {
XThrowIfError(AudioQueueAllocateBuffer(mQueue, bufferByteSize, &mBuffers[i]),
"AudioQueueAllocateBuffer failed");
XThrowIfError(AudioQueueEnqueueBuffer(mQueue, mBuffers[i], 0, NULL),
"AudioQueueEnqueueBuffer failed");
}
mIsRunning = true;
XThrowIfError(AudioQueueStart(mQueue, NULL), "AudioQueueStart failed");
}
catch (CAXException &e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
}
catch (...) {
fprintf(stderr, "An unknown error occurred\n");
}
}
Mais je suis un peu clair sur la façon d'écrire une fonction qui racontera cette file d'attente « d'ici le signal d'arrêt, commencez à écrire cette file d'attente à tmp en tant que fichier ". Je comprends comment dire à un AudioQueue d'écrire en tant que fichier au moment où il est créé, comment définir le format des fichiers, etc., mais pas comment lui dire de démarrer et d'arrêter le flux intermédiaire. Beaucoup reconnaissant de tout pointeur, merci.
Merci Vladimir, l'approche du drapeau booléen pour MyInputBufferHandler a parfaitement fonctionné. – Halle
Je voulais ajouter (pour quiconque lit ceci qui veut l'essayer) que ma fonction ci-dessus devrait être changée pour inclure un appel à AudioFileCreateWithURL de sorte qu'il ait un fichier audio à écrire quand on lui dit d'écrire - la fonction StartRecord() dans le projet de code exemple SpeakHere d'Apple montre un bon exemple de la façon de procéder. – Halle