예제 #1
0
        // ---|
        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 &lt;= 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;
        }