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());
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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
        }