code review: resource leaks and init guard
This commit is contained in:
+17
-10
@@ -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,
|
||||
|
||||
+2
@@ -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",
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user