Exemplo n.º 1
0
 public CompareCore(DiffWriter dw)
 {
     dw_       = dw;
     count_    = 0;
     max_      = 0;
     hexOut_   = false;
     offset_   = 0;
     diffType_ = true;
 }
Exemplo n.º 2
0
        /// <summary>
        /// Workerスレッド内処理。比較処理を行います。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgWorkerMain_DoWork(object sender, DoWorkEventArgs e)
        {
            DiffWriter sw = null;

            string[] args = (string[])e.Argument;

            int ret = 0;

            try {
                if (args[2] != "")
                {
                    sw = new DiffWriter(args[2]);
                }

                if (m_Comp.type == CompType.Wavs)
                {
                    ret = CompareWav((BackgroundWorker)sender, args, m_Comp, sw);
                }
                else if (m_Comp.type == CompType.RawWav)
                {
                    // 現状ここには来ない
                    ret = CompareWavRaw((BackgroundWorker)sender, args, m_Comp, sw);
                }
                else
                {
                    ret = CompareRaw((BackgroundWorker)sender, args, m_Comp, sw);
                }
            } finally {
                if (sw != null)
                {
                    sw.Close();
                }
            }

            e.Result = ret;
        }
Exemplo n.º 3
0
        private int CompareRaw(BackgroundWorker worker, string[] files, CompareInfo ci, DiffWriter sw)
        {
            CompareCore cc = new CompareCore(sw);

            cc.HexOut = ci.setting.hexOut;

            int ret = 0;

            try {
                using (BinaryReader br1 = new BinaryReader(File.OpenRead(files[0])))
                    using (BinaryReader br2 = new BinaryReader(File.OpenRead(files[1]))) {
                        br1.BaseStream.Seek(0, SeekOrigin.Begin);
                        br2.BaseStream.Seek(0, SeekOrigin.Begin);

                        long limit        = (br1.BaseStream.Length > br2.BaseStream.Length) ? br2.BaseStream.Length : br1.BaseStream.Length;
                        long read         = 0;
                        int  prevProgress = 0;

                        int BLOCK_LENGTH = 2 * 1024 * 1024;
                        while (read < limit)
                        {
                            int size = BLOCK_LENGTH;
                            if (read + BLOCK_LENGTH > limit)
                            {
                                size = (int)(limit - read);
                            }

                            // まとめて読んで
                            byte[] ba1 = br1.ReadBytes(size);
                            byte[] ba2 = br2.ReadBytes(size);

                            // 比較
                            if (cc.CompareLoop(ba1, ba2, read))
                            {
                                ret = 1;
                            }
                            read += size;

                            // 進捗を通知
                            int progress = (int)(read * 100 / limit);
                            if (progress > prevProgress)
                            {
                                prevProgress = progress;
                                worker.ReportProgress(progress);
                            }
                        }
                    }
            } catch {
                return(-1);
            }
            if (sw != null && ret == 1)
            {
                sw.PrintResult(cc.Count, cc.Max);
            }
            return(ret);
        }
Exemplo n.º 4
0
        private int CompareWavRaw(BackgroundWorker worker, string[] files, CompareInfo ci, DiffWriter sw)
        {
            int ret = 0;

            try {
            } catch {
                return(-1);
            }
            return(ret);
        }
Exemplo n.º 5
0
        private int CompareWav(BackgroundWorker worker, string[] files, CompareInfo ci, DiffWriter sw)
        {
            CompareCore cc = new CompareCore(sw);

            cc.HexOut = ci.setting.hexOut;
            int ret = 0;

            try {
                using (RiffReader rr1 = new RiffReader(files[0]))
                    using (RiffReader rr2 = new RiffReader(files[1])) {
                        if (!rr1.Parse())
                        {
                            return(-1);
                        }
                        if (!rr2.Parse())
                        {
                            return(-1);
                        }
                        if (!ci.setting.streamOrigin)
                        {
                            cc.Offset = rr1.StreamOffset;
                        }

                        // 読み込み終端。単位に注意
                        long limit = 0;
                        if (ci.setting.sampleOrder)
                        {
                            limit = (rr1.Samples > rr2.Samples) ? rr2.Samples : rr1.Samples;
                        }
                        else
                        {
                            limit = (rr1.Length > rr2.Length) ? rr2.Length : rr1.Length;
                        }
                        // 現在処理位置。単位に注意
                        long read         = 0;
                        int  prevProgress = 0;

                        int BLOCK_LENGTH = 2 * 1024 * 1024;
                        while (read < limit)
                        {
                            int size = BLOCK_LENGTH;
                            if (read + BLOCK_LENGTH > limit)
                            {
                                size = (int)(limit - read);
                            }

                            if (ci.setting.sampleOrder)
                            {
                                int q = rr1.WaveFormat.BitsPerSample / 8;

                                // まとめて読んで比較
                                if (q == 1)
                                {
                                    byte[] ba1 = rr1.Read8(size);
                                    byte[] ba2 = rr2.Read8(size);
                                    if (cc.CompareLoop(ba1, ba2, read))
                                    {
                                        ret = 1;
                                    }
                                }
                                else if (q == 2)
                                {
                                    short[] sa1 = rr1.Read16(size);
                                    short[] sa2 = rr2.Read16(size);
                                    if (cc.CompareLoop(sa1, sa2, read * q))
                                    {
                                        ret = 1;
                                    }
                                }
                                else if (q == 3)
                                {
                                    int[] sa1 = rr1.Read24(size);
                                    int[] sa2 = rr2.Read24(size);
                                    if (cc.CompareLoop(sa1, sa2, read * q, q))
                                    {
                                        ret = 1;
                                    }
                                }
                                else if (q == 4)
                                {
                                    if (rr1.WaveFormat.FormatTag == WaveFormatTag.IEEE_FLOAT)
                                    {
                                        float[] sa1 = rr1.Read32F(size);
                                        float[] sa2 = rr2.Read32F(size);
                                        if (cc.CompareLoop(sa1, sa2, read * q))
                                        {
                                            ret = 1;
                                        }
                                    }
                                    else
                                    {
                                        int[] sa1 = rr1.Read32(size);
                                        int[] sa2 = rr2.Read32(size);
                                        if (cc.CompareLoop(sa1, sa2, read * q, q))
                                        {
                                            ret = 1;
                                        }
                                    }
                                }
                                else
                                {
                                    return(-1);
                                }
                            }
                            else
                            {
                                // まとめて読んで比較
                                byte[] ba1 = rr1.Read8(size);
                                byte[] ba2 = rr2.Read8(size);
                                if (cc.CompareLoop(ba1, ba2, read))
                                {
                                    ret = 1;
                                }
                            }

                            read += size;

                            // 進捗を通知
                            int progress = (int)(read * 100 / limit);
                            if (progress > prevProgress)
                            {
                                prevProgress = progress;
                                worker.ReportProgress(progress);
                            }
                        }
                    }
            } catch {
                return(-1);
            }
            if (sw != null && ret == 1)
            {
                if (cc.DiffType)
                {
                    sw.PrintResult(cc.Count, cc.Max);
                }
                else
                {
                    sw.PrintResult(cc.Count, cc.fMax);
                }
            }
            return(ret);
        }