@@ -27,6 +27,10 @@ internal class WfloatAudioSession(
2727 ) -> Unit ,
2828 private val playbackFinishedHandler : (requestId: Int ) -> Unit ,
2929) {
30+ companion object {
31+ private const val BYTES_PER_PCM_FLOAT_SAMPLE = 4
32+ }
33+
3034 private data class AudioWriteItem (
3135 val samples : FloatArray ,
3236 )
@@ -69,12 +73,19 @@ internal class WfloatAudioSession(
6973 private var totalFramesScheduled = 0L
7074
7175 init {
76+ require(sampleRate > 0 ) { " Invalid sample rate: $sampleRate " }
77+
7278 val minBufferSize = AudioTrack .getMinBufferSize(
7379 sampleRate,
7480 AudioFormat .CHANNEL_OUT_MONO ,
7581 AudioFormat .ENCODING_PCM_FLOAT
7682 )
77- val bufferSize = max(minBufferSize, sampleRate / 2 )
83+ require(minBufferSize > 0 ) {
84+ " Failed to determine minimum audio buffer size for sample rate $sampleRate ."
85+ }
86+
87+ val targetBufferSizeBytes = (sampleRate * BYTES_PER_PCM_FLOAT_SAMPLE ) / 2
88+ val bufferSize = max(minBufferSize, targetBufferSizeBytes)
7889
7990 val attributes = AudioAttributes .Builder ()
8091 .setContentType(AudioAttributes .CONTENT_TYPE_SPEECH )
@@ -94,6 +105,9 @@ internal class WfloatAudioSession(
94105 AudioTrack .MODE_STREAM ,
95106 AudioManager .AUDIO_SESSION_ID_GENERATE
96107 )
108+ require(track.state == AudioTrack .STATE_INITIALIZED ) {
109+ " Failed to initialize AudioTrack for sample rate $sampleRate and buffer size $bufferSize ."
110+ }
97111 track.play()
98112
99113 playbackThread = Thread (
0 commit comments