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}