source: trunk/src/dsound/OS2SNDBUFFER.CPP@ 46

Last change on this file since 46 was 46, checked in by sandervl, 26 years ago

* empty log message *

File size: 14.9 KB
Line 
1/*
2 * DirectSound SoundBuffer class
3 *
4 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
5 *
6 * Project Odin Software License can be found in LICENSE.TXT
7 *
8 */
9
10
11/*@Const************************************************************************
12* Defined Constants *
13*******************************************************************************/
14#define INCL_DOSMEMMGR
15#define INCL_DIRECTSOUNDBUFFER_GUID
16#define WIN32SDK_NOPOSTWRAPPER
17
18/*@Header***********************************************************************
19* Header Files *
20*******************************************************************************/
21#include <os2.h>
22#include <stdlib.h>
23#include <string.h>
24
25#include "no.h" /* NO* defines for windows.h */
26#include <w_windows.h>
27#include <dsound.h>
28#include <Win32SDKPostWrapper.h>
29
30#include "os2dsound.h"
31#include "os2sndbuffer.h"
32#include "misc.h"
33
34
35/* KSO Apr 19 1999: Set correct interface. *
36 * (INTERFACE is used in the THIS and THIS_ macros) */
37#undef INTERFACE
38#define INTERFACE IDirectSoundBuffer
39
40
41
42//******************************************************************************
43//******************************************************************************
44OS2IDirectSoundBuffer::OS2IDirectSoundBuffer(const DSBUFFERDESC *lpDSBufferDesc) //KSO Apr 13 1999: const, SDK changes
45 : Referenced(0), lastError(DS_OK)
46{
47 APIRET rc;
48
49 lpVtbl = &Vtbl;
50 Vtbl.AddRef = SoundBufAddRef;
51 Vtbl.Release = SoundBufRelease;
52 Vtbl.QueryInterface = SoundBufQueryInterface;
53 Vtbl.GetCaps = SoundBufGetCaps;
54 Vtbl.GetFormat = SoundBufGetFormat;
55 Vtbl.GetVolume = SoundBufGetVolume;
56 Vtbl.GetStatus = SoundBufGetStatus;
57 Vtbl.GetCurrentPosition = SoundBufGetCurrentPosition;
58 Vtbl.GetPan = SoundBufGetPan;
59 Vtbl.Initialize = SoundBufInitialize;
60 Vtbl.Restore = SoundBufRestore;
61 Vtbl.SetFormat = SoundBufSetFormat;
62 Vtbl.SetVolume = SoundBufSetVolume;
63 Vtbl.SetCurrentPosition = SoundBufSetCurrentPosition;
64 Vtbl.SetPan = SoundBufSetPan;
65 Vtbl.Lock = SoundBufLock;
66 Vtbl.Unlock = SoundBufUnlock;
67 Vtbl.Stop = SoundBufStop;
68 Vtbl.Play = SoundBufPlay;
69
70 pan = 0;
71 writepos = 0;
72 playpos = 0;
73 frequency = 22050;
74 status = 0;;
75 fLocked = FALSE;
76 volume = 0;
77 lpfxFormat= NULL;
78 lpBuffer = NULL;
79
80 memcpy(&bufferdesc, lpDSBufferDesc, sizeof(DSBUFFERDESC));
81 if(!(bufferdesc.dwFlags & DSBCAPS_PRIMARYBUFFER)) {
82 if(bufferdesc.lpwfxFormat == NULL || bufferdesc.dwBufferBytes == 0) {
83 dprintf(("bufferdesc not valid!"));
84 lastError = DSERR_INVALIDPARAM;
85 return;
86 }
87 lpfxFormat = (WAVEFORMATEX *)malloc(bufferdesc.lpwfxFormat->cbSize + sizeof(WAVEFORMATEX));
88 memcpy(lpfxFormat, bufferdesc.lpwfxFormat, bufferdesc.lpwfxFormat->cbSize + sizeof(WAVEFORMATEX));
89
90 rc = DosAllocMem((PPVOID)&lpBuffer, bufferdesc.dwBufferBytes, PAG_READ|PAG_WRITE|PAG_COMMIT);
91 if(rc) {
92 dprintf(("DosAllocMem returned %d", rc));
93 lpBuffer = NULL;
94 lastError = DSERR_OUTOFMEMORY;
95 return;
96 }
97 }
98 else {//todo: primary buffer
99 }
100}
101//******************************************************************************
102//******************************************************************************
103OS2IDirectSoundBuffer::~OS2IDirectSoundBuffer()
104{
105 if(lpBuffer)
106 DosFreeMem(lpBuffer);
107 if(lpfxFormat)
108 free(lpfxFormat);
109
110}
111//******************************************************************************
112//******************************************************************************
113HRESULT WIN32API SoundBufQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj)
114{
115 dprintf(("OS2IDirectSoundBuffer::QueryInterface\n"));
116 if(This == NULL) {
117 return DSERR_INVALIDPARAM;
118 }
119 *ppvObj = NULL;
120
121 if(!IsEqualGUID(riid, IID_IDirectSoundBuffer))
122 return E_NOINTERFACE;
123
124 *ppvObj = This;
125
126 SoundBufAddRef(This);
127 return(DS_OK);
128}
129//******************************************************************************
130//******************************************************************************
131ULONG WIN32API SoundBufAddRef(THIS)
132{
133 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
134
135 dprintf(("OS2IDirectSoundBuffer::AddRef %d\n", me->Referenced+1));
136 if(me == NULL) {
137 return 0;
138 }
139 return ++me->Referenced;
140}
141//******************************************************************************
142//******************************************************************************
143ULONG WIN32API SoundBufRelease(THIS)
144{
145 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
146
147 dprintf((" OS2IDirectSoundBuffer::Release %d\n", me->Referenced-1));
148 if(me == NULL) {
149 return 0;
150 }
151 if(me->Referenced) {
152 me->Referenced--;
153 if(me->Referenced == 0) {
154 delete me;
155 return(0);
156 }
157 else return me->Referenced;
158 }
159 else return(0);
160}
161//******************************************************************************
162//******************************************************************************
163HRESULT __stdcall SoundBufGetCaps(THIS_ LPDSBCAPS lpDSCaps)
164{
165 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
166
167 dprintf(("SoundBufGetCaps"));
168 if(me == NULL || lpDSCaps == NULL) {
169 return DSERR_INVALIDPARAM;
170 }
171 return DS_OK;
172}
173//******************************************************************************
174//******************************************************************************
175HRESULT __stdcall SoundBufGetCurrentPosition(THIS_ LPDWORD lpdwCurrentPlayCursor,
176 LPDWORD lpdwCurrentWriteCursor)
177{
178 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
179
180 dprintf(("SoundBufGetCurrentPosition"));
181 if(me == NULL || lpdwCurrentPlayCursor == NULL || lpdwCurrentWriteCursor == NULL) {
182 return DSERR_INVALIDPARAM;
183 }
184 *lpdwCurrentPlayCursor = me->playpos;
185 *lpdwCurrentWriteCursor = me->writepos;
186 return DS_OK;
187}
188//******************************************************************************
189//******************************************************************************
190HRESULT __stdcall SoundBufGetFormat(THIS_ LPWAVEFORMATEX lpwfxFormat,
191 DWORD ddwSizeAllocated, LPDWORD lpdwSizeWritten)
192{
193 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
194 int copysize;
195
196 dprintf(("SoundBufGetFormat"));
197 if(me == NULL || lpwfxFormat == NULL || ddwSizeAllocated == 0) {
198 return DSERR_INVALIDPARAM;
199 }
200 copysize = min(ddwSizeAllocated, (me->lpfxFormat->cbSize + sizeof(WAVEFORMATEX)));
201 memcpy(lpwfxFormat, me->lpfxFormat, copysize);
202
203 if(lpdwSizeWritten) {
204 *lpdwSizeWritten = copysize;
205 }
206 return DS_OK;
207}
208//******************************************************************************
209//******************************************************************************
210HRESULT __stdcall SoundBufGetVolume(THIS_ LPLONG lplVolume)
211{
212 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
213
214 dprintf(("SoundBufGetVolume"));
215 if(me == NULL || lplVolume == NULL) {
216 return DSERR_INVALIDPARAM;
217 }
218 *lplVolume = me->volume;
219 return DS_OK;
220}
221//******************************************************************************
222//******************************************************************************
223HRESULT __stdcall SoundBufGetPan(THIS_ LPLONG lplPan)
224{
225 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
226
227 dprintf(("SoundBufGetPan"));
228 if(me == NULL || lplPan == NULL) {
229 return DSERR_INVALIDPARAM;
230 }
231 *lplPan = me->pan;
232 return DS_OK;
233}
234//******************************************************************************
235//******************************************************************************
236HRESULT __stdcall SoundBufGetFrequency(THIS_ LPDWORD lpdwFrequency)
237{
238 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
239
240 dprintf(("SoundBufGetFrequency"));
241 if(me == NULL || lpdwFrequency == NULL) {
242 return DSERR_INVALIDPARAM;
243 }
244 *lpdwFrequency = me->frequency;
245 return DS_OK;
246}
247//******************************************************************************
248//******************************************************************************
249HRESULT __stdcall SoundBufGetStatus(THIS_ LPDWORD lpdwStatus)
250{
251 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
252
253 dprintf(("SoundBufGetStatus"));
254 if(me == NULL || lpdwStatus == NULL) {
255 return DSERR_INVALIDPARAM;
256 }
257 *lpdwStatus = me->status;
258 return DS_OK;
259}
260//******************************************************************************
261//******************************************************************************
262#if 0 //KSO Apr 19 1999: some parameter incompabilities between newer and older SDKs.
263HRESULT __stdcall SoundBufInitialize(THIS_ LPDIRECTSOUND, LPDSBUFFERDESC )
264#else
265HRESULT __stdcall SoundBufInitialize(THIS_ LPDIRECTSOUND, LPCDSBUFFERDESC )
266#endif
267{
268 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
269
270 dprintf(("SoundBufInitialize"));
271 if(me == NULL) {
272 return DSERR_INVALIDPARAM;
273 }
274 return DSERR_ALREADYINITIALIZED; //todo: for future extensions (dx5/6 ??)
275}
276//******************************************************************************
277//******************************************************************************
278#if 0 //KSO Apr 19 1999: some parameter incompabilities between newer and older SDKs.
279HRESULT __stdcall SoundBufLock(THIS_ DWORD dwWriteCursor, DWORD dwWriteBytes,
280 LPVOID lplpvAudioPtr1, LPDWORD lpdwAudioBytes1,
281 LPVOID lplpvAudioPtr2, LPDWORD lpdwAudioBytes2,
282 DWORD dwFlags)
283#else
284HRESULT __stdcall SoundBufLock(THIS_ DWORD dwWriteCursor, DWORD dwWriteBytes,
285 LPVOID *lplpvAudioPtr1, LPDWORD lpdwAudioBytes1,
286 LPVOID *lplpvAudioPtr2, LPDWORD lpdwAudioBytes2,
287 DWORD dwFlags)
288#endif
289{
290 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
291
292 dprintf(("SoundBufLock"));
293 if(me == NULL || !lplpvAudioPtr1 || !lpdwAudioBytes1) {
294 return(DSERR_INVALIDPARAM);
295 }
296 //not sure if this is an error, but it's certainly a smart thing to do (cond. == true)
297 if(dwWriteBytes > me->bufferdesc.dwBufferBytes) {
298 dprintf(("SoundBufLock: dwWriteBytes > me->bufferdesc.dwBufferBytes"));
299 return(DSERR_INVALIDPARAM);
300 }
301 if(dwFlags & DSBLOCK_FROMWRITECURSOR) {
302 dwWriteCursor = me->writepos;
303 }
304 if(dwWriteCursor + dwWriteBytes > me->bufferdesc.dwBufferBytes ) {
305 *(DWORD *)lplpvAudioPtr1 = (DWORD)(me->lpBuffer + dwWriteCursor);
306 *lpdwAudioBytes1 = me->bufferdesc.dwBufferBytes - dwWriteCursor;
307 if(lplpvAudioPtr2 && lpdwAudioBytes2) {
308 *(DWORD *)lplpvAudioPtr2 = (DWORD)me->lpBuffer;
309 *lpdwAudioBytes2 = dwWriteBytes - *lpdwAudioBytes1;
310 }
311 }
312 else {
313 *(DWORD *)lplpvAudioPtr1 = (DWORD)(me->lpBuffer + dwWriteCursor);
314 *lpdwAudioBytes1 = dwWriteBytes;
315 if(lplpvAudioPtr2 && lpdwAudioBytes2) {
316 *(DWORD *)lplpvAudioPtr2 = 0;
317 *lpdwAudioBytes2 = 0;
318 }
319 }
320 me->fLocked = TRUE;
321 return DS_OK;
322}
323//******************************************************************************
324//******************************************************************************
325HRESULT __stdcall SoundBufPlay(THIS_ DWORD,DWORD,DWORD )
326{
327 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
328
329 dprintf(("SoundBufPlay"));
330 if(me == NULL) {
331 return DSERR_INVALIDPARAM;
332 }
333 return DS_OK;
334}
335//******************************************************************************
336//******************************************************************************
337HRESULT __stdcall SoundBufSetCurrentPosition(THIS_ DWORD dwNewPosition)
338{
339 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
340
341 dprintf(("SoundBufSetCurrentPosition"));
342 if(me == NULL) {
343 return DSERR_INVALIDPARAM;
344 }
345 //todo: check for primary buffer (can't do it with those)
346 me->playpos = dwNewPosition;
347 me->writepos = dwNewPosition;
348 return DS_OK;
349}
350//******************************************************************************
351//******************************************************************************
352#if 0 //KSO Apr 19 1999: some parameter incompabilities between newer and older SDKs.
353HRESULT __stdcall SoundBufSetFormat(THIS_ LPWAVEFORMATEX )
354#else
355HRESULT __stdcall SoundBufSetFormat(THIS_ LPCWAVEFORMATEX )
356#endif
357{
358 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
359
360 dprintf(("SoundBufSetFormat"));
361 if(me == NULL) {
362 return DSERR_INVALIDPARAM;
363 }
364 return DS_OK;
365}
366//******************************************************************************
367//******************************************************************************
368HRESULT __stdcall SoundBufSetVolume(THIS_ LONG lVolume)
369{
370 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
371
372 dprintf(("SoundBufSetVolume"));
373 if(me == NULL) {
374 return DSERR_INVALIDPARAM;
375 }
376 me->volume = lVolume;
377 return DS_OK;
378}
379//******************************************************************************
380//******************************************************************************
381HRESULT __stdcall SoundBufSetPan(THIS_ LONG lPan)
382{
383 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
384
385 dprintf(("SoundBufSetPan"));
386 if(me == NULL) {
387 return DSERR_INVALIDPARAM;
388 }
389 me->pan = lPan;
390 return DS_OK;
391}
392//******************************************************************************
393//******************************************************************************
394HRESULT __stdcall SoundBufSetFrequency(THIS_ DWORD dwFrequency)
395{
396 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
397
398 dprintf(("SoundBufSetFrequency"));
399 if(me == NULL) {
400 return DSERR_INVALIDPARAM;
401 }
402 me->frequency = dwFrequency;
403 return DS_OK;
404}
405//******************************************************************************
406//******************************************************************************
407HRESULT __stdcall SoundBufStop(THIS )
408{
409 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
410
411 dprintf(("SoundBufStop"));
412 if(me == NULL) {
413 return DSERR_INVALIDPARAM;
414 }
415 return DS_OK;
416}
417//******************************************************************************
418//******************************************************************************
419HRESULT __stdcall SoundBufUnlock(THIS_ LPVOID,DWORD,LPVOID,DWORD )
420{
421 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
422
423 dprintf(("SoundBufUnlock"));
424 if(me == NULL) {
425 return DSERR_INVALIDPARAM;
426 }
427 return DS_OK;
428}
429//******************************************************************************
430//******************************************************************************
431HRESULT __stdcall SoundBufRestore(THIS )
432{
433 OS2IDirectSoundBuffer *me = (OS2IDirectSoundBuffer *)This;
434
435 dprintf(("SoundBufRestore"));
436 if(me == NULL) {
437 return DSERR_INVALIDPARAM;
438 }
439 return DS_OK;
440}
441//******************************************************************************
442//******************************************************************************
Note: See TracBrowser for help on using the repository browser.