Ejemplo n.º 1
0
        public void Update(byte [] pcm)
        {
            for (int ch = 0; ch < mCh; ++ch)
            {
                mPeakCalcArray[ch].UpdateBegin();
            }

            int sampleBytes = WasapiCS.SampleFormatTypeToUseBitsPerSample(mSampleFormat) / 8;
            int nFrames     = pcm.Length / (mCh * sampleBytes);
            int pos         = 0;

            for (int n = 0; n < nFrames; ++n)
            {
                for (int ch = 0; ch < mCh; ++ch)
                {
                    double v = GetSampleValue(pcm, pos);
                    mPeakCalcArray[ch].NextSample(v);
                    pos += sampleBytes;
                }
            }

            for (int ch = 0; ch < mCh; ++ch)
            {
                mPeakCalcArray[ch].UpdateEnd();
                if (0 < mPeakHoldSec)
                {
                    // 最後のピーク値 x 時間減衰。
                    double lastPeakDb = mLastPeakLevelDb[ch] - ReleaseTimeDbPerSec * mSw.ElapsedMilliseconds / 1000.0;
                    if (mPeakCalcArray[ch].PeakDb < lastPeakDb)
                    {
                        mPeakCalcArray[ch].UpdatePeakDbTo(lastPeakDb);
                    }
                    mLastPeakLevelDb[ch] = mPeakCalcArray[ch].PeakDb;
                }
            }

            mSw.Restart();
        }