#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.
This commit is contained in:
Denny
2017-01-02 16:05:00 -05:00
parent e71a1dbeda
commit 42c18341b6
13 changed files with 270 additions and 207 deletions

View File

@@ -488,60 +488,67 @@ public class BroadcastModel extends AbstractTableModel implements Listener<Audio
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
if( rowIndex <= mBroadcastConfigurations.size())
try
{
BroadcastConfiguration configuration = mBroadcastConfigurations.get(rowIndex);
if(configuration != null)
if( rowIndex <= mBroadcastConfigurations.size())
{
switch(columnIndex)
BroadcastConfiguration configuration = mBroadcastConfigurations.get(rowIndex);
if(configuration != null)
{
case COLUMN_SERVER_ICON:
String iconName = configuration.getBroadcastServerType().getIconName();
switch(columnIndex)
{
case COLUMN_SERVER_ICON:
String iconName = configuration.getBroadcastServerType().getIconName();
if(iconName != null && mSettingsManager != null)
{
return mSettingsManager.getImageIcon(iconName, 14);
}
break;
case COLUMN_STREAM_NAME:
return configuration.getName();
case COLUMN_BROADCASTER_STATUS:
AudioBroadcaster audioBroadcasterA = mBroadcasterMap.get(configuration.getName());
if(iconName != null && mSettingsManager != null)
{
return mSettingsManager.getImageIcon(iconName, 14);
}
break;
case COLUMN_STREAM_NAME:
return configuration.getName();
case COLUMN_BROADCASTER_STATUS:
AudioBroadcaster audioBroadcasterA = mBroadcasterMap.get(configuration.getName());
if(audioBroadcasterA != null)
{
return audioBroadcasterA.getBroadcastState().toString();
}
else if(!configuration.isEnabled())
{
return "Disabled";
}
else if(!configuration.isValid())
{
return "Invalid Settings";
}
case COLUMN_BROADCASTER_QUEUE_SIZE:
AudioBroadcaster audioBroadcasterB = mBroadcasterMap.get(configuration.getName());
if(audioBroadcasterA != null)
{
return audioBroadcasterA.getBroadcastState().toString();
}
else if(!configuration.isEnabled())
{
return "Disabled";
}
else if(!configuration.isValid())
{
return "Invalid Settings";
}
case COLUMN_BROADCASTER_QUEUE_SIZE:
AudioBroadcaster audioBroadcasterB = mBroadcasterMap.get(configuration.getName());
if(audioBroadcasterB != null)
{
return audioBroadcasterB.getQueueSize();
}
break;
case COLUMN_BROADCASTER_STREAMED_COUNT:
AudioBroadcaster audioBroadcasterC = mBroadcasterMap.get(configuration.getName());
if(audioBroadcasterB != null)
{
return audioBroadcasterB.getQueueSize();
}
break;
case COLUMN_BROADCASTER_STREAMED_COUNT:
AudioBroadcaster audioBroadcasterC = mBroadcasterMap.get(configuration.getName());
if(audioBroadcasterC != null)
{
return audioBroadcasterC.getStreamedAudioCount();
}
break;
default:
break;
if(audioBroadcasterC != null)
{
return audioBroadcasterC.getStreamedAudioCount();
}
break;
default:
break;
}
}
}
}
catch(Exception e)
{
mLog.error("Error accessing data in broadcast model", e);
}
return null;
}