Esempio n. 1
0
        /// <summary>
        /// Decodes a dca file to PCM data
        /// </summary>
        /// <returns>byte array with PCM data</returns>
        public ReadData Decode(int offset)
        {
            int channels = 2;
            int ms = 20;

            int blockSize = 48 * 2 * channels * ms;

            using(FileStream fs = new FileStream(__filename, FileMode.Open))
            using (BinaryReader br = new BinaryReader(fs))
            {
                ushort bytesToRead = 0;
                br.BaseStream.Position = offset;
                
                while ((bytesToRead = br.ReadUInt16()) > 0)
                {
                    byte[] buffer = new byte[bytesToRead];
                    buffer = br.ReadBytes(bytesToRead);
                    byte[] pcmBuffer = new byte[blockSize];
                    int bytesDecoded = decoder.DecodeFrame(buffer, 0, bytesToRead, pcmBuffer);
                    ReadData r = new ReadData();
                    r.offset = bytesToRead + offset;
                    r.data = pcmBuffer;
                    return r;
                }
            }
            return new ReadData();
        }
Esempio n. 2
0
        static void Decode()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Select DCA file to decode.";
            ofd.Filter = "DCA Files (*.dca)|*.dca";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Stopwatch t = new Stopwatch();
                DcaDecoder decoder = new DcaDecoder(ofd.FileName);
                t.Start();
                ReadData pcmData = new ReadData();
                pcmData.offset = 0;
                pcmData.data = new byte[1];
                List<byte[]> bytes = new List<byte[]>();
                while ((pcmData = decoder.Decode(pcmData.offset)).data != null)
                {
                    bytes.Add(pcmData.data);
                }

                byte[] FINAL;
                using (BinaryWriter bw = new BinaryWriter(new MemoryStream()))
                {
                    bytes.ForEach(x => bw.Write(x));
                    MemoryStream baseStream = bw.BaseStream as MemoryStream;
                    FINAL = baseStream.ToArray();
                }
                t.Stop();

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "Wave Files (*.wav)|*.wav";
                if(sfd.ShowDialog() == DialogResult.OK)
                {
                    File.WriteAllBytes(sfd.FileName, FINAL);
                }

                Console.WriteLine("\ndone in " + t.Elapsed.Seconds + "s" + " (" + t.ElapsedTicks + " ticks)");
                decoder.Dispose();
            }
        }