mirror of
https://github.com/Myzel394/Alibi.git
synced 2025-06-18 23:05:26 +02:00
fix: Properly save recording
This commit is contained in:
parent
df0bb35672
commit
76752e9004
@ -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"
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user