From 29a10edf032e3eb74c02587779cb247b30522bad Mon Sep 17 00:00:00 2001 From: Denny Sheirer Date: Sun, 15 Nov 2026 01:47:46 -0500 Subject: [PATCH] #2652 DMR audio module checks voice messages for at least one CRC-valid audio frame before processing audio and purges any enqueued audio on voice header to prepare for the upcoming call (#2653) Co-authored-by: denny --- .../module/decode/dmr/audio/DMRAudioModule.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/dsheirer/module/decode/dmr/audio/DMRAudioModule.java b/src/main/java/io/github/dsheirer/module/decode/dmr/audio/DMRAudioModule.java index e54744cf..d13ec1dc 100644 --- a/src/main/java/io/github/dsheirer/module/decode/dmr/audio/DMRAudioModule.java +++ b/src/main/java/io/github/dsheirer/module/decode/dmr/audio/DMRAudioModule.java @@ -99,7 +99,7 @@ public class DMRAudioModule extends AmbeAudioModule implements IdentifierUpdateP } /** - * Processes DMR AMBE audio frames and signalling messages. + * Processes DMR AMBE audio frames and signaling messages. */ public void receive(IMessage message) { @@ -166,7 +166,7 @@ public class DMRAudioModule extends AmbeAudioModule implements IdentifierUpdateP //Queue or process audio frames. Note: audio frames are held/queued until encrypted state is established //before any audio is generated for the audio segment. - if(message instanceof VoiceMessage voiceMessage) + if(message instanceof VoiceMessage voiceMessage && voiceMessage.isValid()) { if(mEncryptedCallStateEstablished && mEncryptedCall) { @@ -181,7 +181,12 @@ public class DMRAudioModule extends AmbeAudioModule implements IdentifierUpdateP } } } - else if(message instanceof Terminator) + else if(message instanceof VoiceHeader voiceHeader && voiceHeader.isValid()) + { + //Clear any queued audio frames received prior to the voice header + mQueuedAmbeFrames.clear(); + } + else if(message instanceof Terminator terminator && terminator.isValid()) { reset(); }