ReactOS 0.4.17-dev-966-gf06eace
buffer.c File Reference
#include "dmusic_private.h"
#include "initguid.h"
#include "dmksctrl.h"
Include dependency graph for buffer.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (dmusic)
 
static IDirectMusicBufferImpl * impl_from_IDirectMusicBuffer (IDirectMusicBuffer *iface)
 
static HRESULT WINAPI IDirectMusicBufferImpl_QueryInterface (LPDIRECTMUSICBUFFER iface, REFIID riid, LPVOID *ret_iface)
 
static ULONG WINAPI IDirectMusicBufferImpl_AddRef (LPDIRECTMUSICBUFFER iface)
 
static ULONG WINAPI IDirectMusicBufferImpl_Release (LPDIRECTMUSICBUFFER iface)
 
static HRESULT WINAPI IDirectMusicBufferImpl_Flush (LPDIRECTMUSICBUFFER iface)
 
static HRESULT WINAPI IDirectMusicBufferImpl_TotalTime (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prtTime)
 
static HRESULT WINAPI IDirectMusicBufferImpl_PackStructured (LPDIRECTMUSICBUFFER iface, REFERENCE_TIME ref_time, DWORD channel_group, DWORD channel_message)
 
static HRESULT WINAPI IDirectMusicBufferImpl_PackUnstructured (IDirectMusicBuffer *iface, REFERENCE_TIME ref_time, DWORD channel_group, DWORD len, BYTE *data)
 
static HRESULT WINAPI IDirectMusicBufferImpl_ResetReadPtr (LPDIRECTMUSICBUFFER iface)
 
static HRESULT WINAPI IDirectMusicBufferImpl_GetNextEvent (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prt, LPDWORD pdwChannelGroup, LPDWORD pdwLength, LPBYTE *ppData)
 
static HRESULT WINAPI IDirectMusicBufferImpl_GetRawBufferPtr (LPDIRECTMUSICBUFFER iface, LPBYTE *data)
 
static HRESULT WINAPI IDirectMusicBufferImpl_GetStartTime (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME ref_time)
 
static HRESULT WINAPI IDirectMusicBufferImpl_GetUsedBytes (LPDIRECTMUSICBUFFER iface, LPDWORD used_bytes)
 
static HRESULT WINAPI IDirectMusicBufferImpl_GetMaxBytes (LPDIRECTMUSICBUFFER iface, LPDWORD max_bytes)
 
static HRESULT WINAPI IDirectMusicBufferImpl_GetBufferFormat (LPDIRECTMUSICBUFFER iface, LPGUID format)
 
static HRESULT WINAPI IDirectMusicBufferImpl_SetStartTime (LPDIRECTMUSICBUFFER iface, REFERENCE_TIME ref_time)
 
static HRESULT WINAPI IDirectMusicBufferImpl_SetUsedBytes (LPDIRECTMUSICBUFFER iface, DWORD used_bytes)
 
HRESULT DMUSIC_CreateDirectMusicBufferImpl (LPDMUS_BUFFERDESC desc, LPVOID *ret_iface)
 

Variables

static const IDirectMusicBufferVtbl DirectMusicBuffer_Vtbl
 

Function Documentation

◆ DMUSIC_CreateDirectMusicBufferImpl()

HRESULT DMUSIC_CreateDirectMusicBufferImpl ( LPDMUS_BUFFERDESC  desc,
LPVOID *  ret_iface 
)

Definition at line 293 of file buffer.c.

294{
295 IDirectMusicBufferImpl* dmbuffer;
296
297 TRACE("(%p, %p)\n", desc, ret_iface);
298
299 *ret_iface = NULL;
300
301 dmbuffer = calloc(1, sizeof(IDirectMusicBufferImpl));
302 if (!dmbuffer)
303 return E_OUTOFMEMORY;
304
306 dmbuffer->ref = 1;
307
308 if (IsEqualGUID(&desc->guidBufferFormat, &GUID_NULL))
310 else
311 dmbuffer->format = desc->guidBufferFormat;
312 dmbuffer->size = (desc->cbBuffer + 3) & ~3; /* Buffer size must be multiple of 4 bytes */
313
314 dmbuffer->data = malloc(dmbuffer->size);
315 if (!dmbuffer->data) {
316 free(dmbuffer);
317 return E_OUTOFMEMORY;
318 }
319
320 *ret_iface = &dmbuffer->IDirectMusicBuffer_iface;
321
322 return S_OK;
323}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
static const IDirectMusicBufferVtbl DirectMusicBuffer_Vtbl
Definition: buffer.c:274
#define S_OK
Definition: intsafe.h:52
#define GUID_NULL
Definition: ks.h:106
#define KSDATAFORMAT_SUBTYPE_MIDI
Definition: ksmedia.h:1016
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define calloc
Definition: rosglue.h:14
#define TRACE(s)
Definition: solgame.cpp:4
IDirectMusicBuffer IDirectMusicBuffer_iface

