fix: Properly save recording

This commit is contained in:
Myzel394 2023-12-17 21:24:12 +01:00
parent df0bb35672
commit 76752e9004
No known key found for this signature in database
GPG Key ID: 79CC92F37B3E1A2B
5 changed files with 84 additions and 78 deletions

View File

@ -263,7 +263,7 @@ data class AudioRecorderSettings(
}
val fileExtension: String
get() = when (outputFormat) {
get() = when (getOutputFormat()) {
MediaRecorder.OutputFormat.AAC_ADTS -> "aac"
MediaRecorder.OutputFormat.THREE_GPP -> "3gp"
MediaRecorder.OutputFormat.MPEG_4 -> "mp4"

View File

@ -54,6 +54,8 @@ class VideoRecorderService :
private lateinit var selectedCamera: CameraSelector
private var enableAudio by Delegates.notNull<Boolean>()
var onCameraControlAvailable = {}
var cameraControl: CameraControl? = null
private set
@ -186,6 +188,7 @@ class VideoRecorderService :
videoCapture
)
cameraControl = CameraControl(camera!!)
onCameraControlAvailable()
_cameraAvailableListener.complete(Unit)
}

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.RecorderScreen.atoms
package app.myzel394.alibi.ui.components.RecorderScreen.organisms
import android.content.Intent
import android.net.Uri
@ -23,6 +23,8 @@ import app.myzel394.alibi.helpers.AudioBatchesFolder
import app.myzel394.alibi.helpers.BatchesFolder
import app.myzel394.alibi.helpers.VideoBatchesFolder
import app.myzel394.alibi.services.IntervalRecorderService
import app.myzel394.alibi.ui.components.RecorderScreen.atoms.RecorderErrorDialog
import app.myzel394.alibi.ui.components.RecorderScreen.atoms.RecorderProcessingDialog
import app.myzel394.alibi.ui.models.AudioRecorderModel
import app.myzel394.alibi.ui.models.BaseRecorderModel
import app.myzel394.alibi.ui.models.VideoRecorderModel
@ -116,82 +118,79 @@ fun RecorderEventsHandler(
}
}
fun saveRecording(recorder: RecorderModel) {
scope.launch {
isProcessing = true
suspend fun saveRecording(recorder: RecorderModel) {
isProcessing = true
// Give the user some time to see the processing dialog
delay(100)
// Give the user some time to see the processing dialog
delay(100)
try {
val recording =
// When new recording created
recorder.recorderService?.getRecordingInformation()
// When recording is loaded from lastRecording
?: settings.lastRecording
?: throw Exception("No recording information available")
val batchesFolder = when (recorder.javaClass) {
AudioRecorderModel::class.java -> AudioBatchesFolder.importFromFolder(
recording.folderPath,
context
)
VideoRecorderModel::class.java -> VideoBatchesFolder.importFromFolder(
recording.folderPath,
context
)
else -> throw Exception("Unknown recorder type")
}
batchesFolder.concatenate(
recording.recordingStart,
recording.fileExtension,
try {
val recording =
// When new recording created
recorder.recorderService?.getRecordingInformation()
// When recording is loaded from lastRecording
?: settings.lastRecording
?: throw Exception("No recording information available")
val batchesFolder = when (recorder.javaClass) {
AudioRecorderModel::class.java -> AudioBatchesFolder.importFromFolder(
recording.folderPath,
context
)
// Save file
val name = batchesFolder.getName(
recording.recordingStart,
recording.fileExtension,
VideoRecorderModel::class.java -> VideoBatchesFolder.importFromFolder(
recording.folderPath,
context
)
when (batchesFolder.type) {
BatchesFolder.BatchType.INTERNAL -> {
when (batchesFolder) {
is AudioBatchesFolder -> {
saveAudioFile(
batchesFolder.asInternalGetOutputFile(
recording.recordingStart,
recording.fileExtension,
), name
)
}
is VideoBatchesFolder -> {
saveVideoFile(
batchesFolder.asInternalGetOutputFile(
recording.recordingStart,
recording.fileExtension,
), name
)
}
}
}
BatchesFolder.BatchType.CUSTOM -> {
showSnackbar(batchesFolder.customFolder!!.uri)
if (settings.deleteRecordingsImmediately) {
batchesFolder.deleteRecordings()
}
}
}
} catch (error: Exception) {
Log.getStackTraceString(error)
} finally {
isProcessing = false
else -> throw Exception("Unknown recorder type")
}
batchesFolder.concatenate(
recording.recordingStart,
recording.fileExtension,
)
// Save file
val name = batchesFolder.getName(
recording.recordingStart,
recording.fileExtension,
)
when (batchesFolder.type) {
BatchesFolder.BatchType.INTERNAL -> {
when (batchesFolder) {
is AudioBatchesFolder -> {
saveAudioFile(
batchesFolder.asInternalGetOutputFile(
recording.recordingStart,
recording.fileExtension,
), name
)
}
is VideoBatchesFolder -> {
saveVideoFile(
batchesFolder.asInternalGetOutputFile(
recording.recordingStart,
recording.fileExtension,
), name
)
}
}
}
BatchesFolder.BatchType.CUSTOM -> {
showSnackbar(batchesFolder.customFolder!!.uri)
if (settings.deleteRecordingsImmediately) {
batchesFolder.deleteRecordings()
}
}
}
} catch (error: Exception) {
Log.getStackTraceString(error)
} finally {
isProcessing = false
}
}
@ -208,9 +207,9 @@ fun RecorderEventsHandler(
saveAsLastRecording(audioRecorder as RecorderModel)
saveRecording(audioRecorder)
}
audioRecorder.destroyService(context)
audioRecorder.destroyService(context)
}
}
}
}
@ -241,9 +240,9 @@ fun RecorderEventsHandler(
saveAsLastRecording(videoRecorder as RecorderModel)
saveRecording(videoRecorder)
}
videoRecorder.destroyService(context)
videoRecorder.destroyService(context)
}
}
}
}

View File

@ -26,8 +26,8 @@ class VideoRecorderModel :
override val isInRecording: Boolean
get() = super.isInRecording
val isStartingRecording: Boolean
get() = recorderService?.cameraControl == null
var isStartingRecording by mutableStateOf(true)
private set
val cameraSelector: CameraSelector
get() = CameraSelector.Builder().requireLensFacing(cameraID).build()
@ -46,6 +46,10 @@ class VideoRecorderModel :
service.startRecording()
}
service.onCameraControlAvailable = {
isStartingRecording = false
}
recorderState = service.state
recordingTime = service.recordingTime
}

View File

@ -28,7 +28,7 @@ import app.myzel394.alibi.R
import app.myzel394.alibi.dataStore
import app.myzel394.alibi.db.AppSettings
import app.myzel394.alibi.db.RecordingInformation
import app.myzel394.alibi.ui.components.RecorderScreen.atoms.RecorderEventsHandler
import app.myzel394.alibi.ui.components.RecorderScreen.organisms.RecorderEventsHandler
import app.myzel394.alibi.ui.components.RecorderScreen.organisms.VideoRecordingStatus
import app.myzel394.alibi.ui.effects.rememberSettings
import app.myzel394.alibi.ui.models.AudioRecorderModel