mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-13 00:57:31 -05:00
Decouples DecoderState from the Decoder and makes DecoderState inherit
from Module so that Decoder can function independent of DecoderSTate and DecoderState can more cleanly interface with other modules. Resolves issue with LTR-type decoders where the AudioModule was filtering demodulated audio buffers before the decoder received the audio - demodulated audio buffers are now copied before creating AudioPackets.
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
package module.decode.state;
|
||||
|
||||
import message.Message;
|
||||
import module.decode.DecoderType;
|
||||
import module.decode.state.DecoderStateEvent.Event;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
@@ -32,21 +33,18 @@ public class AlwaysUnsquelchedDecoderState extends DecoderState
|
||||
private final static Logger mLog =
|
||||
LoggerFactory.getLogger( AlwaysUnsquelchedDecoderState.class );
|
||||
|
||||
private String mProtocol;
|
||||
private DecoderType mDecoderType;
|
||||
|
||||
public AlwaysUnsquelchedDecoderState( String protocol )
|
||||
public AlwaysUnsquelchedDecoderState( DecoderType decoderType )
|
||||
{
|
||||
super( null );
|
||||
|
||||
mProtocol = protocol;
|
||||
mDecoderType = decoderType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init()
|
||||
{
|
||||
mLog.debug( "init() - broadcasting unsquelch event" );
|
||||
|
||||
broadcast( new DecoderStateEvent( this, Event.ALWAYS_UNSQUELCH, State.IDLE ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -62,7 +60,7 @@ public class AlwaysUnsquelchedDecoderState extends DecoderState
|
||||
|
||||
sb.append( "Activity Summary\n" );
|
||||
sb.append( "\tDecoder:\t" );
|
||||
sb.append( mProtocol );
|
||||
sb.append( mDecoderType );
|
||||
sb.append( "\n\n" );
|
||||
|
||||
return sb.toString();
|
||||
@@ -79,4 +77,21 @@ public class AlwaysUnsquelchedDecoderState extends DecoderState
|
||||
{
|
||||
/* Not implemented */
|
||||
}
|
||||
|
||||
@Override
|
||||
public DecoderType getDecoderType()
|
||||
{
|
||||
return mDecoderType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start()
|
||||
{
|
||||
broadcast( new DecoderStateEvent( this, Event.ALWAYS_UNSQUELCH, State.IDLE ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@ import settings.SettingsManager;
|
||||
import controller.channel.Channel;
|
||||
|
||||
/**
|
||||
* Channel Collection assembles a primary channel panel and any related traffic
|
||||
* channel panels, provides contextual access to the primary channel and
|
||||
* supports channel selection for the primary or any traffic channels.
|
||||
* Channel Collection assembles a primary channel panel and any related decoder
|
||||
* state panels, provides contextual access to the channel and supports channel
|
||||
* selection.
|
||||
*/
|
||||
public class ChannelCollectionPanel extends JPanel
|
||||
{
|
||||
|
||||
@@ -79,7 +79,7 @@ public class ChannelState extends Module implements ICallEventProvider,
|
||||
private final static Logger mLog =
|
||||
LoggerFactory.getLogger( ChannelState.class );
|
||||
|
||||
public static final long FADE_TIMEOUT_DELAY = 1000;
|
||||
public static final long FADE_TIMEOUT_DELAY = 1200;
|
||||
public static final long RESET_TIMEOUT_DELAY = 2000;
|
||||
|
||||
private State mState = State.IDLE;
|
||||
@@ -165,9 +165,7 @@ public class ChannelState extends Module implements ICallEventProvider,
|
||||
|
||||
private boolean isEndingState()
|
||||
{
|
||||
return mState == State.IDLE ||
|
||||
mState == State.FADE ||
|
||||
mState == State.END;
|
||||
return mState == State.FADE || mState == State.END;
|
||||
}
|
||||
|
||||
|
||||
@@ -391,13 +389,13 @@ public class ChannelState extends Module implements ICallEventProvider,
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCallEventListener( Listener<CallEvent> listener )
|
||||
public void addCallEventListener( Listener<CallEvent> listener )
|
||||
{
|
||||
mCallEventListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCallEventListener()
|
||||
public void removeCallEventListener( Listener<CallEvent> listener )
|
||||
{
|
||||
mCallEventListener = null;
|
||||
}
|
||||
|
||||
@@ -103,9 +103,9 @@ public class ChannelStatePanel extends JPanel
|
||||
|
||||
init();
|
||||
|
||||
for( Decoder decoder: getChannel().getProcessingChain().getDecoders() )
|
||||
for( DecoderState decoderState: getChannel().getProcessingChain().getDecoderStates() )
|
||||
{
|
||||
DecoderPanel panel = DecoderFactory.getDecoderPanel( mSettingsManager, decoder );
|
||||
DecoderPanel panel = DecoderFactory.getDecoderPanel( mSettingsManager, decoderState );
|
||||
mDecoderPanels.add( panel );
|
||||
add( panel, "grow,span" );
|
||||
}
|
||||
@@ -447,9 +447,9 @@ public class ChannelStatePanel extends JPanel
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
for( Decoder decoder: mChannel.getProcessingChain().getDecoders() )
|
||||
for( DecoderState decoderState: mChannel.getProcessingChain().getDecoderStates() )
|
||||
{
|
||||
sb.append( decoder.getDecoderState().getActivitySummary() );
|
||||
sb.append( decoderState.getActivitySummary() );
|
||||
}
|
||||
|
||||
new ActivitySummaryFrame( sb.toString(), ChannelStatePanel.this );
|
||||
|
||||
@@ -23,14 +23,13 @@ import java.awt.Font;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import alias.Alias;
|
||||
import module.decode.Decoder;
|
||||
import sample.Listener;
|
||||
import settings.ColorSetting;
|
||||
import settings.ColorSetting.ColorSettingName;
|
||||
import settings.Setting;
|
||||
import settings.SettingChangeListener;
|
||||
import settings.SettingsManager;
|
||||
import alias.Alias;
|
||||
|
||||
public abstract class DecoderPanel extends JPanel
|
||||
implements Listener<ChangedAttribute>, SettingChangeListener
|
||||
@@ -47,16 +46,16 @@ public abstract class DecoderPanel extends JPanel
|
||||
protected Color mColorLabelAuxDecoder;
|
||||
|
||||
protected SettingsManager mSettingsManager;
|
||||
protected Decoder mDecoder;
|
||||
protected DecoderState mDecoderState;
|
||||
|
||||
public DecoderPanel( SettingsManager settingsManager, Decoder decoder )
|
||||
public DecoderPanel( SettingsManager settingsManager, DecoderState decoderState )
|
||||
{
|
||||
mSettingsManager = settingsManager;
|
||||
mSettingsManager.addListener( this );
|
||||
|
||||
mDecoder = decoder;
|
||||
mDecoderState = decoderState;
|
||||
|
||||
mDecoder.getDecoderState().setChangedAttributeListener( this );
|
||||
mDecoderState.setChangedAttributeListener( this );
|
||||
}
|
||||
|
||||
public void dispose()
|
||||
@@ -64,13 +63,13 @@ public abstract class DecoderPanel extends JPanel
|
||||
mSettingsManager.removeListener( this );
|
||||
mSettingsManager = null;
|
||||
|
||||
mDecoder.getDecoderState().removeChangedAttributeListener();
|
||||
mDecoder = null;
|
||||
mDecoderState.removeChangedAttributeListener();
|
||||
mDecoderState = null;
|
||||
}
|
||||
|
||||
public Decoder getDecoder()
|
||||
public DecoderState getDecoderState()
|
||||
{
|
||||
return mDecoder;
|
||||
return mDecoderState;
|
||||
}
|
||||
|
||||
protected void init()
|
||||
|
||||
@@ -1,11 +1,21 @@
|
||||
package module.decode.state;
|
||||
|
||||
import message.IMessageListener;
|
||||
import message.Message;
|
||||
import module.Module;
|
||||
import module.decode.DecoderType;
|
||||
import module.decode.event.ActivitySummaryProvider;
|
||||
import module.decode.event.CallEvent;
|
||||
import module.decode.event.ICallEventProvider;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import sample.Broadcaster;
|
||||
import sample.Listener;
|
||||
import alias.AliasList;
|
||||
import audio.metadata.IMetadataProvider;
|
||||
import audio.metadata.Metadata;
|
||||
|
||||
/**
|
||||
* Channel state monitors the stream of decoded messages produced by the
|
||||
@@ -13,16 +23,23 @@ import alias.AliasList;
|
||||
*
|
||||
* Provides access to a textual activity summary of events observed.
|
||||
*/
|
||||
public abstract class DecoderState implements ActivitySummaryProvider,
|
||||
Listener<Message>,
|
||||
ICallEventProvider,
|
||||
IChangedAttributeProvider,
|
||||
IDecoderStateEventListener,
|
||||
IDecoderStateEventProvider
|
||||
public abstract class DecoderState extends Module
|
||||
implements ActivitySummaryProvider,
|
||||
Listener<Message>,
|
||||
ICallEventProvider,
|
||||
IChangedAttributeProvider,
|
||||
IDecoderStateEventListener,
|
||||
IDecoderStateEventProvider,
|
||||
IMessageListener,
|
||||
IMetadataProvider
|
||||
{
|
||||
private Listener<CallEvent> mCallEventListener;
|
||||
private final static Logger mLog = LoggerFactory.getLogger( DecoderState.class );
|
||||
|
||||
/* This has to be a broadcaster in order for references to persist */
|
||||
private Broadcaster<CallEvent> mCallEventBroadcaster = new Broadcaster<>();
|
||||
private Listener<ChangedAttribute> mChangedAttributeListener;
|
||||
private Listener<DecoderStateEvent> mDecoderStateListener;
|
||||
private Listener<Metadata> mMetadataListener;
|
||||
|
||||
private DecoderStateEventListener mDecoderStateEventListener =
|
||||
new DecoderStateEventListener();
|
||||
@@ -36,6 +53,8 @@ public abstract class DecoderState implements ActivitySummaryProvider,
|
||||
mAliasList = aliasList;
|
||||
}
|
||||
|
||||
public abstract DecoderType getDecoderType();
|
||||
|
||||
public AliasList getAliasList()
|
||||
{
|
||||
return mAliasList;
|
||||
@@ -69,9 +88,11 @@ public abstract class DecoderState implements ActivitySummaryProvider,
|
||||
*/
|
||||
public void dispose()
|
||||
{
|
||||
mCallEventListener = null;
|
||||
mCallEventBroadcaster.dispose();
|
||||
mCallEventBroadcaster = null;
|
||||
mChangedAttributeListener = null;
|
||||
mDecoderStateListener = null;
|
||||
mMetadataListener = null;
|
||||
|
||||
mAliasList = null;
|
||||
}
|
||||
@@ -86,28 +107,25 @@ public abstract class DecoderState implements ActivitySummaryProvider,
|
||||
*/
|
||||
protected void broadcast( CallEvent event )
|
||||
{
|
||||
if( mCallEventListener != null )
|
||||
{
|
||||
mCallEventListener.receive( event );
|
||||
}
|
||||
mCallEventBroadcaster.broadcast( event );
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a call event listener
|
||||
*/
|
||||
@Override
|
||||
public void setCallEventListener( Listener<CallEvent> listener )
|
||||
public void addCallEventListener( Listener<CallEvent> listener )
|
||||
{
|
||||
mCallEventListener = listener;
|
||||
mCallEventBroadcaster.addListener( listener );
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the call event listener
|
||||
*/
|
||||
@Override
|
||||
public void removeCallEventListener()
|
||||
public void removeCallEventListener( Listener<CallEvent> listener )
|
||||
{
|
||||
mCallEventListener = null;
|
||||
mCallEventBroadcaster.removeListener( listener );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -183,4 +201,33 @@ public abstract class DecoderState implements ActivitySummaryProvider,
|
||||
{
|
||||
mDecoderStateListener = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Broadcasts metadata to a registered listener
|
||||
*/
|
||||
protected void broadcast( Metadata metadata )
|
||||
{
|
||||
if( mMetadataListener != null )
|
||||
{
|
||||
mMetadataListener.receive( metadata );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMetadataListener( Listener<Metadata> listener )
|
||||
{
|
||||
mMetadataListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeMetadataListener()
|
||||
{
|
||||
mMetadataListener = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Listener<Message> getMessageListener()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,18 @@ public class DecoderStateEvent
|
||||
mFrequency = frequency;
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append( "Decoder State Event - source[" + mSource.getClass() +
|
||||
"] event[" + mEvent.toString() +
|
||||
"] state[" + mState.toString() +
|
||||
"] frequency [" + mFrequency + "]" );
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public Object getSource()
|
||||
{
|
||||
return mSource;
|
||||
|
||||
@@ -315,13 +315,13 @@ public class TrafficChannelManager extends Module
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCallEventListener( Listener<CallEvent> listener )
|
||||
public void addCallEventListener( Listener<CallEvent> listener )
|
||||
{
|
||||
mCallEventListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCallEventListener()
|
||||
public void removeCallEventListener( Listener<CallEvent> listener )
|
||||
{
|
||||
mCallEventListener = null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user