private void ComputeDo3Band(byte[] pkgData, long lBytesToWrite, WAVEFORMATEXTENSION _waveFormat)
        {
            if (GetAudioData(pkgData, lBytesToWrite, _waveFormat))
            {
                EQSTATE eqs = new EQSTATE();
                AudioBandsConfig.init_3band_state(eqs, LowFrequence, HighFrequence, (int)_waveFormat.NSamplesPerSec);
                //for (int i = 0; i < m_nNumSamples; i++)
                for (int i = 0; i < m_RealIn_RT.Count; i++)
                {
                    m_Band_arr.Add(AudioBandsConfig.do_3band(eqs, m_RealIn_RT[i]));
                    m_BandLow_arr.Add(AudioBandsConfig.do_3bandLow(eqs, m_RealIn_LT[i]));
                }
                double A2, dSum = 0, A2Low, dSumLow = 0;
                for (int i = 0; i < m_Band_arr.Count; i++)
                {
                    A2       = m_Band_arr[i] * m_Band_arr[i];
                    dSum    += A2;
                    A2Low    = m_BandLow_arr[i] * m_BandLow_arr[i];
                    dSumLow += A2Low;
                }
                double dAvg    = dSum / m_nNumSamples;
                double dAvgLow = dSumLow / m_nNumSamples;

                double dFinal    = Math.Sqrt(dAvg);
                double dFinalLow = Math.Sqrt(dAvgLow);

                double dOutput    = dFinal * Math.Sqrt(2) / 32768 * 100;
                double dOutputLow = dFinalLow * Math.Sqrt(2) / 32768 * 100;
                _audiopluseCallBack(dOutput, dOutputLow);
            }
        }
        private bool GetAudioData(byte[] pkgData, long lBytesToWrite, WAVEFORMATEXTENSION waveFormat)
        {
            const double FFT_SPEED     = 0.006;
            var          m_nBufferSize = AudioBandsConfig.NextPowerOfTwo((int)(waveFormat.NAvgBytesPerSec * FFT_SPEED));

            m_nNumSamples = m_nBufferSize / waveFormat.NBlockAlign;
            //m_RealIn_RT.Clear();
            //m_RealIn_LT.Clear();
            //m_Band_arr.Clear();
            //m_BandLow_arr.Clear();
            switch (waveFormat.WBitsPerSample)
            {
            case 8:
                break;

            case 16:
                if (waveFormat.NChannels == 1)     // mono
                {
                    int Samples = m_nNumSamples >> 1;
                    for (int i = 0; i < Samples; ++i)
                    {
                        m_RealIn_RT[i] = (float)(pkgData[i]);
                        m_RealIn_LT[i] = m_RealIn_RT[i];
                    }
                    m_nNumSamples = Samples;
                }
                //else if (waveFormat.NChannels == 2) // stereo
                else
                {
                    // Stereo has Left+Right channels
                    int Samples = m_nNumSamples >> 2;
                    //for (int i = 0, j = 0; i < Samples; ++i, j += 2)
                    for (int i = 0, j = 0; i < pkgData.Length; ++i, j += 2)
                    {
                        if (j >= pkgData.Length)
                        {
                            continue;
                        }
                        if (pkgData[j] == 0)
                        {
                            m_RealIn_RT.Add(0);
                            if (pkgData[j + 1] == 0)
                            {
                                m_RealIn_LT.Add(0);
                            }
                            else if (pkgData[j + 1] != 0)
                            {
                                m_RealIn_LT.Add((float)(pkgData[j + 1]));
                            }
                        }
                        else
                        {
                            m_RealIn_RT.Add((float)(pkgData[j]));
                            m_RealIn_LT.Add((float)(pkgData[j + 1]));
                        }
                        m_nNumSamples = Samples;
                    }
                }
                break;
            }
            return(true);
        }