From afa451a07061c1341123a26746f53b5dcc96bf3f Mon Sep 17 00:00:00 2001 From: Denny Date: Tue, 24 Jan 2017 20:49:12 -0500 Subject: [PATCH 1/3] #130 MPT-1327 Decoder Filter issue resolved. Converts the post-demodulation filter from a band pass filter to a low-pass filter with 60 dB attenuation and a cutoff of 3200 Hz. This is then followed by a high-pass filter at the decimated channel rate, internal to the decoder that performs DC removal and removes any CTCSS tones prior to the FSK decoder. --- src/channel/metadata/Metadata.java | 18 +++++++++--------- .../channel/ChannelProcessingManager.java | 11 +++++++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/channel/metadata/Metadata.java b/src/channel/metadata/Metadata.java index ca2aacd4..915f3288 100644 --- a/src/channel/metadata/Metadata.java +++ b/src/channel/metadata/Metadata.java @@ -545,29 +545,29 @@ public class Metadata */ private void determineRecordable() { - mRecordable = false; + mRecordable = true; - if(mPrimaryAddressTo.hasAlias() && mPrimaryAddressTo.getAlias().isRecordable()) + if(mPrimaryAddressTo.hasAlias() && !mPrimaryAddressTo.getAlias().isRecordable()) { - mRecordable = true; + mRecordable = false; return; } - if(mPrimaryAddressFrom.hasAlias() && mPrimaryAddressFrom.getAlias().isRecordable()) + if(mPrimaryAddressFrom.hasAlias() && !mPrimaryAddressFrom.getAlias().isRecordable()) { - mRecordable = true; + mRecordable = false; return; } - if(mSecondaryAddressTo.hasAlias() && mSecondaryAddressTo.getAlias().isRecordable()) + if(mSecondaryAddressTo.hasAlias() && !mSecondaryAddressTo.getAlias().isRecordable()) { - mRecordable = true; + mRecordable = false; return; } - if(mSecondaryAddressFrom.hasAlias() && mSecondaryAddressFrom.getAlias().isRecordable()) + if(mSecondaryAddressFrom.hasAlias() && !mSecondaryAddressFrom.getAlias().isRecordable()) { - mRecordable = true; + mRecordable = false; return; } } diff --git a/src/controller/channel/ChannelProcessingManager.java b/src/controller/channel/ChannelProcessingManager.java index 58e06b9b..1f12ac7a 100644 --- a/src/controller/channel/ChannelProcessingManager.java +++ b/src/controller/channel/ChannelProcessingManager.java @@ -217,11 +217,14 @@ public class ChannelProcessingManager implements ChannelEventListener MessageActivityModel messageModel = new MessageActivityModel(messageFilter); processingChain.setMessageActivityModel(messageModel); - //Override recordable flag in metadata if user has specified audio recording - if(channel.getRecordConfiguration() != null && - channel.getRecordConfiguration().getRecorders().contains(RecorderType.AUDIO)) + //Set the recordable flag to false in metadata if we don't have a record configuration, or if the user + //has not specified audio recording. Note: the metadata class sets recordable to true by default if no + //setting has been specified. This flag is subsequently turned off if any of the primary or secondary + //identifiers are designated as non-recordable. + if(channel.getRecordConfiguration() == null || + !channel.getRecordConfiguration().getRecorders().contains(RecorderType.AUDIO)) { - processingChain.getChannelState().getMutableMetadata().setRecordable(true); + processingChain.getChannelState().getMutableMetadata().setRecordable(false); } //Inject channel metadata that will be inserted into audio packets for recorder manager and streaming From e2e00a98d59330bbf5da308640b8f5f9332784a4 Mon Sep 17 00:00:00 2001 From: Denny Date: Tue, 24 Jan 2017 21:14:16 -0500 Subject: [PATCH 2/3] 135 WIP - updates to resolve issue with all audio being recorded, even when user has not elected to record the audio. --- src/channel/metadata/Metadata.java | 17 +++++++++-------- src/channel/metadata/MutableMetadata.java | 2 ++ .../channel/ChannelProcessingManager.java | 14 +++++--------- .../audio/DemodulatedAudioFilterModule.java | 7 +++++-- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/channel/metadata/Metadata.java b/src/channel/metadata/Metadata.java index 915f3288..bd00e5ad 100644 --- a/src/channel/metadata/Metadata.java +++ b/src/channel/metadata/Metadata.java @@ -55,7 +55,8 @@ public class Metadata //Lazily constructed member variables. private Integer mAudioPriority; - protected Boolean mRecordable; + protected Boolean mRecordable = false; + protected Boolean mDoNotRecord; private List mBroadcastChannels; @@ -141,12 +142,12 @@ public class Metadata */ public boolean isRecordable() { - if(mRecordable == null) + if(mDoNotRecord == null) { determineRecordable(); } - return mRecordable; + return mRecordable & !mDoNotRecord; } /** @@ -545,29 +546,29 @@ public class Metadata */ private void determineRecordable() { - mRecordable = true; + mDoNotRecord = false; if(mPrimaryAddressTo.hasAlias() && !mPrimaryAddressTo.getAlias().isRecordable()) { - mRecordable = false; + mDoNotRecord = true; return; } if(mPrimaryAddressFrom.hasAlias() && !mPrimaryAddressFrom.getAlias().isRecordable()) { - mRecordable = false; + mDoNotRecord = true; return; } if(mSecondaryAddressTo.hasAlias() && !mSecondaryAddressTo.getAlias().isRecordable()) { - mRecordable = false; + mDoNotRecord = true; return; } if(mSecondaryAddressFrom.hasAlias() && !mSecondaryAddressFrom.getAlias().isRecordable()) { - mRecordable = false; + mDoNotRecord = true; return; } } diff --git a/src/channel/metadata/MutableMetadata.java b/src/channel/metadata/MutableMetadata.java index c0279a0d..10ee7b96 100644 --- a/src/channel/metadata/MutableMetadata.java +++ b/src/channel/metadata/MutableMetadata.java @@ -163,6 +163,8 @@ public class MutableMetadata extends Metadata implements Listener Date: Wed, 25 Jan 2017 21:04:28 -0500 Subject: [PATCH 3/3] 135 WIP - resolves issue with recording. --- src/channel/metadata/Metadata.java | 8 ++- .../channel/ChannelProcessingManager.java | 54 ++++++++++--------- src/module/decode/DecoderFactory.java | 3 +- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/channel/metadata/Metadata.java b/src/channel/metadata/Metadata.java index bd00e5ad..5db7a40e 100644 --- a/src/channel/metadata/Metadata.java +++ b/src/channel/metadata/Metadata.java @@ -23,12 +23,16 @@ import alias.id.broadcast.BroadcastChannel; import alias.id.priority.Priority; import channel.state.State; import module.decode.DecoderType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; public class Metadata { + private final static Logger mLog = LoggerFactory.getLogger(Metadata.class); + // Static unique metadata identifier tracking private static int UNIQUE_METADATA_ID_GENERATOR = 0; @@ -147,7 +151,7 @@ public class Metadata determineRecordable(); } - return mRecordable & !mDoNotRecord; + return mRecordable && !mDoNotRecord; } /** @@ -635,6 +639,8 @@ public class Metadata { Metadata copy = new Metadata(mMetadataID); + copy.mDoNotRecord = mDoNotRecord; + copy.mRecordable = mRecordable; copy.mState = mState; copy.mPrimaryDecoderType = mPrimaryDecoderType; copy.mChannelFrequency = mChannelFrequency; diff --git a/src/controller/channel/ChannelProcessingManager.java b/src/controller/channel/ChannelProcessingManager.java index 2d7e8981..aed91534 100644 --- a/src/controller/channel/ChannelProcessingManager.java +++ b/src/controller/channel/ChannelProcessingManager.java @@ -149,7 +149,7 @@ public class ChannelProcessingManager implements ChannelEventListener case NOTIFICATION_CONFIGURATION_CHANGE: if(isProcessing(channel)) { - stopProcessing(channel, false); + stopProcessing(channel, true); startProcessing(event); } break; @@ -217,33 +217,35 @@ public class ChannelProcessingManager implements ChannelEventListener MessageActivityModel messageModel = new MessageActivityModel(messageFilter); processingChain.setMessageActivityModel(messageModel); - //Set the recordable flag to true if the user has requested recording. The metadata class can still - //override recordability if any of the aliased values has 'Do Not Record' alias identifier. - processingChain.getChannelState().getMutableMetadata() - .setRecordable(channel.getRecordConfiguration() != null && - channel.getRecordConfiguration().getRecorders().contains(RecorderType.AUDIO)); - - //Inject channel metadata that will be inserted into audio packets for recorder manager and streaming - processingChain.getChannelState().getMutableMetadata().receive( - new AttributeChangeRequest(Attribute.CHANNEL_CONFIGURATION_SYSTEM, channel.getSystem())); - processingChain.getChannelState().getMutableMetadata().receive( - new AttributeChangeRequest(Attribute.CHANNEL_CONFIGURATION_SITE, channel.getSite())); - processingChain.getChannelState().getMutableMetadata().receive( - new AttributeChangeRequest(Attribute.CHANNEL_CONFIGURATION_NAME, channel.getName())); - - if(channel.getSourceConfiguration().getSourceType() == SourceType.TUNER) - { - long frequency = ((SourceConfigTuner)channel.getSourceConfiguration()).getFrequency(); - - processingChain.getChannelState().getMutableMetadata().receive( - new AttributeChangeRequest(Attribute.CHANNEL_FREQUENCY, frequency)); - } - - processingChain.getChannelState().getMutableMetadata().receive( - new AttributeChangeRequest(Attribute.PRIMARY_DECODER_TYPE, - channel.getDecodeConfiguration().getDecoderType())); } + //Set the recordable flag to true if the user has requested recording. The metadata class can still + //override recordability if any of the aliased values has 'Do Not Record' alias identifier. + boolean recordable = channel.getRecordConfiguration() != null && + channel.getRecordConfiguration().getRecorders().contains(RecorderType.AUDIO); + + processingChain.getChannelState().getMutableMetadata().setRecordable(recordable); + + //Inject channel metadata that will be inserted into audio packets for recorder manager and streaming + processingChain.getChannelState().getMutableMetadata().receive( + new AttributeChangeRequest(Attribute.CHANNEL_CONFIGURATION_SYSTEM, channel.getSystem())); + processingChain.getChannelState().getMutableMetadata().receive( + new AttributeChangeRequest(Attribute.CHANNEL_CONFIGURATION_SITE, channel.getSite())); + processingChain.getChannelState().getMutableMetadata().receive( + new AttributeChangeRequest(Attribute.CHANNEL_CONFIGURATION_NAME, channel.getName())); + + if(channel.getSourceConfiguration().getSourceType() == SourceType.TUNER) + { + long frequency = ((SourceConfigTuner)channel.getSourceConfiguration()).getFrequency(); + + processingChain.getChannelState().getMutableMetadata().receive( + new AttributeChangeRequest(Attribute.CHANNEL_FREQUENCY, frequency)); + } + + processingChain.getChannelState().getMutableMetadata().receive( + new AttributeChangeRequest(Attribute.PRIMARY_DECODER_TYPE, + channel.getDecodeConfiguration().getDecoderType())); + /* Setup event logging */ List loggers = mEventLogManager.getLoggers(channel.getEventLogConfiguration(), channel.getName()); diff --git a/src/module/decode/DecoderFactory.java b/src/module/decode/DecoderFactory.java index 509e7bd6..19471fe9 100644 --- a/src/module/decode/DecoderFactory.java +++ b/src/module/decode/DecoderFactory.java @@ -164,7 +164,8 @@ public class DecoderFactory ChannelMapModel channelMapModel, ChannelProcessingManager channelProcessingManager, AliasList aliasList, - Channel channel, Metadata metadata) + Channel channel, + Metadata metadata) { List modules = new ArrayList();