objective-cswiftezaudioaudiobufferaudiobufferlist

How to convert that UnsafeMutablePointer<UnsafeMutablePointer<Float>> variable into AudioBufferList?


I have this EZAudio method in my Swift project, to capture audio from the microphone:

func microphone(microphone: EZMicrophone!, hasAudioReceived bufferList: UnsafeMutablePointer<UnsafeMutablePointer<Float>>, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {

}

But what I really need is to have that "bufferList" parameter coming in as an AudioBufferList type, in order to send those audio packets through a socket, just like I did in Objective C:

//Objective C pseudocode:
for(int i = 0; i < bufferList.mNumberBuffers; ++i){
   AudioBuffer buffer = bufferList.mBuffers[i];
   audio = ["audio": NSData(bytes: buffer.mData, length: Int(buffer.mDataByteSize))];
   socket.emit("message", audio);
}

How can I convert that UnsafeMutablePointer> variable into AudioBufferList?


Solution

  • I was able to stream audio from the Microphone, into a socket, like this:

    func microphone(microphone: EZMicrophone!, hasBufferList bufferList: UnsafeMutablePointer<AudioBufferList>, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {
            let blist:AudioBufferList=bufferList[0]
            let buffer:AudioBuffer = blist.mBuffers
            let audio = ["audio": NSData(bytes: buffer.mData, length: Int(buffer.mDataByteSize))];
            socket.emit("message", audio);//this socket comes from Foundation framework
        }
    

    This general AudioStreamDescriptor setup worked for me, you might have to tweak it for your own needs or ommit some parts, like the waveform animation:

    func initializeStreaming() {
            var streamDescription:AudioStreamBasicDescription=AudioStreamBasicDescription()
            streamDescription.mSampleRate       = 16000.0
            streamDescription.mFormatID         = kAudioFormatLinearPCM
            streamDescription.mFramesPerPacket  = 1
            streamDescription.mChannelsPerFrame = 1
            streamDescription.mBytesPerFrame    = streamDescription.mChannelsPerFrame * 2
            streamDescription.mBytesPerPacket   = streamDescription.mFramesPerPacket * streamDescription.mBytesPerFram
            streamDescription.mBitsPerChannel   = 16
            streamDescription.mFormatFlags      = kAudioFormatFlagIsSignedInteger
            microphone = EZMicrophone(microphoneDelegate: self, withAudioStreamBasicDescription: sstreamDescription, startsImmediately: false)
            waveview?.plotType=EZPlotType.Buffer
            waveview?.shouldFill = false
            waveview?.shouldMirror = false
        }
    

    It was complicated to get this thing running, good luck!