public override void UninitializeAudio() { if (null != _audioEndpointVolume) { _audioEndpointVolume.UnregisterControlChangeNotify(classCallBack); } if (null != _audioClient) { _audioClient.Stop(); } if (null != _audioMeter) { //For wait audio meter thread stop. then release memory Thread.Sleep(100); Marshal.ReleaseComObject(_audioMeter); _audioMeter = null; } if (null != _audioClient) { Marshal.ReleaseComObject(_audioClient); _audioClient = null; } if (null != _audioEndpointVolume) { Marshal.ReleaseComObject(_audioEndpointVolume); _audioEndpointVolume = null; } if (null != waveFormat) { waveFormat = null; } base.UninitializeAudio(); }
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); } }
/// <summary> /// The Setup Wave Format /// </summary> /// <param name="_waveFormat"></param> private void SetupWaveFormat(WAVEFORMATEXTENSION _waveFormat) { switch (_waveFormat.WFormatTag) { case WaveFormat.Extensible: _waveFormat.WBitsPerSample = 16; _waveFormat.NBlockAlign = (ushort)(_waveFormat.NChannels * _waveFormat.WBitsPerSample / 8); _waveFormat.NAvgBytesPerSec = _waveFormat.NBlockAlign * _waveFormat.NSamplesPerSec; break; } }
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); }