use hardware mute to manage PTT

This commit is contained in:
Gabby Morgan
2026-05-31 16:32:56 -05:00
parent 561c014c33
commit 63422c9a75
+24 -9
View File
@@ -124,8 +124,10 @@ class ChannelClient:
use_daemon_default_log=True, use_daemon_default_log=True,
) )
self.whisplay_interface.board.set_backlight(70) self.whisplay_interface.board.set_backlight(70)
# self.whisplay_interface.board.on_exit_request(self._on_exit_request) if hasattr(self.whisplay_interface.board, "on_exit_request"):
# self.whisplay_interface.board.on_focus_revoked(self._on_focus_revoked) self.board.on_exit_request(self._on_exit_request)
if hasattr(self.whisplay_interface.board, "on_focus_revoked"):
self.board.on_focus_revoked(self._on_focus_revoked)
self._load_fonts() self._load_fonts()
self._setup_whisplay_audio() self._setup_whisplay_audio()
@@ -274,9 +276,9 @@ class ChannelClient:
if ch: if ch:
lines.append(ch["hash"][:16] + "..") lines.append(ch["hash"][:16] + "..")
if self._ptt_enabled: if self._ptt_enabled:
lines += ["", "PTT: hold to talk", "Short: always-on"] lines += ["", "PTT: hold to talk", "release to mute"]
footer = "Dbl: leave" footer = "Short: always-on | Dbl: leave"
else: else:
lines += ["", "Always-on (unmuted)"] lines += ["", "Always-on (unmuted)"]
footer = "Short: PTT Dbl: leave" footer = "Short: PTT Dbl: leave"
fb = self._render("In Call", lines, accent=(60, 220, 120), footer=footer) fb = self._render("In Call", lines, accent=(60, 220, 120), footer=footer)
@@ -312,7 +314,7 @@ class ChannelClient:
if self.state == self.STATE_IN_CALL: if self.state == self.STATE_IN_CALL:
if self.whisplay_interface.is_pressed and self._ptt_enabled and not self._ptt_active: if self.whisplay_interface.is_pressed and self._ptt_enabled and not self._ptt_active:
self._ptt_active = True self._ptt_active = True
self.telephone.unmute_transmit() self._hw_set_mic_muted(False)
if self.whisplay_interface.board: if self.whisplay_interface.board:
self.whisplay_interface.board.set_rgb(255, 255, 0) self.whisplay_interface.board.set_rgb(255, 255, 0)
@@ -325,12 +327,12 @@ class ChannelClient:
self._show_in_call() self._show_in_call()
else: else:
self._ptt_active = False self._ptt_active = False
self.telephone.mute_transmit() self._hw_set_mic_muted(True)
if self.whisplay_interface.board: if self.whisplay_interface.board:
self.whisplay_interface.board.set_rgb(0, 255, 80) self.whisplay_interface.board.set_rgb(0, 255, 80)
elif not self.whisplay_interface.was_long_pressed: elif not self.whisplay_interface.was_long_pressed:
self._ptt_enabled = True self._ptt_enabled = True
self.telephone.mute_transmit() self._hw_set_mic_muted(True)
if self.whisplay_interface.board: if self.whisplay_interface.board:
self._show_in_call() self._show_in_call()
@@ -460,7 +462,7 @@ class ChannelClient:
f"{RNS.prettyhexrep(remote_identity.hash)}" f"{RNS.prettyhexrep(remote_identity.hash)}"
) )
if self._ptt_enabled: if self._ptt_enabled:
self.telephone.mute_transmit() self._hw_set_mic_muted(True)
if self.whisplay_interface.board: if self.whisplay_interface.board:
self.whisplay_interface.board.set_rgb(0, 255, 80) self.whisplay_interface.board.set_rgb(0, 255, 80)
self._show_in_call() self._show_in_call()
@@ -481,6 +483,19 @@ class ChannelClient:
time.sleep(1) time.sleep(1)
self._show_channels() self._show_channels()
def _hw_set_mic_muted(self, muted):
if self._wm8960_device is None:
return
card = self._wm8960_device.split(",")[0].split(":")[-1]
state = "off" if muted else "on"
try:
subprocess.run(
["amixer", "-c", card, "cset", "name='Capture Switch'", state],
check=False, capture_output=True, timeout=2,
)
except Exception:
pass
def call_channel(self, index): def call_channel(self, index):
if index < 0 or index >= len(self.channels): if index < 0 or index >= len(self.channels):
print("Invalid channel index") print("Invalid channel index")