Ejemplo n.º 1
0
        /// <summary>
        ///     Reconstruct a stream from WBH data.
        /// </summary>
        /// <param name="entry"></param>
        /// <param name="convertToPcm"></param>
        /// <returns></returns>
        public Memory <byte> ReconstructWave(WBHEntry entry, bool convertToPcm)
        {
            var data        = Data.Span.Slice(entry.Offset, entry.Size);
            var entryMutate = entry;

            // ReSharper disable once InvertIf
            if (convertToPcm && entry.Codec != WAVECodec.PCM && entry.Channels == 1)
            {
                data = entry.Codec switch
                {
                    WAVECodec.MSADPCM => MSADPCM.Decode(data, entryMutate.BlockAlign),
                    WAVECodec.GCADPCM when entry.Setup is short[] coefficients => GCADPCM.Decode(data, coefficients, entry.Samples),
                    _ => data
                };

                entryMutate.BlockAlign = 2;
                entryMutate.Codec      = WAVECodec.PCM;
            }

            return(PCM.ConstructWAVE((short)entryMutate.Codec, entry.Channels, entryMutate.Frequency, entryMutate.BlockAlign, entryMutate.Codec switch
            {
                WAVECodec.PCM => 16,
                WAVECodec.MSADPCM => 4,
                WAVECodec.GCADPCM => 4,
                _ => 4
            }, data));
Ejemplo n.º 2
0
        /// <summary>
        ///     Reconstructs stream to a WAV
        /// </summary>
        /// <returns></returns>
        public List <Memory <byte> > ReconstructWave(bool convertPcm)
        {
            var streams = new List <Memory <byte> >();

            foreach (var buffer in AudioBuffers)
            {
                var data       = buffer.Span;
                var codec      = 0x0002;
                var blockAlign = Info.FrameSize;
                if (convertPcm)
                {
                    data       = MSADPCM.Decode(data, blockAlign);
                    codec      = 0x0001;
                    blockAlign = 0x2;
                }


                streams.Add(new Memory <byte>(PCM.ConstructWAVE((short)codec, 1, Header.SampleRate, blockAlign, (WAVECodec)codec switch
                {
                    WAVECodec.PCM => 16,
                    WAVECodec.MSADPCM => 4,
                    WAVECodec.GCADPCM => 4,
                    _ => 4
                }, data).ToArray()));