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

📄 wavein.h

📁 声卡的数据分析,用于采集声卡的数据进行分析
💻 H
字号:
#if !defined WAVEIN_H
#define WAVEIN_H

#include "thread.h"
#include <windows.h>
#include <mmsystem.h>

class WaveFormat: public WAVEFORMATEX
{
public:
    WaveFormat ( 
        WORD    nCh, // number of channels (mono, stereo)
        DWORD   nSampleRate, // sample rate
        WORD    BitsPerSample)
	{
		wFormatTag = WAVE_FORMAT_PCM;
		nChannels = nCh;
		nSamplesPerSec = nSampleRate;
		nAvgBytesPerSec = nSampleRate * nCh * BitsPerSample/8;
		nBlockAlign = nChannels * BitsPerSample/8;
		wBitsPerSample = BitsPerSample;
		cbSize = 0;
	}   

	bool isInSupported (UINT idDev)
	{
		MMRESULT result = waveInOpen
			(0, idDev, this, 0, 0, WAVE_FORMAT_QUERY);
		return result == MMSYSERR_NOERROR;
	}
};

class WaveHeader: public WAVEHDR
{
public:
    bool IsDone () const { return dwFlags & WHDR_DONE; }
};

class WaveInDevice
{
public:
	WaveInDevice ();
	WaveInDevice (UINT idDev, WaveFormat& format, Event& event);
	~WaveInDevice ();
	bool    Open (UINT idDev, WaveFormat& format, Event& event);
	void    Reset ();
	bool    Close ();
	void    Prepare (WaveHeader * pHeader);
	void    UnPrepare (WaveHeader * pHeader);
	void    SendBuffer (WaveHeader * pHeader);
	bool    Ok () { return _status == MMSYSERR_NOERROR; }
	void    Start () { waveInStart(_handle); }
	void    Stop () { waveInStop(_handle); }
	bool    isInUse () { return _status == MMSYSERR_ALLOCATED; }
	DWORD   GetPosSample ();
	UINT    GetError () { return _status; }
	void    GetErrorText (char* buf, int len);
private:
	HWAVEIN		_handle;
	MMRESULT	_status;
};

inline WaveInDevice::WaveInDevice ()
{
	_status = MMSYSERR_BADDEVICEID;
}

inline WaveInDevice::WaveInDevice (UINT idDev, WaveFormat& format, Event& event)
{
	Open (idDev, format, event);
}

inline WaveInDevice::~WaveInDevice ()
{
	if (Ok())
	{
		waveInReset(_handle);
		waveInClose (_handle);
	}
}

inline bool WaveInDevice::Open (UINT idDev, WaveFormat& format, Event& event)
{
	_status = waveInOpen (
        &_handle, 
        idDev, 
        &format, 
        (DWORD) HANDLE (event),
        0, // callback instance data
        CALLBACK_EVENT);

	return Ok();
}

inline void WaveInDevice::Reset ()
{
	if (Ok())
		waveInReset (_handle);
}

inline bool WaveInDevice::Close ()
{
	if ( Ok() && waveInClose (_handle) == 0)
	{
		_status = MMSYSERR_BADDEVICEID;
		return true;
	}
	else
		return false;
}

inline void WaveInDevice::Prepare (WaveHeader * pHeader)
{
	waveInPrepareHeader(_handle, pHeader, sizeof(WAVEHDR));
}

inline void WaveInDevice::SendBuffer (WaveHeader * pHeader)
{
	waveInAddBuffer (_handle, pHeader, sizeof(WAVEHDR));
}

inline void WaveInDevice::UnPrepare (WaveHeader * pHeader)
{
	waveInUnprepareHeader (_handle, pHeader, sizeof(WAVEHDR));
}

inline DWORD WaveInDevice::GetPosSample ()
{
	MMTIME mtime;
	mtime.wType = TIME_SAMPLES;
	waveInGetPosition (_handle, &mtime, sizeof (MMTIME));
	return mtime.u.sample;
}

inline void WaveInDevice::GetErrorText (char* buf, int len)
{
	waveInGetErrorText (_status, buf, len);
}

#endif

⌨️ 快捷键说明

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