Coverage Summary for Class: PrimitiveAudioDataKt (com.vsevolodganin.clicktrack.primitiveaudio)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
PrimitiveAudioDataKt |
33.3%
(2/6)
|
100%
(5/5)
|
60%
(6/10)
|
39.7%
(25/63)
|
PrimitiveAudioDataKt$WhenMappings |
|
Total |
33.3%
(2/6)
|
100%
(5/5)
|
60%
(6/10)
|
39.7%
(25/63)
|
package com.vsevolodganin.clicktrack.primitiveaudio
import kotlin.math.roundToInt
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
import kotlin.time.DurationUnit
class PrimitiveAudioData(
val bytes: ByteArray,
val encoding: Encoding,
val sampleRate: Int,
val channelCount: Int,
) {
enum class Encoding {
PCM_UNSIGNED_8BIT,
PCM_SIGNED_16BIT_LITTLE_ENDIAN,
PCM_SIGNED_24BIT_LITTLE_ENDIAN,
PCM_SIGNED_32BIT_LITTLE_ENDIAN,
PCM_FLOAT_32BIT_LITTLE_ENDIAN,
}
}
val PrimitiveAudioData.bytesPerSample: Int
get() = when (encoding) {
PrimitiveAudioData.Encoding.PCM_UNSIGNED_8BIT -> 1
PrimitiveAudioData.Encoding.PCM_SIGNED_16BIT_LITTLE_ENDIAN -> 2
PrimitiveAudioData.Encoding.PCM_SIGNED_24BIT_LITTLE_ENDIAN -> 3
PrimitiveAudioData.Encoding.PCM_SIGNED_32BIT_LITTLE_ENDIAN,
PrimitiveAudioData.Encoding.PCM_FLOAT_32BIT_LITTLE_ENDIAN,
-> 4
}
val PrimitiveAudioData.samplesNumber: Int get() = bytes.size / bytesPerSample
fun convertDurationToSamplesNumber(duration: Duration, sampleRate: Int): Int {
return (duration.toDouble(DurationUnit.SECONDS) * sampleRate).roundToInt()
}
fun convertDurationToFramesNumber(duration: Duration, sampleRate: Int, channelCount: Int): Int {
return (duration.toDouble(DurationUnit.SECONDS) / channelCount * sampleRate).roundToInt()
}
fun convertSamplesNumberToDuration(samplesNumber: Int, sampleRate: Int): Duration {
return (samplesNumber.toDouble() / sampleRate).seconds
}
fun convertFramesNumberToDuration(framesNumber: Int, sampleRate: Int, channelCount: Int): Duration {
return (framesNumber.toDouble() / sampleRate * channelCount).seconds
}