source: branches/gcc-kmk/src/dsound/os2dsound.cpp@ 21692

Last change on this file since 21692 was 21692, checked in by dmik, 14 years ago

Normalize file case.

Change all uppercase filenames and extensions to lowercase (except well known cases like LICENSE.TXT and so on).

File size: 10.5 KB
Line 
1/* $Id: OS2DSOUND.CPP,v 1.8 2001-03-10 06:21:06 mike Exp $ */
2
3/*
4 * DirectSound main class
5 *
6 * Copyright 1998 Sander van Leeuwen
7 * Copyright 2000 Kevin Langman
8 * Copyright 2001 Michal Necasek
9 *
10 * Project Odin Software License can be found in LICENSE.TXT
11 *
12 */
13
14/*@Header***********************************************************************
15* Header Files *
16*******************************************************************************/
17#include <os2win.h>
18#include <stdlib.h>
19#include <string.h>
20
21#include <stdio.h> /****** DEBUGGING ********/
22
23#define CINTERFACE
24#include <dsound.h>
25
26#include "OS2DSound.h"
27#include "OS2SndBuffer.h"
28#include "OS2PrimBuff.h"
29#include "OS23DListener.h"
30#include "OS2Notify.h"
31#include <misc.h>
32
33// TODO: handle cooperative levels properly!!
34
35// this flag is set if the OS2IDirectObject exists
36BOOL OS2IDirectSound::fDSExists = FALSE;
37
38//******************************************************************************
39//******************************************************************************
40OS2IDirectSound::OS2IDirectSound(const GUID *lpGUID) : Referenced(0),
41 lastError(DS_OK), hwndClient(0)
42{
43 lpVtbl = &Vtbl;
44 Vtbl.fnAddRef = SoundAddRef;
45 Vtbl.fnRelease = SoundRelease;
46 Vtbl.fnQueryInterface = SoundQueryInterface;
47 Vtbl.fnCompact = SoundCompact;
48 Vtbl.fnCreateSoundBuffer = SoundCreateSoundBuffer;
49 Vtbl.fnGetCaps = SoundGetCaps;
50 Vtbl.fnDuplicateSoundBuffer = SoundDuplicateSoundBuffer;
51 Vtbl.fnSetCooperativeLevel = SoundSetCooperativeLevel;
52 Vtbl.fnCompact = SoundCompact;
53 Vtbl.fnGetSpeakerConfig = SoundGetSpeakerConfig;
54 Vtbl.fnSetSpeakerConfig = SoundSetSpeakerConfig;
55 Vtbl.fnInitialize = SoundInitialize;
56
57 dprintf(("DSOUND-OS2IDirectSound::OS2IDirectSound"));
58
59 speakerConfig = DSSPEAKER_STEREO;
60 CoopLevel = DSSCL_EXCLUSIVE; //default
61
62 OS2IDirectSound::fDSExists = TRUE;
63
64 // Create the primary buffer
65 primary = new OS2PrimBuff(this, /*lpDSBufferDesc*/NULL);
66 if (primary == NULL){
67 lastError = DSERR_OUTOFMEMORY;
68 return ;
69 }
70 if ( primary->GetLastError() != DS_OK ){
71 ULONG lastErr = primary->GetLastError();
72 dprintf(("LastErr = %d", lastErr));
73 delete primary;
74 lastError = lastErr;
75 return;
76 }
77 primary->Vtbl.fnAddRef(primary);
78
79 dprintf(("Sound init OK"));
80}
81
82//******************************************************************************
83//******************************************************************************
84OS2IDirectSound::~OS2IDirectSound()
85{
86 // TODO: Close all SoundBuffers here
87 OS2IDirectSoundBuffer::DestroyAllBuffers();
88 OS2IDirectSound::fDSExists = FALSE;
89}
90
91//******************************************************************************
92//******************************************************************************
93HRESULT WIN32API SoundQueryInterface(THIS, REFIID riid, LPVOID * ppvObj)
94{
95 dprintf(("DSOUND-OS2IDirectSound::QueryInterface"));
96 if (This == NULL) {
97 return DSERR_INVALIDPARAM;
98 }
99 *ppvObj = NULL;
100
101 if (!IsEqualGUID(riid, &CLSID_DirectSound) &&
102 !IsEqualGUID(riid, &IID_IDirectSound))
103 return E_NOINTERFACE;
104
105 *ppvObj = This;
106
107 SoundAddRef(This);
108 return DS_OK;
109}
110
111//******************************************************************************
112//******************************************************************************
113ULONG WIN32API SoundAddRef(THIS)
114{
115 OS2IDirectSound *me = (OS2IDirectSound *)This;
116
117 dprintf(("DSOUND-OS2IDirectSound::AddRef %d", me->Referenced+1));
118 return ++me->Referenced;
119}
120
121//******************************************************************************
122//******************************************************************************
123ULONG WIN32API SoundRelease(THIS)
124{
125 OS2IDirectSound *me = (OS2IDirectSound *)This;
126
127 dprintf(("DSOUND-OS2IDirectSound::Release %d", me->Referenced-1));
128 if (me->Referenced) {
129 me->Referenced--;
130 if (me->Referenced == 0) {
131 delete me;
132 return 0;
133 }
134 else
135 return me->Referenced;
136 }
137 else
138 return 0;
139}
140
141//******************************************************************************
142//******************************************************************************
143HRESULT WIN32API SoundCompact(THIS)
144{
145 dprintf(("DSOUND-OS2IDirectSound::Compact - NOP"));
146 return DS_OK;
147}
148
149//******************************************************************************
150//******************************************************************************
151HRESULT WIN32API SoundCreateSoundBuffer(THIS_
152 LPDSBUFFERDESC lpDSBufferDesc, //new, const
153 LPDIRECTSOUNDBUFFER *lplpDirectSoundBuffer,
154 LPUNKNOWN pUnkOuter)
155{
156 OS2IDirectSound *me = (OS2IDirectSound *)This;
157 OS2IDirectSoundBuffer *sndbuf;
158
159 dprintf(("DSOUND-OS2IDirectSound::CreateSoundBuffer"));
160 if (me == NULL || lpDSBufferDesc == NULL || lplpDirectSoundBuffer == NULL) {
161 return DSERR_INVALIDPARAM;
162 }
163
164 if ((lpDSBufferDesc->dwFlags & DSBCAPS_PRIMARYBUFFER) && (lpDSBufferDesc->lpwfxFormat != NULL)) {
165 // Primary buffers must be created without format info!
166 return DSERR_INVALIDPARAM;
167 }
168
169 if (lpDSBufferDesc->dwFlags & DSBCAPS_PRIMARYBUFFER) {
170 *lplpDirectSoundBuffer = (LPDIRECTSOUNDBUFFER)me->primary;
171 return DS_OK;
172 }
173
174 sndbuf = new OS2IDirectSoundBuffer(me, lpDSBufferDesc);
175 if (sndbuf == NULL) {
176 return DSERR_OUTOFMEMORY;
177 }
178 if (sndbuf->GetLastError() != DS_OK) {
179 ULONG lastErr = sndbuf->GetLastError();
180 delete sndbuf;
181 return lastErr;
182 }
183 sndbuf->Vtbl.fnAddRef(sndbuf);
184
185 *lplpDirectSoundBuffer = (LPDIRECTSOUNDBUFFER)sndbuf;
186
187 return DS_OK;
188}
189
190//******************************************************************************
191//******************************************************************************
192HRESULT WIN32API SoundGetCaps(THIS_ LPDSCAPS lpCaps)
193{
194 dprintf(("DSOUND-OS2IDirectSound::GetCaps"));
195
196 if (lpCaps == NULL)
197 return DSERR_INVALIDPARAM;
198
199 lpCaps->dwSize = sizeof(DSCAPS);
200 lpCaps->dwFlags = DSCAPS_SECONDARY8BIT | DSCAPS_SECONDARY16BIT |
201 DSCAPS_SECONDARYMONO | DSCAPS_SECONDARYSTEREO |
202 DSCAPS_PRIMARY8BIT | DSCAPS_PRIMARY16BIT |
203 /* DSCAPS_PRIMARYMONO |*/ DSCAPS_PRIMARYSTEREO;
204 lpCaps->dwMinSecondarySampleRate = 100;
205 lpCaps->dwMaxSecondarySampleRate = 100000;
206 lpCaps->dwPrimaryBuffers = 1;
207 lpCaps->dwMaxHwMixingAllBuffers = 0; // no HW support, no HW buffers...
208 lpCaps->dwMaxHwMixingStaticBuffers = 0;
209 lpCaps->dwMaxHwMixingStreamingBuffers = 0;
210 lpCaps->dwFreeHwMixingAllBuffers = 0;
211 lpCaps->dwFreeHwMixingStaticBuffers = 0;
212 lpCaps->dwFreeHwMixingStreamingBuffers = 0;
213 lpCaps->dwMaxHw3DAllBuffers = 0;
214 lpCaps->dwMaxHw3DStaticBuffers = 0;
215 lpCaps->dwMaxHw3DStreamingBuffers = 0;
216 lpCaps->dwFreeHw3DAllBuffers = 0;
217 lpCaps->dwFreeHw3DStaticBuffers = 0;
218 lpCaps->dwFreeHw3DStreamingBuffers = 0;
219 lpCaps->dwTotalHwMemBytes = 0;
220 lpCaps->dwFreeHwMemBytes = 0;
221 lpCaps->dwMaxContigFreeHwMemBytes = 0;
222 lpCaps->dwUnlockTransferRateHwBuffers = 0; // no transfer needed
223 lpCaps->dwPlayCpuOverheadSwBuffers = 0; // we lie here...
224 lpCaps->dwReserved1 = 0;
225 lpCaps->dwReserved2 = 0;
226
227 return DS_OK;
228}
229
230//******************************************************************************
231//******************************************************************************
232HRESULT WIN32API SoundDuplicateSoundBuffer(THIS_ LPDIRECTSOUNDBUFFER lpBuf, LPLPDIRECTSOUNDBUFFER lplpDirectSoundBuffer)
233{
234 OS2IDirectSound *me = (OS2IDirectSound *)This;
235 OS2IDirectSoundBuffer *srcBuf = (OS2IDirectSoundBuffer*)lpBuf;
236 OS2IDirectSoundBuffer *tgtBuf;
237
238 dprintf(("DSOUND-OS2IDirectSound::DuplicateSoundBuffer (%X to %X)", lpBuf, lplpDirectSoundBuffer));
239 if (me == NULL || lpBuf == NULL || lplpDirectSoundBuffer == NULL) {
240 return DSERR_INVALIDPARAM;
241 }
242
243 tgtBuf = new OS2IDirectSoundBuffer(me, srcBuf);
244 if (tgtBuf == NULL) {
245 return DSERR_OUTOFMEMORY;
246 }
247
248 if (tgtBuf->GetLastError() != DS_OK) {
249 ULONG lastErr = tgtBuf->GetLastError();
250 delete tgtBuf;
251 return lastErr;
252 }
253 tgtBuf->Vtbl.fnAddRef(tgtBuf);
254
255 *lplpDirectSoundBuffer = (LPDIRECTSOUNDBUFFER)tgtBuf;
256
257 return DS_OK;
258}
259
260//******************************************************************************
261//******************************************************************************
262HRESULT WIN32API SoundSetCooperativeLevel(THIS_ HWND hwndClient, DWORD level)
263{
264 OS2IDirectSound *me = (OS2IDirectSound *)This;
265
266 dprintf(("DSOUND-OS2IDirectSound::SetCooperativeLevel (to %d)", level));
267 if (me == NULL) {
268 return DSERR_INVALIDPARAM;
269 }
270 me->hwndClient = (HWND)hwndClient;
271 me->CoopLevel = level;
272 return DS_OK;
273}
274
275//******************************************************************************
276//******************************************************************************
277HRESULT WIN32API SoundGetSpeakerConfig(THIS_ LPDWORD lpSpeakerCfg)
278{
279 OS2IDirectSound *me = (OS2IDirectSound *)This;
280
281 dprintf(("DSOUND-OS2IDirectSound::GetSpeakerConfig"));
282 if (me == NULL) {
283 return(DSERR_INVALIDPARAM);
284 }
285 *lpSpeakerCfg = me->speakerConfig;
286
287 return DS_OK;
288}
289
290//******************************************************************************
291//******************************************************************************
292HRESULT WIN32API SoundSetSpeakerConfig(THIS_ DWORD speakerCfg)
293{
294 OS2IDirectSound *me = (OS2IDirectSound *)This;
295
296 dprintf(("DSOUND-OS2IDirectSound::SetSpeakerConfig %X", speakerCfg));
297 if (me == NULL) {
298 return DSERR_INVALIDPARAM;
299 }
300 me->speakerConfig = speakerCfg;
301 return DS_OK;
302}
303
304//******************************************************************************
305//******************************************************************************
306HRESULT WIN32API SoundInitialize(THIS_ LPGUID)
307{
308 dprintf(("DSOUND-OS2IDirectSound::Initialize NOP"));
309 return DS_OK;
310}
311//******************************************************************************
312//******************************************************************************
Note: See TracBrowser for help on using the repository browser.