package local.media;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioFileFormat;
import java.io.File;
import java.io.FileInputStream;
/** AudioSender is a pure-java audio stream sender.
* It uses the javax.sound library (package).
*/
public class AudioSender
{
// ******************************* MAIN *******************************
/** The main method. */
public static void main(String[] args)
{
String daddr=null;
int dport=0;
int payload_type=0;
int tone_freq=500;
double tone_amp=1.0;
int sample_rate=8000;
int sample_size=1;
int frame_size=500;
int frame_rate; //=sample_rate/(frame_size/sample_size);
// byte_rate=frame_rate/frame_size=8000
boolean linear_signed=false;
boolean pcmu=false;
boolean big_endian=false;
String filename=null;
boolean sound=true;
boolean help=true;
for (int i=0; i<args.length; i++)
{
if (args[i].equals("-h"))
{ break;
}
if (i==0 && args.length>1)
{ daddr=args[i];
dport=Integer.parseInt(args[++i]);
help=false;
continue;
}
if (args[i].equals("-p") && args.length>(i+1))
{ payload_type=Integer.parseInt(args[++i]);
continue;
}
if (args[i].equals("-F") && args.length>(i+1))
{ sound=false;
filename=args[++i];
continue;
}
if (args[i].equals("-T") && args.length>(i+1))
{ sound=false;
tone_freq=Integer.parseInt(args[++i]);
continue;
}
if (args[i].equals("-A") && args.length>(i+1))
{ tone_amp=Double.parseDouble(args[++i]);
continue;
}
if (args[i].equals("-S") && args.length>(i+2))
{ sample_rate=Integer.parseInt(args[++i]);
sample_size=Integer.parseInt(args[++i]);
continue;
}
if (args[i].equals("-L") && args.length>(i+1))
{ frame_size=Integer.parseInt(args[++i]);
continue;
}
if (args[i].equals("-Z"))
{ linear_signed=true;
continue;
}
if (args[i].equals("-U"))
{ pcmu=true;
continue;
}
if (args[i].equals("-E"))
{ big_endian=true;
continue;
}
// else, do:
System.out.println("unrecognized param '"+args[i]+"'\n");
help=true;
}
if (help)
{ System.out.println("usage:\n java AudioSender <dest_addr> <dest_port> [options]");
System.out.println(" options:");
System.out.println(" -h this help");
System.out.println(" -p <type> payload type");
System.out.println(" -F <audio_file> sends an audio file");
System.out.println(" -T <frequency> sends a tone of given frequency [Hz]");
System.out.println(" -A <amplitude> sets an amplitude factor [0:1]");
System.out.println(" -S <rate> <size> sample rate [B/s], and size [B]");
System.out.println(" -L <size> frame size");
System.out.println(" -Z uses PCM linear signed format (linear unsigned is used as default)");
System.out.println(" -U uses PCMU format");
System.out.println(" -E uses big endian format");
System.exit(0);
}
frame_rate=sample_rate/(frame_size/sample_size);
AudioFormat.Encoding codec;
if (pcmu) codec=AudioFormat.Encoding.ULAW;
else
if (linear_signed) codec=AudioFormat.Encoding.PCM_SIGNED;
else
codec=AudioFormat.Encoding.PCM_UNSIGNED; // default
int tone_codec=ToneInputStream.PCM_LINEAR_UNSIGNED;
if (linear_signed) tone_codec=ToneInputStream.PCM_LINEAR_SIGNED;
try
{ RtpStreamSender sender;
AudioInput audio_input=null;
if (sound) AudioInput.initAudioLine();
if (sound)
{ AudioFormat format=new AudioFormat(codec,sample_rate,8*sample_size,1,sample_size,sample_rate,big_endian);
System.out.println("System audio format: "+format);
audio_input=new AudioInput(format);
sender=new RtpStreamSender(audio_input.getInputStream(),false,payload_type,frame_rate,frame_size,daddr,dport);
}
else
if (filename!=null)
{ File file=new File(filename);
if (filename.indexOf(".wav")>0)
{ AudioFileFormat format=AudioSystem.getAudioFileFormat(file);
System.out.println("File audio format: "+format);
AudioInputStream audio_input_stream=AudioSystem.getAudioInputStream(file);
sender=new RtpStreamSender(audio_input_stream,true,payload_type,frame_rate,frame_size,daddr,dport);
}
else
{ FileInputStream input_stream=new FileInputStream(file);
sender=new RtpStreamSender(input_stream,true,payload_type,frame_rate,frame_size,daddr,dport);
}
}
else
{ ToneInputStream tone=new ToneInputStream(tone_freq,tone_amp,sample_rate,sample_size,tone_codec,big_endian);
sender=new RtpStreamSender(tone,true,payload_type,frame_rate,frame_size,daddr,dport);
}
if (sender!=null)
{
sender.start();
if (sound) audio_input.play();
System.out.println("Press 'Return' to stop");
System.in.read();
sender.halt();
if (sound) audio_input.stop();
if (sound) AudioInput.closeAudioLine();
}
else
{ System.out.println("Error creating the rtp stream.");
}
}
catch (Exception e) { e.printStackTrace(); }
}
}