mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-04-17 20:08:28 +00:00
148 lines
4.5 KiB
QML
148 lines
4.5 KiB
QML
import QtQuick
|
|
import QtQuick.Layouts
|
|
|
|
import Linphone
|
|
|
|
import UtilsCpp
|
|
|
|
// =============================================================================
|
|
|
|
Item {
|
|
id: mainItem
|
|
property ChatMessageContentGui chatMessageContentGui
|
|
// used for creating a voice recording message
|
|
property var chatMessageObj
|
|
property ChatMessageGui chatMessage: chatMessageObj && chatMessageObj.value || null
|
|
property bool isPlaying: soudPlayerLoader.item && soudPlayerLoader.item.core.playbackState
|
|
=== LinphoneEnums.PlaybackState.PlayingState
|
|
onIsPlayingChanged: isPlaying ? mediaProgressBar.resume() : mediaProgressBar.stop()
|
|
property bool recording: false
|
|
property RecorderGui recorderGui: recorderLoader.item || null
|
|
|
|
signal voiceRecordingMessageCreationRequested(RecorderGui recorderGui)
|
|
signal stopRecording
|
|
signal endOfFileReached
|
|
// auto play if follows a voice recording
|
|
function requestPlaying() {
|
|
if (soudPlayerLoader.item) {
|
|
soudPlayerLoader.item.play(true);
|
|
}
|
|
}
|
|
|
|
function createVoiceMessageInChat(chat) {
|
|
if (recorderLoader.item) {
|
|
mainItem.chatMessageObj = UtilsCpp.createVoiceRecordingMessage(recorderLoader.item, chat);
|
|
} else {
|
|
//: Error
|
|
UtilsCpp.showInformationPopup(qsTr("information_popup_error_title"),
|
|
//: Failed to create voice message : error in recorder
|
|
qsTr("information_popup_voice_message_error_message"), false);
|
|
}
|
|
}
|
|
|
|
Loader {
|
|
id: soudPlayerLoader
|
|
property int duration: mainItem.chatMessageContentGui ? mainItem.chatMessageContentGui.core.fileDuration : item
|
|
? item.core.duration : 0
|
|
property int position: item?.core.position || 0
|
|
active: mainItem.chatMessageContentGui && mainItem.chatMessageContentGui.core.isVoiceRecording
|
|
sourceComponent: SoundPlayerGui {
|
|
id: soundPlayerGui
|
|
source: mainItem.chatMessageContentGui && mainItem.chatMessageContentGui.core.filePath
|
|
|
|
function play(restartIfPlaying) {
|
|
if (mainItem.isPlaying && (restartIfPlaying === undefined || !restartIfPlaying)) {
|
|
// Pause the play
|
|
soundPlayerGui.core.lPause();
|
|
} else if (restartIfPlaying) {
|
|
//Play from scratch
|
|
soundPlayerGui.core.lRestart();
|
|
} else {
|
|
// Play the audio
|
|
soundPlayerGui.core.lPlay();
|
|
}
|
|
}
|
|
onStopped: {
|
|
mediaProgressBar.value = 101;
|
|
}
|
|
onPositionChanged: {
|
|
mediaProgressBar.progressPosition = soudPlayerLoader.position;
|
|
mediaProgressBar.value = 100 * (mediaProgressBar.progressPosition / soudPlayerLoader.duration);
|
|
}
|
|
onSourceChanged: if (source != "") {
|
|
core.lOpen(); // Open the file and allow seeking
|
|
mediaProgressBar.value = 0;
|
|
mediaProgressBar.refresh();
|
|
}
|
|
onErrorChanged: error => {
|
|
//: Error
|
|
UtilsCpp.showInformationPopup(qsTr("information_popup_error_title"), error, false);
|
|
}
|
|
onEofReached: {
|
|
mainItem.endOfFileReached();
|
|
}
|
|
}
|
|
}
|
|
|
|
Loader {
|
|
id: recorderLoader
|
|
active: mainItem.recording && !mainItem.chatMessageContentGui
|
|
property int duration: item?.core.duration || 0
|
|
property int captureVolume: item?.core.captureVolume || 0
|
|
property var state: item?.core.state
|
|
|
|
Connections {
|
|
target: mainItem
|
|
function onStopRecording() {
|
|
recorderLoader.item.core.lStop();
|
|
}
|
|
}
|
|
|
|
sourceComponent: RecorderGui {
|
|
id: recorderGui
|
|
onReady: core.lStart()
|
|
onStateChanged: state => {
|
|
if (state === LinphoneEnums.RecorderState.Running)
|
|
mediaProgressBar.start();
|
|
if (state === LinphoneEnums.RecorderState.Closed) {
|
|
mediaProgressBar.stop();
|
|
mainItem.voiceRecordingMessageCreationRequested(recorderGui);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
MediaProgressBar {
|
|
id: mediaProgressBar
|
|
anchors.fill: parent
|
|
progressDuration: soudPlayerLoader.active ? soudPlayerLoader.duration : recorderLoader ? recorderLoader.duration :
|
|
chatMessageContentGui.core.fileDuration
|
|
progressPosition: 0
|
|
value: 0
|
|
recording: recorderLoader.state === LinphoneEnums.RecorderState.Running
|
|
function refresh() {
|
|
if (soudPlayerLoader.item) {
|
|
soudPlayerLoader.item.core.lRefreshPosition();
|
|
} else if (recorderLoader.item) {
|
|
recorderLoader.item.core.lRefresh();
|
|
}
|
|
}
|
|
onEndReached: {
|
|
if (soudPlayerLoader.item)
|
|
soudPlayerLoader.item.core.lStop();
|
|
}
|
|
onPlayStopButtonToggled: {
|
|
if (soudPlayerLoader.item) {
|
|
soudPlayerLoader.item.play();
|
|
} else if (recorderLoader.item) {
|
|
recorderLoader.item.core.lStop();
|
|
}
|
|
}
|
|
onRefreshPositionRequested: refresh()
|
|
onSeekRequested: ms => {
|
|
if (soudPlayerLoader.active) {
|
|
soudPlayerLoader.item.core.lSeek(ms);
|
|
}
|
|
}
|
|
}
|
|
}
|