separate enable camera and video and use enableCamera when user activates webcam (fix #LINQT-2216)

This commit is contained in:
Gaelle Braud 2025-12-01 16:59:48 +01:00
parent c8428d6ade
commit 5a90959125
12 changed files with 177 additions and 138 deletions

View file

@ -111,6 +111,7 @@ CallCore::CallCore(const std::shared_ptr<linphone::Call> &call) : QObject(nullpt
auto videoDirection = callParams->getVideoDirection(); auto videoDirection = callParams->getVideoDirection();
mLocalVideoEnabled = mLocalVideoEnabled =
videoDirection == linphone::MediaDirection::SendOnly || videoDirection == linphone::MediaDirection::SendRecv; videoDirection == linphone::MediaDirection::SendOnly || videoDirection == linphone::MediaDirection::SendRecv;
mCameraEnabled = callParams->cameraEnabled();
auto remoteParams = call->getRemoteParams(); auto remoteParams = call->getRemoteParams();
videoDirection = remoteParams ? remoteParams->getVideoDirection() : linphone::MediaDirection::Inactive; videoDirection = remoteParams ? remoteParams->getVideoDirection() : linphone::MediaDirection::Inactive;
mRemoteVideoEnabled = mRemoteVideoEnabled =
@ -194,8 +195,8 @@ void CallCore::setSelf(QSharedPointer<CallCore> me) {
mCallModelConnection->makeConnectToModel(&CallModel::speakerMutedChanged, [this](bool isMuted) { mCallModelConnection->makeConnectToModel(&CallModel::speakerMutedChanged, [this](bool isMuted) {
mCallModelConnection->invokeToCore([this, isMuted]() { setSpeakerMuted(isMuted); }); mCallModelConnection->invokeToCore([this, isMuted]() { setSpeakerMuted(isMuted); });
}); });
mCallModelConnection->makeConnectToCore(&CallCore::lSetLocalVideoEnabled, [this](bool enabled) { mCallModelConnection->makeConnectToCore(&CallCore::lSetCameraEnabled, [this](bool enabled) {
mCallModelConnection->invokeToModel([this, enabled]() { mCallModel->setLocalVideoEnabled(enabled); }); mCallModelConnection->invokeToModel([this, enabled]() { mCallModel->setCameraEnabled(enabled); });
}); });
mCallModelConnection->makeConnectToCore(&CallCore::lStartRecording, [this]() { mCallModelConnection->makeConnectToCore(&CallCore::lStartRecording, [this]() {
mCallModelConnection->invokeToModel([this]() { mCallModel->startRecording(); }); mCallModelConnection->invokeToModel([this]() { mCallModel->startRecording(); });
@ -245,6 +246,9 @@ void CallCore::setSelf(QSharedPointer<CallCore> me) {
mCallModelConnection->makeConnectToModel(&CallModel::localVideoEnabledChanged, [this](bool enabled) { mCallModelConnection->makeConnectToModel(&CallModel::localVideoEnabledChanged, [this](bool enabled) {
mCallModelConnection->invokeToCore([this, enabled]() { setLocalVideoEnabled(enabled); }); mCallModelConnection->invokeToCore([this, enabled]() { setLocalVideoEnabled(enabled); });
}); });
mCallModelConnection->makeConnectToModel(&CallModel::cameraEnabledChanged, [this](bool enabled) {
mCallModelConnection->invokeToCore([this, enabled]() { setCameraEnabled(enabled); });
});
mCallModelConnection->makeConnectToModel(&CallModel::durationChanged, [this](int duration) { mCallModelConnection->makeConnectToModel(&CallModel::durationChanged, [this](int duration) {
mCallModelConnection->invokeToCore([this, duration]() { setDuration(duration); }); mCallModelConnection->invokeToCore([this, duration]() { setDuration(duration); });
}); });
@ -561,6 +565,18 @@ void CallCore::setLocalVideoEnabled(bool enabled) {
} }
} }
bool CallCore::getCameraEnabled() const {
return mCameraEnabled;
}
void CallCore::setCameraEnabled(bool enabled) {
if (mCameraEnabled != enabled) {
mCameraEnabled = enabled;
lDebug() << "CameraEnabled: " << mCameraEnabled;
emit cameraEnabledChanged();
}
}
bool CallCore::getPaused() const { bool CallCore::getPaused() const {
return mPaused; return mPaused;
} }

View file

@ -117,8 +117,8 @@ public:
Q_PROPERTY(QStringList remoteTokens WRITE setRemoteTokens MEMBER mRemoteTokens NOTIFY remoteTokensChanged) Q_PROPERTY(QStringList remoteTokens WRITE setRemoteTokens MEMBER mRemoteTokens NOTIFY remoteTokensChanged)
Q_PROPERTY( Q_PROPERTY(
bool remoteVideoEnabled READ getRemoteVideoEnabled WRITE setRemoteVideoEnabled NOTIFY remoteVideoEnabledChanged) bool remoteVideoEnabled READ getRemoteVideoEnabled WRITE setRemoteVideoEnabled NOTIFY remoteVideoEnabledChanged)
Q_PROPERTY( Q_PROPERTY(bool localVideoEnabled READ getLocalVideoEnabled NOTIFY localVideoEnabledChanged)
bool localVideoEnabled READ getLocalVideoEnabled WRITE lSetLocalVideoEnabled NOTIFY localVideoEnabledChanged) Q_PROPERTY(bool cameraEnabled READ getCameraEnabled WRITE lSetCameraEnabled NOTIFY cameraEnabledChanged)
Q_PROPERTY(bool recording READ getRecording WRITE setRecording NOTIFY recordingChanged) Q_PROPERTY(bool recording READ getRecording WRITE setRecording NOTIFY recordingChanged)
Q_PROPERTY(bool remoteRecording READ getRemoteRecording WRITE setRemoteRecording NOTIFY remoteRecordingChanged) Q_PROPERTY(bool remoteRecording READ getRemoteRecording WRITE setRemoteRecording NOTIFY remoteRecordingChanged)
Q_PROPERTY(bool recordable READ getRecordable WRITE setRecordable NOTIFY recordableChanged) Q_PROPERTY(bool recordable READ getRecordable WRITE setRecordable NOTIFY recordableChanged)
@ -201,6 +201,9 @@ public:
bool getLocalVideoEnabled() const; bool getLocalVideoEnabled() const;
void setLocalVideoEnabled(bool enabled); void setLocalVideoEnabled(bool enabled);
bool getCameraEnabled() const;
void setCameraEnabled(bool enabled);
bool getRecording() const; bool getRecording() const;
void setRecording(bool recording); void setRecording(bool recording);
@ -255,6 +258,7 @@ signals:
void remoteTokensChanged(); void remoteTokensChanged();
void remoteVideoEnabledChanged(bool remoteVideoEnabled); void remoteVideoEnabledChanged(bool remoteVideoEnabled);
void localVideoEnabledChanged(); void localVideoEnabledChanged();
void cameraEnabledChanged();
void recordingChanged(); void recordingChanged();
void remoteRecordingChanged(); void remoteRecordingChanged();
void recordableChanged(); void recordableChanged();
@ -275,7 +279,7 @@ signals:
void lTerminateAllCalls(); // Hangup all calls void lTerminateAllCalls(); // Hangup all calls
void lSetSpeakerMuted(bool muted); void lSetSpeakerMuted(bool muted);
void lSetMicrophoneMuted(bool isMuted); void lSetMicrophoneMuted(bool isMuted);
void lSetLocalVideoEnabled(bool enabled); void lSetCameraEnabled(bool enabled);
void lSetVideoEnabled(bool enabled); void lSetVideoEnabled(bool enabled);
void lSetPaused(bool paused); void lSetPaused(bool paused);
void lTransferCall(QString address); void lTransferCall(QString address);
@ -331,6 +335,7 @@ private:
bool mSpeakerMuted = false; bool mSpeakerMuted = false;
bool mMicrophoneMuted = false; bool mMicrophoneMuted = false;
bool mLocalVideoEnabled = false; bool mLocalVideoEnabled = false;
bool mCameraEnabled = false;
bool mVideoEnabled = false; bool mVideoEnabled = false;
bool mPaused = false; bool mPaused = false;
bool mRemoteVideoEnabled = false; bool mRemoteVideoEnabled = false;

View file

@ -752,30 +752,30 @@
<translation>Nur Anwendungs-Logs ausgeben</translation> <translation>Nur Anwendungs-Logs ausgeben</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1407"/> <location filename="../../core/App.cpp" line="1408"/>
<source>hide_action</source> <source>hide_action</source>
<extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment> <extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment>
<translation>Ausblenden</translation> <translation>Ausblenden</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1407"/> <location filename="../../core/App.cpp" line="1408"/>
<source>show_action</source> <source>show_action</source>
<translation>Zeigen</translation> <translation>Zeigen</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1422"/> <location filename="../../core/App.cpp" line="1423"/>
<source>quit_action</source> <source>quit_action</source>
<extracomment>&quot;Quitter&quot;</extracomment> <extracomment>&quot;Quitter&quot;</extracomment>
<translation>Beenden</translation> <translation>Beenden</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1440"/> <location filename="../../core/App.cpp" line="1441"/>
<source>check_for_update</source> <source>check_for_update</source>
<extracomment>Check for update</extracomment> <extracomment>Check for update</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1558"/> <location filename="../../core/App.cpp" line="1559"/>
<source>mark_all_read_action</source> <source>mark_all_read_action</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -821,76 +821,76 @@
<context> <context>
<name>CallCore</name> <name>CallCore</name>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="213"/> <location filename="../../core/call/CallCore.cpp" line="214"/>
<source>call_record_end_message</source> <source>call_record_end_message</source>
<extracomment>&quot;Enregistrement terminé&quot;</extracomment> <extracomment>&quot;Enregistrement terminé&quot;</extracomment>
<translation>Aufnahme beendet</translation> <translation>Aufnahme beendet</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="215"/> <location filename="../../core/call/CallCore.cpp" line="216"/>
<source>call_record_saved_in_file_message</source> <source>call_record_saved_in_file_message</source>
<extracomment>&quot;L&apos;appel a é enregistré dans le fichier : %1&quot;</extracomment> <extracomment>&quot;L&apos;appel a é enregistré dans le fichier : %1&quot;</extracomment>
<translation>Die Aufnahme wurde in der folgenden Datei gespeichert: %1</translation> <translation>Die Aufnahme wurde in der folgenden Datei gespeichert: %1</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="396"/> <location filename="../../core/call/CallCore.cpp" line="400"/>
<location filename="../../core/call/CallCore.cpp" line="421"/> <location filename="../../core/call/CallCore.cpp" line="425"/>
<source>call_stats_codec_label</source> <source>call_stats_codec_label</source>
<extracomment>&quot;Codec: %1 / %2 kHz&quot;</extracomment> <extracomment>&quot;Codec: %1 / %2 kHz&quot;</extracomment>
<translation>Codec: %1 / %2 kHz</translation> <translation>Codec: %1 / %2 kHz</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="400"/> <location filename="../../core/call/CallCore.cpp" line="404"/>
<location filename="../../core/call/CallCore.cpp" line="424"/> <location filename="../../core/call/CallCore.cpp" line="428"/>
<source>call_stats_bandwidth_label</source> <source>call_stats_bandwidth_label</source>
<extracomment>&quot;Bande passante : %1 %2 kbits/s %3 %4 kbits/s&quot;</extracomment> <extracomment>&quot;Bande passante : %1 %2 kbits/s %3 %4 kbits/s&quot;</extracomment>
<translation>Bandbreite: %1 %2 kbits/s %3 %4 kbits/s</translation> <translation>Bandbreite: %1 %2 kbits/s %3 %4 kbits/s</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="406"/> <location filename="../../core/call/CallCore.cpp" line="410"/>
<location filename="../../core/call/CallCore.cpp" line="429"/> <location filename="../../core/call/CallCore.cpp" line="433"/>
<source>call_stats_loss_rate_label</source> <source>call_stats_loss_rate_label</source>
<extracomment>&quot;Taux de perte: %1% %2%&quot;</extracomment> <extracomment>&quot;Taux de perte: %1% %2%&quot;</extracomment>
<translation>Verlustquote: %1% %2%</translation> <translation>Verlustquote: %1% %2%</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="411"/> <location filename="../../core/call/CallCore.cpp" line="415"/>
<source>call_stats_jitter_buffer_label</source> <source>call_stats_jitter_buffer_label</source>
<extracomment>&quot;Tampon de gigue: %1 ms&quot;</extracomment> <extracomment>&quot;Tampon de gigue: %1 ms&quot;</extracomment>
<translation>Jitter-Puffer: %1 ms</translation> <translation>Jitter-Puffer: %1 ms</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="438"/> <location filename="../../core/call/CallCore.cpp" line="442"/>
<source>call_stats_resolution_label</source> <source>call_stats_resolution_label</source>
<extracomment>&quot;Définition vidéo : %1 %2 %3 %4&quot;</extracomment> <extracomment>&quot;Définition vidéo : %1 %2 %3 %4&quot;</extracomment>
<translation>Videoauflösung: %1 %2 %3 %4</translation> <translation>Videoauflösung: %1 %2 %3 %4</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="444"/> <location filename="../../core/call/CallCore.cpp" line="448"/>
<source>call_stats_fps_label</source> <source>call_stats_fps_label</source>
<extracomment>&quot;FPS : %1 %2 %3 %4&quot;</extracomment> <extracomment>&quot;FPS : %1 %2 %3 %4&quot;</extracomment>
<translation>FPS : %1 %2 %3 %4</translation> <translation>FPS : %1 %2 %3 %4</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="657"/> <location filename="../../core/call/CallCore.cpp" line="673"/>
<source>media_encryption_dtls</source> <source>media_encryption_dtls</source>
<extracomment>DTLS</extracomment> <extracomment>DTLS</extracomment>
<translation>DTLS</translation> <translation>DTLS</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="660"/> <location filename="../../core/call/CallCore.cpp" line="676"/>
<source>media_encryption_none</source> <source>media_encryption_none</source>
<extracomment>None</extracomment> <extracomment>None</extracomment>
<translation>Nichts</translation> <translation>Nichts</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="663"/> <location filename="../../core/call/CallCore.cpp" line="679"/>
<source>media_encryption_srtp</source> <source>media_encryption_srtp</source>
<extracomment>SRTP</extracomment> <extracomment>SRTP</extracomment>
<translation>SRTP</translation> <translation>SRTP</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="666"/> <location filename="../../core/call/CallCore.cpp" line="682"/>
<source>media_encryption_post_quantum</source> <source>media_encryption_post_quantum</source>
<extracomment>&quot;ZRTP - Post quantique&quot;</extracomment> <extracomment>&quot;ZRTP - Post quantique&quot;</extracomment>
<translation>Post-quantum ZRTP</translation> <translation>Post-quantum ZRTP</translation>
@ -1027,24 +1027,24 @@
<translation>Der Anrufer hat das Gespräch beendet</translation> <translation>Der Anrufer hat das Gespräch beendet</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="159"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="158"/>
<source>conference_call_empty</source> <source>conference_call_empty</source>
<extracomment>&quot;En attente d&apos;autres participants&quot;</extracomment> <extracomment>&quot;En attente d&apos;autres participants&quot;</extracomment>
<translation>Warten auf weitere Teilnehmer</translation> <translation>Warten auf weitere Teilnehmer</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="177"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="176"/>
<source>conference_share_link_title</source> <source>conference_share_link_title</source>
<extracomment>&quot;Partager le lien&quot;</extracomment> <extracomment>&quot;Partager le lien&quot;</extracomment>
<translation>Link teilen</translation> <translation>Link teilen</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="183"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="182"/>
<source>copied</source> <source>copied</source>
<translation>Kopiert</translation> <translation>Kopiert</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="185"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="184"/>
<source>information_popup_meeting_address_copied_to_clipboard</source> <source>information_popup_meeting_address_copied_to_clipboard</source>
<extracomment>Le lien de la réunion a é copié dans le presse-papier</extracomment> <extracomment>Le lien de la réunion a é copié dans le presse-papier</extracomment>
<translation>Der Besprechungs-Link wurde in die Zwischenablage kopiert</translation> <translation>Der Besprechungs-Link wurde in die Zwischenablage kopiert</translation>
@ -1129,67 +1129,67 @@
<context> <context>
<name>CallModel</name> <name>CallModel</name>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="361"/> <location filename="../../model/call/CallModel.cpp" line="372"/>
<source>call_error_no_response_toast</source> <source>call_error_no_response_toast</source>
<extracomment>&quot;No response&quot;</extracomment> <extracomment>&quot;No response&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="365"/> <location filename="../../model/call/CallModel.cpp" line="376"/>
<source>call_error_forbidden_resource_toast</source> <source>call_error_forbidden_resource_toast</source>
<extracomment>&quot;403 : Forbidden resource&quot;</extracomment> <extracomment>&quot;403 : Forbidden resource&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="369"/> <location filename="../../model/call/CallModel.cpp" line="380"/>
<source>call_error_not_answered_toast</source> <source>call_error_not_answered_toast</source>
<extracomment>&quot;Request timeout&quot;</extracomment> <extracomment>&quot;Request timeout&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="373"/> <location filename="../../model/call/CallModel.cpp" line="384"/>
<source>call_error_user_declined_toast</source> <source>call_error_user_declined_toast</source>
<extracomment>&quot;User declined the call&quot;</extracomment> <extracomment>&quot;User declined the call&quot;</extracomment>
<translation>Der Benutzer hat den Anruf abgelehnt</translation> <translation>Der Benutzer hat den Anruf abgelehnt</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="377"/> <location filename="../../model/call/CallModel.cpp" line="388"/>
<source>call_error_user_not_found_toast</source> <source>call_error_user_not_found_toast</source>
<extracomment>&quot;User was not found&quot;</extracomment> <extracomment>&quot;User was not found&quot;</extracomment>
<translation>Benutzer nicht gefunden</translation> <translation>Benutzer nicht gefunden</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="381"/> <location filename="../../model/call/CallModel.cpp" line="392"/>
<source>call_error_user_busy_toast</source> <source>call_error_user_busy_toast</source>
<extracomment>&quot;User is busy&quot;</extracomment> <extracomment>&quot;User is busy&quot;</extracomment>
<translation>Der Benutzer ist beschäftigt</translation> <translation>Der Benutzer ist beschäftigt</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="385"/> <location filename="../../model/call/CallModel.cpp" line="396"/>
<source>call_error_incompatible_media_params_toast</source> <source>call_error_incompatible_media_params_toast</source>
<extracomment>&quot;User can&amp;apos;t accept your call&quot;</extracomment> <extracomment>&quot;User can&amp;apos;t accept your call&quot;</extracomment>
<translation>Der Benutzer kann Ihren Anruf nicht annehmen</translation> <translation>Der Benutzer kann Ihren Anruf nicht annehmen</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="389"/> <location filename="../../model/call/CallModel.cpp" line="400"/>
<source>call_error_io_error_toast</source> <source>call_error_io_error_toast</source>
<extracomment>&quot;Unavailable service or network error&quot;</extracomment> <extracomment>&quot;Unavailable service or network error&quot;</extracomment>
<translation>Dienst nicht verfügbar oder Netzwerkfehler</translation> <translation>Dienst nicht verfügbar oder Netzwerkfehler</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="393"/> <location filename="../../model/call/CallModel.cpp" line="404"/>
<source>call_error_do_not_disturb_toast</source> <source>call_error_do_not_disturb_toast</source>
<extracomment>&quot;Le correspondant ne peut être dérangé&quot;</extracomment> <extracomment>&quot;Le correspondant ne peut être dérangé&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="397"/> <location filename="../../model/call/CallModel.cpp" line="408"/>
<source>call_error_temporarily_unavailable_toast</source> <source>call_error_temporarily_unavailable_toast</source>
<extracomment>&quot;Temporarily unavailable&quot;</extracomment> <extracomment>&quot;Temporarily unavailable&quot;</extracomment>
<translation>Vorübergehend nicht verfügbar</translation> <translation>Vorübergehend nicht verfügbar</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="401"/> <location filename="../../model/call/CallModel.cpp" line="412"/>
<source>call_error_server_timeout_toast</source> <source>call_error_server_timeout_toast</source>
<extracomment>&quot;Server tiemout&quot;</extracomment> <extracomment>&quot;Server tiemout&quot;</extracomment>
<translation>Server-Zeitüberschreitung</translation> <translation>Server-Zeitüberschreitung</translation>
@ -1852,29 +1852,29 @@
<translation>Video aktivieren</translation> <translation>Video aktivieren</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1468"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1467"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1471"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/>
<source>call_activate_microphone</source> <source>call_activate_microphone</source>
<extracomment>&quot;Activer le micro&quot;</extracomment> <extracomment>&quot;Activer le micro&quot;</extracomment>
<translation>Mikrofon aktivieren</translation> <translation>Mikrofon aktivieren</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1469"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1471"/>
<source>call_deactivate_microphone</source> <source>call_deactivate_microphone</source>
<extracomment>&quot;Désactiver le micro&quot;</extracomment> <extracomment>&quot;Désactiver le micro&quot;</extracomment>
<translation>Mikrofon stummschalten</translation> <translation>Mikrofon stummschalten</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1487"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1488"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1488"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1489"/>
<source>call_share_screen_hint</source> <source>call_share_screen_hint</source>
<extracomment>Partager l&apos;écran</extracomment> <extracomment>Partager l&apos;écran</extracomment>
<translation>Bildschirm teilen</translation> <translation>Bildschirm teilen</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1510"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1511"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1511"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1512"/>
<source>call_open_chat_hint</source> <source>call_open_chat_hint</source>
<extracomment>Open chat</extracomment> <extracomment>Open chat</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>

View file

@ -757,30 +757,30 @@
<translation>Print only logs from the application</translation> <translation>Print only logs from the application</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1407"/> <location filename="../../core/App.cpp" line="1408"/>
<source>hide_action</source> <source>hide_action</source>
<extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment> <extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment>
<translation>Hide</translation> <translation>Hide</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1407"/> <location filename="../../core/App.cpp" line="1408"/>
<source>show_action</source> <source>show_action</source>
<translation>Show</translation> <translation>Show</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1422"/> <location filename="../../core/App.cpp" line="1423"/>
<source>quit_action</source> <source>quit_action</source>
<extracomment>&quot;Quitter&quot;</extracomment> <extracomment>&quot;Quitter&quot;</extracomment>
<translation>Quit</translation> <translation>Quit</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1440"/> <location filename="../../core/App.cpp" line="1441"/>
<source>check_for_update</source> <source>check_for_update</source>
<extracomment>Check for update</extracomment> <extracomment>Check for update</extracomment>
<translation>Check for update</translation> <translation>Check for update</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1558"/> <location filename="../../core/App.cpp" line="1559"/>
<source>mark_all_read_action</source> <source>mark_all_read_action</source>
<translation>Marquer tout comme lu</translation> <translation>Marquer tout comme lu</translation>
</message> </message>
@ -826,76 +826,76 @@
<context> <context>
<name>CallCore</name> <name>CallCore</name>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="213"/> <location filename="../../core/call/CallCore.cpp" line="214"/>
<source>call_record_end_message</source> <source>call_record_end_message</source>
<extracomment>&quot;Enregistrement terminé&quot;</extracomment> <extracomment>&quot;Enregistrement terminé&quot;</extracomment>
<translation>Recording ended</translation> <translation>Recording ended</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="215"/> <location filename="../../core/call/CallCore.cpp" line="216"/>
<source>call_record_saved_in_file_message</source> <source>call_record_saved_in_file_message</source>
<extracomment>&quot;L&apos;appel a é enregistré dans le fichier : %1&quot;</extracomment> <extracomment>&quot;L&apos;appel a é enregistré dans le fichier : %1&quot;</extracomment>
<translation>Recording has been saved in file : %1</translation> <translation>Recording has been saved in file : %1</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="396"/> <location filename="../../core/call/CallCore.cpp" line="400"/>
<location filename="../../core/call/CallCore.cpp" line="421"/> <location filename="../../core/call/CallCore.cpp" line="425"/>
<source>call_stats_codec_label</source> <source>call_stats_codec_label</source>
<extracomment>&quot;Codec: %1 / %2 kHz&quot;</extracomment> <extracomment>&quot;Codec: %1 / %2 kHz&quot;</extracomment>
<translation>Codec: %1 / %2 kHz</translation> <translation>Codec: %1 / %2 kHz</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="400"/> <location filename="../../core/call/CallCore.cpp" line="404"/>
<location filename="../../core/call/CallCore.cpp" line="424"/> <location filename="../../core/call/CallCore.cpp" line="428"/>
<source>call_stats_bandwidth_label</source> <source>call_stats_bandwidth_label</source>
<extracomment>&quot;Bande passante : %1 %2 kbits/s %3 %4 kbits/s&quot;</extracomment> <extracomment>&quot;Bande passante : %1 %2 kbits/s %3 %4 kbits/s&quot;</extracomment>
<translation>Bandwidth : %1 %2 kbits/s %3 %4 kbits/s</translation> <translation>Bandwidth : %1 %2 kbits/s %3 %4 kbits/s</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="406"/> <location filename="../../core/call/CallCore.cpp" line="410"/>
<location filename="../../core/call/CallCore.cpp" line="429"/> <location filename="../../core/call/CallCore.cpp" line="433"/>
<source>call_stats_loss_rate_label</source> <source>call_stats_loss_rate_label</source>
<extracomment>&quot;Taux de perte: %1% %2%&quot;</extracomment> <extracomment>&quot;Taux de perte: %1% %2%&quot;</extracomment>
<translation>Loss rate: %1% %2%</translation> <translation>Loss rate: %1% %2%</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="411"/> <location filename="../../core/call/CallCore.cpp" line="415"/>
<source>call_stats_jitter_buffer_label</source> <source>call_stats_jitter_buffer_label</source>
<extracomment>&quot;Tampon de gigue: %1 ms&quot;</extracomment> <extracomment>&quot;Tampon de gigue: %1 ms&quot;</extracomment>
<translation>Jitter buffer : %1 ms</translation> <translation>Jitter buffer : %1 ms</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="438"/> <location filename="../../core/call/CallCore.cpp" line="442"/>
<source>call_stats_resolution_label</source> <source>call_stats_resolution_label</source>
<extracomment>&quot;Définition vidéo : %1 %2 %3 %4&quot;</extracomment> <extracomment>&quot;Définition vidéo : %1 %2 %3 %4&quot;</extracomment>
<translation>Video resolution: %1 %2 %3 %4</translation> <translation>Video resolution: %1 %2 %3 %4</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="444"/> <location filename="../../core/call/CallCore.cpp" line="448"/>
<source>call_stats_fps_label</source> <source>call_stats_fps_label</source>
<extracomment>&quot;FPS : %1 %2 %3 %4&quot;</extracomment> <extracomment>&quot;FPS : %1 %2 %3 %4&quot;</extracomment>
<translation>FPS : %1 %2 %3 %4</translation> <translation>FPS : %1 %2 %3 %4</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="657"/> <location filename="../../core/call/CallCore.cpp" line="673"/>
<source>media_encryption_dtls</source> <source>media_encryption_dtls</source>
<extracomment>DTLS</extracomment> <extracomment>DTLS</extracomment>
<translation>DTLS</translation> <translation>DTLS</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="660"/> <location filename="../../core/call/CallCore.cpp" line="676"/>
<source>media_encryption_none</source> <source>media_encryption_none</source>
<extracomment>None</extracomment> <extracomment>None</extracomment>
<translation>None</translation> <translation>None</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="663"/> <location filename="../../core/call/CallCore.cpp" line="679"/>
<source>media_encryption_srtp</source> <source>media_encryption_srtp</source>
<extracomment>SRTP</extracomment> <extracomment>SRTP</extracomment>
<translation>SRTP</translation> <translation>SRTP</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="666"/> <location filename="../../core/call/CallCore.cpp" line="682"/>
<source>media_encryption_post_quantum</source> <source>media_encryption_post_quantum</source>
<extracomment>&quot;ZRTP - Post quantique&quot;</extracomment> <extracomment>&quot;ZRTP - Post quantique&quot;</extracomment>
<translation>Post quantum ZRTP</translation> <translation>Post quantum ZRTP</translation>
@ -1032,24 +1032,24 @@
<translation>Your caller has ended the call</translation> <translation>Your caller has ended the call</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="159"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="158"/>
<source>conference_call_empty</source> <source>conference_call_empty</source>
<extracomment>&quot;En attente d&apos;autres participants&quot;</extracomment> <extracomment>&quot;En attente d&apos;autres participants&quot;</extracomment>
<translation>Waiting for other participants</translation> <translation>Waiting for other participants</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="177"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="176"/>
<source>conference_share_link_title</source> <source>conference_share_link_title</source>
<extracomment>&quot;Partager le lien&quot;</extracomment> <extracomment>&quot;Partager le lien&quot;</extracomment>
<translation>Share link</translation> <translation>Share link</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="183"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="182"/>
<source>copied</source> <source>copied</source>
<translation>Copied</translation> <translation>Copied</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="185"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="184"/>
<source>information_popup_meeting_address_copied_to_clipboard</source> <source>information_popup_meeting_address_copied_to_clipboard</source>
<extracomment>Le lien de la réunion a é copié dans le presse-papier</extracomment> <extracomment>Le lien de la réunion a é copié dans le presse-papier</extracomment>
<translation>The meeting link has been copied to the clipboard</translation> <translation>The meeting link has been copied to the clipboard</translation>
@ -1134,67 +1134,67 @@
<context> <context>
<name>CallModel</name> <name>CallModel</name>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="361"/> <location filename="../../model/call/CallModel.cpp" line="372"/>
<source>call_error_no_response_toast</source> <source>call_error_no_response_toast</source>
<extracomment>&quot;No response&quot;</extracomment> <extracomment>&quot;No response&quot;</extracomment>
<translation>No response</translation> <translation>No response</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="365"/> <location filename="../../model/call/CallModel.cpp" line="376"/>
<source>call_error_forbidden_resource_toast</source> <source>call_error_forbidden_resource_toast</source>
<extracomment>&quot;403 : Forbidden resource&quot;</extracomment> <extracomment>&quot;403 : Forbidden resource&quot;</extracomment>
<translation>403 : Forbidden resource</translation> <translation>403 : Forbidden resource</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="369"/> <location filename="../../model/call/CallModel.cpp" line="380"/>
<source>call_error_not_answered_toast</source> <source>call_error_not_answered_toast</source>
<extracomment>&quot;Request timeout&quot;</extracomment> <extracomment>&quot;Request timeout&quot;</extracomment>
<translation>Request timeout</translation> <translation>Request timeout</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="373"/> <location filename="../../model/call/CallModel.cpp" line="384"/>
<source>call_error_user_declined_toast</source> <source>call_error_user_declined_toast</source>
<extracomment>&quot;User declined the call&quot;</extracomment> <extracomment>&quot;User declined the call&quot;</extracomment>
<translation>User declined the call</translation> <translation>User declined the call</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="377"/> <location filename="../../model/call/CallModel.cpp" line="388"/>
<source>call_error_user_not_found_toast</source> <source>call_error_user_not_found_toast</source>
<extracomment>&quot;User was not found&quot;</extracomment> <extracomment>&quot;User was not found&quot;</extracomment>
<translation>User was not found</translation> <translation>User was not found</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="381"/> <location filename="../../model/call/CallModel.cpp" line="392"/>
<source>call_error_user_busy_toast</source> <source>call_error_user_busy_toast</source>
<extracomment>&quot;User is busy&quot;</extracomment> <extracomment>&quot;User is busy&quot;</extracomment>
<translation>User is busy</translation> <translation>User is busy</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="385"/> <location filename="../../model/call/CallModel.cpp" line="396"/>
<source>call_error_incompatible_media_params_toast</source> <source>call_error_incompatible_media_params_toast</source>
<extracomment>&quot;User can&amp;apos;t accept your call&quot;</extracomment> <extracomment>&quot;User can&amp;apos;t accept your call&quot;</extracomment>
<translation>User can&apos;t accept your call</translation> <translation>User can&apos;t accept your call</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="389"/> <location filename="../../model/call/CallModel.cpp" line="400"/>
<source>call_error_io_error_toast</source> <source>call_error_io_error_toast</source>
<extracomment>&quot;Unavailable service or network error&quot;</extracomment> <extracomment>&quot;Unavailable service or network error&quot;</extracomment>
<translation>Unavailable service or network error</translation> <translation>Unavailable service or network error</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="393"/> <location filename="../../model/call/CallModel.cpp" line="404"/>
<source>call_error_do_not_disturb_toast</source> <source>call_error_do_not_disturb_toast</source>
<extracomment>&quot;Le correspondant ne peut être dérangé&quot;</extracomment> <extracomment>&quot;Le correspondant ne peut être dérangé&quot;</extracomment>
<translation>User cannot be disturbed</translation> <translation>User cannot be disturbed</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="397"/> <location filename="../../model/call/CallModel.cpp" line="408"/>
<source>call_error_temporarily_unavailable_toast</source> <source>call_error_temporarily_unavailable_toast</source>
<extracomment>&quot;Temporarily unavailable&quot;</extracomment> <extracomment>&quot;Temporarily unavailable&quot;</extracomment>
<translation>Temporarily unavailable</translation> <translation>Temporarily unavailable</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="401"/> <location filename="../../model/call/CallModel.cpp" line="412"/>
<source>call_error_server_timeout_toast</source> <source>call_error_server_timeout_toast</source>
<extracomment>&quot;Server tiemout&quot;</extracomment> <extracomment>&quot;Server tiemout&quot;</extracomment>
<translation>Server tiemout</translation> <translation>Server tiemout</translation>
@ -1839,29 +1839,29 @@
<translation>Enable video</translation> <translation>Enable video</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1468"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1467"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1471"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/>
<source>call_activate_microphone</source> <source>call_activate_microphone</source>
<extracomment>&quot;Activer le micro&quot;</extracomment> <extracomment>&quot;Activer le micro&quot;</extracomment>
<translation>Activate microphone</translation> <translation>Activate microphone</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1469"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1471"/>
<source>call_deactivate_microphone</source> <source>call_deactivate_microphone</source>
<extracomment>&quot;Désactiver le micro&quot;</extracomment> <extracomment>&quot;Désactiver le micro&quot;</extracomment>
<translation>Mute microphone</translation> <translation>Mute microphone</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1487"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1488"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1488"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1489"/>
<source>call_share_screen_hint</source> <source>call_share_screen_hint</source>
<extracomment>Partager l&apos;écran</extracomment> <extracomment>Partager l&apos;écran</extracomment>
<translation>Share screen</translation> <translation>Share screen</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1510"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1511"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1511"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1512"/>
<source>call_open_chat_hint</source> <source>call_open_chat_hint</source>
<extracomment>Open chat</extracomment> <extracomment>Open chat</extracomment>
<translation>Open conversation</translation> <translation>Open conversation</translation>

View file

@ -757,30 +757,30 @@
<translation>Print only logs from the application</translation> <translation>Print only logs from the application</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1407"/> <location filename="../../core/App.cpp" line="1408"/>
<source>hide_action</source> <source>hide_action</source>
<extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment> <extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment>
<translation>Cacher</translation> <translation>Cacher</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1407"/> <location filename="../../core/App.cpp" line="1408"/>
<source>show_action</source> <source>show_action</source>
<translation>Afficher</translation> <translation>Afficher</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1422"/> <location filename="../../core/App.cpp" line="1423"/>
<source>quit_action</source> <source>quit_action</source>
<extracomment>&quot;Quitter&quot;</extracomment> <extracomment>&quot;Quitter&quot;</extracomment>
<translation>Quitter</translation> <translation>Quitter</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1440"/> <location filename="../../core/App.cpp" line="1441"/>
<source>check_for_update</source> <source>check_for_update</source>
<extracomment>Check for update</extracomment> <extracomment>Check for update</extracomment>
<translation>Rechercher une mise à jour</translation> <translation>Rechercher une mise à jour</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1558"/> <location filename="../../core/App.cpp" line="1559"/>
<source>mark_all_read_action</source> <source>mark_all_read_action</source>
<translation>Marquer tout comme lu</translation> <translation>Marquer tout comme lu</translation>
</message> </message>
@ -826,76 +826,76 @@
<context> <context>
<name>CallCore</name> <name>CallCore</name>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="213"/> <location filename="../../core/call/CallCore.cpp" line="214"/>
<source>call_record_end_message</source> <source>call_record_end_message</source>
<extracomment>&quot;Enregistrement terminé&quot;</extracomment> <extracomment>&quot;Enregistrement terminé&quot;</extracomment>
<translation>Enregistrement terminé</translation> <translation>Enregistrement terminé</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="215"/> <location filename="../../core/call/CallCore.cpp" line="216"/>
<source>call_record_saved_in_file_message</source> <source>call_record_saved_in_file_message</source>
<extracomment>&quot;L&apos;appel a é enregistré dans le fichier : %1&quot;</extracomment> <extracomment>&quot;L&apos;appel a é enregistré dans le fichier : %1&quot;</extracomment>
<translation>L&apos;appel a é enregistré dans le fichier : %1</translation> <translation>L&apos;appel a é enregistré dans le fichier : %1</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="396"/> <location filename="../../core/call/CallCore.cpp" line="400"/>
<location filename="../../core/call/CallCore.cpp" line="421"/> <location filename="../../core/call/CallCore.cpp" line="425"/>
<source>call_stats_codec_label</source> <source>call_stats_codec_label</source>
<extracomment>&quot;Codec: %1 / %2 kHz&quot;</extracomment> <extracomment>&quot;Codec: %1 / %2 kHz&quot;</extracomment>
<translation>Codec: %1 / %2 kHz</translation> <translation>Codec: %1 / %2 kHz</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="400"/> <location filename="../../core/call/CallCore.cpp" line="404"/>
<location filename="../../core/call/CallCore.cpp" line="424"/> <location filename="../../core/call/CallCore.cpp" line="428"/>
<source>call_stats_bandwidth_label</source> <source>call_stats_bandwidth_label</source>
<extracomment>&quot;Bande passante : %1 %2 kbits/s %3 %4 kbits/s&quot;</extracomment> <extracomment>&quot;Bande passante : %1 %2 kbits/s %3 %4 kbits/s&quot;</extracomment>
<translation>Bande passante : %1 %2 kbits/s %3 %4 kbits/s</translation> <translation>Bande passante : %1 %2 kbits/s %3 %4 kbits/s</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="406"/> <location filename="../../core/call/CallCore.cpp" line="410"/>
<location filename="../../core/call/CallCore.cpp" line="429"/> <location filename="../../core/call/CallCore.cpp" line="433"/>
<source>call_stats_loss_rate_label</source> <source>call_stats_loss_rate_label</source>
<extracomment>&quot;Taux de perte: %1% %2%&quot;</extracomment> <extracomment>&quot;Taux de perte: %1% %2%&quot;</extracomment>
<translation>Taux de perte: %1% %2%</translation> <translation>Taux de perte: %1% %2%</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="411"/> <location filename="../../core/call/CallCore.cpp" line="415"/>
<source>call_stats_jitter_buffer_label</source> <source>call_stats_jitter_buffer_label</source>
<extracomment>&quot;Tampon de gigue: %1 ms&quot;</extracomment> <extracomment>&quot;Tampon de gigue: %1 ms&quot;</extracomment>
<translation>Tampon de gigue: %1 ms</translation> <translation>Tampon de gigue: %1 ms</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="438"/> <location filename="../../core/call/CallCore.cpp" line="442"/>
<source>call_stats_resolution_label</source> <source>call_stats_resolution_label</source>
<extracomment>&quot;Définition vidéo : %1 %2 %3 %4&quot;</extracomment> <extracomment>&quot;Définition vidéo : %1 %2 %3 %4&quot;</extracomment>
<translation>Définition vidéo : %1 %2 %3 %4</translation> <translation>Définition vidéo : %1 %2 %3 %4</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="444"/> <location filename="../../core/call/CallCore.cpp" line="448"/>
<source>call_stats_fps_label</source> <source>call_stats_fps_label</source>
<extracomment>&quot;FPS : %1 %2 %3 %4&quot;</extracomment> <extracomment>&quot;FPS : %1 %2 %3 %4&quot;</extracomment>
<translation>FPS : %1 %2 %3 %4</translation> <translation>FPS : %1 %2 %3 %4</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="657"/> <location filename="../../core/call/CallCore.cpp" line="673"/>
<source>media_encryption_dtls</source> <source>media_encryption_dtls</source>
<extracomment>DTLS</extracomment> <extracomment>DTLS</extracomment>
<translation>DTLS</translation> <translation>DTLS</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="660"/> <location filename="../../core/call/CallCore.cpp" line="676"/>
<source>media_encryption_none</source> <source>media_encryption_none</source>
<extracomment>None</extracomment> <extracomment>None</extracomment>
<translation>None</translation> <translation>None</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="663"/> <location filename="../../core/call/CallCore.cpp" line="679"/>
<source>media_encryption_srtp</source> <source>media_encryption_srtp</source>
<extracomment>SRTP</extracomment> <extracomment>SRTP</extracomment>
<translation>SRTP</translation> <translation>SRTP</translation>
</message> </message>
<message> <message>
<location filename="../../core/call/CallCore.cpp" line="666"/> <location filename="../../core/call/CallCore.cpp" line="682"/>
<source>media_encryption_post_quantum</source> <source>media_encryption_post_quantum</source>
<extracomment>&quot;ZRTP - Post quantique&quot;</extracomment> <extracomment>&quot;ZRTP - Post quantique&quot;</extracomment>
<translation>ZRTP - Post quantique</translation> <translation>ZRTP - Post quantique</translation>
@ -1032,24 +1032,24 @@
<translation>Votre correspondant a terminé l&apos;appel</translation> <translation>Votre correspondant a terminé l&apos;appel</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="159"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="158"/>
<source>conference_call_empty</source> <source>conference_call_empty</source>
<extracomment>&quot;En attente d&apos;autres participants&quot;</extracomment> <extracomment>&quot;En attente d&apos;autres participants&quot;</extracomment>
<translation>En attente d&apos;autres participants</translation> <translation>En attente d&apos;autres participants</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="177"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="176"/>
<source>conference_share_link_title</source> <source>conference_share_link_title</source>
<extracomment>&quot;Partager le lien&quot;</extracomment> <extracomment>&quot;Partager le lien&quot;</extracomment>
<translation>Partager le lien</translation> <translation>Partager le lien</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="183"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="182"/>
<source>copied</source> <source>copied</source>
<translation>Copié</translation> <translation>Copié</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallLayout.qml" line="185"/> <location filename="../../view/Control/Container/Call/CallLayout.qml" line="184"/>
<source>information_popup_meeting_address_copied_to_clipboard</source> <source>information_popup_meeting_address_copied_to_clipboard</source>
<extracomment>Le lien de la réunion a é copié dans le presse-papier</extracomment> <extracomment>Le lien de la réunion a é copié dans le presse-papier</extracomment>
<translation>Le lien de la réunion a é copié dans le presse-papier</translation> <translation>Le lien de la réunion a é copié dans le presse-papier</translation>
@ -1134,67 +1134,67 @@
<context> <context>
<name>CallModel</name> <name>CallModel</name>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="361"/> <location filename="../../model/call/CallModel.cpp" line="372"/>
<source>call_error_no_response_toast</source> <source>call_error_no_response_toast</source>
<extracomment>&quot;No response&quot;</extracomment> <extracomment>&quot;No response&quot;</extracomment>
<translation>Pas de réponse</translation> <translation>Pas de réponse</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="365"/> <location filename="../../model/call/CallModel.cpp" line="376"/>
<source>call_error_forbidden_resource_toast</source> <source>call_error_forbidden_resource_toast</source>
<extracomment>&quot;403 : Forbidden resource&quot;</extracomment> <extracomment>&quot;403 : Forbidden resource&quot;</extracomment>
<translation>403 : Forbidden resource</translation> <translation>403 : Forbidden resource</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="369"/> <location filename="../../model/call/CallModel.cpp" line="380"/>
<source>call_error_not_answered_toast</source> <source>call_error_not_answered_toast</source>
<extracomment>&quot;Request timeout&quot;</extracomment> <extracomment>&quot;Request timeout&quot;</extracomment>
<translation>La requête a expiré</translation> <translation>La requête a expiré</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="373"/> <location filename="../../model/call/CallModel.cpp" line="384"/>
<source>call_error_user_declined_toast</source> <source>call_error_user_declined_toast</source>
<extracomment>&quot;User declined the call&quot;</extracomment> <extracomment>&quot;User declined the call&quot;</extracomment>
<translation>Le correspondant a décliné l&apos;appel</translation> <translation>Le correspondant a décliné l&apos;appel</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="377"/> <location filename="../../model/call/CallModel.cpp" line="388"/>
<source>call_error_user_not_found_toast</source> <source>call_error_user_not_found_toast</source>
<extracomment>&quot;User was not found&quot;</extracomment> <extracomment>&quot;User was not found&quot;</extracomment>
<translation>Le correspondant n&apos;a pas é trouvé</translation> <translation>Le correspondant n&apos;a pas é trouvé</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="381"/> <location filename="../../model/call/CallModel.cpp" line="392"/>
<source>call_error_user_busy_toast</source> <source>call_error_user_busy_toast</source>
<extracomment>&quot;User is busy&quot;</extracomment> <extracomment>&quot;User is busy&quot;</extracomment>
<translation>Le correspondant est occupé</translation> <translation>Le correspondant est occupé</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="385"/> <location filename="../../model/call/CallModel.cpp" line="396"/>
<source>call_error_incompatible_media_params_toast</source> <source>call_error_incompatible_media_params_toast</source>
<extracomment>&quot;User can&amp;apos;t accept your call&quot;</extracomment> <extracomment>&quot;User can&amp;apos;t accept your call&quot;</extracomment>
<translation>Le correspondant ne peut accepter votre appel</translation> <translation>Le correspondant ne peut accepter votre appel</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="389"/> <location filename="../../model/call/CallModel.cpp" line="400"/>
<source>call_error_io_error_toast</source> <source>call_error_io_error_toast</source>
<extracomment>&quot;Unavailable service or network error&quot;</extracomment> <extracomment>&quot;Unavailable service or network error&quot;</extracomment>
<translation>Service indisponible ou erreur réseau</translation> <translation>Service indisponible ou erreur réseau</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="393"/> <location filename="../../model/call/CallModel.cpp" line="404"/>
<source>call_error_do_not_disturb_toast</source> <source>call_error_do_not_disturb_toast</source>
<extracomment>&quot;Le correspondant ne peut être dérangé&quot;</extracomment> <extracomment>&quot;Le correspondant ne peut être dérangé&quot;</extracomment>
<translation>Le correspondant ne peut être dérangé</translation> <translation>Le correspondant ne peut être dérangé</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="397"/> <location filename="../../model/call/CallModel.cpp" line="408"/>
<source>call_error_temporarily_unavailable_toast</source> <source>call_error_temporarily_unavailable_toast</source>
<extracomment>&quot;Temporarily unavailable&quot;</extracomment> <extracomment>&quot;Temporarily unavailable&quot;</extracomment>
<translation>Temporairement indisponible</translation> <translation>Temporairement indisponible</translation>
</message> </message>
<message> <message>
<location filename="../../model/call/CallModel.cpp" line="401"/> <location filename="../../model/call/CallModel.cpp" line="412"/>
<source>call_error_server_timeout_toast</source> <source>call_error_server_timeout_toast</source>
<extracomment>&quot;Server tiemout&quot;</extracomment> <extracomment>&quot;Server tiemout&quot;</extracomment>
<translation>Délai d&apos;attente du serveur dépassé</translation> <translation>Délai d&apos;attente du serveur dépassé</translation>
@ -1839,29 +1839,29 @@
<translation>Activer la vidéo</translation> <translation>Activer la vidéo</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1468"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1467"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1471"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/>
<source>call_activate_microphone</source> <source>call_activate_microphone</source>
<extracomment>&quot;Activer le micro&quot;</extracomment> <extracomment>&quot;Activer le micro&quot;</extracomment>
<translation>Activer le micro</translation> <translation>Activer le micro</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1469"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1470"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1471"/>
<source>call_deactivate_microphone</source> <source>call_deactivate_microphone</source>
<extracomment>&quot;Désactiver le micro&quot;</extracomment> <extracomment>&quot;Désactiver le micro&quot;</extracomment>
<translation>Désactiver le micro</translation> <translation>Désactiver le micro</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1487"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1488"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1488"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1489"/>
<source>call_share_screen_hint</source> <source>call_share_screen_hint</source>
<extracomment>Partager l&apos;écran</extracomment> <extracomment>Partager l&apos;écran</extracomment>
<translation>Partager l&apos;écran</translation> <translation>Partager l&apos;écran</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1510"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1511"/> <location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1511"/>
<location filename="../../view/Page/Window/Call/CallsWindow.qml" line="1512"/>
<source>call_open_chat_hint</source> <source>call_open_chat_hint</source>
<extracomment>Open chat</extracomment> <extracomment>Open chat</extracomment>
<translation>Ouvrir le chat</translation> <translation>Ouvrir le chat</translation>

View file

@ -69,6 +69,7 @@ void CallModel::accept(bool withVideo) {
activateLocalVideo(params, withVideo); activateLocalVideo(params, withVideo);
mMonitor->acceptWithParams(params); mMonitor->acceptWithParams(params);
emit localVideoEnabledChanged(withVideo); emit localVideoEnabledChanged(withVideo);
emit cameraEnabledChanged(params->cameraEnabled());
} }
void CallModel::decline() { void CallModel::decline() {
@ -146,8 +147,9 @@ void CallModel::activateLocalVideo(std::shared_ptr<linphone::CallParams> &params
.arg("Updating call with video enabled and media direction set to %1") .arg("Updating call with video enabled and media direction set to %1")
.arg((int)params->getVideoDirection()); .arg((int)params->getVideoDirection());
params->enableVideo(SettingsModel::getInstance()->getVideoEnabled()); params->enableVideo(SettingsModel::getInstance()->getVideoEnabled());
auto videoDirection = enable ? linphone::MediaDirection::SendRecv : linphone::MediaDirection::RecvOnly; auto videoDirection = params->getVideoDirection();
params->setVideoDirection(videoDirection); params->setVideoDirection(enable || params->screenSharingEnabled() ? linphone::MediaDirection::SendRecv
: linphone::MediaDirection::RecvOnly);
} }
void CallModel::setLocalVideoEnabled(bool enabled) { void CallModel::setLocalVideoEnabled(bool enabled) {
@ -157,6 +159,15 @@ void CallModel::setLocalVideoEnabled(bool enabled) {
mMonitor->update(params); mMonitor->update(params);
} }
void CallModel::setCameraEnabled(bool enabled) {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
auto params = CoreModel::getInstance()->getCore()->createCallParams(mMonitor);
activateLocalVideo(params, enabled);
lInfo() << log().arg("Enable camera :") << enabled;
params->enableCamera(enabled);
mMonitor->update(params);
}
void CallModel::startRecording() { void CallModel::startRecording() {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
mMonitor->startRecording(); mMonitor->startRecording();
@ -444,8 +455,11 @@ void CallModel::onStateChanged(const std::shared_ptr<linphone::Call> &call,
setConference(call->getConference()); setConference(call->getConference());
mDurationTimer.start(); mDurationTimer.start();
// After UpdatedByRemote, video direction could be changed. // After UpdatedByRemote, video direction could be changed.
auto videoDirection = call->getParams()->getVideoDirection(); auto params = call->getParams();
auto videoDirection = params->getVideoDirection();
auto remoteVideoDirection = call->getRemoteParams()->getVideoDirection(); auto remoteVideoDirection = call->getRemoteParams()->getVideoDirection();
lInfo() << log().arg("Camera enabled changed") << params->cameraEnabled();
emit cameraEnabledChanged(params->cameraEnabled());
emit localVideoEnabledChanged(videoDirection == linphone::MediaDirection::SendOnly || emit localVideoEnabledChanged(videoDirection == linphone::MediaDirection::SendOnly ||
videoDirection == linphone::MediaDirection::SendRecv); videoDirection == linphone::MediaDirection::SendRecv);
emit remoteVideoEnabledChanged(remoteVideoDirection == linphone::MediaDirection::SendOnly || emit remoteVideoEnabledChanged(remoteVideoDirection == linphone::MediaDirection::SendOnly ||

View file

@ -45,6 +45,7 @@ public:
void setMicrophoneMuted(bool isMuted); void setMicrophoneMuted(bool isMuted);
void setSpeakerMuted(bool isMuted); void setSpeakerMuted(bool isMuted);
void setLocalVideoEnabled(bool enabled); void setLocalVideoEnabled(bool enabled);
void setCameraEnabled(bool enabled);
void startRecording(); void startRecording();
void stopRecording(); void stopRecording();
void setRecordFile(const std::string &path); void setRecordFile(const std::string &path);
@ -98,6 +99,7 @@ signals:
void microphoneVolumeChanged(float); void microphoneVolumeChanged(float);
void pausedChanged(bool paused); void pausedChanged(bool paused);
void remoteVideoEnabledChanged(bool remoteVideoEnabled); void remoteVideoEnabledChanged(bool remoteVideoEnabled);
void cameraEnabledChanged(bool enalbed);
void localVideoEnabledChanged(bool enabled); void localVideoEnabledChanged(bool enabled);
void recordingChanged(const std::shared_ptr<linphone::Call> &call, bool recording); void recordingChanged(const std::shared_ptr<linphone::Call> &call, bool recording);
void speakerVolumeGainChanged(float volume); void speakerVolumeGainChanged(float volume);

View file

@ -236,8 +236,8 @@ void ConferenceModel::onParticipantDeviceMediaCapabilityChanged(
void ConferenceModel::onParticipantDeviceMediaAvailabilityChanged( void ConferenceModel::onParticipantDeviceMediaAvailabilityChanged(
const std::shared_ptr<linphone::Conference> &conference, const std::shared_ptr<linphone::Conference> &conference,
const std::shared_ptr<const linphone::ParticipantDevice> &participantDevice) { const std::shared_ptr<const linphone::ParticipantDevice> &participantDevice) {
lInfo() << "onParticipantDeviceMediaAvailabilityChanged: " lInfo() << "onParticipantDeviceMediaAvailabilityChanged: video stream available ="
<< (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) << participantDevice->getStreamAvailability(linphone::StreamType::Video)
<< ". Device: " << participantDevice->getAddress()->asString().c_str(); << ". Device: " << participantDevice->getAddress()->asString().c_str();
emit participantDeviceMediaAvailabilityChanged(participantDevice); emit participantDeviceMediaAvailabilityChanged(participantDevice);
} }

View file

@ -79,6 +79,9 @@ Item {
anchors.bottomMargin: Utils.getSizeWithScreenRatio(15)// Spacing anchors.bottomMargin: Utils.getSizeWithScreenRatio(15)// Spacing
qmlName: 'S_'+index qmlName: 'S_'+index
visible: parent.visible visible: parent.visible
videoEnabled: (index === 0 && mainItem.call.core.cameraEnabled)
|| (!previewEnabled && call && call.core.remoteVideoEnabled)
|| (!previewEnabled && participantDevice && participantDevice.core.videoEnabled)
participantDevice: $modelData participantDevice: $modelData
displayAll: false displayAll: false
displayPresence: false displayPresence: false

View file

@ -113,8 +113,7 @@ Item {
anchors.bottom: mainItem.bottom anchors.bottom: mainItem.bottom
anchors.rightMargin: Utils.getSizeWithScreenRatio(20) anchors.rightMargin: Utils.getSizeWithScreenRatio(20)
anchors.bottomMargin: Utils.getSizeWithScreenRatio(10) anchors.bottomMargin: Utils.getSizeWithScreenRatio(10)
videoEnabled: preview.visible && mainItem.call && mainItem.call.core.localVideoEnabled onVideoEnabledChanged: console.log("Preview : " +videoEnabled + " / " +visible +" / " +mainItem.call)
onVideoEnabledChanged: console.log("P : " +videoEnabled + " / " +visible +" / " +mainItem.call)
property var accountObj: UtilsCpp.findLocalAccountByAddress(mainItem.localAddress) property var accountObj: UtilsCpp.findLocalAccountByAddress(mainItem.localAddress)
account: accountObj && accountObj.value || null account: accountObj && accountObj.value || null
call: mainItem.call call: mainItem.call

View file

@ -58,7 +58,7 @@ Item {
property var contact: contactObj && contactObj.value || null property var contact: contactObj && contactObj.value || null
property var identityAddress: account ? UtilsCpp.getDisplayName(account.core.identityAddress) : null property var identityAddress: account ? UtilsCpp.getDisplayName(account.core.identityAddress) : null
property bool videoEnabled: (previewEnabled && call && call.core.localVideoEnabled) property bool videoEnabled: (previewEnabled && call && call.core.cameraEnabled)
|| (!previewEnabled && call && call.core.remoteVideoEnabled) || (!previewEnabled && call && call.core.remoteVideoEnabled)
|| (participantDevice && participantDevice.core.videoEnabled) || (participantDevice && participantDevice.core.videoEnabled)
property string qmlName property string qmlName

View file

@ -27,7 +27,7 @@ AbstractWindow {
property ChatGui chat: chatObj ? chatObj.value : null property ChatGui chat: chatObj ? chatObj.value : null
property int conferenceLayout: call && call.core.conferenceVideoLayout || 0 property int conferenceLayout: call && call.core.conferenceVideoLayout || 0
property bool localVideoEnabled: call && call.core.localVideoEnabled property bool cameraEnabled: call && call.core.cameraEnabled
property bool remoteVideoEnabled: call && call.core.remoteVideoEnabled property bool remoteVideoEnabled: call && call.core.remoteVideoEnabled
property bool callTerminatedByUser: false property bool callTerminatedByUser: false
@ -1447,14 +1447,14 @@ AbstractWindow {
checkedIconUrl: AppIcons.videoCameraSlash checkedIconUrl: AppIcons.videoCameraSlash
//: "Désactiver la vidéo" //: "Désactiver la vidéo"
//: "Activer la vidéo" //: "Activer la vidéo"
ToolTip.text: mainWindow.localVideoEnabled ? qsTr("call_deactivate_video_hint") : qsTr("call_activate_video_hint") ToolTip.text: mainWindow.cameraEnabled ? qsTr("call_deactivate_video_hint") : qsTr("call_activate_video_hint")
Accessible.name: mainWindow.localVideoEnabled ? qsTr("call_deactivate_video_hint") : qsTr("call_activate_video_hint") Accessible.name: mainWindow.cameraEnabled ? qsTr("call_deactivate_video_hint") : qsTr("call_activate_video_hint")
checked: !mainWindow.localVideoEnabled checked: !mainWindow.cameraEnabled
Layout.preferredWidth: Utils.getSizeWithScreenRatio(55) Layout.preferredWidth: Utils.getSizeWithScreenRatio(55)
Layout.preferredHeight: Utils.getSizeWithScreenRatio(55) Layout.preferredHeight: Utils.getSizeWithScreenRatio(55)
icon.width: Utils.getSizeWithScreenRatio(32) icon.width: Utils.getSizeWithScreenRatio(32)
icon.height: Utils.getSizeWithScreenRatio(32) icon.height: Utils.getSizeWithScreenRatio(32)
onClicked: mainWindow.call.core.lSetLocalVideoEnabled(!mainWindow.call.core.localVideoEnabled) onClicked: mainWindow.call.core.lSetCameraEnabled(!mainWindow.call.core.cameraEnabled)
} }
// Audio microphone button // Audio microphone button