Esempio n. 1
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);
        }