feat(icom): the speaker choice appears beside the RX-audio option too
Same remembered preference as the console's speaker button, surfaced where the stream itself is enabled — tick RX audio and decide in the same breath whether it reaches the speakers. Applied immediately, no save needed.
This commit is contained in:
@@ -21105,3 +21105,10 @@ func (a *App) CheckHamlogKey(key string) (string, error) {
|
|||||||
defer cancel()
|
defer cancel()
|
||||||
return extsvc.CheckHamlogKey(ctx, nil, key)
|
return extsvc.CheckHamlogKey(ctx, nil, key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAudioMonitorPref says whether the network RX audio should be played
|
||||||
|
// through the Listening device — the remembered speaker choice behind the
|
||||||
|
// console's speaker button and the CAT panel's checkbox.
|
||||||
|
func (a *App) GetAudioMonitorPref() bool {
|
||||||
|
return a.settingOr(keyAudioMonitorOn, "1") == "1"
|
||||||
|
}
|
||||||
|
|||||||
+4
-2
@@ -23,7 +23,8 @@
|
|||||||
"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: 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.",
|
"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.",
|
||||||
"Icom console: a speaker button beside ON/OFF toggles listening to the network RX audio right from the console — no more trip through Settings → Audio; recordings and the voice keyer keep working either way, and the choice is remembered."
|
"Icom console: a speaker button beside ON/OFF toggles listening to the network RX audio right from the console — no more trip through Settings → Audio; recordings and the voice keyer keep working either way, and the choice is remembered.",
|
||||||
|
"CAT settings: a “Play it through the speakers” checkbox sits under the Icom RX-audio option — the same remembered switch as the console’s speaker button, applied immediately."
|
||||||
],
|
],
|
||||||
"fr": [
|
"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).",
|
"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).",
|
||||||
@@ -46,7 +47,8 @@
|
|||||||
"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.",
|
"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.",
|
"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.",
|
||||||
"Console Icom : un bouton haut-parleur à côté de ON/OFF bascule l’écoute du RX audio réseau depuis la console — fini l’aller-retour dans Réglages → Audio ; enregistrements et voice keyer continuent de fonctionner, et le choix est mémorisé."
|
"Console Icom : un bouton haut-parleur à côté de ON/OFF bascule l’écoute du RX audio réseau depuis la console — fini l’aller-retour dans Réglages → Audio ; enregistrements et voice keyer continuent de fonctionner, et le choix est mémorisé.",
|
||||||
|
"Réglages CAT : une case « Écouter dans les enceintes » sous l’option RX audio Icom — le même interrupteur mémorisé que le bouton haut-parleur de la console, appliqué immédiatement."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import {
|
|||||||
GetLookupSettings, SaveLookupSettings, ClearLookupCache, TestLookupProvider,
|
GetLookupSettings, SaveLookupSettings, ClearLookupCache, TestLookupProvider,
|
||||||
GetListsSettings, SaveListsSettings,
|
GetListsSettings, SaveListsSettings,
|
||||||
GetCATSettings, SaveCATSettings, GetRadios, SaveRadios, SetActiveRadio, ActiveRadioID, DiscoverFlexRadios,
|
GetCATSettings, SaveCATSettings, GetRadios, SaveRadios, SetActiveRadio, ActiveRadioID, DiscoverFlexRadios,
|
||||||
|
GetAudioMonitorPref,
|
||||||
ListProfiles, GetActiveProfile, SaveProfile, DeleteProfile, ActivateProfile, DuplicateProfile,
|
ListProfiles, GetActiveProfile, SaveProfile, DeleteProfile, ActivateProfile, DuplicateProfile,
|
||||||
GetRotators, SaveRotators, TestRotatorDevice, RotatorPark, RotatorStop,
|
GetRotators, SaveRotators, TestRotatorDevice, RotatorPark, RotatorStop,
|
||||||
GetRotorPresets, SaveRotorPresets, ResetRotorPresets,
|
GetRotorPresets, SaveRotorPresets, ResetRotorPresets,
|
||||||
@@ -1601,6 +1602,7 @@ function SettingsModalImpl({ onClose, onSaved, initialSection, onMainPaneChanged
|
|||||||
// The saved radios. The CAT panel edits ONE of them — whichever is on the air
|
// The saved radios. The CAT panel edits ONE of them — whichever is on the air
|
||||||
// — and the list is what makes switching possible without touching profiles.
|
// — and the list is what makes switching possible without touching profiles.
|
||||||
const [radios, setRadios] = useState<any[]>([]);
|
const [radios, setRadios] = useState<any[]>([]);
|
||||||
|
const [listenPref, setListenPref] = useState(true);
|
||||||
const [activeRadio, setActiveRadioId] = useState('');
|
const [activeRadio, setActiveRadioId] = useState('');
|
||||||
const [radioBusy, setRadioBusy] = useState(false);
|
const [radioBusy, setRadioBusy] = useState(false);
|
||||||
const [catCfg, setCatCfg] = useState<CATSettings>({
|
const [catCfg, setCatCfg] = useState<CATSettings>({
|
||||||
@@ -2204,6 +2206,7 @@ function SettingsModalImpl({ onClose, onSaved, initialSection, onMainPaneChanged
|
|||||||
// buttons. See rotorPresetsLoaded for the belt to this brace.
|
// buttons. See rotorPresetsLoaded for the belt to this brace.
|
||||||
try { setRotorPresets((((await GetRotorPresets()) ?? []) as any)); setRotorPresetsLoaded(true); } catch {}
|
try { setRotorPresets((((await GetRotorPresets()) ?? []) as any)); setRotorPresetsLoaded(true); } catch {}
|
||||||
try {
|
try {
|
||||||
|
try { setListenPref(!!(await GetAudioMonitorPref())); } catch {}
|
||||||
const rl: any = await GetRadios();
|
const rl: any = await GetRadios();
|
||||||
setRadios(rl ?? []);
|
setRadios(rl ?? []);
|
||||||
// The backend is the only one who knows which radio is on the air —
|
// The backend is the only one who knows which radio is on the air —
|
||||||
@@ -3626,6 +3629,22 @@ function SettingsModalImpl({ onClose, onSaved, initialSection, onMainPaneChanged
|
|||||||
<span className="block text-[11px] text-muted-foreground">{t('cat.icomNetAudioHint')}</span>
|
<span className="block text-[11px] text-muted-foreground">{t('cat.icomNetAudioHint')}</span>
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
|
{!!(catCfg as any).icom_net_audio && (
|
||||||
|
<label className="col-span-2 flex items-start gap-2 text-sm cursor-pointer pl-6">
|
||||||
|
{/* The speaker choice, right where the stream is enabled. Same
|
||||||
|
remembered preference as the console's speaker button —
|
||||||
|
applied immediately, no save needed. */}
|
||||||
|
<Checkbox checked={listenPref}
|
||||||
|
onCheckedChange={(c) => {
|
||||||
|
setListenPref(!!c);
|
||||||
|
(c ? AudioStartMonitor() : Promise.resolve(AudioStopMonitor())).catch(() => setListenPref(!c));
|
||||||
|
}} />
|
||||||
|
<span>
|
||||||
|
{t('cat.icomNetListen')}
|
||||||
|
<span className="block text-[11px] text-muted-foreground">{t('cat.icomNetListenHint')}</span>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{catCfg.backend === 'tci' && (
|
{catCfg.backend === 'tci' && (
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Vendored
+2
@@ -406,6 +406,8 @@ export function GetAntGeniusSettings():Promise<main.AntGeniusSettings>;
|
|||||||
|
|
||||||
export function GetAntGeniusStatus():Promise<antgenius.Status>;
|
export function GetAntGeniusStatus():Promise<antgenius.Status>;
|
||||||
|
|
||||||
|
export function GetAudioMonitorPref():Promise<boolean>;
|
||||||
|
|
||||||
export function GetAudioSettings():Promise<main.AudioSettings>;
|
export function GetAudioSettings():Promise<main.AudioSettings>;
|
||||||
|
|
||||||
export function GetAutostartPrograms():Promise<Array<main.AutostartProgram>>;
|
export function GetAutostartPrograms():Promise<Array<main.AutostartProgram>>;
|
||||||
|
|||||||
@@ -750,6 +750,10 @@ export function GetAntGeniusStatus() {
|
|||||||
return window['go']['main']['App']['GetAntGeniusStatus']();
|
return window['go']['main']['App']['GetAntGeniusStatus']();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function GetAudioMonitorPref() {
|
||||||
|
return window['go']['main']['App']['GetAudioMonitorPref']();
|
||||||
|
}
|
||||||
|
|
||||||
export function GetAudioSettings() {
|
export function GetAudioSettings() {
|
||||||
return window['go']['main']['App']['GetAudioSettings']();
|
return window['go']['main']['App']['GetAudioSettings']();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user