From 42c18341b6672736be6f64fab9cb7ad17b508be1 Mon Sep 17 00:00:00 2001 From: Denny Date: Mon, 2 Jan 2017 16:05:00 -0500 Subject: [PATCH] #30 - adds support for Shoutcast V2 (aka Ultravox 2.1) audio streams. Resolves issue with MP3 framing where the remote server was disconnecting us due to bad MP3 sync. The LAME encoder was sending partial 20 byte MP3 frames initiall, then following with a 144 byte array which contained the remainder of the first frame and the header of the next frame. Adjusted the MP3SilenceGenerator to only emit complete MP3 frames. This should be the final commit for this feature, pending merge back into master branch. --- .idea/dictionaries/denny.xml | 1 + src/audio/broadcast/AudioBroadcaster.java | 19 ++- src/audio/broadcast/BroadcastFactory.java | 4 + src/audio/broadcast/BroadcastModel.java | 95 +++++++------- src/audio/broadcast/BroadcastPanel.java | 1 + src/audio/broadcast/BroadcastState.java | 5 + .../broadcast/IBroadcastMetadataUpdater.java | 31 +++++ .../icecast/IcecastAudioBroadcaster.java | 15 +-- ...a => IcecastBroadcastMetadataUpdater.java} | 11 +- .../icecast/IcecastTCPAudioBroadcaster.java | 2 +- src/audio/convert/MP3FrameInspector.java | 89 +++++++++++++ src/audio/convert/MP3SilenceGenerator.java | 85 +++++++++---- src/record/mp3/MP3FileInspector.java | 119 ------------------ 13 files changed, 270 insertions(+), 207 deletions(-) create mode 100644 src/audio/broadcast/IBroadcastMetadataUpdater.java rename src/audio/broadcast/icecast/{IcecastMetadataUpdater.java => IcecastBroadcastMetadataUpdater.java} (96%) create mode 100644 src/audio/convert/MP3FrameInspector.java delete mode 100644 src/record/mp3/MP3FileInspector.java diff --git a/.idea/dictionaries/denny.xml b/.idea/dictionaries/denny.xml index dc5ec847..408050c7 100644 --- a/.idea/dictionaries/denny.xml +++ b/.idea/dictionaries/denny.xml @@ -10,6 +10,7 @@ polyphase samplerate sdrtrunk + sheirer shoutcast streamable talkgroup diff --git a/src/audio/broadcast/AudioBroadcaster.java b/src/audio/broadcast/AudioBroadcaster.java index cbec6e17..59c903c7 100644 --- a/src/audio/broadcast/AudioBroadcaster.java +++ b/src/audio/broadcast/AudioBroadcaster.java @@ -103,10 +103,23 @@ public abstract class AudioBroadcaster implements IAudioPacketListener protected abstract void broadcastAudio(byte[] audio); /** - * Broadcasts the next song's audio metadata prior to streaming the next song. - * @param metadata + * Protocol-specific metadata updater */ - protected abstract void broadcastMetadata(AudioMetadata metadata); + protected abstract IBroadcastMetadataUpdater getMetadataUpdater(); + + /** + * Broadcasts the next song's audio metadata prior to streaming the next song. + * @param metadata for the next recording that will be streamed + */ + protected void broadcastMetadata(AudioMetadata metadata) + { + IBroadcastMetadataUpdater metadataUpdater = getMetadataUpdater(); + + if(metadataUpdater != null) + { + metadataUpdater.update(metadata); + } + } /** * Disconnects the broadcaster from the remote server for a reset or final stop. diff --git a/src/audio/broadcast/BroadcastFactory.java b/src/audio/broadcast/BroadcastFactory.java index 5f8b47fa..3fc95768 100644 --- a/src/audio/broadcast/BroadcastFactory.java +++ b/src/audio/broadcast/BroadcastFactory.java @@ -32,6 +32,7 @@ import audio.broadcast.shoutcast.v1.ShoutcastV1Configuration; import audio.broadcast.shoutcast.v1.ShoutcastV1ConfigurationEditor; import audio.broadcast.shoutcast.v2.ShoutcastV2AudioBroadcaster; import audio.broadcast.shoutcast.v2.ShoutcastV2Configuration; +import audio.broadcast.shoutcast.v2.ShoutcastV2ConfigurationEditor; import audio.convert.IAudioConverter; import audio.convert.ISilenceGenerator; import audio.convert.MP3AudioConverter; @@ -172,6 +173,9 @@ public class BroadcastFactory case SHOUTCAST_V1: editor = new ShoutcastV1ConfigurationEditor(broadcastModel, aliasModel, settingsManager); break; + case SHOUTCAST_V2: + editor = new ShoutcastV2ConfigurationEditor(broadcastModel, aliasModel, settingsManager); + break; default: editor = new EmptyEditor(); break; diff --git a/src/audio/broadcast/BroadcastModel.java b/src/audio/broadcast/BroadcastModel.java index 05b59cfe..fa0f10d2 100644 --- a/src/audio/broadcast/BroadcastModel.java +++ b/src/audio/broadcast/BroadcastModel.java @@ -488,60 +488,67 @@ public class BroadcastModel extends AbstractTableModel implements Listener