Class Intercom

  • All Implemented Interfaces:
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, java.lang.Runnable, javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants

    public class Intercom
    extends javax.swing.JFrame
    implements java.lang.Runnable

    Intercom is a simple Java program to send voice over IP to a remote copy of the Intercom program.

    Program Revisions
    0.1001 Sep 2017Incept
    0.1101 Oct 2017Complete the javadocs
    0.1230 Oct 2017Move the DatagramPacket creation out of the inner loops in the sendThread and the receiveThread
    0.1331 Oct 2017Add code to close AudioInputStream in audioThread and the DatagramSocket in the receiveThread if an Exception occurs in either thread
    0.1423 Mar 2019Fix bug in sendThread so it will use the new address after a change
    0.1525 Mar 2019Clean up previous bug fix in sendThread
    0.1626 Mar 2019Create the TargetDataLine for the microphone in the constructor instead of creating a new one each time the talk button pressed
    0.1715 Jun 2019Clean up buffers for microphone TargetDataLine
    Author:
    Knute Johnson
    See Also:
    Serialized Form
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      private static class  Intercom.ActivityJMenu
      A JMenu used to signal an activity occuring in the program.
      private static class  Intercom.RingBuffer
      This RingBuffer is an unprotected circular buffer used to move byte data to and from streams.
      • Nested classes/interfaces inherited from class javax.swing.JFrame

        javax.swing.JFrame.AccessibleJFrame
      • Nested classes/interfaces inherited from class java.awt.Frame

        java.awt.Frame.AccessibleAWTFrame
      • Nested classes/interfaces inherited from class java.awt.Window

        java.awt.Window.AccessibleAWTWindow, java.awt.Window.Type
      • Nested classes/interfaces inherited from class java.awt.Container

        java.awt.Container.AccessibleAWTContainer
      • Nested classes/interfaces inherited from class java.awt.Component

        java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private Intercom.ActivityJMenu activity
      A JMenu that displays a moving symbol, changed when datagram packets are received
      private static javax.sound.sampled.AudioFormat ALAW
      ALAW AudioFormat
      private java.lang.Thread audioThread
      Thread that reads the receive RingBuffer, converts the data to PCM_SIGNED format and writes it to the SourceDataLine
      static java.lang.String DATE
      Program Date
      private static java.lang.String DEFAULT_ADDRESS
      Default destination address
      private static java.lang.String DEFAULT_PORT
      Default port number
      private static javax.sound.sampled.AudioFormat PCM
      PCM_SIGNED AudioFormat
      private java.util.Properties properties
      Program properties
      private static java.io.File PROPERTIES_FILE
      Properties file
      private java.lang.Thread receiveThread
      Thread that reads DatagramPackets and writes the data to the receive RingBuffer
      private boolean runFlag
      Flag to control the thread reading data from the TargetDataLine
      private Intercom.RingBuffer rxBuf
      Receive RingBuffer to access received audio data in a AudioInptStream so that the format can be change back to PCM_SIGNED
      private java.net.DatagramSocket rxSocket
      DatagramSocket used to receive packets of audio data from another copy of Intercom
      private java.lang.Thread sendThread
      Thread that reads data from the transmit RingBuffer, assembles it into a DatagramPacket and transmits it
      private javax.sound.sampled.TargetDataLine tdl
      TargetDataLine to collect audio from the microphone
      private Intercom.RingBuffer txBuf
      Transmit RingBuffer to access audio data from TargetDataLine in a AudioInputStream so that the format can be changed to ULAW
      private static javax.sound.sampled.AudioFormat ULAW
      ULAW AudioFormat
      private static java.io.File USER_HOME
      User home directory
      static java.lang.String VERSION
      Program Version
      • Fields inherited from class javax.swing.JFrame

        accessibleContext, rootPane, rootPaneCheckingEnabled
      • Fields inherited from class java.awt.Frame

        CROSSHAIR_CURSOR, DEFAULT_CURSOR, E_RESIZE_CURSOR, HAND_CURSOR, ICONIFIED, MAXIMIZED_BOTH, MAXIMIZED_HORIZ, MAXIMIZED_VERT, MOVE_CURSOR, N_RESIZE_CURSOR, NE_RESIZE_CURSOR, NORMAL, NW_RESIZE_CURSOR, S_RESIZE_CURSOR, SE_RESIZE_CURSOR, SW_RESIZE_CURSOR, TEXT_CURSOR, W_RESIZE_CURSOR, WAIT_CURSOR
      • Fields inherited from class java.awt.Component

        BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • Fields inherited from interface java.awt.image.ImageObserver

        ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • Fields inherited from interface javax.swing.WindowConstants

        DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, EXIT_ON_CLOSE, HIDE_ON_CLOSE
    • Constructor Summary

      Constructors 
      Constructor Description
      Intercom()
      Creates a new Intercom GUI and three of the data transfer threads
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private void loadProperties​(java.util.Properties properties)
      Loads the program properties from a data file
      static void main​(java.lang.String... args)
      Main program entry point, creates a new Intercom and starts it running.
      void run()
      Reads data from the TargetDataLine (microphone) and writes that data to the transmit RingBuffer when the talk button is pressed.
      void start()
      Starts the three transfer threads.
      private void storeProperties​(java.util.Properties properties)
      Stores the program properties to a data file
      • Methods inherited from class javax.swing.JFrame

        addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getGraphics, getJMenuBar, getLayeredPane, getRootPane, getTransferHandler, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, repaint, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setIconImage, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, setTransferHandler, update
      • Methods inherited from class java.awt.Frame

        addNotify, getCursorType, getExtendedState, getFrames, getIconImage, getMaximizedBounds, getMenuBar, getState, getTitle, isResizable, isUndecorated, remove, removeNotify, setBackground, setCursor, setExtendedState, setMaximizedBounds, setMenuBar, setOpacity, setResizable, setShape, setState, setTitle, setUndecorated
      • Methods inherited from class java.awt.Window

        addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, hide, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, postEvent, processEvent, processWindowFocusEvent, processWindowStateEvent, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, setVisible, show, toBack, toFront
      • Methods inherited from class java.awt.Container

        add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree
      • Methods inherited from class java.awt.Component

        action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • Methods inherited from interface java.awt.MenuContainer

        getFont, postEvent
    • Field Detail

      • DEFAULT_PORT

        private static final java.lang.String DEFAULT_PORT
        Default port number
        See Also:
        Constant Field Values
      • DEFAULT_ADDRESS

        private static final java.lang.String DEFAULT_ADDRESS
        Default destination address
        See Also:
        Constant Field Values
      • USER_HOME

        private static final java.io.File USER_HOME
        User home directory
      • PROPERTIES_FILE

        private static final java.io.File PROPERTIES_FILE
        Properties file
      • PCM

        private static final javax.sound.sampled.AudioFormat PCM
        PCM_SIGNED AudioFormat
      • ULAW

        private static final javax.sound.sampled.AudioFormat ULAW
        ULAW AudioFormat
      • ALAW

        private static final javax.sound.sampled.AudioFormat ALAW
        ALAW AudioFormat
      • properties

        private final java.util.Properties properties
        Program properties
      • txBuf

        private final Intercom.RingBuffer txBuf
        Transmit RingBuffer to access audio data from TargetDataLine in a AudioInputStream so that the format can be changed to ULAW
      • rxBuf

        private final Intercom.RingBuffer rxBuf
        Receive RingBuffer to access received audio data in a AudioInptStream so that the format can be change back to PCM_SIGNED
      • sendThread

        private final java.lang.Thread sendThread
        Thread that reads data from the transmit RingBuffer, assembles it into a DatagramPacket and transmits it
      • receiveThread

        private final java.lang.Thread receiveThread
        Thread that reads DatagramPackets and writes the data to the receive RingBuffer
      • audioThread

        private final java.lang.Thread audioThread
        Thread that reads the receive RingBuffer, converts the data to PCM_SIGNED format and writes it to the SourceDataLine
      • activity

        private final Intercom.ActivityJMenu activity
        A JMenu that displays a moving symbol, changed when datagram packets are received
      • runFlag

        private volatile boolean runFlag
        Flag to control the thread reading data from the TargetDataLine
      • tdl

        private volatile javax.sound.sampled.TargetDataLine tdl
        TargetDataLine to collect audio from the microphone
      • rxSocket

        private volatile java.net.DatagramSocket rxSocket
        DatagramSocket used to receive packets of audio data from another copy of Intercom
    • Constructor Detail

      • Intercom

        public Intercom()
        Creates a new Intercom GUI and three of the data transfer threads
    • Method Detail

      • start

        public void start()
        Starts the three transfer threads.
      • run

        public void run()
        Reads data from the TargetDataLine (microphone) and writes that data to the transmit RingBuffer when the talk button is pressed.
        Specified by:
        run in interface java.lang.Runnable
      • loadProperties

        private void loadProperties​(java.util.Properties properties)
        Loads the program properties from a data file
        Parameters:
        properties - destination for Properties read from file
      • storeProperties

        private void storeProperties​(java.util.Properties properties)
        Stores the program properties to a data file
        Parameters:
        properties - source of Properties to be written to file
      • main

        public static void main​(java.lang.String... args)
        Main program entry point, creates a new Intercom and starts it running.
        Parameters:
        args - command line arguments (not used)