Convert PCM float32 to int16 iOS


What's inside this article ⌄
  • KMP IOS convert PCM float 32 bit to PCM int 16 bit
  • PCM float32 to int16 IOS
  • Kotlin Multiplatform PCM conversion
  • IOS audio format conversion KMP
  • Convert PCM audio format IOS

Here we have the method that converts audio in AVAudioPCMBuffer in PCM float 32bit mono format to audio in ByteArray in PCM int 16bit mono format:

 1fun convertMonoPCMFloat32ToMonoPCMInt16(inputBuffer: AVAudioPCMBuffer, outputSampleRate: Double): ByteArray {
 2    val floatChannelData = inputBuffer.floatChannelData!!
 3    val frameLength = inputBuffer.frameLength.toInt()
 4    val channelCount = inputBuffer.format.channelCount
 5    val inputSampleRate = inputBuffer.format.sampleRate
 6
 7    val resampleRatio = inputSampleRate / outputSampleRate
 8    val outputFrameLength = (frameLength.toDouble() / resampleRatio).toInt()
 9    val outputSize = outputFrameLength * channelCount.toInt()
10    val outputBuffer = ByteArray(outputSize * 2) // 2 bytes per Int16 sample
11
12    var outputIndex = 0
13    for (outputFrame in 0 until outputFrameLength) {
14        val inputFrameFloat = outputFrame * resampleRatio
15        val inputFrame = inputFrameFloat.toInt()
16        val fraction = inputFrameFloat - inputFrame
17
18        for (channel in 0 until channelCount.toInt()) {
19            // Linear interpolation for resampling
20            val sample1 = floatChannelData[channel]!![inputFrame]
21            val sample2 = if (inputFrame + 1 < frameLength) floatChannelData[channel]!![inputFrame + 1] else sample1
22            val interpolatedSample = (1 - fraction) * sample1 + fraction * sample2
23
24            // Convert to Int16
25            val int16Sample = (interpolatedSample * Short.MAX_VALUE).toInt()
26                .coerceIn(Short.MIN_VALUE.toInt(), Short.MAX_VALUE.toInt()).toShort()
27
28            outputBuffer[outputIndex++] = int16Sample.toByte()
29            outputBuffer[outputIndex++] = (int16Sample.toInt() shr 8).toByte()
30        }
31    }
32
33    return outputBuffer
34}