Referenced by IDirectMusic8Impl_CreateMusicBuffer().

◆ IDirectMusicBufferImpl_AddRef()

static ULONG WINAPI IDirectMusicBufferImpl_AddRef ( LPDIRECTMUSICBUFFER  iface)
static

Definition at line 53 of file buffer.c.

54{
57
58 TRACE("(%p): new ref = %lu\n", iface, ref);
59
60 return ref;
61}
#define InterlockedIncrement
Definition: armddk.h:53
static IDirectMusicBufferImpl * impl_from_IDirectMusicBuffer(IDirectMusicBuffer *iface)
Definition: buffer.c:28
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

◆ IDirectMusicBufferImpl_Flush()

static HRESULT WINAPI IDirectMusicBufferImpl_Flush ( LPDIRECTMUSICBUFFER  iface)
static

Definition at line 79 of file buffer.c.

80{
82
83 TRACE("(%p)->()\n", iface);
84
85 This->write_pos = 0;
86
87 return S_OK;
88}

◆ IDirectMusicBufferImpl_GetBufferFormat()

static HRESULT WINAPI IDirectMusicBufferImpl_GetBufferFormat ( LPDIRECTMUSICBUFFER  iface,
LPGUID  format 
)
static

Definition at line 236 of file buffer.c.

237{
239
240 TRACE("(%p)->(%p)\n", iface, format);
241
242 if (!format)
243 return E_POINTER;
244
245 *format = This->format;
246 return S_OK;
247}
#define E_POINTER
Definition: winerror.h:3480

◆ IDirectMusicBufferImpl_GetMaxBytes()

static HRESULT WINAPI IDirectMusicBufferImpl_GetMaxBytes ( LPDIRECTMUSICBUFFER  iface,
LPDWORD  max_bytes 
)
static

Definition at line 222 of file buffer.c.

223{
225
226 TRACE("(%p)->(%p)\n", iface, max_bytes);
227
228 if (!max_bytes)
229 return E_POINTER;
230
231 *max_bytes = This->size;
232
233 return S_OK;
234}

◆ IDirectMusicBufferImpl_GetNextEvent()

static HRESULT WINAPI IDirectMusicBufferImpl_GetNextEvent ( LPDIRECTMUSICBUFFER  iface,
LPREFERENCE_TIME  prt,
LPDWORD  pdwChannelGroup,
LPDWORD  pdwLength,
LPBYTE *  ppData 
)
static

Definition at line 169 of file buffer.c.

170{
172
173 FIXME("(%p, %p, %p, %p, %p): stub\n", This, prt, pdwChannelGroup, pdwLength, ppData);
174
175 return S_OK;
176}
#define FIXME(fmt,...)
Definition: precomp.h:53
PSDBQUERYRESULT_VISTA PVOID * ppData
Definition: env.c:56

◆ IDirectMusicBufferImpl_GetRawBufferPtr()

static HRESULT WINAPI IDirectMusicBufferImpl_GetRawBufferPtr ( LPDIRECTMUSICBUFFER  iface,
LPBYTE *  data 
)
static

Definition at line 178 of file buffer.c.

179{
181
182 TRACE("(%p)->(%p)\n", iface, data);
183
184 if (!data)
185 return E_POINTER;
186
187 *data = This->data;
188
189 return S_OK;
190}
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

◆ IDirectMusicBufferImpl_GetStartTime()

static HRESULT WINAPI IDirectMusicBufferImpl_GetStartTime ( LPDIRECTMUSICBUFFER  iface,
LPREFERENCE_TIME  ref_time 
)
static

Definition at line 192 of file buffer.c.

193{
195
196 TRACE("(%p)->(%p)\n", iface, ref_time);
197
198 if (!ref_time)
199 return E_POINTER;
200 if (!This->write_pos)
201 return DMUS_E_BUFFER_EMPTY;
202
203 *ref_time = This->start_time;
204
205 return S_OK;
206}
#define DMUS_E_BUFFER_EMPTY
Definition: dmerror.h:89

◆ IDirectMusicBufferImpl_GetUsedBytes()

static HRESULT WINAPI IDirectMusicBufferImpl_GetUsedBytes ( LPDIRECTMUSICBUFFER  iface,
LPDWORD  used_bytes 
)
static

Definition at line 208 of file buffer.c.

209{
211
212 TRACE("(%p)->(%p)\n", iface, used_bytes);
213
214 if (!used_bytes)
215 return E_POINTER;
216
217 *used_bytes = This->write_pos;
218
219 return S_OK;
220}

◆ IDirectMusicBufferImpl_PackStructured()

