Compare commits

..

3 Commits

Author SHA1 Message Date
Denny
cebd2da89f Updates build to v0.3.2-beta1 2017-10-21 09:47:58 -04:00
Denny Sheirer
73b6ef164f Merge pull request #280 from DSheirer/276-tuner-controller-issue-cherry-pick
Resolves #276 Traffic Channel threads locking in overflow state.  Issue
2017-10-21 09:46:30 -04:00
Denny
b2c7ac8c66 Resolves #276 Traffic Channel threads locking in overflow state. Issue
occured when the ChannelProcessionManager was allocating a new channel
causing the tuner to invoke the updateLOFrequency() method that was
trying to find a center tune frequency that would accommodate all of the
channels, specifically in the instance where the distance between the
highest channel and the middle channel was exactly one-half of the
tuner's bandwidth.  This situation would cause the calculated adjustment
to be zero and would cause an infinite loop, locking all channels from
accessing the any channel startup/teardown events and causing running
channels to block with buffer overflows. Added 1 to the adjustment to
ensure that the initial adjustment placed the center overlapping channel
fully to the left of the center DC spike so that on the next iteration
that channel would no longer be overlapping.

(cherry picked from commit f3d3a81)
2017-10-21 09:45:51 -04:00
8 changed files with 31 additions and 117 deletions

View File

@@ -1,13 +1,5 @@
0.3.2 20171105
- Resolves issue with tuner frequency adjustments that was causing channel processing
to lockup and show persistent 'overflow' state in each channel status
- Resolves issue with broadcastify 'mountpoint-in-use' error handling and updates
memory usage logging
0.3.1 20171009 0.3.0-beta1 20170129
- Resolves Java 9 incompatibility issues
0.3.0 20170922
- REQUIRES: Java 8 (or newer) for compatibility and eventual changeover to JavaFX - REQUIRES: Java 8 (or newer) for compatibility and eventual changeover to JavaFX
- FEATURE: audio streaming - adds capability to stream to multiple remote broadcast - FEATURE: audio streaming - adds capability to stream to multiple remote broadcast
servers (Broadcastify, Icecast v2.3 and v2.4+, and Shoutcast V1 and V2). Each servers (Broadcastify, Icecast v2.3 and v2.4+, and Shoutcast V1 and V2). Each

View File

@@ -6,8 +6,8 @@
<!-- version properties --> <!-- version properties -->
<property name="major" value="0"/> <property name="major" value="0"/>
<property name="minor" value="3"/> <property name="minor" value="3"/>
<property name="patch" value="1"/> <property name="patch" value="2"/>
<property name="release" value=""/> <!-- Use dash (-) prefix (e.g. -beta1) --> <property name="release" value="-beta1"/>
<property name="filename" value="sdrtrunk_${major}.${minor}.${patch}${release}"/> <property name="filename" value="sdrtrunk_${major}.${minor}.${patch}${release}"/>
<!-- Build properties --> <!-- Build properties -->
@@ -34,7 +34,7 @@
<mkdir dir="${output.classes}"/> <mkdir dir="${output.classes}"/>
<!-- Create version file --> <!-- Create version file -->
<echo message="${major}.${minor}.${patch}${release}" file="${output.classes}/sdrtrunk-version"/> <echo message="${major}.${minor}.${patch}-${release}" file="${output.classes}/sdrtrunk-version"/>
</target> </target>
<target name="compile" depends="clean,init,compile-java-8,compile-java-9" <target name="compile" depends="clean,init,compile-java-8,compile-java-9"

View File

@@ -1,6 +1,4 @@
<configuration> <configuration>
<conversionRule conversionWord="memory_usage" converterClass="util.MemoryUsageLogger" />
<timestamp key="appstart" datePattern="HHmmss"/> <timestamp key="appstart" datePattern="HHmmss"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -11,7 +9,7 @@
<maxHistory>10</maxHistory> <maxHistory>10</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>%-25(%d{yyyyMMdd HHmmss.SSS} [%thread]) %-5level %logger{30} - %msg %memory_usage%n</pattern> <pattern>%-25(%d{yyyyMMdd HHmmss.SSS} [%thread]) %-5level %logger{30} - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
@@ -21,7 +19,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <encoder>
<pattern>%-12(%d{HH:mm:ss.SSS}) %-5level %logger{25} - %msg %memory_usage%n</pattern> <pattern>%-12(%d{HH:mm:ss.SSS}) %-5level %logger{25} - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>

View File

