2016-03-23 21 views
1

Ses kaydı, gerektiği gibi çalışır: Kaydı kaydedebilir ve oynatabilirim. Sadece garip olan şey, Geri Çağırma fonksiyonunun bazen tamamen doldurulmayan tamponlarla çağrılmasıdır. benim StreamCallback işlevinde inNumPackets değişkenin değerini giriş yapmış ve bir dizi bu gibi görünebilir:Ses kaydedici neden iOS ses kaydı geri aramamda yok?

2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048 2048, , 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048 2048, 2048, 2048,

şu anda tampon işleme kod ben eserler her zaman a almak demektir sabit bir boyutu, güvenir

tampon doldurulmadı.

Her zaman tam arabellek almak için bir şeyler yapabilir miyim? - ya da beklenen davranış mı? Benim kodundan

Birkaç ekstreler:

DataFormat.mFormatID := kAudioFormatLinearPCM; 
DataFormat.mSampleRate := 44100; 
DataFormat.mChannelsPerFrame := 1; 
DataFormat.mBitsPerChannel := 16; 
DataFormat.mBytesPerPacket := 2; 
DataFormat.mBytesPerFrame := 2; 
DataFormat.mFramesPerPacket := 1; 
DataFormat.mFormatFlags := kLinearPCMFormatFlagIsSignedInteger OR kLinearPCMFormatFlagIsPacked; 

lStatus := AudioQueueNewInput(@DataFormat,@StreamCallback,nil,nil,kCFRunLoopCommonModes,0,fAqDataQueue); 
... 
//allocate 3 buffers with a buffer size of 2048 packets with 2 bytes per packet 
AudioQueueAllocateBuffer(fAqDataQueue,2*2048,fAqDataBuffers[li]); 

cevap

2

Sen sabit boyutta iOS Çekirdek Ses tamponları bağlıdır işleme kullanamazsınız. Bunun nedeni, iOS'un, uygulamanızın kontrolü dışındaki nedenlerden ötürü ses birimi arabelleği boyutunu değiştirmekte serbest olmasıdır (örneğin, cihazda çalışan diğer ses işlemlerinin gerektirdiği örnekleme hızı yeniden örnekleme veya cihazın donanım yetenekleri nedeniyle veya çeşitli güç tasarrufu için) modları vb.)

Sabit bir boyutta arabellekleri işlemeniz gerekiyorsa, gelen ses birimi örnekleri için kilitlenmeyen bir dairesel FIFO/arabellek kullanın ve işlem adımınız için yeterli örnek içerip içermediğini görmek için FIFO'ya oy verin. . Daha fazla ayrıntı için bkz. this answer.

İlgili konular