mirror of
https://github.com/microsoft/Microsoft-3D-Movie-Maker.git
synced 2024-11-25 03:33:22 +01:00
129 lines
3.2 KiB
C++
129 lines
3.2 KiB
C++
/* Copyright (c) Microsoft Corporation.
|
|
Licensed under the MIT License. */
|
|
|
|
/***************************************************************************
|
|
|
|
srec.h: Sound Recording class
|
|
|
|
Primary Author: ****** (based on ***** original srec)
|
|
Review Status: reviewed
|
|
|
|
BASE ---> SREC
|
|
|
|
***************************************************************************/
|
|
#ifndef SREC_H
|
|
#define SREC_H
|
|
|
|
#include "audioman.h"
|
|
|
|
/****************************************
|
|
RIFF Header helper class
|
|
****************************************/
|
|
#ifdef MAC
|
|
#define RIFF_TAG 'RIFF'
|
|
#define WAVE_TAG 'WAVE'
|
|
#define FMT__TAG 'fmt '
|
|
#define DATA_TAG 'data'
|
|
#define FACT_TAG 'fact'
|
|
#else
|
|
#define RIFF_TAG 'FFIR' // RIFF
|
|
#define WAVE_TAG 'EVAW' // WAVE
|
|
#define FMT__TAG ' tmf' // fmt_
|
|
#define DATA_TAG 'atad' // data
|
|
#define FACT_TAG 'tcaf' // fact
|
|
#endif
|
|
|
|
|
|
#pragma pack(push, _SOCPACK_)
|
|
#pragma pack(1)
|
|
|
|
class RIFF
|
|
{
|
|
private:
|
|
DWORD _dwRiffTag;
|
|
DWORD _dwRiffLength;
|
|
DWORD _dwWaveTag;
|
|
DWORD _dwFmtTag;
|
|
DWORD _dwFmtLength;
|
|
WAVEFORMATEX _wfx;
|
|
DWORD _dwDataTag;
|
|
DWORD _dwDataLength;
|
|
public:
|
|
void Set(long cchan, long csampSec, long cbSample, DWORD dwLength)
|
|
{
|
|
_dwRiffTag = RIFF_TAG;
|
|
_dwRiffLength = sizeof(RIFF) + dwLength;
|
|
_dwWaveTag = WAVE_TAG;
|
|
_dwFmtTag = FMT__TAG;
|
|
_dwFmtLength = sizeof(WAVEFORMATEX);
|
|
_wfx.wFormatTag = WAVE_FORMAT_PCM;
|
|
_wfx.nChannels = (ushort)cchan;
|
|
_wfx.nSamplesPerSec = csampSec;
|
|
_wfx.nAvgBytesPerSec = csampSec * cbSample * cchan;
|
|
_wfx.nBlockAlign = (ushort)cchan * (ushort)cbSample;
|
|
_wfx.wBitsPerSample = (ushort)LwMul(8, cbSample);
|
|
_wfx.cbSize = 0;
|
|
_dwDataTag = DATA_TAG;
|
|
_dwDataLength = dwLength;
|
|
}
|
|
|
|
LPWAVEFORMATEX PwfxGet() { return &_wfx; };
|
|
|
|
DWORD Cb() { return sizeof(RIFF) + _dwDataLength; };
|
|
};
|
|
#pragma pack(pop, _SOCPACK_)
|
|
|
|
/****************************************
|
|
The sound recording class
|
|
****************************************/
|
|
typedef class SREC *PSREC;
|
|
#define SREC_PAR BASE
|
|
#define kclsSREC 'SREC'
|
|
class SREC : public SREC_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
MARKMEM
|
|
|
|
protected:
|
|
long _csampSec; // sampling rate (number of samples per second)
|
|
long _cchan; // 1 = mono, 2 = stereo
|
|
long _cbSample; // bytes per sample (1 = 8 bit, 2 = 16 bit, etc)
|
|
ulong _dtsMax; // maximum length to record
|
|
bool _fRecording;
|
|
bool _fPlaying;
|
|
bool _fHaveSound; // have you recorded a sound yet?
|
|
bool _fBufferAdded; // have added record buffer
|
|
|
|
HWAVEIN _hwavein; // handle to wavein device
|
|
WAVEHDR _wavehdr; // wave hdr for buffer
|
|
|
|
LPMIXER _pmixer; // pointer to Audioman Mixer
|
|
LPCHANNEL _pchannel;// pointer to Audioman Channel
|
|
LPSOUND _psnd; // psnd for current sound
|
|
RIFF *_priff; // pointer to riff in memory
|
|
|
|
bool _FOpenRecord();
|
|
bool _FCloseRecord();
|
|
static void _WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
|
|
|
|
protected:
|
|
bool _FInit(long csampSec, long cchan, long cbSample, ulong dtsMax);
|
|
void _UpdateStatus(void);
|
|
|
|
public:
|
|
static PSREC PsrecNew(long csampSec, long cchan, long cbSample, ulong dtsMax);
|
|
~SREC(void);
|
|
|
|
bool FStart(void);
|
|
bool FStop(void);
|
|
bool FPlay(void);
|
|
bool FRecording(void);
|
|
bool FPlaying(void);
|
|
bool FSave(PFNI pfni);
|
|
bool FHaveSound(void) { return _fHaveSound; }
|
|
};
|
|
|
|
|
|
#endif SREC_H
|