M17: activate speaker only when a valid transmission is received

Audio path from codec2 to speaker is now set up only when an incoming stream
with matching CAN and destination callsign is received. Speaker is then turned
off when the demodulator goes back in unlocked state.
pull/227/head
Silvano Seva 2024-01-10 19:01:54 +01:00
rodzic 2653ee01aa
commit dbe7ff4700
1 zmienionych plików z 17 dodań i 28 usunięć

Wyświetl plik

@ -78,17 +78,6 @@ void OpMode_M17::disable()
void OpMode_M17::update(rtxStatus_t *const status, const bool newCfg)
{
//
// FIXME: workaround to avoid UI glitches when a new dst callsign is set.
//
// When a new dst callsign is set, the rtx configuration data structure is
// updated and this may trigger false setting of the lsfOk variable to true,
// causing the M17 info screen to appear for a very small, but noticeable,
// amount of time.
//
if(newCfg)
status->lsfOk = false;
#if defined(PLATFORM_MD3x0) || defined(PLATFORM_MDUV3x0)
//
// Invert TX phase for all MDx models.
@ -154,9 +143,7 @@ void OpMode_M17::offState(rtxStatus_t *const status)
{
radio_disableRtx();
codec_stop(rxAudioPath);
codec_stop(txAudioPath);
audioPath_release(rxAudioPath);
audioPath_release(txAudioPath);
if(startRx)
@ -201,18 +188,6 @@ void OpMode_M17::rxState(rtxStatus_t *const status)
if(locked)
{
// Check RX audio path status, open it if necessary
uint8_t pthSts = audioPath_getStatus(rxAudioPath);
if(pthSts == PATH_CLOSED)
{
rxAudioPath = audioPath_request(SOURCE_MCU, SINK_SPK, PRIO_RX);
pthSts = audioPath_getStatus(rxAudioPath);
}
// Start codec2 module if not already up
if(codec_running() == false)
codec_startDecode(rxAudioPath);
// Process new data
if(newData)
{
@ -272,10 +247,21 @@ void OpMode_M17::rxState(rtxStatus_t *const status)
// matches with ours
bool callMatch = compareCallsigns(std::string(status->source_address), dst);
// Extract audio data
if((type == M17FrameType::STREAM) && (pthSts == PATH_OPEN) &&
(canMatch == true) && (callMatch == true))
// Open audio path only if CAN and callsign match
uint8_t pthSts = audioPath_getStatus(rxAudioPath);
if((pthSts == PATH_CLOSED) && (canMatch == true) && (callMatch == true))
{
rxAudioPath = audioPath_request(SOURCE_MCU, SINK_SPK, PRIO_RX);
pthSts = audioPath_getStatus(rxAudioPath);
}
// Extract audio data and sent it to codec
if((type == M17FrameType::STREAM) && (pthSts == PATH_OPEN))
{
// (re)start codec2 module if not already up
if(codec_running() == false)
codec_startDecode(rxAudioPath);
M17StreamFrame sf = decoder.getStreamFrame();
codec_pushFrame(sf.payload().data(), false);
codec_pushFrame(sf.payload().data() + 8, false);
@ -301,6 +287,9 @@ void OpMode_M17::rxState(rtxStatus_t *const status)
extendedCall = false;
status->M17_link[0] = '\0';
status->M17_refl[0] = '\0';
codec_stop(rxAudioPath);
audioPath_release(rxAudioPath);
}
}