mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-14 17:47:32 -05:00
#30 - WIP on the shoutcast v2 protocol
This commit is contained in:
@@ -63,6 +63,8 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
private final static Logger mLog = LoggerFactory.getLogger( ShoutcastV2Handler.class );
|
private final static Logger mLog = LoggerFactory.getLogger( ShoutcastV2Handler.class );
|
||||||
|
|
||||||
private static final long RECONNECT_INTERVAL_MILLISECONDS = 15000; //15 seconds
|
private static final long RECONNECT_INTERVAL_MILLISECONDS = 15000; //15 seconds
|
||||||
|
private static final boolean GET_RESPONSE = true;
|
||||||
|
private static final boolean NO_RESPONSE_EXPECTED = false;
|
||||||
private long mLastConnectionAttempt = 0;
|
private long mLastConnectionAttempt = 0;
|
||||||
|
|
||||||
private Socket mSocket;
|
private Socket mSocket;
|
||||||
@@ -71,9 +73,9 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
private int mMaxPayloadSize = 16377;
|
private int mMaxPayloadSize = 16377;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Shoutcast Version 1 broadcast handler.
|
* Creates a Shoutcast Version 2 broadcast handler.
|
||||||
* @param configuration
|
* @param configuration details for shoutcast version 2
|
||||||
* @param audioConverter
|
* @param audioConverter to convert PCM audio
|
||||||
*/
|
*/
|
||||||
public ShoutcastV2Handler(ShoutcastV2Configuration configuration, IAudioConverter audioConverter)
|
public ShoutcastV2Handler(ShoutcastV2Configuration configuration, IAudioConverter audioConverter)
|
||||||
{
|
{
|
||||||
@@ -105,25 +107,21 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
{
|
{
|
||||||
List<UltravoxMessage> audioMessages = getAudioMessages(convertedAudio);
|
List<UltravoxMessage> audioMessages = getAudioMessages(convertedAudio);
|
||||||
|
|
||||||
for(UltravoxMessage audioMessage: audioMessages)
|
try
|
||||||
{
|
{
|
||||||
try
|
for(UltravoxMessage audioMessage: audioMessages)
|
||||||
{
|
{
|
||||||
send(audioMessage, false);
|
send(audioMessage, NO_RESPONSE_EXPECTED);
|
||||||
}
|
|
||||||
catch(IOException e)
|
|
||||||
{
|
|
||||||
mLog.error("Error while dispatching audio", e);
|
|
||||||
setBroadcastState(BroadcastState.BROADCAST_ERROR);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch(IOException e)
|
||||||
|
{
|
||||||
|
mLog.error("Error while dispatching audio", e);
|
||||||
|
setBroadcastState(BroadcastState.BROADCAST_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
mLog.debug("Not connected");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -305,7 +303,7 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
UltravoxMessage response = send(requestCipher, true);
|
UltravoxMessage response = send(requestCipher, GET_RESPONSE);
|
||||||
|
|
||||||
if (response instanceof RequestCipher)
|
if (response instanceof RequestCipher)
|
||||||
{
|
{
|
||||||
@@ -316,7 +314,7 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
authenticateBroadcast.setCredentials(cipherResponse.getCipher(),
|
authenticateBroadcast.setCredentials(cipherResponse.getCipher(),
|
||||||
getShoutcastConfiguration().getStreamID(), getShoutcastConfiguration().getUserID(),
|
getShoutcastConfiguration().getStreamID(), getShoutcastConfiguration().getUserID(),
|
||||||
getShoutcastConfiguration().getPassword());
|
getShoutcastConfiguration().getPassword());
|
||||||
response = send(authenticateBroadcast, true);
|
response = send(authenticateBroadcast, GET_RESPONSE);
|
||||||
|
|
||||||
if (response.isErrorResponse())
|
if (response.isErrorResponse())
|
||||||
{
|
{
|
||||||
@@ -327,7 +325,7 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
UltravoxMessage streamMimeType = UltravoxMessageFactory
|
UltravoxMessage streamMimeType = UltravoxMessageFactory
|
||||||
.getMessage(UltravoxMessageType.STREAM_MIME_TYPE);
|
.getMessage(UltravoxMessageType.STREAM_MIME_TYPE);
|
||||||
streamMimeType.setPayload(getShoutcastConfiguration().getBroadcastFormat().getValue());
|
streamMimeType.setPayload(getShoutcastConfiguration().getBroadcastFormat().getValue());
|
||||||
response = send(streamMimeType, true);
|
response = send(streamMimeType, GET_RESPONSE);
|
||||||
|
|
||||||
if (response.isErrorResponse())
|
if (response.isErrorResponse())
|
||||||
{
|
{
|
||||||
@@ -340,7 +338,7 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
.getMessage(UltravoxMessageType.SETUP_BROADCAST);
|
.getMessage(UltravoxMessageType.SETUP_BROADCAST);
|
||||||
setupBroadcast.setBitRate(getShoutcastConfiguration().getBitRate(),
|
setupBroadcast.setBitRate(getShoutcastConfiguration().getBitRate(),
|
||||||
getShoutcastConfiguration().getBitRate());
|
getShoutcastConfiguration().getBitRate());
|
||||||
response = send(setupBroadcast, true);
|
response = send(setupBroadcast, GET_RESPONSE);
|
||||||
|
|
||||||
if (response.isErrorResponse())
|
if (response.isErrorResponse())
|
||||||
{
|
{
|
||||||
@@ -352,7 +350,7 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
NegotiateMaxPayloadSize negotiateMaxPayloadSize = (NegotiateMaxPayloadSize) UltravoxMessageFactory
|
NegotiateMaxPayloadSize negotiateMaxPayloadSize = (NegotiateMaxPayloadSize) UltravoxMessageFactory
|
||||||
.getMessage(UltravoxMessageType.NEGOTIATE_MAX_PAYLOAD_SIZE);
|
.getMessage(UltravoxMessageType.NEGOTIATE_MAX_PAYLOAD_SIZE);
|
||||||
negotiateMaxPayloadSize.setMaximumPayloadSize(mMaxPayloadSize, 14000);
|
negotiateMaxPayloadSize.setMaximumPayloadSize(mMaxPayloadSize, 14000);
|
||||||
response = send(negotiateMaxPayloadSize, true);
|
response = send(negotiateMaxPayloadSize, GET_RESPONSE);
|
||||||
mMaxPayloadSize = ((NegotiateMaxPayloadSize) response).getMaximumPayloadSize();
|
mMaxPayloadSize = ((NegotiateMaxPayloadSize) response).getMaximumPayloadSize();
|
||||||
|
|
||||||
List<String> metadata = new ArrayList<>();
|
List<String> metadata = new ArrayList<>();
|
||||||
@@ -364,7 +362,7 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
ConfigureIcyName icyName = (ConfigureIcyName) UltravoxMessageFactory
|
ConfigureIcyName icyName = (ConfigureIcyName) UltravoxMessageFactory
|
||||||
.getMessage(UltravoxMessageType.CONFIGURE_ICY_NAME);
|
.getMessage(UltravoxMessageType.CONFIGURE_ICY_NAME);
|
||||||
icyName.setName(getShoutcastConfiguration().getStreamName());
|
icyName.setName(getShoutcastConfiguration().getStreamName());
|
||||||
response = send(icyName, false);
|
response = send(icyName, NO_RESPONSE_EXPECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getShoutcastConfiguration().getStreamGenre() != null)
|
if (getShoutcastConfiguration().getStreamGenre() != null)
|
||||||
@@ -374,7 +372,7 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
ConfigureIcyGenre icyGenre = (ConfigureIcyGenre) UltravoxMessageFactory
|
ConfigureIcyGenre icyGenre = (ConfigureIcyGenre) UltravoxMessageFactory
|
||||||
.getMessage(UltravoxMessageType.CONFIGURE_ICY_GENRE);
|
.getMessage(UltravoxMessageType.CONFIGURE_ICY_GENRE);
|
||||||
icyGenre.setGenre(getShoutcastConfiguration().getStreamGenre());
|
icyGenre.setGenre(getShoutcastConfiguration().getStreamGenre());
|
||||||
response = send(icyGenre, false);
|
response = send(icyGenre, NO_RESPONSE_EXPECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getShoutcastConfiguration().getURL() != null)
|
if (getShoutcastConfiguration().getURL() != null)
|
||||||
@@ -382,16 +380,16 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
ConfigureIcyURL icyURL = (ConfigureIcyURL) UltravoxMessageFactory
|
ConfigureIcyURL icyURL = (ConfigureIcyURL) UltravoxMessageFactory
|
||||||
.getMessage(UltravoxMessageType.CONFIGURE_ICY_URL);
|
.getMessage(UltravoxMessageType.CONFIGURE_ICY_URL);
|
||||||
icyURL.setURL(getShoutcastConfiguration().getURL());
|
icyURL.setURL(getShoutcastConfiguration().getURL());
|
||||||
response = send(icyURL, false);
|
response = send(icyURL, NO_RESPONSE_EXPECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureIcyPublic icyPublic = (ConfigureIcyPublic) UltravoxMessageFactory
|
ConfigureIcyPublic icyPublic = (ConfigureIcyPublic) UltravoxMessageFactory
|
||||||
.getMessage(UltravoxMessageType.CONFIGURE_ICY_PUBLIC);
|
.getMessage(UltravoxMessageType.CONFIGURE_ICY_PUBLIC);
|
||||||
icyPublic.setPublic(getShoutcastConfiguration().isPublic());
|
icyPublic.setPublic(getShoutcastConfiguration().isPublic());
|
||||||
response = send(icyPublic, false);
|
response = send(icyPublic, NO_RESPONSE_EXPECTED);
|
||||||
|
|
||||||
Standby standby = (Standby) UltravoxMessageFactory.getMessage(UltravoxMessageType.STANDBY);
|
Standby standby = (Standby) UltravoxMessageFactory.getMessage(UltravoxMessageType.STANDBY);
|
||||||
response = send(standby, true);
|
response = send(standby, GET_RESPONSE);
|
||||||
|
|
||||||
if (response.isValidResponse())
|
if (response.isValidResponse())
|
||||||
{
|
{
|
||||||
@@ -412,7 +410,7 @@ public class ShoutcastV2Handler extends BroadcastHandler
|
|||||||
for (UltravoxMessage message : messages)
|
for (UltravoxMessage message : messages)
|
||||||
{
|
{
|
||||||
mLog.debug("Sending metadata message");
|
mLog.debug("Sending metadata message");
|
||||||
send(message, true);
|
send(message, GET_RESPONSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
mLog.debug("We're connected!!!");
|
mLog.debug("We're connected!!!");
|
||||||
|
|||||||
@@ -65,14 +65,14 @@ public class AdjacentStatusBroadcastExtended extends PDUMessage
|
|||||||
sb.append( " RFSS:" + getRFSS() );
|
sb.append( " RFSS:" + getRFSS() );
|
||||||
|
|
||||||
sb.append( " SITE:" + getSiteID() );
|
sb.append( " SITE:" + getSiteID() );
|
||||||
|
|
||||||
sb.append( " CTRL CHAN:" + getReceiveIdentifier() + "-" + getReceiveChannel() );
|
sb.append( " CTRL CHAN:" + getTransmitIdentifier() + "-" + getTransmitChannel() );
|
||||||
|
|
||||||
sb.append( " DN:" + getDownlinkFrequency() );
|
sb.append( " DN:" + getDownlinkFrequency() );
|
||||||
|
|
||||||
sb.append( " " + getTransmitIdentifier() + "-" + getTransmitChannel() );
|
sb.append( " " + getReceiveIdentifier() + "-" + getReceiveChannel() );
|
||||||
|
|
||||||
sb.append( " UP:" + getUplinkFrequency() );
|
sb.append( " UP:" + getUplinkFrequency() );
|
||||||
|
|
||||||
sb.append( " SYS SVC CLASS:" + getSystemServiceClass() );
|
sb.append( " SYS SVC CLASS:" + getSystemServiceClass() );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user