119 lines
3.2 KiB
C++
119 lines
3.2 KiB
C++
#ifndef _SAMPLE_DEVICE_HPP_
|
|
#define _SAMPLE_DEVICE_HPP_
|
|
#ifndef _COMMON_WINDOWS_HPP_
|
|
#include <common/windows.hpp>
|
|
#endif
|
|
#ifndef _COMMON_WINDOW_HPP_
|
|
#include <common/window.hpp>
|
|
#endif
|
|
#ifndef _SAMPLE_WAVEOUTDEVICE_HPP_
|
|
#include <sample/waveout.hpp>
|
|
#endif
|
|
#ifndef _SAMPLE_WAVEINDEVICE_HPP_
|
|
#include <sample/wavein.hpp>
|
|
#endif
|
|
#ifndef _SAMPLE_WAVEHEADER_HPP_
|
|
#include <sample/wavehdr.hpp>
|
|
#endif
|
|
#ifndef _SAMPLE_WAVEFORM_HPP_
|
|
#include <sample/wave.hpp>
|
|
#endif
|
|
#ifndef _SAMPLE_WAVEFORMATPCM_HPP_
|
|
#include <sample/pcmform.hpp>
|
|
#endif
|
|
|
|
class WaveDevice
|
|
{
|
|
public:
|
|
enum DeviceType{InputDevice,OutputDevice,InvalidDevice};
|
|
enum PlayMode{Wait,NoWait};
|
|
WaveDevice(UINT waveDeviceID,DeviceType waveDeviceType,Window &windowHandler);
|
|
WaveDevice(const WaveDevice &someWaveDevice);
|
|
~WaveDevice();
|
|
WORD play(WaveForm &waveForm,PlayMode playMode=NoWait);
|
|
WORD operator==(const WaveDevice &someWaveDevice)const;
|
|
WaveDevice &operator=(const WaveDevice &someWaveDevice);
|
|
void waveDeviceID(UINT deviceID);
|
|
UINT waveDeviceID(void)const;
|
|
void waveDeviceType(DeviceType waveDeviceType);
|
|
DeviceType waveDeviceType(void)const;
|
|
private:
|
|
enum ErrorCode{InvalidFormat};
|
|
void yieldTask(void)const;
|
|
void getDeviceCapabilities(void);
|
|
void insertHandlers(void);
|
|
void removeHandlers(void);
|
|
void mmSystemErrorMessage(MMRESULT mmResult)const;
|
|
void genericErrorMessage(ErrorCode errorCode)const;
|
|
WORD closeDevice(void);
|
|
WORD openDevice(WaveFormatPCM &waveFormatPCM);
|
|
CallbackData::ReturnType mmOpenHandler(CallbackData &someCallbackData);
|
|
CallbackData::ReturnType mmCloseHandler(CallbackData &someCallbackData);
|
|
CallbackData::ReturnType mmDoneHandler(CallbackData &someCallbackData);
|
|
Callback<WaveDevice> mMMOpenHandler;
|
|
Callback<WaveDevice> mMMCloseHandler;
|
|
Callback<WaveDevice> mMMDoneHandler;
|
|
UINT mWaveDeviceID;
|
|
DeviceType mDeviceType;
|
|
WaveInCaps mWaveInCaps;
|
|
WaveOutCaps mWaveOutCaps;
|
|
HWAVEOUT mhWaveOut;
|
|
GlobalData<WaveHeader> mGlobalWaveHeader;
|
|
Window &mWindowHandler;
|
|
};
|
|
|
|
inline
|
|
void WaveDevice::waveDeviceID(UINT deviceID)
|
|
{
|
|
mWaveDeviceID=deviceID;
|
|
getDeviceCapabilities();
|
|
}
|
|
|
|
inline
|
|
UINT WaveDevice::waveDeviceID(void)const
|
|
{
|
|
return mWaveDeviceID;
|
|
}
|
|
|
|
inline
|
|
void WaveDevice::waveDeviceType(DeviceType waveDeviceType)
|
|
{
|
|
mDeviceType=waveDeviceType;
|
|
getDeviceCapabilities();
|
|
}
|
|
|
|
inline
|
|
WaveDevice::DeviceType WaveDevice::waveDeviceType(void)const
|
|
{
|
|
return mDeviceType;
|
|
}
|
|
|
|
inline
|
|
void WaveDevice::getDeviceCapabilities(void)
|
|
{
|
|
if(mDeviceType==InputDevice)::waveInGetDevCaps(mWaveDeviceID,&((WAVEINCAPS&)mWaveInCaps),sizeof(mWaveInCaps));
|
|
else if(mDeviceType==OutputDevice)::waveOutGetDevCaps(mWaveDeviceID,&((WAVEOUTCAPS&)mWaveOutCaps),sizeof(mWaveOutCaps));
|
|
}
|
|
|
|
inline
|
|
WORD WaveDevice::operator==(const WaveDevice &someWaveDevice)const
|
|
{
|
|
return (mDeviceType==someWaveDevice.mDeviceType&&mWaveDeviceID==someWaveDevice.mWaveDeviceID);
|
|
}
|
|
|
|
inline
|
|
void WaveDevice::mmSystemErrorMessage(MMRESULT mmResult)const
|
|
{
|
|
String errorString;
|
|
::waveOutGetErrorText(mmResult,(LPSTR)errorString,String::MaxString);
|
|
::MessageBox(::GetFocus(),(LPSTR)errorString,(LPSTR)"WaveDevice",MB_OK);
|
|
}
|
|
|
|
inline
|
|
void WaveDevice::genericErrorMessage(ErrorCode errorCode)const
|
|
{
|
|
if(errorCode==InvalidFormat)::MessageBox(::GetFocus(),(LPSTR)"Invalid Format.",(LPSTR)"WaveDevice",MB_OK);
|
|
return;
|
|
}
|
|
#endif
|