merge: TCI audio — receive, transmit, and the voice keyer over the CAT link
A SunSDR carries its audio on the same WebSocket as its commands, so
OpsLog can take it directly: no virtual cable, no second sound card, no
Windows mixer between the recording and the air. The radio appears as a
device in both audio lists and can be chosen for either direction.
Everything here was settled on real hardware over one evening, and none of
it was guessable from the documentation:
- The receive stream answers format=3 for four-byte floats, so the
sample width is derived from the frame rather than trusted from the
field.
- The radio asks for transmit audio only when the transmission is the
CLIENT'S, and only when its transmit audio source is TCI rather than
the microphone.
- The chrono is a REQUEST, not a clock: no payload, carrying the size it
wants, 47 times a second. Audio goes out in answer to it and never on
a timer of our own — a timer was the first attempt and all 234 frames
of it were ignored.
Confirmed: a clean test recording, and 80 W out of a 1 kHz tone.
This commit is contained in:
@@ -1090,6 +1090,14 @@ export function GetStationStatus() {
|
||||
return window['go']['main']['App']['GetStationStatus']();
|
||||
}
|
||||
|
||||
export function GetTCIAudioStatus() {
|
||||
return window['go']['main']['App']['GetTCIAudioStatus']();
|
||||
}
|
||||
|
||||
export function GetTCIRecordAudio() {
|
||||
return window['go']['main']['App']['GetTCIRecordAudio']();
|
||||
}
|
||||
|
||||
export function GetTelemetryEnabled() {
|
||||
return window['go']['main']['App']['GetTelemetryEnabled']();
|
||||
}
|
||||
@@ -1614,6 +1622,10 @@ export function PopulateBuiltinReferences(arg1) {
|
||||
return window['go']['main']['App']['PopulateBuiltinReferences'](arg1);
|
||||
}
|
||||
|
||||
export function ProbeTCITransmit(arg1) {
|
||||
return window['go']['main']['App']['ProbeTCITransmit'](arg1);
|
||||
}
|
||||
|
||||
export function PublishLogNow() {
|
||||
return window['go']['main']['App']['PublishLogNow']();
|
||||
}
|
||||
@@ -1750,6 +1762,10 @@ export function RecomputeAwardRefsForCode(arg1) {
|
||||
return window['go']['main']['App']['RecomputeAwardRefsForCode'](arg1);
|
||||
}
|
||||
|
||||
export function RecordTCIAudio(arg1) {
|
||||
return window['go']['main']['App']['RecordTCIAudio'](arg1);
|
||||
}
|
||||
|
||||
export function RefreshCtyDat() {
|
||||
return window['go']['main']['App']['RefreshCtyDat']();
|
||||
}
|
||||
@@ -2254,6 +2270,10 @@ export function SetSpotTTLMinutes(arg1) {
|
||||
return window['go']['main']['App']['SetSpotTTLMinutes'](arg1);
|
||||
}
|
||||
|
||||
export function SetTCIRecordAudio(arg1) {
|
||||
return window['go']['main']['App']['SetTCIRecordAudio'](arg1);
|
||||
}
|
||||
|
||||
export function SetTelemetryEnabled(arg1) {
|
||||
return window['go']['main']['App']['SetTelemetryEnabled'](arg1);
|
||||
}
|
||||
@@ -2358,6 +2378,10 @@ export function StartCWDecoder() {
|
||||
return window['go']['main']['App']['StartCWDecoder']();
|
||||
}
|
||||
|
||||
export function StartTCIAudio(arg1, arg2) {
|
||||
return window['go']['main']['App']['StartTCIAudio'](arg1, arg2);
|
||||
}
|
||||
|
||||
export function StationSetRelay(arg1, arg2, arg3) {
|
||||
return window['go']['main']['App']['StationSetRelay'](arg1, arg2, arg3);
|
||||
}
|
||||
@@ -2366,6 +2390,10 @@ export function StopCWDecoder() {
|
||||
return window['go']['main']['App']['StopCWDecoder']();
|
||||
}
|
||||
|
||||
export function StopTCIAudio() {
|
||||
return window['go']['main']['App']['StopTCIAudio']();
|
||||
}
|
||||
|
||||
export function SwitchCATRig(arg1) {
|
||||
return window['go']['main']['App']['SwitchCATRig'](arg1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user