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

📄 display.cpp

📁 声卡的数据分析,用于采集声卡的数据进行分析
💻 CPP
字号:
#include "display.h"
#include "views.h"
#include "canvas.h"
#include "recorder.h"
#include "fft.h"
#include "winex.h"
#include "wassert.h"

Painter::Painter (
        HWND hwnd,
        ViewWave& viewWave,
        ViewFreq& viewFreq,
        int samplesPerBuf, 
        int samplesPerSec, 
        int fftPoints)
:   _hwnd (hwnd), 
    _viewWave (viewWave),
    _viewFreq (viewFreq),
    _samplesPerBuf (samplesPerBuf),
    _samplesPerSecond (samplesPerSec),
    _fftPoints (fftPoints),
    _bitsPerSample (16),
    _pFftTransformer (fftPoints, samplesPerSec),
    _pRecorder (samplesPerBuf, samplesPerSec)
{
    // Let the caller Resume explicitly
    //_thread.Resume ();
}

void Painter::Run ()
{
    for (;;)
    {
        _event.Wait ();
        if (_isDying)
            return;

        Lock lock (_mutex);
        if (_pRecorder->IsBufferDone ())
            LokWaveInData ();
    }
}

void Painter::FlushThread ()
{
    _event.Release ();
}

bool Painter::ReInit (
        int samplesPerBuf, 
        int samplesPerSec, 
        int fftPoints,
        int bitsPerSample)
{
    Lock lock (_mutex);

    if (_pRecorder->BitsPerSample() == bitsPerSample &&
        _pRecorder->SamplesPerSecond() == samplesPerSec &&
        _pFftTransformer->Points() == fftPoints &&
        _pRecorder->SampleCount() == samplesPerBuf)
    {
        return true;
    }

    _samplesPerBuf = samplesPerBuf;
    _samplesPerSecond = samplesPerSec;
    _fftPoints = fftPoints;
    _bitsPerSample = bitsPerSample;

    bool isStarted = _pRecorder->IsStarted();
    if (isStarted)
        _pRecorder->Stop();

    bool isError = false;

    try
    {
        _pFftTransformer.ReInit ( _fftPoints, _samplesPerSecond);
        _pRecorder.ReInit (_bitsPerSample, _samplesPerBuf, _samplesPerSecond);
    }
    catch ( WinException e )
    {
        char buf[50];
        wsprintf ( buf, "%s, Error %d", e.GetMessage(), e.GetError() );
        MessageBox (0, buf, "Exception", MB_ICONEXCLAMATION | MB_OK);
        isError = true;
    }
    catch (...)
    {
        MessageBox (0, "Unknown", "Exception", MB_ICONEXCLAMATION | MB_OK);
        isError = true;
    }

    if (isStarted)
    {
        isError = !_pRecorder->Start(_event);
    }

    return !isError;
}

bool Painter::Start ()
{
    Lock lock (_mutex);
    return _pRecorder->Start (_event);
}

void Painter::Stop ()
{
    Lock lock (_mutex);
    _pRecorder->Stop ();
}

void Painter::LokWaveInData ()
{
    SampleIter iter (_pRecorder.GetAccess());
    // Quickly release the buffer
    if (!_pRecorder->BufferDone ())
        return;

    _pFftTransformer->CopyIn (iter);
    _pFftTransformer->Transform();
    _viewFreq.Update (_pFftTransformer.GetAccess());
    _viewWave.Update (_pFftTransformer.GetAccess());
}


⌨️ 快捷键说明

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