mirror of
https://github.com/nonoo/kappanhang.git
synced 2025-12-06 08:02:00 +01:00
Fix panic on audio stream timeout
This commit is contained in:
parent
5a40225408
commit
aeeaa981cf
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
270
hotkeys.go
270
hotkeys.go
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue