コード例 #1
0
        public OggVorbisEncodedStream(byte[] buffer)
        {
            //this.buffer = buffer;
            rawStream = new MemoryStream(buffer);

            //Open
            file = new NativeOggVorbisFile();

            NativeCallbacks callbacks = new NativeCallbacks();

            callbacks.ReadFunction = new ReadFunctionDelegate(this.RawStreamRead);
            callbacks.TellFunction = new TellFunctionDelegate(this.RawStreamTell);
            callbacks.SeekFunction = new SeekFunctionDelegate(this.RawStreamSeek);

            int result = 0;

            if ((result = OggVorbisFile.NativeOpenCallbacks(buffer, file, IntPtr.Zero, 0, callbacks)) != 0)
            {
                throw new OggVorbisException(String.Format("Error {0} during open", result));
            }

            //Get info
            info = new VorbisInfo(OggVorbisFile.NativeGetInfo(file, -1));

            //Get lengths of the stream
            pcmLength = OggVorbisFile.NativeGetLength(file, -1);    // -1 to entire bitstream
            rawLength = OggVorbisFile.NativeGetRawLength(file, -1); // -1 to entire bitstream
            duration  = OggVorbisFile.NativeGetDuration(file, -1);  // -1 to entire bitstream

            //Update info
            info.Duration = duration;
        }
コード例 #2
0
 public override void Close()
 {
     base.Close();
     if (file != null)
     {
         OggVorbisFile.NativeClear(file);
     }
 }
コード例 #3
0
        public override int Read(byte[] buffer, int offset, int length)
        {
            unsafe
            {
                fixed(byte *bp = buffer)
                {
                    //init and set initial pointer position
                    int   size      = 0;
                    int   result    = 0;
                    byte *bufferPos = bp + offset;

                    while (size < length)
                    {
                        bufferPos = bp + offset + size; // going to the correct buffer position
                        result    = OggVorbisFile.NativeRead(file, bufferPos, length - size, 0, 2, 1, IntPtr.Zero);

                        if (result > 0)
                        {
                            size += result;
                        }
                        else if (result == 0)
                        {
                            break;
                        }
                        else //if (result < 0)
                        {
                            if (result == -1)
                            {
                                throw new OggVorbisException("The initial file headers couldn't be read or are corrupt, or that the initial open call for vf failed.");
                            }
                            if (result == -2)
                            {
                                throw new OggVorbisException("An invalid stream section was supplied to libvorbisfile, or the requested link is corrupt.");
                            }
                            if (result == -3)
                            {
                                throw new OggVorbisException("There was an interruption in the data. (one of: garbage between pages, loss of sync followed by recapture, or a corrupt page)");
                            }
                            else
                            {
                                throw new OggVorbisException("Unknown OggVorbis error: " + result);
                            }
                        }
                    }

                    return(result);
                }
            }
        }
コード例 #4
0
        public OggVorbisFileStream(string filename)
        {
            //Open File
            file = new NativeOggVorbisFile();

            //if (ov_open(stream.SafeFileHandle, ref vf, IntPtr.Zero,0) == 0)
            // fopen for Win32!
            if (OggVorbisFile.NativeFOpen(filename, file) != 0)
            {
                throw new OggVorbisException("Error during fopen");
            }

            //Get info
            info = new VorbisInfo(OggVorbisFile.NativeGetInfo(file, -1));

            //Get lengths of the stream
            pcmLength = OggVorbisFile.NativeGetLength(file, -1);    // -1 to entire bitstream
            rawLength = OggVorbisFile.NativeGetRawLength(file, -1); // -1 to entire bitstream
            duration  = OggVorbisFile.NativeGetDuration(file, -1);  // -1 to entire bitstream

            //Update info
            info.Duration = duration;
        }
コード例 #5
0
 public virtual int SeekTime(double time)
 {
     return(OggVorbisFile.NativeSeekTime(file, time));
 }
コード例 #6
0
 public override long Seek(long offset, SeekOrigin origin)
 {
     // Using this because it's the fastest seek method possible (with crosslap)
     OggVorbisFile.NativeSeek(file, offset);
     return(file.PcmOffset);
 }