Как записать массив значений с плавающей точкой в ​​аудиофайл в Core Audio? - PullRequest
1 голос
/ 08 марта 2011

Я пытаюсь реализовать линейную свертку с использованием Core Audio, у меня реализован и работает алгоритм, но я пытаюсь записать вывод этого в аудиофайл .wav.Вот код алгоритма ...

    //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 (стандартный массив с плавающей точкой) в аудиофайл.Прав ли я, предполагая, что мне нужно отправить эти значения с плавающей точкой в ​​AudioBuffer в AudioBufferList изначально?Или есть простой способ сделать это?

Большое спасибо за любую помощь или руководство!

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Бесплатная библиотека растяжения времени DiracLE (http://dirac.dspdimension.com) имеет служебный код, который преобразует ABL (AudioBufferLists) в массивы с плавающей запятой и наоборот как часть их примера кода. Проверьте их классы EAFRead и EAFWrite, они именно то, что вы ищете.

1 голос
/ 09 декабря 2015

Это поздний ответ, но я изо всех сил пытался получить буфер 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)
    }
}
1 голос
/ 19 августа 2011

Да, я бы поместил их в AudioBuffer, а это в AudioBufferList.После этого вы можете записать их в файл с помощью ExtAudioFileWrite () в ExtAudioFileRef, который был создан с помощью ExtAudioFileCreateNew ().

Документация по аудиофайлам: http://developer.apple.com/library/mac/#documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html%23//apple_ref/doc/uid/TP40007912

...