⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soundstudiofrm.cs

📁 Programing SoundStudioCS
💻 CS
📖 第 1 页 / 共 3 页
字号:
#else
                FFT.Compute(_numSamples, RealIn, null, RealOut, ImagOut, false);
                FFT.Norm(_numSamples / 2, RealOut, ImagOut, AmplOut);
#endif
                double maxAmpl = (_wfmt.BitsPerSample == 8) ? (127.0 * 127.0) : (32767.0 * 32767.0);

                // update meter
                int centerFreq = (_wfmt.SamplesPerSecond / 2);
                for (int i = 0; i < NUM_FREQUENCY; ++i)
                {
                    if (METER_FREQUENCY[i] > centerFreq)
                        _meterData[i] = 0;
                    else
                    {
                        int indice = (int)(METER_FREQUENCY[i] * _numSamples / _wfmt.SamplesPerSecond);
                        int metervalue = (int)(20.0 * Math.Log10(AmplOut[indice] / maxAmpl));
                        _meterData[i] = metervalue;
                    }
                }
                peakMeterCtrl1.SetData(_meterData, 0, NUM_FREQUENCY);
                _numSamples = 0; // ready to do it again
            }
            else
            {
                System.Diagnostics.Trace.WriteLine("GET Audio data failed.");
            }
        }

        bool GetAudioData(IntPtr ptr, int cbSize, WaveFormat wfmt)
        {
            bool samplesReady = false;
            if (cbSize == 0)
                return false; // no data
            switch (wfmt.BitsPerSample)
            {
                case 8:
                    {
                        // NOTE: waveData member is necessary to prevent using 'unsafe' code block
                        Marshal.Copy(ptr, waveData, 0, (int)cbSize);
                        if (wfmt.Channels == 1) // mono
                        {
                            for (uint i = 0; i < cbSize; ++i)
                            {
                                RealIn[i] = (double)((waveData[i] - 128) << 6);// Out = (In-128)*64
                                // LeftIn[i] = RealIn[i]; // Out = (In-128)*64
                            }
                            _numSamples = (uint)cbSize;
                        }
                        else if (wfmt.Channels == 2) // stereo
                        {
                            // Stereo has Right+Left channels
                            int Samples = cbSize >> 1;
                            for (uint i = 0, j = 0; i < Samples; ++i, j += 2)
                            {
                                RealIn[i] = (double)((waveData[j] - 128) << 6); // Out = (In-128)*64
                                // LeftIn[i] = (double)((waveData[j+1]-128)<<6); // Out = (In-128)*64
                            }
                            _numSamples = (uint)Samples;
                        }
                        samplesReady = (_numSamples != 0);
                    }
                    break;
                case 16:
                    {
                        // NOTE: waveData member is necessary to prevent using 'unsafe' code block
                        Marshal.Copy(ptr, waveData, 0, (int)cbSize);
                        if (wfmt.Channels == 1) // mono
                        {
                            int Samples = cbSize >> 1;
                            for (uint i = 0, j = 0; i < Samples; ++i, j += 2)
                            {
                                short val = (short)unchecked(((waveData[j + 1] << 8) + waveData[j]));
                                RealIn[i] = (double)val;
                            }
                            _numSamples = (uint)Samples;
                        }
                        else if (wfmt.Channels == 2) // stereo
                        {
                            // Stereo has Right+Left channels
                            int Samples = cbSize >> 2;
                            for (uint i = 0, j = 0; i < Samples; ++i, j += 4)
                            {
                                short val = unchecked((short)((waveData[j + 1] << 8) + waveData[j])); // right
                                RealIn[i] = (double)val;
                                // val = unchecked((short)((waveData[j+3] << 8) + waveData[j+2])); // left
                            }
                            _numSamples = (uint)Samples;
                        }
                        samplesReady = (_numSamples != 0);
                    }
                    break;
                default:
                    System.Diagnostics.Debug.Assert(false, "Format not supported"); // not supported
                    break;
            }
            return samplesReady;
        }
        bool PutAudioData(IntPtr pbData, int cbSize, int recvBytes, WaveFormat wfmt)
        {
            bool samplesReady = true;
            switch( wfmt.BitsPerSample )
            {
            case 8:
                {
                    // fill with silence - no smoothing
                    if ( cbSize > recvBytes )
                    {
                        MemorySet(pbData, 0x80, (cbSize - recvBytes));
                    }
                }
                break;
            case 16:
            default:
                {
                    // fill with silence - no smoothing
                    if ( cbSize > recvBytes )
                    {
                        MemorySet(pbData, 0x00, (cbSize - recvBytes));
                    }
                }
                break;
            }
            return samplesReady;
        }
        void MemorySet(IntPtr ptrData, byte val, int cb)
        {
            byte[] silence = { val };
            for (int i = 0; i < cb; ++i)
            {
                IntPtr ptrDest = (IntPtr)((int)ptrData + i);
                Marshal.Copy(silence, 0, ptrDest, 1);
            }
        }
        void CreateWaveOutput()
        {
            if (_waveOutput == null)
            {
                _waveOutput = new WaveOutDevice();
                _waveOutput.SetNotifyHandler(this);
            }
        }
        void ReleaseWaveOutput()
        {
            if (_waveOutput != null)
            {
                _waveOutput.Dispose();
                _waveOutput = null;
                ReleaseBuffers();
            }
            ReleaseMixerDevice();
            if (_AudioStream != null)
            {
                _AudioStream.Dispose();
                _AudioStream = null;
            }
            if (_MediaStream != null)
            {
                _MediaStream.Dispose();
                _MediaStream = null;
            }
        }
        void CreateMixerDevice()
        {
            if (_mixerDevice == null)
            {
                _mixerDevice = new WaveMixerDevice();
            }
        }
        void ReleaseMixerDevice()
        {
            if (_mixerDevice != null)
            {
                _mixerDevice.Dispose();
                _mixerDevice = null;
                Marshal.FreeHGlobal(_mixerDataPtr);
                _mixerDataPtr = IntPtr.Zero;
            }
        }
        void CreateBuffers()
        {
            if (_waveBuffer == null)
            {
                _waveBuffer = new WaveBuffer[MAX_BUFFERS];
                for (int ii = 0; ii < MAX_BUFFERS; ++ii)
                {
                    _waveBuffer[ii] = new WaveBuffer();
                    _waveBuffer[ii].Allocate((int)_bufferSize);
                }
            }
        }
        void ReleaseBuffers()
        {
            if (_waveBuffer != null)
            {
                for (int ii = 0; ii < MAX_BUFFERS; ++ii)
                {
                    _waveBuffer[ii].Dispose();
                }
                _waveBuffer = null;
            }
        }

        void AllocFFTData()
        {
            int numSamples = (int)_bufferSize / _wfmt.BlockAlign;
            RealIn = new double[numSamples];
            RealOut = new double[numSamples];
            ImagOut = new double[numSamples];
            AmplOut = new double[numSamples];
            waveData = new byte[_bufferSize];
        }
        void ReleaseFFTData()
        {
            RealIn = null;
            RealOut = null;
            ImagOut = null;
            AmplOut = null;
            waveData = null;
        }

        [ConditionalAttribute("DEBUG")]
        void DumpWaveErrorMessage(string message, int error)
        {
            StringBuilder sError = new StringBuilder(256);
            WaveOutput.waveOutGetErrorTextW(error, sError, 256);
            Trace.WriteLine(string.Format("{0} {1}", message, sError.ToString()));
        }

        [ConditionalAttribute("DEBUG")]
        void DumpDebugMessage(string message)
        {
            Trace.WriteLine(message);
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -