code review: resource leaks and init guard
This commit is contained in:
+17
-10
@@ -112,6 +112,9 @@ class VoiceAnonymizer {
|
|||||||
onProgress: (Float) -> Unit,
|
onProgress: (Float) -> Unit,
|
||||||
): DecodedAudio {
|
): DecodedAudio {
|
||||||
val extractor = MediaExtractor()
|
val extractor = MediaExtractor()
|
||||||
|
var decoder: MediaCodec? = null
|
||||||
|
|
||||||
|
try {
|
||||||
extractor.setDataSource(inputFile.absolutePath)
|
extractor.setDataSource(inputFile.absolutePath)
|
||||||
|
|
||||||
var audioTrackIndex = -1
|
var audioTrackIndex = -1
|
||||||
@@ -127,7 +130,6 @@ class VoiceAnonymizer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (audioTrackIndex == -1 || format == null) {
|
if (audioTrackIndex == -1 || format == null) {
|
||||||
extractor.release()
|
|
||||||
throw IllegalStateException("No audio track found in file")
|
throw IllegalStateException("No audio track found in file")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,7 +139,7 @@ class VoiceAnonymizer {
|
|||||||
val durationUs = format.getLong(MediaFormat.KEY_DURATION)
|
val durationUs = format.getLong(MediaFormat.KEY_DURATION)
|
||||||
val duration = (durationUs / 1_000_000).toInt()
|
val duration = (durationUs / 1_000_000).toInt()
|
||||||
|
|
||||||
val decoder = MediaCodec.createDecoderByType(mime)
|
decoder = MediaCodec.createDecoderByType(mime)
|
||||||
decoder.configure(format, null, null, 0)
|
decoder.configure(format, null, null, 0)
|
||||||
decoder.start()
|
decoder.start()
|
||||||
|
|
||||||
@@ -192,11 +194,12 @@ class VoiceAnonymizer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
decoder.stop()
|
|
||||||
decoder.release()
|
|
||||||
extractor.release()
|
|
||||||
|
|
||||||
return DecodedAudio(pcmSamples.toFloatArray(), sampleRate, duration)
|
return DecodedAudio(pcmSamples.toFloatArray(), sampleRate, duration)
|
||||||
|
} finally {
|
||||||
|
decoder?.stop()
|
||||||
|
decoder?.release()
|
||||||
|
extractor.release()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun processPcmWithTarsos(
|
private fun processPcmWithTarsos(
|
||||||
@@ -320,13 +323,14 @@ class VoiceAnonymizer {
|
|||||||
format.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE)
|
format.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE)
|
||||||
|
|
||||||
val encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC)
|
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.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
|
||||||
encoder.start()
|
encoder.start()
|
||||||
|
|
||||||
val muxer = MediaMuxer(outputFile.absolutePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
|
|
||||||
var audioTrackIndex = -1
|
var audioTrackIndex = -1
|
||||||
var muxerStarted = false
|
|
||||||
|
|
||||||
val bufferInfo = MediaCodec.BufferInfo()
|
val bufferInfo = MediaCodec.BufferInfo()
|
||||||
var inputOffset = 0
|
var inputOffset = 0
|
||||||
var inputDone = false
|
var inputDone = false
|
||||||
@@ -395,13 +399,16 @@ class VoiceAnonymizer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
encoder.stop()
|
encoder.stop()
|
||||||
encoder.release()
|
encoder.release()
|
||||||
|
if (muxerStarted) {
|
||||||
muxer.stop()
|
muxer.stop()
|
||||||
|
}
|
||||||
muxer.release()
|
muxer.release()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class FloatArrayAudioInputStream(
|
private class FloatArrayAudioInputStream(
|
||||||
private val floatArray: FloatArray,
|
private val floatArray: FloatArray,
|
||||||
|
|||||||
+2
@@ -74,10 +74,12 @@ class VoiceReplyViewModel : ViewModel() {
|
|||||||
scope = viewModelScope,
|
scope = viewModelScope,
|
||||||
logTag = "VoiceReplyViewModel",
|
logTag = "VoiceReplyViewModel",
|
||||||
onError = { error ->
|
onError = { error ->
|
||||||
|
if (::accountViewModel.isInitialized) {
|
||||||
accountViewModel.toastManager.toast(
|
accountViewModel.toastManager.toast(
|
||||||
stringRes(Amethyst.instance.appContext, R.string.error),
|
stringRes(Amethyst.instance.appContext, R.string.error),
|
||||||
error.message ?: "Voice anonymization failed",
|
error.message ?: "Voice anonymization failed",
|
||||||
)
|
)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user