13,825
社区成员
发帖
与我相关
我的任务
分享
//---------------------------------------------------------------------------
#ifndef TAudioIOH
#define TAudioIOH
//---------------------------------------------------------------------------
#include "Main.h"
#include <mmsystem.h>
//本类用于声卡两个声道的输出,用于两路电源的开关控制
class TAudioIO
{
private:
Byte* _Output; //输出信号
WAVEFORMATEX _WaveFormatEx;
HWAVEOUT _hWaveOut;
WAVEHDR _lpHdrOut;
public:
Byte* _Input; //输入信号
public:
TAudioIO(void);
~TAudioIO(void);
void AudioOutStart(void);
void AudioOutStop(void);
void SetRCOutput(bool); //设置右通道输出数据,参数为true时为高电平,反之为低电平
void SetLCOutput(bool); //设置左通道输出数据,参数为true时为高电平,反之为低电平
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "TAudioIO.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
TAudioIO::TAudioIO(void)
{
_WaveFormatEx.wFormatTag = WAVE_FORMAT_PCM;
_WaveFormatEx.nChannels = 2;
_WaveFormatEx.wBitsPerSample = 8;
_WaveFormatEx.cbSize = 0;
_WaveFormatEx.nSamplesPerSec = 8000;
_WaveFormatEx.nAvgBytesPerSec = _WaveFormatEx.nChannels * _WaveFormatEx.nSamplesPerSec * _WaveFormatEx.wBitsPerSample/8;
_WaveFormatEx.nBlockAlign = _WaveFormatEx.nChannels * _WaveFormatEx.wBitsPerSample/8;
_Output = new Byte[_WaveFormatEx.nSamplesPerSec*2];
memset(_Output,0,_WaveFormatEx.nSamplesPerSec*2);
_lpHdrOut.lpData = _Output;
_lpHdrOut.dwBufferLength = _WaveFormatEx.nSamplesPerSec * _WaveFormatEx.nBlockAlign;
_lpHdrOut.dwFlags = WHDR_BEGINLOOP|WHDR_ENDLOOP;
_lpHdrOut.dwLoops = 0xFFFFFFFF;
_hWaveOut = NULL;
}
//---------------------------------------------------------------------------
TAudioIO::~TAudioIO(void)
{
AudioOutStop();
delete[] _Output;
}
//---------------------------------------------------------------------------
void TAudioIO::AudioOutStart(void)
{
waveOutOpen(&_hWaveOut,WAVE_MAPPER,&_WaveFormatEx,0,0,0);
waveOutPrepareHeader(_hWaveOut,&_lpHdrOut,sizeof(WAVEHDR));
waveOutWrite(_hWaveOut,&_lpHdrOut,sizeof(WAVEHDR));
}
//---------------------------------------------------------------------------
void TAudioIO::AudioOutStop(void)
{
waveOutReset(_hWaveOut);
waveOutClose(_hWaveOut);
waveOutUnprepareHeader(_hWaveOut,&_lpHdrOut,sizeof(WAVEHDR));
}
//---------------------------------------------------------------------------
void TAudioIO::SetRCOutput(bool VTag)
{
if(VTag == true)
{
for(unsigned int i=0;i<_WaveFormatEx.nSamplesPerSec;i++)
{
_Output[i*2+1] = 255;
}
}
else
{
for(unsigned int i=0;i<_WaveFormatEx.nSamplesPerSec;i++)
{
_Output[i*2+1] = 0;
}
}
}
//---------------------------------------------------------------------------
void TAudioIO::SetLCOutput(bool VTag)
{
if(VTag == true)
{
for(unsigned int i=0;i<_WaveFormatEx.nSamplesPerSec;i++)
{
_Output[i*2] = 255;
}
}
else
{
for(unsigned int i=0;i<_WaveFormatEx.nSamplesPerSec;i++)
{
_Output[i*2] = 0;
}
}
}
//---------------------------------------------------------------------------