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 val fileExtension: String
get() = when (outputFormat) { get() = when (getOutputFormat()) {
MediaRecorder.OutputFormat.AAC_ADTS -> "aac" MediaRecorder.OutputFormat.AAC_ADTS -> "aac"
MediaRecorder.OutputFormat.THREE_GPP -> "3gp" MediaRecorder.OutputFormat.THREE_GPP -> "3gp"
MediaRecorder.OutputFormat.MPEG_4 -> "mp4" MediaRecorder.OutputFormat.MPEG_4 -> "mp4"

View File

@ -54,6 +54,8 @@ class VideoRecorderService :
private lateinit var selectedCamera: CameraSelector private lateinit var selectedCamera: CameraSelector
private var enableAudio by Delegates.notNull<Boolean>() private var enableAudio by Delegates.notNull<Boolean>()
var onCameraControlAvailable = {}
var cameraControl: CameraControl? = null var cameraControl: CameraControl? = null
private set private set
@ -186,6 +188,7 @@ class VideoRecorderService :
videoCapture videoCapture
) )
cameraControl = CameraControl(camera!!) cameraControl = CameraControl(camera!!)
onCameraControlAvailable()
_cameraAvailableListener.complete(Unit) _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.content.Intent
import android.net.Uri 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.BatchesFolder
import app.myzel394.alibi.helpers.VideoBatchesFolder import app.myzel394.alibi.helpers.VideoBatchesFolder
import app.myzel394.alibi.services.IntervalRecorderService 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.AudioRecorderModel
import app.myzel394.alibi.ui.models.BaseRecorderModel import app.myzel394.alibi.ui.models.BaseRecorderModel
import app.myzel394.alibi.ui.models.VideoRecorderModel import app.myzel394.alibi.ui.models.VideoRecorderModel
@ -116,82 +118,79 @@ fun RecorderEventsHandler(
} }
} }
fun saveRecording(recorder: RecorderModel) { suspend fun saveRecording(recorder: RecorderModel) {
scope.launch { isProcessing = true
isProcessing = true
// Give the user some time to see the processing dialog // Give the user some time to see the processing dialog
delay(100) delay(100)
try { try {
val recording =
val recording = // When new recording created
// When new recording created recorder.recorderService?.getRecordingInformation()
recorder.recorderService?.getRecordingInformation() // When recording is loaded from lastRecording
// When recording is loaded from lastRecording ?: settings.lastRecording
?: settings.lastRecording ?: throw Exception("No recording information available")
?: throw Exception("No recording information available") val batchesFolder = when (recorder.javaClass) {
val batchesFolder = when (recorder.javaClass) { AudioRecorderModel::class.java -> AudioBatchesFolder.importFromFolder(
AudioRecorderModel::class.java -> AudioBatchesFolder.importFromFolder( recording.folderPath,
recording.folderPath, context
context
)
VideoRecorderModel::class.java -> VideoBatchesFolder.importFromFolder(
recording.folderPath,
context
)
else -> throw Exception("Unknown recorder type")
}
batchesFolder.concatenate(
recording.recordingStart,
recording.fileExtension,
) )
// Save file VideoRecorderModel::class.java -> VideoBatchesFolder.importFromFolder(
val name = batchesFolder.getName( recording.folderPath,
recording.recordingStart, context
recording.fileExtension,
) )
when (batchesFolder.type) { else -> throw Exception("Unknown recorder 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
} }
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) saveAsLastRecording(audioRecorder as RecorderModel)
saveRecording(audioRecorder) saveRecording(audioRecorder)
}
audioRecorder.destroyService(context) audioRecorder.destroyService(context)
}
} }
} }
} }
@ -241,9 +240,9 @@ fun RecorderEventsHandler(
saveAsLastRecording(videoRecorder as RecorderModel) saveAsLastRecording(videoRecorder as RecorderModel)
saveRecording(videoRecorder) saveRecording(videoRecorder)
}
videoRecorder.destroyService(context) videoRecorder.destroyService(context)
}
} }
} }
} }

View File

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

View File

@ -28,7 +28,7 @@ import app.myzel394.alibi.R
import app.myzel394.alibi.dataStore import app.myzel394.alibi.dataStore
import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.db.AppSettings
import app.myzel394.alibi.db.RecordingInformation 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.components.RecorderScreen.organisms.VideoRecordingStatus
import app.myzel394.alibi.ui.effects.rememberSettings import app.myzel394.alibi.ui.effects.rememberSettings
import app.myzel394.alibi.ui.models.AudioRecorderModel import app.myzel394.alibi.ui.models.AudioRecorderModel