mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-12 00:27:26 -05:00
211 lines
8.2 KiB
Java
211 lines
8.2 KiB
Java
/*******************************************************************************
|
|
* sdrtrunk
|
|
* Copyright (C) 2014-2016 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 audio.broadcast;
|
|
|
|
import alias.AliasModel;
|
|
import audio.broadcast.broadcastify.BroadcastifyConfiguration;
|
|
import audio.broadcast.broadcastify.BroadcastifyConfigurationEditor;
|
|
import audio.broadcast.icecast.IcecastHTTPAudioBroadcaster;
|
|
import audio.broadcast.icecast.IcecastHTTPConfiguration;
|
|
import audio.broadcast.icecast.IcecastHTTPConfigurationEditor;
|
|
import audio.broadcast.icecast.IcecastTCPAudioBroadcaster;
|
|
import audio.broadcast.icecast.IcecastTCPConfiguration;
|
|
import audio.broadcast.icecast.IcecastTCPConfigurationEditor;
|
|
import audio.broadcast.shoutcast.v1.ShoutcastV1AudioBroadcaster;
|
|
import audio.broadcast.shoutcast.v1.ShoutcastV1Configuration;
|
|
import audio.broadcast.shoutcast.v1.ShoutcastV1ConfigurationEditor;
|
|
import audio.broadcast.shoutcast.v2.ShoutcastV2AudioBroadcaster;
|
|
import audio.broadcast.shoutcast.v2.ShoutcastV2Configuration;
|
|
import audio.broadcast.shoutcast.v2.ShoutcastV2ConfigurationEditor;
|
|
import audio.convert.IAudioConverter;
|
|
import audio.convert.ISilenceGenerator;
|
|
import audio.convert.MP3AudioConverter;
|
|
import audio.convert.MP3SilenceGenerator;
|
|
import gui.editor.Editor;
|
|
import gui.editor.EmptyEditor;
|
|
import icon.IconManager;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import record.AudioRecorder;
|
|
import record.mp3.MP3Recorder;
|
|
|
|
import java.nio.file.Path;
|
|
|
|
public class BroadcastFactory
|
|
{
|
|
private final static Logger mLog = LoggerFactory.getLogger(BroadcastFactory.class);
|
|
|
|
public static final int MP3_MONO_16_KHZ_BITRATE = 16;
|
|
public static final boolean MP3_CONSTANT_BITRATE = false;
|
|
|
|
/**
|
|
* Creates an audio streaming broadcaster for the configuration
|
|
*
|
|
* @param configuration describing the server and audio types
|
|
* @return configured broadcaster or null
|
|
*/
|
|
public static AudioBroadcaster getBroadcaster(BroadcastConfiguration configuration)
|
|
{
|
|
if(configuration != null)
|
|
{
|
|
IAudioConverter converter = getAudioConverter(configuration);
|
|
|
|
if(converter != null)
|
|
{
|
|
switch(configuration.getBroadcastServerType())
|
|
{
|
|
case BROADCASTIFY:
|
|
return new IcecastTCPAudioBroadcaster((BroadcastifyConfiguration) configuration);
|
|
case ICECAST_TCP:
|
|
return new IcecastTCPAudioBroadcaster((IcecastTCPConfiguration) configuration);
|
|
case ICECAST_HTTP:
|
|
return new IcecastHTTPAudioBroadcaster((IcecastHTTPConfiguration) configuration);
|
|
case SHOUTCAST_V1:
|
|
return new ShoutcastV1AudioBroadcaster((ShoutcastV1Configuration) configuration);
|
|
case SHOUTCAST_V2:
|
|
return new ShoutcastV2AudioBroadcaster((ShoutcastV2Configuration) configuration);
|
|
case UNKNOWN:
|
|
default:
|
|
mLog.info("Unrecognized broadcastAudio configuration: " + configuration.getBroadcastFormat().name());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Creates an audio convert to convert from 8 kHz PCM audio to the specified format
|
|
*
|
|
* @param configuration containing the requested output audio format
|
|
* @return audio convert or null
|
|
*/
|
|
public static IAudioConverter getAudioConverter(BroadcastConfiguration configuration)
|
|
{
|
|
switch(configuration.getBroadcastFormat())
|
|
{
|
|
case MP3:
|
|
return new MP3AudioConverter(MP3_MONO_16_KHZ_BITRATE, MP3_CONSTANT_BITRATE);
|
|
default:
|
|
mLog.info("Unrecognized broadcastAudio format: " + configuration.getBroadcastFormat().name());
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Creates a broadcastAudio configuration for the specified server type and format
|
|
*
|
|
* @param serverType for the configuration
|
|
* @param format for the output audio format
|
|
* @return constructed (empty) configuration
|
|
*/
|
|
public static BroadcastConfiguration getConfiguration(BroadcastServerType serverType, BroadcastFormat format)
|
|
{
|
|
switch(serverType)
|
|
{
|
|
case BROADCASTIFY:
|
|
return new BroadcastifyConfiguration(format);
|
|
case ICECAST_HTTP:
|
|
return new IcecastHTTPConfiguration(format);
|
|
case ICECAST_TCP:
|
|
return new IcecastTCPConfiguration(format);
|
|
case SHOUTCAST_V1:
|
|
return new ShoutcastV1Configuration(format);
|
|
case SHOUTCAST_V2:
|
|
return new ShoutcastV2Configuration(format);
|
|
case UNKNOWN:
|
|
default:
|
|
mLog.info("Unrecognized broadcastAudio server type: " + serverType.name());
|
|
break;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Constructs an editor for the specified broadcastAudio configuration
|
|
*
|
|
* @param configuration to modify or view
|
|
* @param broadcastModel model for broadcastAudio configurations
|
|
* @return an editor for the specified broadcastAudio configuration
|
|
*/
|
|
public static Editor<BroadcastConfiguration> getEditor(BroadcastConfiguration configuration,
|
|
BroadcastModel broadcastModel,
|
|
AliasModel aliasModel,
|
|
IconManager iconManager)
|
|
{
|
|
Editor<BroadcastConfiguration> editor;
|
|
|
|
switch(configuration.getBroadcastServerType())
|
|
{
|
|
case BROADCASTIFY:
|
|
editor = new BroadcastifyConfigurationEditor(broadcastModel, aliasModel, iconManager);
|
|
break;
|
|
case ICECAST_TCP:
|
|
editor = new IcecastTCPConfigurationEditor(broadcastModel, aliasModel, iconManager);
|
|
break;
|
|
case ICECAST_HTTP:
|
|
editor = new IcecastHTTPConfigurationEditor(broadcastModel, aliasModel, iconManager);
|
|
break;
|
|
case SHOUTCAST_V1:
|
|
editor = new ShoutcastV1ConfigurationEditor(broadcastModel, aliasModel, iconManager);
|
|
break;
|
|
case SHOUTCAST_V2:
|
|
editor = new ShoutcastV2ConfigurationEditor(broadcastModel, aliasModel, iconManager);
|
|
break;
|
|
default:
|
|
editor = new EmptyEditor<BroadcastConfiguration>();
|
|
break;
|
|
}
|
|
|
|
editor.setItem(configuration);
|
|
|
|
return editor;
|
|
}
|
|
|
|
/**
|
|
* Creates an audio recorder for the specified broadcastAudio format using the specified path output file name
|
|
*/
|
|
public static AudioRecorder getAudioRecorder(Path path, BroadcastFormat broadcastFormat)
|
|
{
|
|
switch(broadcastFormat)
|
|
{
|
|
case MP3:
|
|
return new MP3Recorder(path);
|
|
default:
|
|
mLog.debug("Unrecognized broadcastAudio format [" + broadcastFormat + "] cannot create audio recorder");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static ISilenceGenerator getSilenceGenerator(BroadcastFormat format)
|
|
{
|
|
switch(format)
|
|
{
|
|
case MP3:
|
|
return new MP3SilenceGenerator();
|
|
default:
|
|
throw new IllegalArgumentException("Unrecognized broadcast format [" + format +
|
|
"] can't create silence generator");
|
|
}
|
|
}
|
|
}
|