// ---| public virtual void encode(java.io.File srcPath, java.io.File destPath) { byte[] temp = new byte[2560]; // stereo UWB requires one to read 2560b int HEADERSIZE = 8; string RIFF = "RIFF"; string WAVE = "WAVE"; string FORMAT = "fmt "; string DATA = "data"; int WAVE_FORMAT_PCM = unchecked((int)(0x0001)); // Display info if (printlevel <= INFO) { version(); } if (printlevel <= DEBUG) { System.Console.WriteLine(string.Empty); } if (printlevel <= DEBUG) { System.Console.WriteLine("Input File: " + srcPath); } // Open the input stream java.io.DataInputStream dis = new java.io.DataInputStream(new java.io.FileInputStream (srcPath)); // Prepare input stream if (srcFormat == FILE_FORMAT_WAVE) { // read the WAVE header dis.readFully(temp, 0, HEADERSIZE + 4); // make sure its a WAVE header if (!RIFF.Equals(cspeex.StringUtil.getStringForBytes(temp, 0, 4)) && !WAVE.Equals(cspeex.StringUtil.getStringForBytes (temp, 8, 4))) { System.Console.Error.WriteLine("Not a WAVE file"); return; } // Read other header chunks dis.readFully(temp, 0, HEADERSIZE); string chunk = cspeex.StringUtil.getStringForBytes(temp, 0, 4); int size = readInt(temp, 4); while (!chunk.Equals(DATA)) { dis.readFully(temp, 0, size); if (chunk.Equals(FORMAT)) { if (readShort(temp, 0) != WAVE_FORMAT_PCM) { System.Console.Error.WriteLine("Not a PCM file"); return; } channels = readShort(temp, 2); sampleRate = readInt(temp, 4); if (readShort(temp, 14) != 16) { System.Console.Error.WriteLine("Not a 16 bit file " + readShort(temp, 18)); return; } // Display audio info if (printlevel <= DEBUG) { System.Console.WriteLine("File Format: PCM wave"); System.Console.WriteLine("Sample Rate: " + sampleRate); System.Console.WriteLine("Channels: " + channels); } } dis.readFully(temp, 0, HEADERSIZE); chunk = cspeex.StringUtil.getStringForBytes(temp, 0, 4); size = readInt(temp, 4); } if (printlevel <= DEBUG) { System.Console.WriteLine("Data size: " + size); } } else { if (sampleRate < 0) { switch (mode) { case 0: { sampleRate = 8000; break; } case 1: { sampleRate = 16000; break; } case 2: { sampleRate = 32000; break; } default: { sampleRate = 8000; break; } } } // Display audio info if (printlevel <= DEBUG) { System.Console.WriteLine("File format: Raw audio"); System.Console.WriteLine("Sample rate: " + sampleRate); System.Console.WriteLine("Channels: " + channels); System.Console.WriteLine("Data size: " + srcPath.length()); } } // Set the mode if it has not yet been determined if (mode < 0) { if (sampleRate < 100) { // Sample Rate has probably been given in kHz sampleRate *= 1000; } if (sampleRate < 12000) { mode = 0; } else { // Narrowband if (sampleRate < 24000) { mode = 1; } else { // Wideband mode = 2; } } } // Ultra-wideband // Construct a new encoder org.xiph.speex.SpeexEncoder speexEncoder = new org.xiph.speex.SpeexEncoder(); speexEncoder.init(mode, quality, sampleRate, channels); if (complexity > 0) { speexEncoder.getEncoder().setComplexity(complexity); } if (bitrate > 0) { speexEncoder.getEncoder().setBitRate(bitrate); } if (vbr) { speexEncoder.getEncoder().setVbr(vbr); if (vbr_quality > 0) { speexEncoder.getEncoder().setVbrQuality(vbr_quality); } } if (vad) { speexEncoder.getEncoder().setVad(vad); } if (dtx) { speexEncoder.getEncoder().setDtx(dtx); } // Display info if (printlevel <= DEBUG) { System.Console.WriteLine(string.Empty); System.Console.WriteLine("Output File: " + destPath); System.Console.WriteLine("File format: Ogg Speex"); System.Console.WriteLine("Encoder mode: " + (mode == 0 ? "Narrowband" : (mode== 1 ? "Wideband" : "UltraWideband"))); System.Console.WriteLine("Quality: " + (vbr ? vbr_quality : quality)); System.Console.WriteLine("Complexity: " + complexity); System.Console.WriteLine("Frames per packet: " + nframes); System.Console.WriteLine("Varible bitrate: " + vbr); System.Console.WriteLine("Voice activity detection: " + vad); System.Console.WriteLine("Discontinouous Transmission: " + dtx); } // Open the file writer org.xiph.speex.AudioFileWriter writer; if (destFormat == FILE_FORMAT_OGG) { writer = new org.xiph.speex.OggSpeexWriter(mode, sampleRate, channels, nframes, vbr ); } else { if (destFormat == FILE_FORMAT_WAVE) { nframes = org.xiph.speex.PcmWaveWriter.WAVE_FRAME_SIZES[mode - 1][channels - 1][quality ]; writer = new org.xiph.speex.PcmWaveWriter(mode, quality, sampleRate, channels, nframes , vbr); } else { writer = new org.xiph.speex.RawWriter(); } } writer.open(destPath); writer.writeHeader("Encoded with: " + VERSION); int pcmPacketSize = 2 * channels * speexEncoder.getFrameSize(); try { // read until we get to EOF while (true) { dis.readFully(temp, 0, nframes * pcmPacketSize); for (int i = 0; i < nframes; i++) { speexEncoder.processData(temp, i * pcmPacketSize, pcmPacketSize); } int encsize = speexEncoder.getProcessedData(temp, 0); if (encsize > 0) { writer.writePacket(temp, 0, encsize); } } } catch (java.io.EOFException) { } writer.close(); dis.close(); }
/// <summary>Constructor</summary> /// <param name="mode">the mode of the encoder (0=NB, 1=WB, 2=UWB).</param> /// <param name="quality">the quality setting of the encoder (between 0 and 10).</param> /// <param name="in">the underlying input stream.</param> /// <param name="format">the target format of this stream's audio data.</param> /// <param name="length">the length in sample frames of the data in this stream.</param> /// <param name="size">the buffer size.</param> /// <exception> /// IllegalArgumentException /// if size <= 0. /// </exception> public Pcm2SpeexAudioInputStream(int mode, int quality, java.io.InputStream @in, javax.sound.sampled.AudioFormat format, long length, int size) : base(@in, format , length, size) { // public static final boolean DEFAULT_VBR = true; // .4s of audio // Speex variables // Ogg variables // Ogg initialisation granulepos = 0; if (streamSerialNumber == 0) { streamSerialNumber = new java.util.Random().nextInt(); } packetsPerOggPage = DEFAULT_PACKETS_PER_OGG_PAGE; packetCount = 0; pageCount = 0; // Speex initialisation framesPerPacket = DEFAULT_FRAMES_PER_PACKET; int samplerate = (int)format.getSampleRate(); if (samplerate < 0) { samplerate = DEFAULT_SAMPLERATE; } channels = format.getChannels(); if (channels < 0) { channels = DEFAULT_CHANNELS; } if (mode < 0) { mode = (samplerate < 12000) ? 0 : ((samplerate < 24000) ? 1 : 2); } this.mode = mode; javax.sound.sampled.AudioFormat.Encoding encoding = format.getEncoding(); if (quality < 0) { if (encoding is org.xiph.speex.spi.SpeexEncoding) { quality = ((org.xiph.speex.spi.SpeexEncoding)encoding).getQuality(); } else { quality = DEFAULT_QUALITY; } } encoder = new org.xiph.speex.SpeexEncoder(); encoder.init(mode, quality, samplerate, channels); if (encoding is org.xiph.speex.spi.SpeexEncoding && ((org.xiph.speex.spi.SpeexEncoding )encoding).isVBR()) { setVbr(true); } else { setVbr(false); } frameSize = 2 * channels * encoder.getFrameSize(); // Misc initialsation comment = "Encoded with " + org.xiph.speex.SpeexEncoder.VERSION; first = true; }