#ifndef _SAMPLE_DEVICE_HPP_ #define _SAMPLE_DEVICE_HPP_ #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_WINDOW_HPP_ #include #endif #ifndef _SAMPLE_WAVEOUTDEVICE_HPP_ #include #endif #ifndef _SAMPLE_WAVEINDEVICE_HPP_ #include #endif #ifndef _SAMPLE_WAVEHEADER_HPP_ #include #endif #ifndef _SAMPLE_WAVEFORM_HPP_ #include #endif #ifndef _SAMPLE_WAVEFORMATPCM_HPP_ #include #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 mMMOpenHandler; Callback mMMCloseHandler; Callback mMMDoneHandler; UINT mWaveDeviceID; DeviceType mDeviceType; WaveInCaps mWaveInCaps; WaveOutCaps mWaveOutCaps; HWAVEOUT mhWaveOut; GlobalData 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