From 4578e45f606d0b5bf2ee2628facc4394bcbe6692 Mon Sep 17 00:00:00 2001 From: Denny Date: Tue, 3 Jan 2017 06:41:22 -0500 Subject: [PATCH] #30 - adds streaming status color indicators to the streaming panel table. Resolves issue with temporary streaming file name collisions by adding a 1-up number to each generated temporary recording file. --- src/audio/broadcast/AudioBroadcaster.java | 73 +- src/audio/broadcast/BroadcastModel.java | 16 +- src/audio/broadcast/BroadcastPanel.java | 72 +- src/audio/broadcast/BroadcastState.java | 10 + src/audio/broadcast/StreamManager.java | 8 +- .../v1/ShoutcastAudioBroadcaster.java | 47 -- .../v1/ShoutcastV1AudioBroadcaster.java | 15 +- .../ShoutcastV1BroadcastMetadataUpdater.java} | 22 +- .../v1/ShoutcastV1ConfigurationEditor.java | 1 - .../v2/ShoutcastV2AudioBroadcaster.java | 733 +++++++++--------- .../v2/ShoutcastV2Configuration.java | 47 +- .../v2/ShoutcastV2ConfigurationEditor.java | 363 +++++++++ .../shoutcast/v2/message/XMLMetadata.java | 106 --- .../AuthenticateBroadcast.java | 10 +- .../v2/ultravox/CacheableXMLMetadata.java | 42 + .../ConfigureIcyGenre.java | 6 +- .../ConfigureIcyName.java | 10 +- .../ConfigureIcyPublic.java | 6 +- .../ConfigureIcyURL.java | 6 +- .../FlushCachedMetadata.java | 6 +- .../v2/{message => ultravox}/MP3Audio.java | 4 +- .../NegotiateBufferSize.java | 12 +- .../NegotiateMaxPayloadSize.java | 16 +- .../v2/ultravox/PassThroughXMLMetadata.java | 42 + .../{message => ultravox}/RequestCipher.java | 8 +- .../{message => ultravox}/SetupBroadcast.java | 6 +- .../v2/{message => ultravox}/Standby.java | 6 +- .../{message => ultravox}/StreamMimeType.java | 6 +- .../TerminateBroadcast.java | 6 +- .../v2/ultravox/UltravoxDecoder.java | 50 ++ .../v2/ultravox/UltravoxEncoder.java | 41 + .../UltravoxMessage.java | 43 +- .../UltravoxMessageClass.java | 2 +- .../UltravoxMessageFactory.java | 24 +- .../UltravoxMessageType.java | 9 +- .../UltravoxMetadata.java | 2 +- .../v2/ultravox/UltravoxProtocolFactory.java | 52 ++ 37 files changed, 1236 insertions(+), 692 deletions(-) delete mode 100644 src/audio/broadcast/shoutcast/v1/ShoutcastAudioBroadcaster.java rename src/audio/broadcast/shoutcast/{ShoutcastMetadataUpdater.java => v1/ShoutcastV1BroadcastMetadataUpdater.java} (91%) create mode 100644 src/audio/broadcast/shoutcast/v2/ShoutcastV2ConfigurationEditor.java delete mode 100644 src/audio/broadcast/shoutcast/v2/message/XMLMetadata.java rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/AuthenticateBroadcast.java (93%) create mode 100644 src/audio/broadcast/shoutcast/v2/ultravox/CacheableXMLMetadata.java rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/ConfigureIcyGenre.java (89%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/ConfigureIcyName.java (87%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/ConfigureIcyPublic.java (89%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/ConfigureIcyURL.java (89%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/FlushCachedMetadata.java (89%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/MP3Audio.java (95%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/NegotiateBufferSize.java (85%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/NegotiateMaxPayloadSize.java (83%) create mode 100644 src/audio/broadcast/shoutcast/v2/ultravox/PassThroughXMLMetadata.java rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/RequestCipher.java (89%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/SetupBroadcast.java (91%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/Standby.java (89%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/StreamMimeType.java (90%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/TerminateBroadcast.java (88%) create mode 100644 src/audio/broadcast/shoutcast/v2/ultravox/UltravoxDecoder.java create mode 100644 src/audio/broadcast/shoutcast/v2/ultravox/UltravoxEncoder.java rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/UltravoxMessage.java (82%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/UltravoxMessageClass.java (97%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/UltravoxMessageFactory.java (83%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/UltravoxMessageType.java (91%) rename src/audio/broadcast/shoutcast/v2/{message => ultravox}/UltravoxMetadata.java (97%) create mode 100644 src/audio/broadcast/shoutcast/v2/ultravox/UltravoxProtocolFactory.java diff --git a/src/audio/broadcast/AudioBroadcaster.java b/src/audio/broadcast/AudioBroadcaster.java index 59c903c7..be544ae1 100644 --- a/src/audio/broadcast/AudioBroadcaster.java +++ b/src/audio/broadcast/AudioBroadcaster.java @@ -223,7 +223,8 @@ public abstract class AudioBroadcaster implements IAudioPacketListener } catch(IOException ioe) { - mLog.error("Error deleting temporary internet recording file: " + recording.getPath().toString()); + mLog.error("Stream [" + getBroadcastConfiguration().getName() + "] - error deleting temporary internet " + + "recording file: " + recording.getPath().toString() + " - " + ioe.getMessage()); } } @@ -354,44 +355,51 @@ public abstract class AudioBroadcaster implements IAudioPacketListener { if(mProcessing.compareAndSet(false, true)) { - if(mInputStream == null || mInputStream.available() <= 0) + try { - if(mFinalSilencePadding > 0) + if(mInputStream == null || mInputStream.available() <= 0) { - broadcastAudio(mSilenceGenerator.generate(mFinalSilencePadding)); - mFinalSilencePadding = 0; + if(mFinalSilencePadding > 0) + { + broadcastAudio(mSilenceGenerator.generate(mFinalSilencePadding)); + mFinalSilencePadding = 0; + } + + nextRecording(); } - nextRecording(); - } - - if(mInputStream != null) - { - //We need to stream at 13.888 fps (144 byte frame) to achieve 2000 Bps or 16 kbps - mBytesStreamedRequired += 2000; //2000 bytes per second for 16 kbps data rate - int bytesToStream = mBytesStreamedRequired - mBytesStreamedActual; - - //Trim length to whole-frame intervals (144 byte frame) - bytesToStream -= (bytesToStream % 144); - - int length = Math.min(bytesToStream, mInputStream.available()); - - byte[] audio = new byte[length]; - - try + if(mInputStream != null) { - mBytesStreamedActual += mInputStream.read(audio); + //We need to stream at 13.888 fps (144 byte frame) to achieve 2000 Bps or 16 kbps + mBytesStreamedRequired += 2000; //2000 bytes per second for 16 kbps data rate + int bytesToStream = mBytesStreamedRequired - mBytesStreamedActual; - broadcastAudio(audio); + //Trim length to whole-frame intervals (144 byte frame) + bytesToStream -= (bytesToStream % 144); + + int length = Math.min(bytesToStream, mInputStream.available()); + + byte[] audio = new byte[length]; + + try + { + mBytesStreamedActual += mInputStream.read(audio); + + broadcastAudio(audio); + } + catch(IOException ioe) + { + mLog.error("Error reading from in-memory audio recording input stream", ioe); + } } - catch(IOException ioe) + else { - mLog.error("Error reading from in-memory audio recording input stream", ioe); + broadcastAudio(mSilenceGenerator.generate(PROCESSOR_RUN_INTERVAL_MS)); } } - else + catch(Exception e) { - broadcastAudio(mSilenceGenerator.generate(PROCESSOR_RUN_INTERVAL_MS)); + mLog.error("Error while processing audio streaming queue", e); } mProcessing.set(false); @@ -447,17 +455,18 @@ public abstract class AudioBroadcaster implements IAudioPacketListener metadataUpdateRequired = false; } + + removeRecording(recording); } catch(IOException ioe) { - mLog.error("Error reading temporary audio stream recording [" + recording.getPath().toString() + - "] - skipping recording"); + mLog.error("Stream [" + getBroadcastConfiguration().getName() + "] error reading temporary audio " + + "stream recording [" + recording.getPath().toString() + "] - skipping recording - ", ioe); mInputStream = null; + metadataUpdateRequired = false; } - removeRecording(recording); - broadcast(new BroadcastEvent(AudioBroadcaster.this, BroadcastEvent.Event.BROADCASTER_QUEUE_CHANGE)); } diff --git a/src/audio/broadcast/BroadcastModel.java b/src/audio/broadcast/BroadcastModel.java index fa0f10d2..9f0416a5 100644 --- a/src/audio/broadcast/BroadcastModel.java +++ b/src/audio/broadcast/BroadcastModel.java @@ -53,11 +53,11 @@ public class BroadcastModel extends AbstractTableModel implements Listener