// // Copyright 2023, 2024 New Vector Ltd. // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial // Please see LICENSE files in the repository root for full details. // import Combine import Foundation enum VoiceMessageRecorderError: Error { case missingRecordingFile case previewNotAvailable case audioRecorderError(AudioRecorderError) case waveformAnalysisError case failedSendingVoiceMessage } enum VoiceMessageRecorderAction { case didStartRecording(audioRecorder: AudioRecorderProtocol) case didStopRecording(previewState: AudioPlayerState, url: URL) case didFailWithError(error: VoiceMessageRecorderError) } protocol VoiceMessageRecorderProtocol { var previewAudioPlayerState: AudioPlayerState? { get } var isRecording: Bool { get } var recordingURL: URL? { get } var actions: AnyPublisher { get } func startRecording() async func stopRecording() async func cancelRecording() async func startPlayback() async -> Result func pausePlayback() func stopPlayback() async func seekPlayback(to progress: Double) async func deleteRecording() async func sendVoiceMessage(timelineController: TimelineControllerProtocol, audioConverter: AudioConverterProtocol) async -> Result } // sourcery: AutoMockable extension VoiceMessageRecorderProtocol { }