diff --git a/src/channel/metadata/Metadata.java b/src/channel/metadata/Metadata.java index ca2aacd4..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; @@ -55,7 +59,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 +146,12 @@ public class Metadata */ public boolean isRecordable() { - if(mRecordable == null) + if(mDoNotRecord == null) { determineRecordable(); } - return mRecordable; + return mRecordable && !mDoNotRecord; } /** @@ -545,29 +550,29 @@ public class Metadata */ private void determineRecordable() { - mRecordable = false; + mDoNotRecord = false; - if(mPrimaryAddressTo.hasAlias() && mPrimaryAddressTo.getAlias().isRecordable()) + if(mPrimaryAddressTo.hasAlias() && !mPrimaryAddressTo.getAlias().isRecordable()) { - mRecordable = true; + mDoNotRecord = true; return; } - if(mPrimaryAddressFrom.hasAlias() && mPrimaryAddressFrom.getAlias().isRecordable()) + if(mPrimaryAddressFrom.hasAlias() && !mPrimaryAddressFrom.getAlias().isRecordable()) { - mRecordable = true; + mDoNotRecord = true; return; } - if(mSecondaryAddressTo.hasAlias() && mSecondaryAddressTo.getAlias().isRecordable()) + if(mSecondaryAddressTo.hasAlias() && !mSecondaryAddressTo.getAlias().isRecordable()) { - mRecordable = true; + mDoNotRecord = true; return; } - if(mSecondaryAddressFrom.hasAlias() && mSecondaryAddressFrom.getAlias().isRecordable()) + if(mSecondaryAddressFrom.hasAlias() && !mSecondaryAddressFrom.getAlias().isRecordable()) { - mRecordable = true; + mDoNotRecord = true; return; } } @@ -634,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/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(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(); diff --git a/src/module/demodulate/audio/DemodulatedAudioFilterModule.java b/src/module/demodulate/audio/DemodulatedAudioFilterModule.java index 532786ce..4efb3d8b 100644 --- a/src/module/demodulate/audio/DemodulatedAudioFilterModule.java +++ b/src/module/demodulate/audio/DemodulatedAudioFilterModule.java @@ -72,8 +72,11 @@ public class DemodulatedAudioFilterModule extends Module implements IUnFilteredR mBandPassFilter.dispose(); mBandPassFilter = null; - mDCFilter.dispose(); - mDCFilter = null; + if(mDCFilter != null) + { + mDCFilter.dispose(); + mDCFilter = null; + } } @Override