2016-04-05 52 views
-1

我在覈心音頻輸出隊列的開始和結尾處出現了破解。該代碼應該簡單地生成一個音調。核心音頻隊列破解

編輯:創建了一個示例項目 https://github.com/MrMatthias/CoreAudioCrackle

下面是設置:

-(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]); 
     } 
    } 
} 

在輸出回調我認爲這種填充緩衝塊:

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

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

填充緩衝區看起來像這樣:

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; 

的記錄是這樣的:

cracking

+1

你編碼的語言是?我們需要一塊有問題的代碼?,一張圖片可以作爲一種支持,但不能自成一格。 –

回答

0

嘗試增加(SInt16)之前SHRT_MAX(SIN((用戶數據 - > ... ,使得整個代碼塊看起來像這樣 SInt16 sample = CFSwapInt16HostToBig((SInt16)SHRT_MAX *(sin((userData-> outputSamplePosition + i)* 2 * M_PI/f1)));

+0

對不起,本來會評論的,但是還沒有rep points:/ ...但是,請記住,音頻硬件的移動速度通常比您的硬件io更快,因此您的音頻硬件可能會用完數據,這可能是它產生這些噪音的原因......嘗試創建一個內存緩衝區,並將文件或循環文件放到那裏。這應該有助於確保數據能夠跟上音頻硬件,此外,在寫入文件時還可能需要應用此概念,以便不會有太多的函數調用。 –