/// <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(); }
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(); } }