2016-04-05 18 views
-1

Çekirdek ses çıkış kuyruğunun başında ve sonunda bir kırılma oluyor. Kod sadece bir ton üretmelidir.Çekirdek Ses Kuyrukları Çatlıyor

userData->outputBlock(userData, inAQ, inBuffer); 

      AudioQueueEnqueueBuffer(userData->outputQueue, inBuffer, 0, NULL); 

i tampon dolduran bir bloğunu diyoruz çıktı Geri arama durumunda

-(void) startOutputQueue { 
    if(userData.outputQueue != NULL) { 
     if(!checkError(AudioQueuePrime(userData.outputQueue, 0, NULL), "AudioQueuePrime")) { 
      NSLog(@"Error priming QutputQueue"); 
     } 

     if(!checkError(AudioQueueStart(userData.outputQueue, NULL), "AudioQueueStart Output")) { 
      NSLog(@"Error starting OutputQueue"); 
     } 
    } 
} 

-(void) setupOutputQueue { 
    memset(&userData.outputDesc, 0, sizeof(userData.outputDesc)); 
    userData.outputDesc.mFormatID = kAudioFormatLinearPCM; 
    userData.outputDesc.mFramesPerPacket = 1; 
    userData.outputDesc.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    userData.outputDesc.mChannelsPerFrame = 1; 
    userData.outputDesc.mSampleRate = 44100; 
    userData.outputDesc.mBitsPerChannel = 16; 
    userData.outputDesc.mBytesPerFrame = userData.outputDesc.mBytesPerPacket = 2; 
    userData.outputSamplePosition = 0; 
    if (userData.outputQueue == NULL) { 
     if(!checkError(AudioQueueNewOutput(&userData.outputDesc, outputCallback, &userData, NULL, NULL, 0, &userData.outputQueue), "AudioQueueNewOutput")) { 
      return; 
     } 
     UInt32 bufferSize = userData.outputDesc.mBytesPerFrame * userData.outputDesc.mSampleRate * DURATION; 
     for (int i=0; i<3; ++i) { 

      if(!checkError(AudioQueueAllocateBuffer(userData.outputQueue, bufferSize, &userData.outputBuffers[i]), "AudioQueueAllocateBuffer")) { 
       return; 
      } 
      outputCallback(&userData, userData.outputQueue, userData.outputBuffers[i]); 
     } 
    } 
} 

:

Düzenleme: kurulum örnek bir proje İşte https://github.com/MrMatthias/CoreAudioCrackle

yarattı olduğunu Tamponun doldurulması şu şekilde görünür:

UInt32 sampleCount = DURATION * userData->outputDesc.mSampleRate; 
double f1 = userData->outputDesc.mSampleRate/10000.0f; 
for (int i=0; i<sampleCount; ++i) { 
    SInt16 sample = CFSwapInt16HostToBig(SHRT_MAX * (sin((userData->outputSamplePosition + i) * 2 * M_PI/f1))); 
    ((SInt16*)inBuffer->mAudioData)[i] = sample; 
    } 
    userData->outputSamplePosition += sampleCount; 
    inBuffer->mAudioDataByteSize = sampleCount * 2; 

kayıt şuna benzer:

cracking

+1

Kodun hangi dilde olduğunu? Sorunu olan bir kod parçasına mı ihtiyacımız var? Bir resim bir destek olarak iyi olurdu ama kendi başına duramaz. –

cevap

0

deneyin ((sadece SHRT_MAX (sin önce (SInt16) ekleyerek userData -> ... tüm kod bloğu bu benzediğini böyle SInt16 sample = CFSwapInt16HostToBig ((SInt16) SHRT_MAX * (sin ((kullanıcıData-> outputSamplePosition + i) * 2 * M_PI/f1)));

+0

özür dilerim, yorum yaptıklarını ancak henüz puan almadıklarını:/... bununla birlikte, ses donanımının genellikle donanımınızı daha hızlı bir şekilde değiştirdiğinden ve bu nedenle ses donanımınızın veri tükendi ve bu neden bu sesleri üretiyor olabilir ... Bir bellek arabelleği oluşturmayı ve dosyayı yerleştirmeyi veya dosyayı oradan çevirmeyi deneyin. Bu, verilerin ses donanımına ayak uydurabilmesini sağlamaya yardımcı olur, ayrıca dosya yazılırken bu kavramın da uygulanması gerekebilir, böylece çok sayıda işlev çağrısı olmayacaktır. –

İlgili konular