2013-12-19 45 views
1

所以我試圖將着名的smbPitchShift算法集成到我的項目中,但輸入緩衝區和輸出緩衝區是相同的。 smbPitchShift算法不會更改緩衝區中的採樣。iOS smbPitchShift不起作用

這是我在我做渲染後的回調:

OSStatus MyAURenderCallback (void      *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp  *inTimeStamp, 
          UInt32      inBusNumber, 
          UInt32      inNumberFrames, 
          AudioBufferList    *ioData 
          ) 
{ 
    if (*ioActionFlags == kAudioUnitRenderAction_PostRender) { 
     NSLog(@"render"); 
     SBPitchShifter *self = (__bridge SBPitchShifter *)inRefCon; 

     float *fBuffer = (float *)(malloc(sizeof(float)*inNumberFrames)); 

     int stride = 2; 
     vDSP_vflt16((SInt16 *)ioData->mBuffers[0].mData, stride, (float *)fBuffer, stride, inNumberFrames); 

     smbPitchShift(2.0, inNumberFrames, inNumberFrames, 4, self.linearPCMASBD.mSampleRate, fBuffer, fBuffer); 

     vDSP_vfixr16((float *)fBuffer, stride, (SInt16 *)ioData->mBuffers[0].mData, stride, inNumberFrames); 

     free(fBuffer); 
    } 
    return noErr; 
}; 

播放聲音時就像正常的,因爲在球場將被設置爲1。任何想法? :)

+0

嘗試使用kAudioUnitRenderAction_PreRender並將修改的數據設置爲ioData緩衝區。 –

回答

1

我也嘗試kAudioUnitRenderAction_PreRender標誌,但它沒有奏效。它認爲我使用Accelerate框架的vDSP函數錯誤。我使用了AEFloatConverter並且做了這個訣竅;)

+0

我正在嘗試使用smbPitchShift,並且遇到類似的問題。你可以分享(Github的要點?)你的更新,工作,回報? –