po: Update French translation.
[wine] / dlls / dmusic / port.c
1 /*
2  * IDirectMusicPort Implementation
3  *
4  * Copyright (C) 2003-2004 Rok Mandeljc
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "dmusic_private.h"
22
23 WINE_DEFAULT_DEBUG_CHANNEL(dmusic);
24
25 static inline IDirectMusicPortImpl *impl_from_IDirectMusicPort(IDirectMusicPort *iface)
26 {
27     return CONTAINING_RECORD(iface, IDirectMusicPortImpl, IDirectMusicPort_iface);
28 }
29
30 static inline IDirectMusicPortImpl *impl_from_IDirectMusicPortDownload(IDirectMusicPortDownload *iface)
31 {
32     return CONTAINING_RECORD(iface, IDirectMusicPortImpl, IDirectMusicPortDownload_iface);
33 }
34
35 static inline IDirectMusicPortImpl *impl_from_IDirectMusicThru(IDirectMusicThru *iface)
36 {
37     return CONTAINING_RECORD(iface, IDirectMusicPortImpl, IDirectMusicThru_iface);
38 }
39
40 /* IDirectMusicPortImpl IUnknown part: */
41 static HRESULT WINAPI IDirectMusicPortImpl_QueryInterface(LPDIRECTMUSICPORT iface, REFIID riid, LPVOID *ppobj)
42 {
43         IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
44
45         TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
46
47         if (IsEqualIID (riid, &IID_IUnknown) ||
48             IsEqualGUID(riid, &IID_IDirectMusicPort) ||
49             IsEqualGUID(riid, &IID_IDirectMusicPort8)) {
50                 *ppobj = &This->IDirectMusicPort_iface;
51                 IDirectMusicPort_AddRef((LPDIRECTMUSICPORT)*ppobj);
52                 return S_OK;
53         } else if (IsEqualGUID(riid, &IID_IDirectMusicPortDownload) ||
54                    IsEqualGUID(riid, &IID_IDirectMusicPortDownload8)) {
55                 *ppobj = &This->IDirectMusicPortDownload_iface;
56                 IDirectMusicPortDownload_AddRef((LPDIRECTMUSICPORTDOWNLOAD)*ppobj);
57                 return S_OK;
58         } else if (IsEqualGUID(riid, &IID_IDirectMusicThru) ||
59                    IsEqualGUID(riid, &IID_IDirectMusicThru8)) {
60                 *ppobj = &This->IDirectMusicThru_iface;
61                 IDirectMusicThru_AddRef((LPDIRECTMUSICTHRU)*ppobj);
62                 return S_OK;
63         }
64         WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj);
65         return E_NOINTERFACE;
66 }
67
68 static ULONG WINAPI IDirectMusicPortImpl_AddRef(LPDIRECTMUSICPORT iface)
69 {
70         IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
71         ULONG refCount = InterlockedIncrement(&This->ref);
72
73         TRACE("(%p)->(ref before=%u)\n", This, refCount - 1);
74
75         DMUSIC_LockModule();
76
77         return refCount;
78 }
79
80 static ULONG WINAPI IDirectMusicPortImpl_Release(LPDIRECTMUSICPORT iface)
81 {
82         IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
83         ULONG refCount = InterlockedDecrement(&This->ref);
84
85         TRACE("(%p)->(ref before=%u)\n", This, refCount + 1);
86
87         if (!refCount) {
88                 HeapFree(GetProcessHeap(), 0, This);
89         }
90
91         DMUSIC_UnlockModule();
92
93         return refCount;
94 }
95
96 /* IDirectMusicPortImpl IDirectMusicPort part: */
97 static HRESULT WINAPI IDirectMusicPortImpl_PlayBuffer(LPDIRECTMUSICPORT iface, LPDIRECTMUSICBUFFER buffer)
98 {
99     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
100
101     FIXME("(%p/%p)->(%p): stub\n", iface, This, buffer);
102
103     return S_OK;
104 }
105
106 static HRESULT WINAPI IDirectMusicPortImpl_SetReadNotificationHandle(LPDIRECTMUSICPORT iface, HANDLE event)
107 {
108     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
109
110     FIXME("(%p/%p)->(%p): stub\n", iface, This, event);
111
112     return S_OK;
113 }
114
115 static HRESULT WINAPI IDirectMusicPortImpl_Read(LPDIRECTMUSICPORT iface, LPDIRECTMUSICBUFFER buffer)
116 {
117     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
118
119     FIXME("(%p/%p)->(%p): stub\n", iface, This, buffer);
120
121     return S_OK;
122 }
123
124 static HRESULT WINAPI IDirectMusicPortImpl_DownloadInstrument(LPDIRECTMUSICPORT iface, IDirectMusicInstrument* pInstrument, IDirectMusicDownloadedInstrument** ppDownloadedInstrument, DMUS_NOTERANGE* pNoteRanges, DWORD dwNumNoteRanges)
125 {
126         IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
127
128         FIXME("(%p, %p, %p, %p, %d): stub\n", This, pInstrument, ppDownloadedInstrument, pNoteRanges, dwNumNoteRanges);
129
130         if (!pInstrument || !ppDownloadedInstrument || (dwNumNoteRanges && !pNoteRanges))
131                 return E_POINTER;
132
133         return DMUSIC_CreateDirectMusicDownloadedInstrumentImpl(&IID_IDirectMusicDownloadedInstrument, (LPVOID*)ppDownloadedInstrument, NULL);
134 }
135
136 static HRESULT WINAPI IDirectMusicPortImpl_UnloadInstrument(LPDIRECTMUSICPORT iface, IDirectMusicDownloadedInstrument *downloaded_instrument)
137 {
138     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
139
140     FIXME("(%p/%p)->(%p): stub\n", iface, This, downloaded_instrument);
141
142     return S_OK;
143 }
144
145 static HRESULT WINAPI IDirectMusicPortImpl_GetLatencyClock(LPDIRECTMUSICPORT iface, IReferenceClock** clock)
146 {
147     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
148
149     TRACE("(%p/%p)->(%p)\n", iface, This, clock);
150
151     *clock = This->pLatencyClock;
152     IReferenceClock_AddRef(*clock);
153
154     return S_OK;
155 }
156
157 static HRESULT WINAPI IDirectMusicPortImpl_GetRunningStats(LPDIRECTMUSICPORT iface, LPDMUS_SYNTHSTATS stats)
158 {
159     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
160
161     FIXME("(%p/%p)->(%p): stub\n", iface, This, stats);
162
163     return S_OK;
164 }
165
166 static HRESULT WINAPI IDirectMusicPortImpl_Compact(LPDIRECTMUSICPORT iface)
167 {
168     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
169
170     FIXME("(%p/%p)->(): stub\n", iface, This);
171
172     return S_OK;
173 }
174
175 static HRESULT WINAPI IDirectMusicPortImpl_GetCaps(LPDIRECTMUSICPORT iface, LPDMUS_PORTCAPS port_caps)
176 {
177     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
178
179     TRACE("(%p/%p)->(%p)\n", iface, This, port_caps);
180
181     *port_caps = This->caps;
182
183     return S_OK;
184 }
185
186 static HRESULT WINAPI IDirectMusicPortImpl_DeviceIoControl(LPDIRECTMUSICPORT iface, DWORD io_control_code, LPVOID in_buffer, DWORD in_buffer_size,
187                                                            LPVOID out_buffer, DWORD out_buffer_size, LPDWORD bytes_returned, LPOVERLAPPED overlapped)
188 {
189     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
190
191     FIXME("(%p/%p)->(%d, %p, %d, %p, %d, %p, %p): stub\n", iface, This, io_control_code, in_buffer, in_buffer_size, out_buffer, out_buffer_size, bytes_returned, overlapped);
192
193     return S_OK;
194 }
195
196 static HRESULT WINAPI IDirectMusicPortImpl_SetNumChannelGroups(LPDIRECTMUSICPORT iface, DWORD channel_groups)
197 {
198     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
199
200     FIXME("(%p/%p)->(%d): semi-stub\n", iface, This, channel_groups);
201
202     This->nrofgroups = channel_groups;
203
204     return S_OK;
205 }
206
207 static HRESULT WINAPI IDirectMusicPortImpl_GetNumChannelGroups(LPDIRECTMUSICPORT iface, LPDWORD channel_groups)
208 {
209     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
210
211     TRACE("(%p/%p)->(%p)\n", iface, This, channel_groups);
212
213     *channel_groups = This->nrofgroups;
214
215     return S_OK;
216 }
217
218 static HRESULT WINAPI IDirectMusicPortImpl_Activate(LPDIRECTMUSICPORT iface, BOOL active)
219 {
220     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
221
222     TRACE("(%p/%p)->(%d)\n", iface, This, active);
223
224     This->fActive = active;
225
226     return S_OK;
227 }
228
229 static HRESULT WINAPI IDirectMusicPortImpl_SetChannelPriority(LPDIRECTMUSICPORT iface, DWORD channel_group, DWORD channel, DWORD priority)
230 {
231     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
232
233     FIXME("(%p/%p)->(%d, %d, %d): semi-stub\n", iface, This, channel_group, channel, priority);
234
235     if (channel > 16)
236     {
237         WARN("isn't there supposed to be 16 channels (no. %d requested)?! (faking as it is ok)\n", channel);
238         /*return E_INVALIDARG;*/
239     }
240
241     return S_OK;
242 }
243
244 static HRESULT WINAPI IDirectMusicPortImpl_GetChannelPriority(LPDIRECTMUSICPORT iface, DWORD channel_group, DWORD channel, LPDWORD priority)
245 {
246     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
247
248     TRACE("(%p/%p)->(%u, %u, %p)\n", iface, This, channel_group, channel, priority);
249
250     *priority = This->group[channel_group - 1].channel[channel].priority;
251
252     return S_OK;
253 }
254
255 static HRESULT WINAPI IDirectMusicPortImpl_SetDirectSound(LPDIRECTMUSICPORT iface, LPDIRECTSOUND direct_sound, LPDIRECTSOUNDBUFFER direct_sound_buffer)
256 {
257     IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
258
259     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, direct_sound, direct_sound_buffer);
260
261     return S_OK;
262 }
263
264 static HRESULT WINAPI IDirectMusicPortImpl_GetFormat(LPDIRECTMUSICPORT iface, LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize, LPDWORD pdwBufferSize)
265 {
266         IDirectMusicPortImpl *This = impl_from_IDirectMusicPort(iface);
267         WAVEFORMATEX format;
268         FIXME("(%p, %p, %p, %p): stub\n", This, pWaveFormatEx, pdwWaveFormatExSize, pdwBufferSize);
269
270         if (pWaveFormatEx == NULL)
271         {
272                 if (pdwWaveFormatExSize)
273                         *pdwWaveFormatExSize = sizeof(format);
274                 else
275                         return E_POINTER;
276         }
277         else
278         {
279                 if (pdwWaveFormatExSize == NULL)
280                         return E_POINTER;
281
282                 /* Just fill this in with something that will not crash Direct Sound for now. */
283                 /* It won't be used anyway until Performances are completed */
284                 format.wFormatTag = WAVE_FORMAT_PCM;
285                 format.nChannels = 2; /* This->params.dwAudioChannels; */
286                 format.nSamplesPerSec = 44100; /* This->params.dwSampleRate; */
287                 format.wBitsPerSample = 16;     /* FIXME: check this */
288                 format.nBlockAlign = (format.wBitsPerSample * format.nChannels) / 8;
289                 format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
290                 format.cbSize = 0;
291
292                 if (*pdwWaveFormatExSize >= sizeof(format))
293                 {
294                         CopyMemory(pWaveFormatEx, &format, min(sizeof(format), *pdwWaveFormatExSize));
295                         *pdwWaveFormatExSize = sizeof(format);  /* FIXME check if this is set */
296                 }
297                 else
298                         return E_POINTER;       /* FIXME find right error */
299         }
300
301         if (pdwBufferSize)
302                 *pdwBufferSize = 44100 * 2 * 2;
303         else
304                 return E_POINTER;
305
306         return S_OK;
307 }
308
309 static const IDirectMusicPortVtbl DirectMusicPort_Vtbl = {
310         IDirectMusicPortImpl_QueryInterface,
311         IDirectMusicPortImpl_AddRef,
312         IDirectMusicPortImpl_Release,
313         IDirectMusicPortImpl_PlayBuffer,
314         IDirectMusicPortImpl_SetReadNotificationHandle,
315         IDirectMusicPortImpl_Read,
316         IDirectMusicPortImpl_DownloadInstrument,
317         IDirectMusicPortImpl_UnloadInstrument,
318         IDirectMusicPortImpl_GetLatencyClock,
319         IDirectMusicPortImpl_GetRunningStats,
320         IDirectMusicPortImpl_Compact,
321         IDirectMusicPortImpl_GetCaps,
322         IDirectMusicPortImpl_DeviceIoControl,
323         IDirectMusicPortImpl_SetNumChannelGroups,
324         IDirectMusicPortImpl_GetNumChannelGroups,
325         IDirectMusicPortImpl_Activate,
326         IDirectMusicPortImpl_SetChannelPriority,
327         IDirectMusicPortImpl_GetChannelPriority,
328         IDirectMusicPortImpl_SetDirectSound,
329         IDirectMusicPortImpl_GetFormat
330 };
331
332 /* IDirectMusicPortDownload IUnknown parts follow: */
333 static HRESULT WINAPI IDirectMusicPortDownloadImpl_QueryInterface(LPDIRECTMUSICPORTDOWNLOAD iface, REFIID riid, LPVOID *ret_iface)
334 {
335     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
336
337     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_dmguid(riid), ret_iface);
338
339     return IDirectMusicPort_QueryInterface(&This->IDirectMusicPort_iface, riid, ret_iface);
340 }
341
342 static ULONG WINAPI IDirectMusicPortDownloadImpl_AddRef (LPDIRECTMUSICPORTDOWNLOAD iface)
343 {
344     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
345
346     TRACE("(%p/%p)->()\n", iface, This);
347
348     return IDirectMusicPort_AddRef(&This->IDirectMusicPort_iface);
349 }
350
351 static ULONG WINAPI IDirectMusicPortDownloadImpl_Release(LPDIRECTMUSICPORTDOWNLOAD iface)
352 {
353     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
354
355     TRACE("(%p/%p)->()\n", iface, This);
356
357     return IDirectMusicPort_Release(&This->IDirectMusicPort_iface);
358 }
359
360 /* IDirectMusicPortDownload Interface follow: */
361 static HRESULT WINAPI IDirectMusicPortDownloadImpl_GetBuffer(LPDIRECTMUSICPORTDOWNLOAD iface, DWORD DLId, IDirectMusicDownload** IDMDownload)
362 {
363     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
364
365     FIXME("(%p/%p)->(%u, %p): stub\n", iface, This, DLId, IDMDownload);
366
367     if (!IDMDownload)
368         return E_POINTER;
369
370     return DMUSIC_CreateDirectMusicDownloadImpl(&IID_IDirectMusicDownload, (LPVOID*)IDMDownload, NULL);
371 }
372
373 static HRESULT WINAPI IDirectMusicPortDownloadImpl_AllocateBuffer(LPDIRECTMUSICPORTDOWNLOAD iface, DWORD size, IDirectMusicDownload** IDMDownload)
374 {
375     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
376
377     FIXME("(%p/%p)->(%u, %p): stub\n", iface, This, size, IDMDownload);
378
379     return S_OK;
380 }
381
382 static HRESULT WINAPI IDirectMusicPortDownloadImpl_GetDLId(LPDIRECTMUSICPORTDOWNLOAD iface, DWORD* start_DLId, DWORD count)
383 {
384     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
385
386     FIXME("(%p/%p)->(%p, %u): stub\n", iface, This, start_DLId, count);
387
388     return S_OK;
389 }
390
391 static HRESULT WINAPI IDirectMusicPortDownloadImpl_GetAppend (LPDIRECTMUSICPORTDOWNLOAD iface, DWORD* append)
392 {
393     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
394
395     FIXME("(%p/%p)->(%p): stub\n", iface, This, append);
396
397     return S_OK;
398 }
399
400 static HRESULT WINAPI IDirectMusicPortDownloadImpl_Download(LPDIRECTMUSICPORTDOWNLOAD iface, IDirectMusicDownload* IDMDownload)
401 {
402     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
403
404     FIXME("(%p/%p)->(%p): stub\n", iface, This, IDMDownload);
405
406     return S_OK;
407 }
408
409 static HRESULT WINAPI IDirectMusicPortDownloadImpl_Unload(LPDIRECTMUSICPORTDOWNLOAD iface, IDirectMusicDownload* IDMDownload)
410 {
411     IDirectMusicPortImpl *This = impl_from_IDirectMusicPortDownload(iface);
412
413     FIXME("(%p/%p)->(%p): stub\n", iface, This, IDMDownload);
414
415     return S_OK;
416 }
417
418 static const IDirectMusicPortDownloadVtbl DirectMusicPortDownload_Vtbl = {
419         IDirectMusicPortDownloadImpl_QueryInterface,
420         IDirectMusicPortDownloadImpl_AddRef,
421         IDirectMusicPortDownloadImpl_Release,
422         IDirectMusicPortDownloadImpl_GetBuffer,
423         IDirectMusicPortDownloadImpl_AllocateBuffer,
424         IDirectMusicPortDownloadImpl_GetDLId,
425         IDirectMusicPortDownloadImpl_GetAppend,
426         IDirectMusicPortDownloadImpl_Download,
427         IDirectMusicPortDownloadImpl_Unload
428 };
429
430 /* IDirectMusicThru IUnknown parts follow: */
431 static HRESULT WINAPI IDirectMusicThruImpl_QueryInterface(LPDIRECTMUSICTHRU iface, REFIID riid, LPVOID *ret_iface)
432 {
433     IDirectMusicPortImpl *This = impl_from_IDirectMusicThru(iface);
434
435     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_dmguid(riid), ret_iface);
436
437     return IDirectMusicPort_QueryInterface(&This->IDirectMusicPort_iface, riid, ret_iface);
438 }
439
440 static ULONG WINAPI IDirectMusicThruImpl_AddRef(LPDIRECTMUSICTHRU iface)
441 {
442     IDirectMusicPortImpl *This = impl_from_IDirectMusicThru(iface);
443
444     TRACE("(%p/%p)->()\n", iface, This);
445
446     return IDirectMusicPort_AddRef(&This->IDirectMusicPort_iface);
447 }
448
449 static ULONG WINAPI IDirectMusicThruImpl_Release(LPDIRECTMUSICTHRU iface)
450 {
451     IDirectMusicPortImpl *This = impl_from_IDirectMusicThru(iface);
452
453     TRACE("(%p/%p)->()\n", iface, This);
454
455     return IDirectMusicPort_Release(&This->IDirectMusicPort_iface);
456 }
457
458 /* IDirectMusicThru Interface follow: */
459 static HRESULT WINAPI IDirectMusicThruImpl_ThruChannel(LPDIRECTMUSICTHRU iface, DWORD source_channel_group, DWORD source_channel, DWORD destination_channel_group,
460                                                        DWORD destination_channel, LPDIRECTMUSICPORT destination_port)
461 {
462     IDirectMusicPortImpl *This = impl_from_IDirectMusicThru(iface);
463
464     FIXME("(%p/%p)->(%d, %d, %d, %d, %p): stub\n", iface, This, source_channel_group, source_channel, destination_channel_group, destination_channel, destination_port);
465
466     return S_OK;
467 }
468
469 static const IDirectMusicThruVtbl DirectMusicThru_Vtbl = {
470         IDirectMusicThruImpl_QueryInterface,
471         IDirectMusicThruImpl_AddRef,
472         IDirectMusicThruImpl_Release,
473         IDirectMusicThruImpl_ThruChannel
474 };
475
476 HRESULT DMUSIC_CreateDirectMusicPortImpl (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter, LPDMUS_PORTPARAMS pPortParams, LPDMUS_PORTCAPS pPortCaps) {
477         IDirectMusicPortImpl *obj;
478         HRESULT hr = E_FAIL;
479         UINT j;
480
481         TRACE("(%p,%p,%p)\n", lpcGUID, ppobj, pUnkOuter);
482
483         obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicPortImpl));
484         if (NULL == obj) {
485                 *ppobj = NULL;
486                 return E_OUTOFMEMORY;
487         }
488         obj->IDirectMusicPort_iface.lpVtbl = &DirectMusicPort_Vtbl;
489         obj->IDirectMusicPortDownload_iface.lpVtbl = &DirectMusicPortDownload_Vtbl;
490         obj->IDirectMusicThru_iface.lpVtbl = &DirectMusicThru_Vtbl;
491         obj->ref = 0;  /* will be inited by QueryInterface */
492         obj->fActive = FALSE;
493         obj->params = *pPortParams;
494         obj->caps = *pPortCaps;
495         obj->pDirectSound = NULL;
496         obj->pLatencyClock = NULL;
497         hr = DMUSIC_CreateReferenceClockImpl(&IID_IReferenceClock, (LPVOID*)&obj->pLatencyClock, NULL);
498         if(hr != S_OK)
499         {
500                 HeapFree(GetProcessHeap(), 0, obj);
501                 return hr;
502         }
503
504 if(0)
505 {
506         if (pPortParams->dwValidParams & DMUS_PORTPARAMS_CHANNELGROUPS) {
507           obj->nrofgroups = pPortParams->dwChannelGroups;
508           /* setting default priorities */                      
509           for (j = 0; j < obj->nrofgroups; j++) {
510             TRACE ("Setting default channel priorities on channel group %i\n", j + 1);
511             obj->group[j].channel[0].priority = DAUD_CHAN1_DEF_VOICE_PRIORITY;
512             obj->group[j].channel[1].priority = DAUD_CHAN2_DEF_VOICE_PRIORITY;
513             obj->group[j].channel[2].priority = DAUD_CHAN3_DEF_VOICE_PRIORITY;
514             obj->group[j].channel[3].priority = DAUD_CHAN4_DEF_VOICE_PRIORITY;
515             obj->group[j].channel[4].priority = DAUD_CHAN5_DEF_VOICE_PRIORITY;
516             obj->group[j].channel[5].priority = DAUD_CHAN6_DEF_VOICE_PRIORITY;
517             obj->group[j].channel[6].priority = DAUD_CHAN7_DEF_VOICE_PRIORITY;
518             obj->group[j].channel[7].priority = DAUD_CHAN8_DEF_VOICE_PRIORITY;
519             obj->group[j].channel[8].priority = DAUD_CHAN9_DEF_VOICE_PRIORITY;
520             obj->group[j].channel[9].priority = DAUD_CHAN10_DEF_VOICE_PRIORITY;
521             obj->group[j].channel[10].priority = DAUD_CHAN11_DEF_VOICE_PRIORITY;
522             obj->group[j].channel[11].priority = DAUD_CHAN12_DEF_VOICE_PRIORITY;
523             obj->group[j].channel[12].priority = DAUD_CHAN13_DEF_VOICE_PRIORITY;
524             obj->group[j].channel[13].priority = DAUD_CHAN14_DEF_VOICE_PRIORITY;
525             obj->group[j].channel[14].priority = DAUD_CHAN15_DEF_VOICE_PRIORITY;
526             obj->group[j].channel[15].priority = DAUD_CHAN16_DEF_VOICE_PRIORITY;
527           }
528         }
529 }
530
531         return IDirectMusicPortImpl_QueryInterface ((LPDIRECTMUSICPORT)obj, lpcGUID, ppobj);
532 }