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() {
if civControl == nil {
return
}
if a.defaultSoundcardStream.recStream == nil {
ss := pulse.SampleSpec{Format: pulse.SAMPLE_S16LE, Rate: audioSampleRate, Channels: 1}
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.
func (s *civControlStruct) decode(d []byte) bool {
@ -710,6 +710,10 @@ func (s *civControlStruct) removePendingCmd(cmd *civCmd) {
}
func (s *civControlStruct) sendCmd(cmd *civCmd) error {
if s.st == nil {
return nil
}
cmd.pending = true
cmd.sentAt = time.Now()
if s.getPendingCmdIndex(cmd) < 0 {
@ -1267,4 +1271,5 @@ func (s *civControlStruct) deinit() {
<-s.deinitFinished
}
s.deinitNeeded = nil
s.st = nil
}

View file

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