Beispiel #1
0
        public bool Init(IStorageFile stream, bool readTags, string stateJson = null)
        {
            if (stream == null)
            {
                throw new ArgumentNullException($"Null argument {nameof(stream)} !");
            }

            _readTags   = readTags;
            _fileStream = stream;
            bsbuf       = bsspace_1;

            _fileStream.UseReadBuffer(2048);

            bool stateIsRestored = false;

            if (!string.IsNullOrEmpty(stateJson))
            {
                var state = JsonConvert.DeserializeObject <Mp3EncoderState>(stateJson);
                if (state != null)
                {
                    Args      = state.Args;
                    bsnum     = state.bsnum;
                    firsthead = state.firsthead;
                    fr        = state.frame;
                    framesize = state.framesize;
                    fsize     = state.fsize;
                    fsizeold  = state.fsizeold;
                    oldhead   = state.oldhead;
                    ssize     = state.ssize;
                    syncword  = state.syncword;

                    _frameOffsets = (state.Args.FramesFileOffsets?.ToList() ?? null);
                    // Restore full offset instead of relative offset value.
                    if (_frameOffsets != null)
                    {
                        for (int i = 1; i < _frameOffsets.Count; i++)
                        {
                            _frameOffsets[i] += _frameOffsets[i - 1];
                        }
                    }

                    // Seek to the beggining of the current frame.
                    _fileStream.Seek(state.FileOffset, SeekOrigin.Begin);

                    // Read current frame data.
                    //ReadFrame();

                    stateIsRestored = true;
                }
            }

            if (!stateIsRestored)
            {
                ReadFrame();
            }
            return(true);
        }
Beispiel #2
0
        public AudioPackets ReadFrames(int packetsCt)
        {
            bool isEof = false;
            int  packets = 0, frameSizeWithHeader = framesize + 4;
            var  mediaFrames = new List <AudioPacket>();

            byte[] frameData = null;

            // Calculate read buffer length in order to read all the freames in only one IO-READ call.
            if (packetsCt > 1)
            {
                if ((_frameOffsets?.Count ?? 0) > 0)
                {
                    bool lastPacket       = ((int)Args.CurrentPos) + packetsCt >= _frameOffsets.Count;
                    long lastPacketOffset = lastPacket ? _frameOffsets.Last() + Constants.MAXFRAMESIZE :
                                            _frameOffsets[(int)(Args.CurrentPos + (ulong)packetsCt)];
                    int readBufferSize = (int)(lastPacketOffset - _frameOffsets[(int)Args.CurrentPos]);
                    _fileStream.UseReadBuffer(readBufferSize);
                }
                else
                {
                    _fileStream.UseReadBuffer(frameSizeWithHeader * packetsCt);
                }
            }

            // Read frame in buffer first.
            if (framebuffIsEmpty)
            {
                ReadFrame();
                Args.CurrentPos++;
            }

            // Read current frame packet data.
            frameData = new byte[frameSizeWithHeader];
            Array.Copy(bsbuf, 512, frameData, 0, frameSizeWithHeader);

            mediaFrames.Add(new AudioPacket()
            {
                Data            = frameData,
                SamplesPerFrame = Args.IsVBR ? SamplesPerFrame : 0
            });
            packets++;

            while (packets < packetsCt)
            {
                if (((long)Args.CurrentPos) >= MaxFrames)
                {
                    break;
                }

read_again:
                int res = ReadFrame(); // Read next frame
                if (res == 0 && res != -1)
                {
                    goto read_again;
                }

                if (res == -2)
                {
                    isEof = true;
                    break;
                }

                frameSizeWithHeader = framesize + 4;
                // Read current frame packet data.
                frameData = new byte[frameSizeWithHeader];
                Array.Copy(bsbuf, 512, frameData, 0, frameSizeWithHeader);
                mediaFrames.Add(new AudioPacket()
                {
                    Data            = frameData,
                    SamplesPerFrame = Args.IsVBR ? SamplesPerFrame : 0
                });

                packets++;
                Args.CurrentPos++;
            }

            return(new AudioPackets()
            {
                IsEof = (isEof || Args.CurrentPos >= (ulong)MaxFrames),
                IsVBR = Args.IsVBR,
                NumPackets = packets,
                SamplesPerFrame = Args.IsVBR ? 0 : SamplesPerFrame,
                FramesCt = (ulong)MaxFrames,
                Offset = Args.CurrentPos,
                Packets = mediaFrames
            });
        }