Files
Work/sample/holdii/Device.hpp
2024-08-07 09:16:27 -04:00

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