(icecast) Add support for inline metadata (#1212)

This commit is contained in:
Doug Hoffman
2022-04-25 04:38:54 -04:00
committed by GitHub
parent ac8aa17a80
commit 60489e1fef
14 changed files with 315 additions and 94 deletions

View File

@@ -52,6 +52,10 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
private long mMaximumRecordingAge;
private AtomicBoolean mStreaming = new AtomicBoolean();
protected boolean mInlineActive = false;
protected int mInlineInterval;
protected int mInlineRemaining = -1;
/**
* AudioBroadcaster for streaming audio recordings to a remote streaming audio server. Audio recordings are
* generated by an internal StreamManager that converts an inbound stream of AudioPackets into a recording of the
@@ -89,7 +93,7 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
/**
* Broadcast binary audio data frames or sequences.
*/
protected abstract void broadcastAudio(byte[] audio);
protected abstract void broadcastAudio(byte[] audio, IdentifierCollection identifierCollection);
/**
* Protocol-specific metadata updater
@@ -212,6 +216,8 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
if(!connected())
{
//Reset inline metadata
mInlineRemaining = -1;
//Remove all pending audio recordings
while(!mAudioRecordingQueue.isEmpty())
{
@@ -265,6 +271,7 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
{
private AtomicBoolean mProcessing = new AtomicBoolean();
private ByteArrayInputStream mInputStream;
private IdentifierCollection mInputIdentifierCollection;
private long mFinalSilencePadding = 0;
private int mBytesToStreamPerInterval = 0;
@@ -289,7 +296,7 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
try
{
int read = mInputStream.read(audio);
broadcastAudio(audio);
broadcastAudio(audio, mInputIdentifierCollection);
}
catch(IOException ioe)
{
@@ -303,7 +310,7 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
for(byte[] silence: finalSilence)
{
broadcastAudio(silence);
broadcastAudio(silence, null);
}
mFinalSilencePadding = 0;
@@ -314,7 +321,7 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
List<byte[]> silenceFrames = mSilenceGenerator.generate(PROCESSOR_RUN_INTERVAL_MS);
for(byte[] silence: silenceFrames)
{
broadcastAudio(silence);
broadcastAudio(silence, null);
}
}
}
@@ -343,6 +350,7 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
}
mInputStream = null;
mInputIdentifierCollection = null;
//Peek at the next recording but don't remove it from the queue yet, so we can inspect the start time for
//age limits and/or delay elapsed
@@ -377,6 +385,7 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
mBytesToStreamPerInterval = (int)((double)audio.length / intervals);
mInputStream = new ByteArrayInputStream(audio);
mInputIdentifierCollection = nextRecording.getIdentifierCollection();
mFinalSilencePadding = PROCESSOR_RUN_INTERVAL_MS -
(nextRecording.getRecordingLength() % PROCESSOR_RUN_INTERVAL_MS);
@@ -401,6 +410,7 @@ public abstract class AudioStreamingBroadcaster<T extends BroadcastConfiguration
"stream recording [" + nextRecording.getPath().toString() + "] - skipping recording - ", ioe);
mInputStream = null;
mInputIdentifierCollection = null;
metadataUpdateRequired = false;
}