static HRESULT WINAPI IDirectMusicBufferImpl_PackStructured ( LPDIRECTMUSICBUFFER  iface,
REFERENCE_TIME  ref_time,
DWORD  channel_group,
DWORD  channel_message 
)
static

Definition at line 99 of file buffer.c.

100{
102 DWORD new_write_pos = This->write_pos + DMUS_EVENT_SIZE(sizeof(channel_message));
104
105 TRACE("(%p, 0x%s, %lu, %#lx)\n", iface, wine_dbgstr_longlong(ref_time), channel_group, channel_message);
106
107 if (new_write_pos > This->size)
108 return DMUS_E_BUFFER_FULL;
109
110 /* Channel_message 0xZZYYXX (3 bytes) is a midi message where XX = status byte, YY = byte 1 and ZZ = byte 2 */
111
112 if (!(channel_message & 0x80))
113 {
114 /* Status byte MSB is always set */
116 }
117
118 if (!This->write_pos)
119 This->start_time = ref_time;
120
121 header = (DMUS_EVENTHEADER*)&This->data[This->write_pos];
122 header->cbEvent = 3; /* Midi message takes 4 bytes space but only 3 are relevant */
123 header->dwChannelGroup = channel_group;
124 header->rtDelta = ref_time - This->start_time;
125 header->dwFlags = DMUS_EVENT_STRUCTURED;
126
127 *(DWORD*)&header[1] = channel_message;
128 This->write_pos = new_write_pos;
129
130 return S_OK;
131}
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define DMUS_E_BUFFER_FULL
Definition: dmerror.h:90
#define DMUS_E_INVALID_EVENT
Definition: dmerror.h:99
#define DMUS_EVENT_STRUCTURED
Definition: dmusbuff.h:4
#define DMUS_EVENT_SIZE(cb)
Definition: dmusbuff.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95

◆ IDirectMusicBufferImpl_PackUnstructured()

static HRESULT WINAPI IDirectMusicBufferImpl_PackUnstructured ( IDirectMusicBuffer *  iface,
REFERENCE_TIME  ref_time,
DWORD  channel_group,
DWORD  len,
BYTE *  data 
)
static

Definition at line 133 of file buffer.c.

135{
137 DWORD new_write_pos = This->write_pos + DMUS_EVENT_SIZE(len);
139
140 TRACE("(%p, 0x%s, %ld, %ld, %p)\n", This, wine_dbgstr_longlong(ref_time), channel_group, len, data);
141
142 if (new_write_pos > This->size)
143 return DMUS_E_BUFFER_FULL;
144
145 if (!This->write_pos)
146 This->start_time = ref_time;
147
148 header = (DMUS_EVENTHEADER*)&This->data[This->write_pos];
149 header->cbEvent = len;
150 header->dwChannelGroup = channel_group;
151 header->rtDelta = ref_time - This->start_time;
152 header->dwFlags = 0;
153
154 memcpy(&header[1], data, len);
155 This->write_pos = new_write_pos;
156
157 return S_OK;
158}
GLenum GLsizei len
Definition: glext.h:6722
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878

◆ IDirectMusicBufferImpl_QueryInterface()

static HRESULT WINAPI IDirectMusicBufferImpl_QueryInterface ( LPDIRECTMUSICBUFFER  iface,
REFIID  riid,
LPVOID *  ret_iface 
)
static

Definition at line 34 of file buffer.c.

35{
36 TRACE("(%p)->(%s, %p)\n", iface, debugstr_dmguid(riid), ret_iface);
37
39 IsEqualIID(riid, &IID_IDirectMusicBuffer))
40 {
42 *ret_iface = iface;
43 return S_OK;
44 }
45
46 *ret_iface = NULL;
47
48 WARN("(%p)->(%s, %p): not found\n", iface, debugstr_dmguid(riid), ret_iface);
49
50 return E_NOINTERFACE;
51}
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36
#define IDirectMusicBuffer_AddRef(p)
Definition: dmusicc.h:488
REFIID riid
Definition: atlbase.h:39
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ IDirectMusicBufferImpl_Release()

static ULONG WINAPI IDirectMusicBufferImpl_Release ( LPDIRECTMUSICBUFFER  iface)
static

Definition at line 63 of file buffer.c.

64{
67
68 TRACE("(%p): new ref = %lu\n", iface, ref);
69
70 if (!ref) {
71 free(This->data);
72 free(This);
73 }
74
75 return ref;
76}
#define InterlockedDecrement
Definition: armddk.h:52

◆ IDirectMusicBufferImpl_ResetReadPtr()

static HRESULT WINAPI IDirectMusicBufferImpl_ResetReadPtr ( LPDIRECTMUSICBUFFER  iface)
static

Definition at line 160 of file buffer.c.

161{
163
164 FIXME("(%p): stub\n", This);
165
166 return S_OK;
167}

