private static void WriteRIFFDataChunk(BinaryWriter outStream, PCMData pcm) { // Chunk preamble outStream.Write("data".ToCharArray()); outStream.Write(pcm.Data.Length); // Chunk data outStream.Write(pcm.Data); }
private static void WriteRIFFFileHeaderChunk(BinaryWriter outStream, PCMData pcm) { int fileHeaderSize = 12; int numChunks = 2; int chunkPreambleSize = 8; int fileSize = fileHeaderSize + numChunks * chunkPreambleSize + pcm.Data.Length + FormatChunkSize; outStream.Write("RIFF".ToCharArray()); outStream.Write(fileSize); outStream.Write("WAVE".ToCharArray()); }
public Boolean LoadCalSegment(int SegNr, string FileName, ref PCMData PCM) { //Load CAL segment from file to segment buffer try { Logger("Reading " + SegmentNames[SegNr] + " from " + FileName); uint SegSize = PCM.Segments[SegNr].Length; long fsize = new System.IO.FileInfo(FileName).Length; byte[] tmpData; if (fsize == SegSize) { tmpData = ReadBin(FileName, 0, SegSize); } else if (fsize == PCM.BinSize) { uint OS1 = PCM.Segments[1].PN; uint OS2 = GetOsidFromFile(FileName); if (OS1 != OS2) { string err = "OS mismatch!" + Environment.NewLine; err += "file: " + PCM.Segments[1].Source + Environment.NewLine + "OS: " + OS1 + Environment.NewLine; err += "file: " + FileName + Environment.NewLine + "OS: " + OS2 + Environment.NewLine; throw new FileLoadException(err); } tmpData = ReadBin(FileName, PCM.Segments[SegNr].Start, SegSize); } else { string Msg = "Error: " + Environment.NewLine; Msg += FileName + " file size = " + fsize.ToString() + " bytes" + Environment.NewLine; Msg += "Should be: " + SegSize.ToString() + " or " + PCM.BinSize.ToString() + " bytes"; throw new FileLoadException(Msg); } //Check if readed segment have correct segment number in address start + 3 uint FileSegNr = tmpData[3]; if (FileSegNr != SegNr || tmpData[2] != 0) { string Msg = "Error: " + Environment.NewLine; Msg += "Wrong segment number: " + FileSegNr.ToString() + "in file: " + FileName; throw new FileLoadException(Msg); } PCM.Segments[SegNr].PN = BEToUint32(tmpData, 4); string Ver; Ver = System.Text.Encoding.ASCII.GetString(tmpData, 8, 2); PCM.Segments[SegNr].Ver = Regex.Replace(Ver, "[^a-zA-Z0-9]", "?"); PCM.Segments[SegNr].Data = new byte[SegSize]; Array.Copy(tmpData, 0, PCM.Segments[SegNr].Data, 0, SegSize); PCM.Segments[SegNr].Source = FileName; Logger("[OK]"); this.Close(); return(true); } catch (Exception ex) { Logger(ex.Message); return(false); } }
public Boolean LoadOS(string FileName, ref PCMData PCM) { //Load OS segment(s) from file(s) to segment buffer try { long fsize = new System.IO.FileInfo(FileName).Length; string FileName2 = ""; byte[] tmpData; byte[] tmpData2; if (fsize == 0x4000) //OS Segment1 size { Logger("Loading OS segment 1"); GetPcmType(FileName, ref PCM); tmpData = ReadBin(FileName, 0, (uint)fsize); if (tmpData[0] != 0 || tmpData[1] != 0xFF) { throw new Exception("Error: OS segment 1 not valid!"); } GetSegmentAddresses(tmpData, ref PCM); if (FileName.EndsWith("ossegment1")) //Get OS from segment files { FileName2 = FileName.Replace(".ossegment1", ".ossegment2"); } else { FileName2 = SelectFile("Select OS segment 2", true); if (FileName2.Length < 1) { throw new FileLoadException("user cancel"); } } Logger("Loading OS segment 2"); fsize = new System.IO.FileInfo(FileName2).Length; if (fsize != PCM.Segments[0].Length) { string Msg = "Error: " + Environment.NewLine + "File: " + FileName2 + " size: " + fsize.ToString() + Environment.NewLine; Msg += "Should be: " + PCM.Segments[0].Length.ToString(); throw new FileLoadException(Msg); } tmpData2 = ReadBin(FileName2, 0, PCM.Segments[0].Length); PCM.Segments[1].Data = new byte[0x4000]; PCM.Segments[0].Data = new byte[PCM.Segments[0].Length]; Array.Copy(tmpData, 0, PCM.Segments[1].Data, 0, PCM.Segments[1].Length); //OS1 Array.Copy(tmpData2, 0, PCM.Segments[0].Data, 0, PCM.Segments[0].Length); //OS2 } else if (fsize == (512 * 1024) || fsize == (1024 * 1024)) //Full binary { GetPcmType(FileName, ref PCM); Logger("Loading OS file: " + FileName); PCM.Segments[1].Data = ReadBin(FileName, 0, (uint)fsize); if (PCM.Segments[1].Data[0] != 0 || PCM.Segments[1].Data[1] != 0xFF) { throw new Exception("Error: OS segment 1 not valid!"); } GetSegmentAddresses(PCM.Segments[1].Data, ref PCM); PCM.VIN = GetVIN(PCM.Segments[1].Data); } else { string Msg = "Error:" + Environment.NewLine + "File: " + FileName + " size: " + fsize.ToString() + Environment.NewLine; Msg += "Should be: 16384 bytes, 512kB or 1MB"; throw new FileLoadException(Msg); } PCM.Segments[1].Source = FileName; Logger("[OK]"); this.Close(); return(true); } catch (Exception ex) { Logger(ex.Message); return(false); } }
private static void WriteRIFFFormatChunk(BinaryWriter outStream, PCMData pcm) { int avgBPS = (pcm.SampleRate * BitDepth * pcm.ChannelCount) / 8; short blockAlign = (short)((BitDepth * pcm.ChannelCount) / 8); // Chunk preamble outStream.Write("fmt ".ToCharArray()); outStream.Write(FormatChunkSize); // Chunk data outStream.Write(WAVE_FORMAT_IEEE_FLOAT); outStream.Write(pcm.ChannelCount); outStream.Write(pcm.SampleRate); outStream.Write(avgBPS); outStream.Write(blockAlign); outStream.Write(BitDepth); // NOTE - Don't need to write chunk extension if FormatChunkSize is 16 }