code review: resource leaks and init guard

This commit is contained in:
davotoula
2026-01-12 22:55:53 +01:00
parent 3287e3c031
commit f13a9164c2
2 changed files with 154 additions and 145 deletions
@@ -112,6 +112,9 @@ class VoiceAnonymizer {
onProgress: (Float) -> Unit,
): DecodedAudio {
val extractor = MediaExtractor()
var decoder: MediaCodec? = null
try {
extractor.setDataSource(inputFile.absolutePath)
var audioTrackIndex = -1
@@ -127,7 +130,6 @@ class VoiceAnonymizer {
}
if (audioTrackIndex == -1 || format == null) {
extractor.release()
throw IllegalStateException("No audio track found in file")
}
@@ -137,7 +139,7 @@ class VoiceAnonymizer {
val durationUs = format.getLong(MediaFormat.KEY_DURATION)
val duration = (durationUs / 1_000_000).toInt()
val decoder = MediaCodec.createDecoderByType(mime)
decoder = MediaCodec.createDecoderByType(mime)
decoder.configure(format, null, null, 0)
decoder.start()
@@ -192,11 +194,12 @@ class VoiceAnonymizer {
}
}
decoder.stop()
decoder.release()
extractor.release()
return DecodedAudio(pcmSamples.toFloatArray(), sampleRate, duration)
} finally {
decoder?.stop()
decoder?.release()
extractor.release()
}
}
private fun processPcmWithTarsos(
@@ -320,13 +323,14 @@ class VoiceAnonymizer {
format.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE)
val encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC)
val muxer = MediaMuxer(outputFile.absolutePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
var muxerStarted = false
try {
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
encoder.start()
val muxer = MediaMuxer(outputFile.absolutePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
var audioTrackIndex = -1
var muxerStarted = false
val bufferInfo = MediaCodec.BufferInfo()
var inputOffset = 0
var inputDone = false
@@ -395,13 +399,16 @@ class VoiceAnonymizer {
}
}
}
} finally {
encoder.stop()
encoder.release()
if (muxerStarted) {
muxer.stop()
}
muxer.release()
}
}
}
private class FloatArrayAudioInputStream(
private val floatArray: FloatArray,
@@ -74,10 +74,12 @@ class VoiceReplyViewModel : ViewModel() {
scope = viewModelScope,
logTag = "VoiceReplyViewModel",
onError = { error ->
if (::accountViewModel.isInitialized) {
accountViewModel.toastManager.toast(
stringRes(Amethyst.instance.appContext, R.string.error),
error.message ?: "Voice anonymization failed",
)
}
},
)