◆ IDirectMusicBufferImpl_SetStartTime()

static HRESULT WINAPI IDirectMusicBufferImpl_SetStartTime ( LPDIRECTMUSICBUFFER  iface,
REFERENCE_TIME  ref_time 
)
static

Definition at line 249 of file buffer.c.

250{
252
253 TRACE("(%p)->(0x%s)\n", This, wine_dbgstr_longlong(ref_time));
254
255 This->start_time = ref_time;
256
257 return S_OK;
258}

◆ IDirectMusicBufferImpl_SetUsedBytes()

static HRESULT WINAPI IDirectMusicBufferImpl_SetUsedBytes ( LPDIRECTMUSICBUFFER  iface,
DWORD  used_bytes 
)
static

Definition at line 260 of file buffer.c.

261{
263
264 TRACE("(%p, %lu)\n", iface, used_bytes);
265
266 if (used_bytes > This->size)
267 return DMUS_E_BUFFER_FULL;
268
269 This->write_pos = used_bytes;
270
271 return S_OK;
272}

◆ IDirectMusicBufferImpl_TotalTime()

static HRESULT WINAPI IDirectMusicBufferImpl_TotalTime ( LPDIRECTMUSICBUFFER  iface,
LPREFERENCE_TIME  prtTime 
)
static

Definition at line 90 of file buffer.c.

91{
93
94 FIXME("(%p, %p): stub\n", This, prtTime);
95
96 return S_OK;
97}

◆ impl_from_IDirectMusicBuffer()

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( dmusic  )

Variable Documentation

◆ DirectMusicBuffer_Vtbl

const IDirectMusicBufferVtbl DirectMusicBuffer_Vtbl
static
Initial value:
= {
}
static HRESULT WINAPI IDirectMusicBufferImpl_PackUnstructured(IDirectMusicBuffer *iface, REFERENCE_TIME ref_time, DWORD channel_group, DWORD len, BYTE *data)
Definition: buffer.c:133
static HRESULT WINAPI IDirectMusicBufferImpl_GetNextEvent(LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prt, LPDWORD pdwChannelGroup, LPDWORD pdwLength, LPBYTE *ppData)
Definition: buffer.c:169
static HRESULT WINAPI IDirectMusicBufferImpl_Flush(LPDIRECTMUSICBUFFER iface)
Definition: buffer.c:79
static HRESULT WINAPI IDirectMusicBufferImpl_SetUsedBytes(LPDIRECTMUSICBUFFER iface, DWORD used_bytes)
Definition: buffer.c:260
static ULONG WINAPI IDirectMusicBufferImpl_Release(LPDIRECTMUSICBUFFER iface)
Definition: buffer.c:63
static HRESULT WINAPI IDirectMusicBufferImpl_GetUsedBytes(LPDIRECTMUSICBUFFER iface, LPDWORD used_bytes)
Definition: buffer.c:208
static HRESULT WINAPI IDirectMusicBufferImpl_QueryInterface(LPDIRECTMUSICBUFFER iface, REFIID riid, LPVOID *ret_iface)
Definition: buffer.c:34
static HRESULT WINAPI IDirectMusicBufferImpl_GetStartTime(LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME ref_time)
Definition: buffer.c:192
static HRESULT WINAPI IDirectMusicBufferImpl_SetStartTime(LPDIRECTMUSICBUFFER iface, REFERENCE_TIME ref_time)
Definition: buffer.c:249
static HRESULT WINAPI IDirectMusicBufferImpl_GetRawBufferPtr(LPDIRECTMUSICBUFFER iface, LPBYTE *data)
Definition: buffer.c:178
static ULONG WINAPI IDirectMusicBufferImpl_AddRef(LPDIRECTMUSICBUFFER iface)
Definition: buffer.c:53
static HRESULT WINAPI IDirectMusicBufferImpl_PackStructured(LPDIRECTMUSICBUFFER iface, REFERENCE_TIME ref_time, DWORD channel_group, DWORD channel_message)
Definition: buffer.c:99
static HRESULT WINAPI IDirectMusicBufferImpl_GetMaxBytes(LPDIRECTMUSICBUFFER iface, LPDWORD max_bytes)
Definition: buffer.c:222
static HRESULT WINAPI IDirectMusicBufferImpl_TotalTime(LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prtTime)
Definition: buffer.c:90
static HRESULT WINAPI IDirectMusicBufferImpl_ResetReadPtr(LPDIRECTMUSICBUFFER iface)
Definition: buffer.c:160
static HRESULT WINAPI IDirectMusicBufferImpl_GetBufferFormat(LPDIRECTMUSICBUFFER iface, LPGUID format)
Definition: buffer.c:236

Definition at line 274 of file buffer.c.

Referenced by DMUSIC_CreateDirectMusicBufferImpl().