Fix panic on audio stream timeout

This commit is contained in:
Nonoo 2020-11-09 10:05:39 +01:00
parent 5a40225408
commit aeeaa981cf
4 changed files with 98 additions and 190 deletions

View file

@ -85,10 +85,6 @@ func (a *audioStruct) togglePlaybackToDefaultSoundcard() {
} }
func (a *audioStruct) toggleRecFromDefaultSoundcard() { func (a *audioStruct) toggleRecFromDefaultSoundcard() {
if civControl == nil {
return
}
if a.defaultSoundcardStream.recStream == nil { if a.defaultSoundcardStream.recStream == nil {
ss := pulse.SampleSpec{Format: pulse.SAMPLE_S16LE, Rate: audioSampleRate, Channels: 1} ss := pulse.SampleSpec{Format: pulse.SAMPLE_S16LE, Rate: audioSampleRate, Channels: 1}
battr := pulse.NewBufferAttr() battr := pulse.NewBufferAttr()

View file

@ -158,7 +158,7 @@ type civControlStruct struct {
} }
} }
var civControl *civControlStruct var civControl civControlStruct
// Returns false if the message should not be forwarded to the serial port TCP server or the virtual serial port. // Returns false if the message should not be forwarded to the serial port TCP server or the virtual serial port.
func (s *civControlStruct) decode(d []byte) bool { func (s *civControlStruct) decode(d []byte) bool {
@ -710,6 +710,10 @@ func (s *civControlStruct) removePendingCmd(cmd *civCmd) {
} }
func (s *civControlStruct) sendCmd(cmd *civCmd) error { func (s *civControlStruct) sendCmd(cmd *civCmd) error {
if s.st == nil {
return nil
}
cmd.pending = true cmd.pending = true
cmd.sentAt = time.Now() cmd.sentAt = time.Now()
if s.getPendingCmdIndex(cmd) < 0 { if s.getPendingCmdIndex(cmd) < 0 {
@ -1267,4 +1271,5 @@ func (s *civControlStruct) deinit() {
<-s.deinitFinished <-s.deinitFinished
} }
s.deinitNeeded = nil s.deinitNeeded = nil
s.st = nil
} }

View file

@ -9,274 +9,184 @@ func handleHotkey(k byte) {
case ' ': case ' ':
audio.toggleRecFromDefaultSoundcard() audio.toggleRecFromDefaultSoundcard()
case 't': case 't':
if civControl != nil { if err := civControl.toggleTune(); err != nil {
if err := civControl.toggleTune(); err != nil { log.Error("can't toggle tune: ", err)
log.Error("can't toggle tune: ", err)
}
} }
case '+': case '+':
if civControl != nil { if err := civControl.incPwr(); err != nil {
if err := civControl.incPwr(); err != nil { log.Error("can't increase power: ", err)
log.Error("can't increase power: ", err)
}
} }
case '-': case '-':
if civControl != nil { if err := civControl.decPwr(); err != nil {
if err := civControl.decPwr(); err != nil { log.Error("can't decrease power: ", err)
log.Error("can't decrease power: ", err)
}
} }
case '0': case '0':
if civControl != nil { if err := civControl.setPwr(0); err != nil {
if err := civControl.setPwr(0); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '1': case '1':
if civControl != nil { if err := civControl.setPwr(10); err != nil {
if err := civControl.setPwr(10); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '2': case '2':
if civControl != nil { if err := civControl.setPwr(20); err != nil {
if err := civControl.setPwr(20); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '3': case '3':
if civControl != nil { if err := civControl.setPwr(30); err != nil {
if err := civControl.setPwr(30); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '4': case '4':
if civControl != nil { if err := civControl.setPwr(40); err != nil {
if err := civControl.setPwr(40); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '5': case '5':
if civControl != nil { if err := civControl.setPwr(50); err != nil {
if err := civControl.setPwr(50); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '6': case '6':
if civControl != nil { if err := civControl.setPwr(60); err != nil {
if err := civControl.setPwr(60); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '7': case '7':
if civControl != nil { if err := civControl.setPwr(70); err != nil {
if err := civControl.setPwr(70); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '8': case '8':
if civControl != nil { if err := civControl.setPwr(80); err != nil {
if err := civControl.setPwr(80); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '9': case '9':
if civControl != nil { if err := civControl.setPwr(90); err != nil {
if err := civControl.setPwr(90); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case ')': case ')':
if civControl != nil { if err := civControl.setPwr(100); err != nil {
if err := civControl.setPwr(100); err != nil { log.Error("can't set power: ", err)
log.Error("can't set power: ", err)
}
} }
case '!': case '!':
if civControl != nil { if err := civControl.setRFGain(10); err != nil {
if err := civControl.setRFGain(10); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '@': case '@':
if civControl != nil { if err := civControl.setRFGain(20); err != nil {
if err := civControl.setRFGain(20); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '#': case '#':
if civControl != nil { if err := civControl.setRFGain(30); err != nil {
if err := civControl.setRFGain(30); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '$': case '$':
if civControl != nil { if err := civControl.setRFGain(40); err != nil {
if err := civControl.setRFGain(40); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '%': case '%':
if civControl != nil { if err := civControl.setRFGain(50); err != nil {
if err := civControl.setRFGain(50); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '^': case '^':
if civControl != nil { if err := civControl.setRFGain(60); err != nil {
if err := civControl.setRFGain(60); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '&': case '&':
if civControl != nil { if err := civControl.setRFGain(70); err != nil {
if err := civControl.setRFGain(70); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '*': case '*':
if civControl != nil { if err := civControl.setRFGain(80); err != nil {
if err := civControl.setRFGain(80); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '(': case '(':
if civControl != nil { if err := civControl.setRFGain(90); err != nil {
if err := civControl.setRFGain(90); err != nil { log.Error("can't set rfgain: ", err)
log.Error("can't set rfgain: ", err)
}
} }
case '\'': case '\'':
if civControl != nil { if err := civControl.incRFGain(); err != nil {
if err := civControl.incRFGain(); err != nil { log.Error("can't increase rf gain: ", err)
log.Error("can't increase rf gain: ", err)
}
} }
case ';': case ';':
if civControl != nil { if err := civControl.decRFGain(); err != nil {
if err := civControl.decRFGain(); err != nil { log.Error("can't decrease rf gain: ", err)
log.Error("can't decrease rf gain: ", err)
}
} }
case '"': case '"':
if civControl != nil { if err := civControl.incSQL(); err != nil {
if err := civControl.incSQL(); err != nil { log.Error("can't increase sql: ", err)
log.Error("can't increase sql: ", err)
}
} }
case ':': case ':':
if civControl != nil { if err := civControl.decSQL(); err != nil {
if err := civControl.decSQL(); err != nil { log.Error("can't decrease sql: ", err)
log.Error("can't decrease sql: ", err)
}
} }
case '.': case '.':
if civControl != nil { if err := civControl.incNR(); err != nil {
if err := civControl.incNR(); err != nil { log.Error("can't increase nr: ", err)
log.Error("can't increase nr: ", err)
}
} }
case ',': case ',':
if civControl != nil { if err := civControl.decNR(); err != nil {
if err := civControl.decNR(); err != nil { log.Error("can't decrease nr: ", err)
log.Error("can't decrease nr: ", err)
}
} }
case '/': case '/':
if civControl != nil { if err := civControl.toggleNR(); err != nil {
if err := civControl.toggleNR(); err != nil { log.Error("can't toggle nr: ", err)
log.Error("can't toggle nr: ", err)
}
} }
case ']': case ']':
if civControl != nil { if err := civControl.incFreq(); err != nil {
if err := civControl.incFreq(); err != nil { log.Error("can't increase freq: ", err)
log.Error("can't increase freq: ", err)
}
} }
case '[': case '[':
if civControl != nil { if err := civControl.decFreq(); err != nil {
if err := civControl.decFreq(); err != nil { log.Error("can't decrease freq: ", err)
log.Error("can't decrease freq: ", err)
}
} }
case '}': case '}':
if civControl != nil { if err := civControl.incTS(); err != nil {
if err := civControl.incTS(); err != nil { log.Error("can't increase ts: ", err)
log.Error("can't increase ts: ", err)
}
} }
case '{': case '{':
if civControl != nil { if err := civControl.decTS(); err != nil {
if err := civControl.decTS(); err != nil { log.Error("can't decrease ts: ", err)
log.Error("can't decrease ts: ", err)
}
} }
case 'm': case 'm':
if civControl != nil { if err := civControl.incOperatingMode(); err != nil {
if err := civControl.incOperatingMode(); err != nil { log.Error("can't change mode: ", err)
log.Error("can't change mode: ", err)
}
} }
case 'n': case 'n':
if civControl != nil { if err := civControl.decOperatingMode(); err != nil {
if err := civControl.decOperatingMode(); err != nil { log.Error("can't change mode: ", err)
log.Error("can't change mode: ", err)
}
} }
case 'f': case 'f':
if civControl != nil { if err := civControl.incFilter(); err != nil {
if err := civControl.incFilter(); err != nil { log.Error("can't change filter: ", err)
log.Error("can't change filter: ", err)
}
} }
case 'd': case 'd':
if civControl != nil { if err := civControl.decFilter(); err != nil {
if err := civControl.decFilter(); err != nil { log.Error("can't change filter: ", err)
log.Error("can't change filter: ", err)
}
} }
case 'D': case 'D':
if civControl != nil { if err := civControl.toggleDataMode(); err != nil {
if err := civControl.toggleDataMode(); err != nil { log.Error("can't change datamode: ", err)
log.Error("can't change datamode: ", err)
}
} }
case 'b': case 'b':
if civControl != nil { if err := civControl.incBand(); err != nil {
if err := civControl.incBand(); err != nil { log.Error("can't change band: ", err)
log.Error("can't change band: ", err)
}
} }
case 'v': case 'v':
if civControl != nil { if err := civControl.decBand(); err != nil {
if err := civControl.decBand(); err != nil { log.Error("can't change band: ", err)
log.Error("can't change band: ", err)
}
} }
case 'p': case 'p':
if civControl != nil { if err := civControl.togglePreamp(); err != nil {
if err := civControl.togglePreamp(); err != nil { log.Error("can't change preamp: ", err)
log.Error("can't change preamp: ", err)
}
} }
case 'a': case 'a':
if civControl != nil { if err := civControl.toggleAGC(); err != nil {
if err := civControl.toggleAGC(); err != nil { log.Error("can't change agc: ", err)
log.Error("can't change agc: ", err)
}
} }
case 'o': case 'o':
if civControl != nil { if err := civControl.toggleVFO(); err != nil {
if err := civControl.toggleVFO(); err != nil { log.Error("can't change vfo: ", err)
log.Error("can't change vfo: ", err)
}
} }
case 's': case 's':
if civControl != nil { if err := civControl.toggleSplit(); err != nil {
if err := civControl.toggleSplit(); err != nil { log.Error("can't change split: ", err)
log.Error("can't change split: ", err)
}
} }
case '\n': case '\n':
if statusLog.isRealtime() { if statusLog.isRealtime() {

View file

@ -254,7 +254,7 @@ func (s *serialStream) init(devName string) error {
s.readFromSerialPort.frameTimeout = time.NewTimer(0) s.readFromSerialPort.frameTimeout = time.NewTimer(0)
<-s.readFromSerialPort.frameTimeout.C <-s.readFromSerialPort.frameTimeout.C
civControl = &civControlStruct{} civControl = civControlStruct{}
if err := civControl.init(s); err != nil { if err := civControl.init(s); err != nil {
return err return err
} }
@ -272,10 +272,7 @@ func (s *serialStream) deinit() {
s.deinitNeededChan <- true s.deinitNeededChan <- true
<-s.deinitFinishedChan <-s.deinitFinishedChan
} }
if civControl != nil { civControl.deinit()
civControl.deinit()
civControl = nil
}
s.common.deinit() s.common.deinit()
s.rxSeqBuf.deinit() s.rxSeqBuf.deinit()
} }