6 #ifndef _INC_cWaveDevice_H
7 #define _INC_cWaveDevice_H
12 #include "../AV/cWaveFormat.h"
15 #include "../WinAPI/cWinResource.h"
39 typedef UINT WAVE_DEVICEID_t;
40 typedef UINT WAVE_DEVPID_t;
52 cRefPtr<cWaveDevice> m_pDevice;
55 CWinGlobalT<WAVEHDR> m_wh;
56 bool m_bManageDataBuffer;
59 cWaveHeaderBase(
void* pDataBuffer =
nullptr,
size_t dwBufferLength = 0);
62 void UnprepareDevice();
63 HRESULT PrepareDevice(cWaveDevice* pDevice);
66 bool AttachData(
void* pDataBuffer,
size_t dwBufferLength);
68 WAVEHDR* get_wh() const noexcept
70 return m_wh.get_Data();
72 bool isValid() const noexcept
74 WAVEHDR* pwh = get_wh();
77 if (pwh->lpData ==
nullptr)
79 ASSERT(pwh->dwUser == (DWORD_PTR)
this);
82 bool isValidCheck() const noexcept
86 bool isInQueue() const noexcept
91 if (get_wh()->dwFlags & WHDR_INQUEUE)
97 class GRAYLIB_LINK cWaveDevice :
public cRefBase,
public cSoundBase
104 friend class cWaveHeaderBase;
107 WAVE_DEVICEID_t m_uDeviceID;
110 int m_iHeadersInQueue;
113 virtual HRESULT PrepareHeader(WAVEHDR* pwh) = 0;
114 virtual HRESULT UnprepareHeader(WAVEHDR* pwh) = 0;
117 static const WAVE_DEVICEID_t k_NO_ID = ((WAVE_DEVICEID_t)(WAVE_MAPPER - 1));
119 cWaveDevice(WAVE_DEVICEID_t uDeviceID = WAVE_MAPPER);
120 virtual ~cWaveDevice();
122 static WAVE_DEVICEID_t
GRAYCALL FindDeviceByPersistID(
bool bInput, WAVE_DEVPID_t nPersistId);
123 static inline WAVE_DEVPID_t MakePersistID(WORD wPid, WORD wMid)
125 return (WAVE_DEVPID_t)
MAKEDWORD(wPid, wMid);
127 operator HWAVE() const noexcept
131 bool isOpen() const noexcept
135 HWAVE get_Handle() const noexcept
139 void DetachHandle() noexcept
145 WAVE_DEVICEID_t get_DeviceID() const noexcept
151 virtual HRESULT put_DeviceID(WAVE_DEVICEID_t uDeviceID) = 0;
152 virtual WAVE_DEVICEID_t QueryDeviceID()
const = 0;
154 bool isActive() const noexcept
158 int get_HeadersInQueue() const noexcept
160 return m_iHeadersInQueue;
162 int& ref_HeadersInQueue() noexcept
164 return m_iHeadersInQueue;
167 virtual HRESULT OpenWave(
const cWaveFormat& format, DWORD_PTR dwCallback, DWORD_PTR dwInstanceData, DWORD dwOpenFlags) = 0;
168 virtual void CloseWave() = 0;
174 virtual HRESULT GetPosition(MMTIME& Info)
const = 0;
175 virtual HRESULT WriteHeader(cWaveHeaderBase* pHdr) = 0;
178 static cWaveHeaderBase*
GRAYCALL OnHeaderReturn(WAVEHDR* pHdr);
190 virtual HRESULT PrepareHeader(WAVEHDR* pwh)
override;
191 virtual HRESULT UnprepareHeader(WAVEHDR* pwh)
override;
193 cWaveRecorder(WAVE_DEVICEID_t uDeviceID = WAVE_MAPPER);
194 virtual ~cWaveRecorder();
196 operator HWAVEIN()
const
198 return((HWAVEIN)m_hDevice);
200 HWAVEIN get_Handle()
const
202 return((HWAVEIN)m_hDevice);
204 WAVE_DEVPID_t get_PersistID()
const
207 return MakePersistID(m_Caps.wPid, m_Caps.wMid);
210 virtual HRESULT put_DeviceID(WAVE_DEVICEID_t uDeviceID)
override;
211 virtual WAVE_DEVICEID_t QueryDeviceID()
const override;
217 virtual HRESULT OpenWave(
const cWaveFormat& format, DWORD_PTR dwCallback, DWORD_PTR dwInstanceData, DWORD fdwOpenFlags)
override;
218 virtual void CloseWave()
override;
221 virtual HRESULT Start()
override;
222 virtual HRESULT Stop()
override;
223 virtual HRESULT Reset()
override;
225 virtual HRESULT GetPosition(MMTIME& Info)
const override;
226 virtual HRESULT WriteHeader(cWaveHeaderBase* pHdr)
override;
236 virtual HRESULT PrepareHeader(WAVEHDR* pwh)
override;
237 virtual HRESULT UnprepareHeader(WAVEHDR* pwh)
override;
239 cWavePlayer(WAVE_DEVICEID_t uDeviceID = WAVE_MAPPER);
240 virtual ~cWavePlayer();
242 operator HWAVEOUT()
const
244 return((HWAVEOUT)m_hDevice);
246 HWAVEOUT get_Handle()
const
248 return((HWAVEOUT)m_hDevice);
250 WAVE_DEVPID_t get_PersistID()
const
253 return MakePersistID(m_Caps.wPid, m_Caps.wMid);
255 virtual HRESULT put_DeviceID(WAVE_DEVICEID_t uDeviceID)
override;
256 virtual WAVE_DEVICEID_t QueryDeviceID()
const override;
263 virtual HRESULT OpenWave(
const cWaveFormat& format, DWORD_PTR dwCallback, DWORD_PTR dwInstanceData, DWORD fdwOpenFlags)
override;
264 virtual void CloseWave()
override;
266 virtual HRESULT GetPosition(MMTIME& Info)
const override;
267 virtual HRESULT Start()
override;
268 virtual HRESULT Stop()
override;
269 virtual HRESULT Reset()
override;
270 virtual HRESULT WriteHeader(cWaveHeaderBase* pHdr)
override;
278 HRESULT get_PlaybackRate(DWORD& dwRate);
279 HRESULT put_PlaybackRate(DWORD dwRate);
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define HANDLE_NULL
Invalid OS handle for _WIN32. Not invalid OS handle for linux.
Definition: cOSHandle.h:21
#define _GTNSND
Definition: cSoundBase.h:26
#define MAKEDWORD(low, high)
Definition: cTypes.h:32
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
void CloseHandle()
Definition: cHandlePtr.h:79
WORD SOUND_VOL_t
Mono Attenuation of the audio. linear perception 0 to k_VOL_MAX(0xffff). NOT decibels.
Definition: cSoundBase.h:29
DWORD SOUND_VOL2_t
Stereo linear perceived volume. LOWORD(left) HIWORD(right)
Definition: cSoundBase.h:30
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14