@@ -68,7 +68,7 @@ public enum BroadcastState
/** /**
* Specified mount point is already in use * Specified mount point is already in use
*/ */
MOUNT_POINT_IN_USE("Mount Point In Use", false), MOUNT_POINT_IN_USE("Mount Point In Use", true),
/** /**
* Server is not known or reachable * Server is not known or reachable

View File

@@ -325,10 +325,6 @@ public class IcecastTCPAudioBroadcaster extends IcecastAudioBroadcaster
{ {
setBroadcastState(BroadcastState.MOUNT_POINT_IN_USE); setBroadcastState(BroadcastState.MOUNT_POINT_IN_USE);
} }
else if(message.contains("Content-Type: text/html"))
{
//Disregard ... this normally follows the mount point in use error
}
else if(message.contains("Invalid Password") || else if(message.contains("Invalid Password") ||
message.contains("Authentication Required")) message.contains("Authentication Required"))
{ {

View File

@@ -71,40 +71,6 @@ public class AuthenticateBroadcast extends UltravoxMessage
setPayload(sb.toString()); setPayload(sb.toString());
} }
/**
* Encrypts the value using the XTEA block cipher algorithm. The byte array is sliced into 8-byte chunks and each
* chunk is encrypted into a 16 hexadecimal character string. All encrypted chunks are concatenated and returned
* as a single string. If the value byte array is not an even multiple of 8 characters, it will be padded with
* zero valued bytes to make it an even multiple of eight.
*
* @param xtea instance of the XTEA algorithm with a loaded encryption key
* @param value to encode
* @return value encrypted into one or more multiples of 16 hexadecimal characters
*/
private static String encrypt(XTEA xtea, byte[] value)
{
if(value.length % 8 != 0 || value.length == 0)
{
int newLength = ((value.length / 8) + 1) * 8;
value = Arrays.copyOf(value, newLength);
}
StringBuilder sb = new StringBuilder();
for(int x = 0; x < value.length; x += 8)
{
byte[] plaintext = Arrays.copyOfRange(value, x, x + 8);
byte[] encrypted = xtea.encrypt(plaintext);
for(byte b: encrypted)
{
sb.append(String.format("%02x", b));
}
}
return sb.toString();
}
/** /**
* Encrypts the value using the XTEA block cipher algorithm and returns the encrypted value as a 16 hex value * Encrypts the value using the XTEA block cipher algorithm and returns the encrypted value as a 16 hex value
* *
@@ -114,6 +80,23 @@ public class AuthenticateBroadcast extends UltravoxMessage
*/ */
private static String encrypt(XTEA xtea, String value) private static String encrypt(XTEA xtea, String value)
{ {
return encrypt(xtea, value.getBytes()); byte[] valueBytes = value.getBytes();
if(valueBytes.length % 8 != 0 || valueBytes.length == 0)
{
int newLength = ((valueBytes.length / 8) + 1) * 8;
valueBytes = Arrays.copyOf(valueBytes, newLength);
}
byte[] encrypted = xtea.encrypt(valueBytes);
StringBuilder sb = new StringBuilder();
for(byte b: encrypted)
{
sb.append(String.format("%02x", b));
}
return sb.toString();
} }
} }

View File

@@ -33,7 +33,6 @@ import icon.IconManager;
import map.MapService; import map.MapService;
import module.log.EventLogManager; import module.log.EventLogManager;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import playlist.PlaylistManager; import playlist.PlaylistManager;
@@ -81,16 +80,16 @@ public class SDRTrunk implements Listener<TunerEvent>
public SDRTrunk() public SDRTrunk()
{ {
mLog.info("");
mLog.info("*******************************************************************"); mLog.info("*******************************************************************");
mLog.info("**** sdrtrunk: a trunked radio and digital decoding application ***"); mLog.info("**** sdrtrunk: a trunked radio and digital decoding application ***");
mLog.info("**** website: https://github.com/dsheirer/sdrtrunk ***"); mLog.info("**** website: https://github.com/dsheirer/sdrtrunk ***");
mLog.info("*******************************************************************"); mLog.info("*******************************************************************");
mLog.info("Memory Logging Format: [Used/Allocated PercentUsed%]"); mLog.info("");
mLog.info("Host CPU Cores: " + Runtime.getRuntime().availableProcessors()); mLog.info("Host CPU Cores: " + Runtime.getRuntime().availableProcessors());
mLog.info("Host OS Name: " + System.getProperty("os.name")); mLog.info("Host Memory Total: " + Runtime.getRuntime().totalMemory());
mLog.info("Host OS Arch: " + System.getProperty("os.arch")); mLog.info("Host Memory Max: " + Runtime.getRuntime().maxMemory());
mLog.info("Host OS Version: " + System.getProperty("os.version")); mLog.info("Host Memory Free: " + Runtime.getRuntime().freeMemory());
mLog.info("Host Max Java Memory: " + FileUtils.byteCountToDisplaySize(Runtime.getRuntime().maxMemory()));
//Setup the application home directory //Setup the application home directory
Path home = getHomePath(); Path home = getHomePath();

View File

@@ -1,54 +0,0 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package util;
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import org.apache.commons.io.FileUtils;
/**
* Custom logging plugin for logging memory usage with logback
*
* Add the following to the logback.xml configuration file to use this custom converter:
*
* <conversionRule conversionWord="memory_usage" converterClass="util.MemoryUsageLogger" />
*
* Update the encoder pattern to include %memory_usage within the pattern
*/
public class MemoryUsageLogger extends ClassicConverter
{
@Override
public String convert(ILoggingEvent iLoggingEvent)
{
//Method argument is ignored - we simply return memory usage statistics
long allocated = Runtime.getRuntime().totalMemory();
long free = Runtime.getRuntime().freeMemory();
long used = allocated - free;
int usedPercentage = (int)((double)(used) / (double)allocated * 100.0);
StringBuilder sb = new StringBuilder();
sb.append("[").append(FileUtils.byteCountToDisplaySize(used).replace(" ", ""));
sb.append("/").append(FileUtils.byteCountToDisplaySize(allocated).replace(" ", ""));
sb.append(" ").append(usedPercentage).append("%]");
return sb.toString();
}
}