2011-03-08 55 views
1

我想實現使用核心音頻線性卷積,我有算法實現和工作,但我試圖將這個輸出寫入.wav音頻文件。這裏是算法的代碼...如何在Core Audio中將浮點值數組寫入音頻文件?

//Create array containing output of convolution (size of array1 + array2 - 1) 
float *COutput; 

COutput = (float *)malloc(((size1+size2)-1)* sizeof(float)); 

int sizeOutput = ((size1 + size2)-1); 


//Convolution Algorithm!!! 

for (i=0; i<sizeOutput; i++) { 

    COutput[i]=0; 

    for (j=0; j<sizeCArray1; j++) { 

     if (((i-j)+1) > 0) { 
      COutput[i] += CArray1[i - j] * CArray2[j]; 
     } 

    } 

} 

我需要將COutput(浮點數的標準數組)中的浮點值寫入音頻文件。我是否正確地假設我需要將這些浮點值最初發送到AudioBufferList中的AudioBuffer?還是有一個簡單的方法來做到這一點?

非常感謝您的任何幫助或指導!

回答

1

自由DiracLE時間拉伸庫(http://dirac.dspdimension.com)具有將ABLS(AudioBufferLists)成浮點陣列,反之亦然作爲其示例代碼部分實用程序代碼。看看他們的EAFRead和EAFWrite類,他們正是你要找的。

1

這是一個遲到的答案,但我努力得到一個float *緩衝區寫入一個文件在Swift中。

發佈此示例以防萬一。

enum AudioFileError: ErrorType { 
    case FailedToCreate(OSStatus) 
    case FailedToWrite(OSStatus) 
    case FailedToClose(OSStatus) 
} 

func writeAudioData(audioData:NSData, toFile destination:NSURL, description:AudioStreamBasicDescription) throws { 
    //get a pointer to the float buffer 
    let floatBuffer = UnsafeMutablePointer<Float>(audioData.bytes) 

    //get an AudioBufferList from the float buffer 
    let buffer = AudioBuffer(mNumberChannels: 1, mDataByteSize: UInt32(audioData.length), mData: floatBuffer) 
    var bufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: buffer) 


    //create the CAF file using the stream description 
    var file = ExtAudioFileRef() 
    var result:OSStatus = noErr 

    var streamDescription = description 

    withUnsafePointer(&streamDescription) { streamDescription in 
     withUnsafeMutablePointer(&file) { file in 
      result = ExtAudioFileCreateWithURL(destination, kAudioFileCAFType, streamDescription, nil, AudioFileFlags.EraseFile.rawValue, file) 
     } 
    } 

    if result != noErr { 
     throw AudioFileError.FailedToCreate(result) 
    } 

    //write the AudioBufferList to the file 
    withUnsafeMutablePointer(&bufferList) { bufferList in 
     result = ExtAudioFileWrite(file, UInt32(audioData.length/sizeof(Float)), bufferList) 
    } 

    if result != noErr { 
     throw AudioFileError.FailedToWrite(result) 
    } 

    //close the file 
    result = ExtAudioFileDispose(file) 

    if result != noErr { 
     throw AudioFileError.FailedToClose(result) 
    } 
} 
相關問題