diff --git a/Linphone/core/call/CallCore.cpp b/Linphone/core/call/CallCore.cpp index 0ba88c459..c27edab10 100644 --- a/Linphone/core/call/CallCore.cpp +++ b/Linphone/core/call/CallCore.cpp @@ -111,6 +111,7 @@ CallCore::CallCore(const std::shared_ptr &call) : QObject(nullpt auto videoDirection = callParams->getVideoDirection(); mLocalVideoEnabled = videoDirection == linphone::MediaDirection::SendOnly || videoDirection == linphone::MediaDirection::SendRecv; + mCameraEnabled = callParams->cameraEnabled(); auto remoteParams = call->getRemoteParams(); videoDirection = remoteParams ? remoteParams->getVideoDirection() : linphone::MediaDirection::Inactive; mRemoteVideoEnabled = @@ -194,8 +195,8 @@ void CallCore::setSelf(QSharedPointer me) { mCallModelConnection->makeConnectToModel(&CallModel::speakerMutedChanged, [this](bool isMuted) { mCallModelConnection->invokeToCore([this, isMuted]() { setSpeakerMuted(isMuted); }); }); - mCallModelConnection->makeConnectToCore(&CallCore::lSetLocalVideoEnabled, [this](bool enabled) { - mCallModelConnection->invokeToModel([this, enabled]() { mCallModel->setLocalVideoEnabled(enabled); }); + mCallModelConnection->makeConnectToCore(&CallCore::lSetCameraEnabled, [this](bool enabled) { + mCallModelConnection->invokeToModel([this, enabled]() { mCallModel->setCameraEnabled(enabled); }); }); mCallModelConnection->makeConnectToCore(&CallCore::lStartRecording, [this]() { mCallModelConnection->invokeToModel([this]() { mCallModel->startRecording(); }); @@ -245,6 +246,9 @@ void CallCore::setSelf(QSharedPointer me) { mCallModelConnection->makeConnectToModel(&CallModel::localVideoEnabledChanged, [this](bool 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->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 { return mPaused; } diff --git a/Linphone/core/call/CallCore.hpp b/Linphone/core/call/CallCore.hpp index 5624c6d9d..1ed2f6529 100644 --- a/Linphone/core/call/CallCore.hpp +++ b/Linphone/core/call/CallCore.hpp @@ -117,8 +117,8 @@ public: Q_PROPERTY(QStringList remoteTokens WRITE setRemoteTokens MEMBER mRemoteTokens NOTIFY remoteTokensChanged) Q_PROPERTY( bool remoteVideoEnabled READ getRemoteVideoEnabled WRITE setRemoteVideoEnabled NOTIFY remoteVideoEnabledChanged) - Q_PROPERTY( - bool localVideoEnabled READ getLocalVideoEnabled WRITE lSetLocalVideoEnabled NOTIFY localVideoEnabledChanged) + Q_PROPERTY(bool localVideoEnabled READ getLocalVideoEnabled 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 remoteRecording READ getRemoteRecording WRITE setRemoteRecording NOTIFY remoteRecordingChanged) Q_PROPERTY(bool recordable READ getRecordable WRITE setRecordable NOTIFY recordableChanged) @@ -201,6 +201,9 @@ public: bool getLocalVideoEnabled() const; void setLocalVideoEnabled(bool enabled); + bool getCameraEnabled() const; + void setCameraEnabled(bool enabled); + bool getRecording() const; void setRecording(bool recording); @@ -255,6 +258,7 @@ signals: void remoteTokensChanged(); void remoteVideoEnabledChanged(bool remoteVideoEnabled); void localVideoEnabledChanged(); + void cameraEnabledChanged(); void recordingChanged(); void remoteRecordingChanged(); void recordableChanged(); @@ -275,7 +279,7 @@ signals: void lTerminateAllCalls(); // Hangup all calls void lSetSpeakerMuted(bool muted); void lSetMicrophoneMuted(bool isMuted); - void lSetLocalVideoEnabled(bool enabled); + void lSetCameraEnabled(bool enabled); void lSetVideoEnabled(bool enabled); void lSetPaused(bool paused); void lTransferCall(QString address); @@ -331,6 +335,7 @@ private: bool mSpeakerMuted = false; bool mMicrophoneMuted = false; bool mLocalVideoEnabled = false; + bool mCameraEnabled = false; bool mVideoEnabled = false; bool mPaused = false; bool mRemoteVideoEnabled = false; diff --git a/Linphone/data/languages/de.ts b/Linphone/data/languages/de.ts index 03f5685f0..3f20dbe60 100644 --- a/Linphone/data/languages/de.ts +++ b/Linphone/data/languages/de.ts @@ -752,30 +752,30 @@ Nur Anwendungs-Logs ausgeben - + hide_action "Cacher" "Afficher" Ausblenden - + show_action Zeigen - + quit_action "Quitter" Beenden - + check_for_update Check for update - + mark_all_read_action @@ -821,76 +821,76 @@ CallCore - + call_record_end_message "Enregistrement terminé" Aufnahme beendet - + call_record_saved_in_file_message "L'appel a été enregistré dans le fichier : %1" Die Aufnahme wurde in der folgenden Datei gespeichert: %1 - - + + call_stats_codec_label "Codec: %1 / %2 kHz" Codec: %1 / %2 kHz - - + + call_stats_bandwidth_label "Bande passante : %1 %2 kbits/s %3 %4 kbits/s" Bandbreite: %1 %2 kbits/s %3 %4 kbits/s - - + + call_stats_loss_rate_label "Taux de perte: %1% %2%" Verlustquote: %1% %2% - + call_stats_jitter_buffer_label "Tampon de gigue: %1 ms" Jitter-Puffer: %1 ms - + call_stats_resolution_label "Définition vidéo : %1 %2 %3 %4" Videoauflösung: %1 %2 %3 %4 - + call_stats_fps_label "FPS : %1 %2 %3 %4" FPS : %1 %2 %3 %4 - + media_encryption_dtls DTLS DTLS - + media_encryption_none None Nichts - + media_encryption_srtp SRTP SRTP - + media_encryption_post_quantum "ZRTP - Post quantique" Post-quantum ZRTP @@ -1027,24 +1027,24 @@ Der Anrufer hat das Gespräch beendet - + conference_call_empty "En attente d'autres participants…" Warten auf weitere Teilnehmer… - + conference_share_link_title "Partager le lien" Link teilen - + copied Kopiert - + information_popup_meeting_address_copied_to_clipboard Le lien de la réunion a été copié dans le presse-papier Der Besprechungs-Link wurde in die Zwischenablage kopiert @@ -1129,67 +1129,67 @@ CallModel - + call_error_no_response_toast "No response" - + call_error_forbidden_resource_toast "403 : Forbidden resource" - + call_error_not_answered_toast "Request timeout" - + call_error_user_declined_toast "User declined the call" Der Benutzer hat den Anruf abgelehnt - + call_error_user_not_found_toast "User was not found" Benutzer nicht gefunden - + call_error_user_busy_toast "User is busy" Der Benutzer ist beschäftigt - + call_error_incompatible_media_params_toast "User can&apos;t accept your call" Der Benutzer kann Ihren Anruf nicht annehmen - + call_error_io_error_toast "Unavailable service or network error" Dienst nicht verfügbar oder Netzwerkfehler - + call_error_do_not_disturb_toast "Le correspondant ne peut être dérangé" - + call_error_temporarily_unavailable_toast "Temporarily unavailable" Vorübergehend nicht verfügbar - + call_error_server_timeout_toast "Server tiemout" Server-Zeitüberschreitung @@ -1852,29 +1852,29 @@ Video aktivieren - - + + call_activate_microphone "Activer le micro" Mikrofon aktivieren + - call_deactivate_microphone "Désactiver le micro" Mikrofon stummschalten + - call_share_screen_hint Partager l'écran… Bildschirm teilen… + - call_open_chat_hint Open chat… diff --git a/Linphone/data/languages/en.ts b/Linphone/data/languages/en.ts index 53ab70c58..9dd57e667 100644 --- a/Linphone/data/languages/en.ts +++ b/Linphone/data/languages/en.ts @@ -757,30 +757,30 @@ Print only logs from the application - + hide_action "Cacher" "Afficher" Hide - + show_action Show - + quit_action "Quitter" Quit - + check_for_update Check for update Check for update - + mark_all_read_action Marquer tout comme lu @@ -826,76 +826,76 @@ CallCore - + call_record_end_message "Enregistrement terminé" Recording ended - + call_record_saved_in_file_message "L'appel a été enregistré dans le fichier : %1" Recording has been saved in file : %1 - - + + call_stats_codec_label "Codec: %1 / %2 kHz" Codec: %1 / %2 kHz - - + + call_stats_bandwidth_label "Bande passante : %1 %2 kbits/s %3 %4 kbits/s" Bandwidth : %1 %2 kbits/s %3 %4 kbits/s - - + + call_stats_loss_rate_label "Taux de perte: %1% %2%" Loss rate: %1% %2% - + call_stats_jitter_buffer_label "Tampon de gigue: %1 ms" Jitter buffer : %1 ms - + call_stats_resolution_label "Définition vidéo : %1 %2 %3 %4" Video resolution: %1 %2 %3 %4 - + call_stats_fps_label "FPS : %1 %2 %3 %4" FPS : %1 %2 %3 %4 - + media_encryption_dtls DTLS DTLS - + media_encryption_none None None - + media_encryption_srtp SRTP SRTP - + media_encryption_post_quantum "ZRTP - Post quantique" Post quantum ZRTP @@ -1032,24 +1032,24 @@ Your caller has ended the call - + conference_call_empty "En attente d'autres participants…" Waiting for other participants… - + conference_share_link_title "Partager le lien" Share link - + copied Copied - + information_popup_meeting_address_copied_to_clipboard Le lien de la réunion a été copié dans le presse-papier The meeting link has been copied to the clipboard @@ -1134,67 +1134,67 @@ CallModel - + call_error_no_response_toast "No response" No response - + call_error_forbidden_resource_toast "403 : Forbidden resource" 403 : Forbidden resource - + call_error_not_answered_toast "Request timeout" Request timeout - + call_error_user_declined_toast "User declined the call" User declined the call - + call_error_user_not_found_toast "User was not found" User was not found - + call_error_user_busy_toast "User is busy" User is busy - + call_error_incompatible_media_params_toast "User can&apos;t accept your call" User can't accept your call - + call_error_io_error_toast "Unavailable service or network error" Unavailable service or network error - + call_error_do_not_disturb_toast "Le correspondant ne peut être dérangé" User cannot be disturbed - + call_error_temporarily_unavailable_toast "Temporarily unavailable" Temporarily unavailable - + call_error_server_timeout_toast "Server tiemout" Server tiemout @@ -1839,29 +1839,29 @@ Enable video - - + + call_activate_microphone "Activer le micro" Activate microphone + - call_deactivate_microphone "Désactiver le micro" Mute microphone + - call_share_screen_hint Partager l'écran… Share screen… + - call_open_chat_hint Open chat… Open conversation… diff --git a/Linphone/data/languages/fr.ts b/Linphone/data/languages/fr.ts index c09a8e86b..40482360d 100644 --- a/Linphone/data/languages/fr.ts +++ b/Linphone/data/languages/fr.ts @@ -757,30 +757,30 @@ Print only logs from the application - + hide_action "Cacher" "Afficher" Cacher - + show_action Afficher - + quit_action "Quitter" Quitter - + check_for_update Check for update Rechercher une mise à jour - + mark_all_read_action Marquer tout comme lu @@ -826,76 +826,76 @@ CallCore - + call_record_end_message "Enregistrement terminé" Enregistrement terminé - + call_record_saved_in_file_message "L'appel a été enregistré dans le fichier : %1" L'appel a été enregistré dans le fichier : %1 - - + + call_stats_codec_label "Codec: %1 / %2 kHz" Codec: %1 / %2 kHz - - + + call_stats_bandwidth_label "Bande passante : %1 %2 kbits/s %3 %4 kbits/s" Bande passante : %1 %2 kbits/s %3 %4 kbits/s - - + + call_stats_loss_rate_label "Taux de perte: %1% %2%" Taux de perte: %1% %2% - + call_stats_jitter_buffer_label "Tampon de gigue: %1 ms" Tampon de gigue: %1 ms - + call_stats_resolution_label "Définition vidéo : %1 %2 %3 %4" Définition vidéo : %1 %2 %3 %4 - + call_stats_fps_label "FPS : %1 %2 %3 %4" FPS : %1 %2 %3 %4 - + media_encryption_dtls DTLS DTLS - + media_encryption_none None None - + media_encryption_srtp SRTP SRTP - + media_encryption_post_quantum "ZRTP - Post quantique" ZRTP - Post quantique @@ -1032,24 +1032,24 @@ Votre correspondant a terminé l'appel - + conference_call_empty "En attente d'autres participants…" En attente d'autres participants… - + conference_share_link_title "Partager le lien" Partager le lien - + copied Copié - + information_popup_meeting_address_copied_to_clipboard Le lien de la réunion a été copié dans le presse-papier Le lien de la réunion a été copié dans le presse-papier @@ -1134,67 +1134,67 @@ CallModel - + call_error_no_response_toast "No response" Pas de réponse - + call_error_forbidden_resource_toast "403 : Forbidden resource" 403 : Forbidden resource - + call_error_not_answered_toast "Request timeout" La requête a expiré - + call_error_user_declined_toast "User declined the call" Le correspondant a décliné l'appel - + call_error_user_not_found_toast "User was not found" Le correspondant n'a pas été trouvé - + call_error_user_busy_toast "User is busy" Le correspondant est occupé - + call_error_incompatible_media_params_toast "User can&apos;t accept your call" Le correspondant ne peut accepter votre appel - + call_error_io_error_toast "Unavailable service or network error" Service indisponible ou erreur réseau - + call_error_do_not_disturb_toast "Le correspondant ne peut être dérangé" Le correspondant ne peut être dérangé - + call_error_temporarily_unavailable_toast "Temporarily unavailable" Temporairement indisponible - + call_error_server_timeout_toast "Server tiemout" Délai d'attente du serveur dépassé @@ -1839,29 +1839,29 @@ Activer la vidéo - - + + call_activate_microphone "Activer le micro" Activer le micro + - call_deactivate_microphone "Désactiver le micro" Désactiver le micro + - call_share_screen_hint Partager l'écran… Partager l'écran… + - call_open_chat_hint Open chat… Ouvrir le chat… diff --git a/Linphone/model/call/CallModel.cpp b/Linphone/model/call/CallModel.cpp index a5359cc5e..b6c05cf6d 100644 --- a/Linphone/model/call/CallModel.cpp +++ b/Linphone/model/call/CallModel.cpp @@ -69,6 +69,7 @@ void CallModel::accept(bool withVideo) { activateLocalVideo(params, withVideo); mMonitor->acceptWithParams(params); emit localVideoEnabledChanged(withVideo); + emit cameraEnabledChanged(params->cameraEnabled()); } void CallModel::decline() { @@ -146,8 +147,9 @@ void CallModel::activateLocalVideo(std::shared_ptr ¶ms .arg("Updating call with video enabled and media direction set to %1") .arg((int)params->getVideoDirection()); params->enableVideo(SettingsModel::getInstance()->getVideoEnabled()); - auto videoDirection = enable ? linphone::MediaDirection::SendRecv : linphone::MediaDirection::RecvOnly; - params->setVideoDirection(videoDirection); + auto videoDirection = params->getVideoDirection(); + params->setVideoDirection(enable || params->screenSharingEnabled() ? linphone::MediaDirection::SendRecv + : linphone::MediaDirection::RecvOnly); } void CallModel::setLocalVideoEnabled(bool enabled) { @@ -157,6 +159,15 @@ void CallModel::setLocalVideoEnabled(bool enabled) { 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() { mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mMonitor->startRecording(); @@ -444,8 +455,11 @@ void CallModel::onStateChanged(const std::shared_ptr &call, setConference(call->getConference()); mDurationTimer.start(); // 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(); + lInfo() << log().arg("Camera enabled changed") << params->cameraEnabled(); + emit cameraEnabledChanged(params->cameraEnabled()); emit localVideoEnabledChanged(videoDirection == linphone::MediaDirection::SendOnly || videoDirection == linphone::MediaDirection::SendRecv); emit remoteVideoEnabledChanged(remoteVideoDirection == linphone::MediaDirection::SendOnly || diff --git a/Linphone/model/call/CallModel.hpp b/Linphone/model/call/CallModel.hpp index cdcc0b15d..db5c04abe 100644 --- a/Linphone/model/call/CallModel.hpp +++ b/Linphone/model/call/CallModel.hpp @@ -45,6 +45,7 @@ public: void setMicrophoneMuted(bool isMuted); void setSpeakerMuted(bool isMuted); void setLocalVideoEnabled(bool enabled); + void setCameraEnabled(bool enabled); void startRecording(); void stopRecording(); void setRecordFile(const std::string &path); @@ -98,6 +99,7 @@ signals: void microphoneVolumeChanged(float); void pausedChanged(bool paused); void remoteVideoEnabledChanged(bool remoteVideoEnabled); + void cameraEnabledChanged(bool enalbed); void localVideoEnabledChanged(bool enabled); void recordingChanged(const std::shared_ptr &call, bool recording); void speakerVolumeGainChanged(float volume); diff --git a/Linphone/model/conference/ConferenceModel.cpp b/Linphone/model/conference/ConferenceModel.cpp index 8564e0173..13288700b 100644 --- a/Linphone/model/conference/ConferenceModel.cpp +++ b/Linphone/model/conference/ConferenceModel.cpp @@ -236,8 +236,8 @@ void ConferenceModel::onParticipantDeviceMediaCapabilityChanged( void ConferenceModel::onParticipantDeviceMediaAvailabilityChanged( const std::shared_ptr &conference, const std::shared_ptr &participantDevice) { - lInfo() << "onParticipantDeviceMediaAvailabilityChanged: " - << (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) + lInfo() << "onParticipantDeviceMediaAvailabilityChanged: video stream available =" + << participantDevice->getStreamAvailability(linphone::StreamType::Video) << ". Device: " << participantDevice->getAddress()->asString().c_str(); emit participantDeviceMediaAvailabilityChanged(participantDevice); } diff --git a/Linphone/view/Control/Container/Call/ActiveSpeakerLayout.qml b/Linphone/view/Control/Container/Call/ActiveSpeakerLayout.qml index 95df7b4c2..8599aa97b 100644 --- a/Linphone/view/Control/Container/Call/ActiveSpeakerLayout.qml +++ b/Linphone/view/Control/Container/Call/ActiveSpeakerLayout.qml @@ -79,6 +79,9 @@ Item { anchors.bottomMargin: Utils.getSizeWithScreenRatio(15)// Spacing qmlName: 'S_'+index visible: parent.visible + videoEnabled: (index === 0 && mainItem.call.core.cameraEnabled) + || (!previewEnabled && call && call.core.remoteVideoEnabled) + || (!previewEnabled && participantDevice && participantDevice.core.videoEnabled) participantDevice: $modelData displayAll: false displayPresence: false diff --git a/Linphone/view/Control/Container/Call/CallLayout.qml b/Linphone/view/Control/Container/Call/CallLayout.qml index eb14d0508..607f623b7 100644 --- a/Linphone/view/Control/Container/Call/CallLayout.qml +++ b/Linphone/view/Control/Container/Call/CallLayout.qml @@ -113,8 +113,7 @@ Item { anchors.bottom: mainItem.bottom anchors.rightMargin: Utils.getSizeWithScreenRatio(20) anchors.bottomMargin: Utils.getSizeWithScreenRatio(10) - videoEnabled: preview.visible && mainItem.call && mainItem.call.core.localVideoEnabled - onVideoEnabledChanged: console.log("P : " +videoEnabled + " / " +visible +" / " +mainItem.call) + onVideoEnabledChanged: console.log("Preview : " +videoEnabled + " / " +visible +" / " +mainItem.call) property var accountObj: UtilsCpp.findLocalAccountByAddress(mainItem.localAddress) account: accountObj && accountObj.value || null call: mainItem.call diff --git a/Linphone/view/Control/Display/Sticker.qml b/Linphone/view/Control/Display/Sticker.qml index 8afe80d84..0a1dd10e1 100644 --- a/Linphone/view/Control/Display/Sticker.qml +++ b/Linphone/view/Control/Display/Sticker.qml @@ -58,7 +58,7 @@ Item { property var contact: contactObj && contactObj.value || 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) || (participantDevice && participantDevice.core.videoEnabled) property string qmlName diff --git a/Linphone/view/Page/Window/Call/CallsWindow.qml b/Linphone/view/Page/Window/Call/CallsWindow.qml index adbaf2f50..e17661707 100644 --- a/Linphone/view/Page/Window/Call/CallsWindow.qml +++ b/Linphone/view/Page/Window/Call/CallsWindow.qml @@ -27,7 +27,7 @@ AbstractWindow { property ChatGui chat: chatObj ? chatObj.value : null 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 callTerminatedByUser: false @@ -1447,14 +1447,14 @@ AbstractWindow { checkedIconUrl: AppIcons.videoCameraSlash //: "Désactiver la vidéo" //: "Activer la vidéo" - ToolTip.text: mainWindow.localVideoEnabled ? qsTr("call_deactivate_video_hint") : qsTr("call_activate_video_hint") - Accessible.name: mainWindow.localVideoEnabled ? qsTr("call_deactivate_video_hint") : qsTr("call_activate_video_hint") - checked: !mainWindow.localVideoEnabled + ToolTip.text: mainWindow.cameraEnabled ? 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.cameraEnabled Layout.preferredWidth: Utils.getSizeWithScreenRatio(55) Layout.preferredHeight: Utils.getSizeWithScreenRatio(55) icon.width: 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