diff --git a/app.go b/app.go index a609344..6bb366a 100644 --- a/app.go +++ b/app.go @@ -159,6 +159,7 @@ const ( keyCATIcomNetUser = "cat.icom.net.user" // Icom network: Network User1 ID keyCATIcomNetPass = "cat.icom.net.pass" // Icom network: Network User1 password keyCATIcomNetAudio = "cat.icom.net.audio" // Icom network: stream RX audio on 50003 (experimental) + keyAudioMonitorOn = "audio.monitor.on" // play the network RX audio through the Listening device (the stream itself stays open for the recorder either way) keyCATTCIHost = "cat.tci.host" // TCI host (Expert Electronics SunSDR / ExpertSDR2) keyCATTCIPort = "cat.tci.port" // TCI WebSocket port (default 40001) keyCATTCISpots = "cat.tci.spots" // push cluster spots to the TCI panorama @@ -10690,6 +10691,7 @@ func (a *App) AudioStartMonitor() error { // The result was audio chopped to pieces the moment the operator toggled // Listening off and on while connected to a network Icom. if cs, err := a.GetCATSettings(); err == nil && cs.Enabled && cs.Backend == "icom-net" && cs.IcomNetAudio { + a.setSetting(keyAudioMonitorOn, "1") applog.Printf("audio: RX monitor start (network sink only → listen=%q)", cfg.ListeningDevice) return a.audioMgr.StartMonitorSink(cfg.ListeningDevice) } @@ -10700,6 +10702,7 @@ func (a *App) AudioStartMonitor() error { // AudioStopMonitor stops the RX monitor passthrough. func (a *App) AudioStopMonitor() { + a.setSetting(keyAudioMonitorOn, "0") if a.audioMgr != nil { a.audioMgr.StopMonitor() applog.Printf("audio: RX monitor stopped") @@ -15590,7 +15593,14 @@ func (a *App) reloadCAT() { // verification (see icomaudio.go) — hence experimental + opt-in. acfg, _ := a.GetAudioSettings() a.audioMgr.StopMonitor() // clear any prior monitor/sink so a re-save restarts cleanly - if err := a.audioMgr.StartMonitorSink(acfg.ListeningDevice); err != nil { + // Listening is a CHOICE, remembered: an operator sitting next to the + // radio hears it in the room and wants the stream only for the + // recorder and the voice keyer. Stop listening turns this off, the + // Listen button turns it back on, and reconnects respect it instead + // of switching the speakers back on every time. + if a.settingOr(keyAudioMonitorOn, "1") != "1" { + applog.Printf("icom-net audio: stream on, speakers off (Listening was stopped by the operator)") + } else if err := a.audioMgr.StartMonitorSink(acfg.ListeningDevice); err != nil { applog.Printf("icom-net audio: cannot start output sink: %v", err) } else { codec := audio.NewPCM16Codec() diff --git a/changelog.json b/changelog.json index f1a641c..b8b7bed 100644 --- a/changelog.json +++ b/changelog.json @@ -21,7 +21,8 @@ "Icom network audio: it now starts with the app — launching OpsLog connected with audio silently off, and the option had to be unticked and re-saved to hear anything.", "Icom network: when the rig goes quiet on CI-V while the session stays up (seen on the IC-7760), the CI-V flow is re-opened on the spot — recovery in seconds instead of the 35-second full reconnect.", "Icom network: after a session dies young, the redial waits 20 s so the rig can purge the old session first — stops the reconnect-die-reconnect spiral seen on the IC-7760, where each fresh session answered for a second and was then strangled by the previous one’s cleanup.", - "Icom network audio, phase 5: the radio can now TAKE audio — with RX audio enabled, pick “Radio (network audio)” as the To-radio device and the voice keyer plays straight to the rig over the LAN, no cable, no virtual sound card. First tested on the IC-7760." + "Icom network audio, phase 5: the radio can now TAKE audio — with RX audio enabled, pick “Radio (network audio)” as the To-radio device and the voice keyer plays straight to the rig over the LAN, no cable, no virtual sound card. First tested on the IC-7760.", + "Icom network audio: listening is now a remembered choice — Stop listening keeps the speakers off across reconnects and restarts, while the stream stays open for the QSO recorder and the voice keyer." ], "fr": [ "Console Elecraft : le S-mètre est calibré sur un vrai K3 — S9 et les +dB correspondent désormais à l’affichage de la radio (il lisait environ deux points S trop bas).", @@ -42,7 +43,8 @@ "Audio réseau Icom : il démarre maintenant avec l’application — au lancement, la connexion se faisait audio coupé, et il fallait décocher/recocher l’option pour entendre quelque chose.", "Réseau Icom : quand la radio se tait sur le CI-V alors que la session tient (constaté sur l’IC-7760), le flux CI-V est rouvert immédiatement — récupération en quelques secondes au lieu des 35 secondes de reconnexion complète.", "Réseau Icom : après une session morte jeune, la renumérotation attend 20 s pour que la radio purge d’abord l’ancienne session — stoppe la spirale reconnexion-mort-reconnexion vue sur l’IC-7760, où chaque session neuve répondait une seconde avant d’être étranglée par le nettoyage de la précédente.", - "Audio réseau Icom, phase 5 : la radio peut maintenant RECEVOIR de l’audio — avec le RX audio activé, choisissez « Radio (network audio) » comme périphérique To Radio et le voice keyer joue directement vers la radio par le LAN, sans câble ni carte son virtuelle. Premier test sur l’IC-7760." + "Audio réseau Icom, phase 5 : la radio peut maintenant RECEVOIR de l’audio — avec le RX audio activé, choisissez « Radio (network audio) » comme périphérique To Radio et le voice keyer joue directement vers la radio par le LAN, sans câble ni carte son virtuelle. Premier test sur l’IC-7760.", + "Audio réseau Icom : l’écoute est désormais un choix mémorisé — Stop listening garde les enceintes coupées à travers reconnexions et redémarrages, tandis que le flux reste ouvert pour l’enregistreur de QSO et le voice keyer." ] }, {