AudioQueue aß mein Puffer (die ersten 15 Millisekunden es)
Ich bin Generierung von audio-programmgesteuert. Ich höre Lücken des Schweigens zwischen meinen Puffer. Wenn ich den Haken " mein Handy einen Bereich, sehe ich, dass die ersten paar Proben von jedem Puffer fehlen, und an Ihre Stelle ist die Stille. Die Länge dieses Schweigens variiert von fast nichts bis zu 20 ms.
Mein Erster Gedanke ist, dass meine original-callback-Funktion nimmt zu viel Zeit. Ich ersetzen Sie es mit der kürzesten möglich-es re-renqueues den gleichen Puffer über und über. Ich beobachte das gleiche Verhalten.
AudioQueueRef aq;
AudioQueueBufferRef aq_buffer;
AudioStreamBasicDescription asbd;
void aq_callback (void *aqData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer) {
OSStatus s = AudioQueueEnqueueBuffer(aq, aq_buffer, 0, NULL);
}
void aq_init(void) {
OSStatus s;
asbd.mSampleRate = AUDIO_SAMPLES_PER_S;
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
asbd.mBytesPerPacket = 1;
asbd.mFramesPerPacket = 1;
asbd.mBytesPerFrame = 1;
asbd.mChannelsPerFrame = 1;
asbd.mBitsPerChannel = 8;
asbd.mReserved = 0;
int PPM_PACKETS_PER_SECOND = 50;
//one buffer is as long as one PPM frame
int BUFFER_SIZE_BYTES = asbd.mSampleRate/PPM_PACKETS_PER_SECOND*asbd.mBytesPerFrame;
s = AudioQueueNewOutput(&asbd, aq_callback, NULL, CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &aq);
s = AudioQueueAllocateBuffer(aq, BUFFER_SIZE_BYTES, &aq_buffer);
//put samples in the buffer
buffer_data(my_data, aq_buffer);
s = AudioQueueStart(aq, NULL);
s = AudioQueueEnqueueBuffer(aq, aq_buffer, 0, NULL);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht vertraut mit dem iPhone audio-APIs, aber es scheint ähnlich zu sein, anderen diejenigen, bei denen in der Regel würden Sie Schlange stehen, mehr als einen Puffer, auf Diese Weise, wenn das system fertig ist mit der Bearbeitung des ersten Puffers, es kann sofort mit der Verarbeitung beginnen die nächsten buffer (da es bereits in der Warteschlange), während der Rückruf bei Abschluss auf die 1. Puffer ausgeführt wird.
Etwas wie:
buffer_data()
füllt einen Puffer mit einem vollen 1/50th einer Sekunde lohnt sich, die Pakete? Was ist der Wert vonAUDIO_SAMPLES_PER_S
?PPM_PACKETS_PER_SECOND = 1
). Mit 2 langen Puffer ich noch verlieren Muster. Mit 3 kurzen Puffer bekomme ich wieder alles, was ich Male.AudioQueueBuffer.mAudioDataBytesCapacity
) undAUDIO_SAMPLES_PER_S
ist#define
'd auf 44100.