Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
April 2022
- 87 participants
- 938 discussions
From: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
---
v2: Tweak style / formatting a bit more while at it.
dlls/d3dxof/Makefile.in | 1 -
dlls/d3dxof/d3dxof.c | 561 ++++++++++++++++++++--------------------
dlls/d3dxof/parsing.c | 76 +++---
3 files changed, 322 insertions(+), 316 deletions(-)
diff --git a/dlls/d3dxof/Makefile.in b/dlls/d3dxof/Makefile.in
index 8171b57421d..93032adbb3f 100644
--- a/dlls/d3dxof/Makefile.in
+++ b/dlls/d3dxof/Makefile.in
@@ -1,4 +1,3 @@
-EXTRADEFS = -DWINE_NO_LONG_TYPES
MODULE = d3dxof.dll
IMPORTLIB = d3dxof
IMPORTS = dxguid uuid ole32 advapi32
diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index e16b0d802f3..41614d117fe 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -81,46 +81,49 @@ static inline IDirectXFileImpl *impl_from_IDirectXFile(IDirectXFile *iface)
return CONTAINING_RECORD(iface, IDirectXFileImpl, IDirectXFile_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileImpl_QueryInterface(IDirectXFile* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileImpl_QueryInterface(IDirectXFile *iface, REFIID riid, void **out)
{
- IDirectXFileImpl *This = impl_from_IDirectXFile(iface);
+ IDirectXFileImpl *object = impl_from_IDirectXFile(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFile))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFile_iface;
- return S_OK;
- }
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFile))
+ {
+ *out = &object->IDirectXFile_iface;
+ }
+ else
+ {
+ *out = NULL;
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileImpl_AddRef(IDirectXFile* iface)
+static ULONG WINAPI IDirectXFileImpl_AddRef(IDirectXFile *iface)
{
- IDirectXFileImpl *This = impl_from_IDirectXFile(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileImpl *object = impl_from_IDirectXFile(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileImpl_Release(IDirectXFile* iface)
+static ULONG WINAPI IDirectXFileImpl_Release(IDirectXFile *iface)
{
- IDirectXFileImpl *This = impl_from_IDirectXFile(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileImpl *object = impl_from_IDirectXFile(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, object);
- return ref;
+ return refcount;
}
/*** IDirectXFile methods ***/
@@ -133,7 +136,7 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
DWORD file_size;
DWORD bytes_written;
- TRACE("(%p/%p)->(%p,%x,%p)\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
+ TRACE("iface %p, source %p, load_options %#lx, out %p.\n", iface, pvSource, dwLoadOptions, ppEnumObj);
if (!ppEnumObj)
return DXFILEERR_BADVALUE;
@@ -212,19 +215,19 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
{
LPDXFILELOADMEMORY lpdxflm = pvSource;
- TRACE("Source in memory at %p with size %d\n", lpdxflm->lpMemory, lpdxflm->dSize);
+ TRACE("Source in memory at %p with size %ld.\n", lpdxflm->lpMemory, lpdxflm->dSize);
file_buffer = lpdxflm->lpMemory;
file_size = lpdxflm->dSize;
}
else
{
- FIXME("Source type %d is not handled yet\n", dwLoadOptions);
+ FIXME("Source type %ld not handled yet.\n", dwLoadOptions);
hr = DXFILEERR_NOTDONEYET;
goto error;
}
- TRACE("File size is %d bytes\n", file_size);
+ TRACE("File size is %lu bytes.\n", file_size);
if (TRACE_ON(d3dxof_dump))
{
@@ -261,7 +264,7 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
if (TRACE_ON(d3dxof))
{
ULONG i;
- TRACE("Registered templates (%d):\n", This->nb_xtemplates);
+ TRACE("Registered templates (%lu):\n", This->nb_xtemplates);
for (i = 1; i < This->nb_xtemplates; i++)
TRACE("%s - %s\n", This->xtemplates[i].name, debugstr_guid(&This->xtemplates[i].class_id));
}
@@ -277,21 +280,22 @@ error:
return hr;
}
-static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile* iface, LPCSTR szFileName, DXFILEFORMAT dwFileFormat, LPDIRECTXFILESAVEOBJECT* ppSaveObj)
+static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile *iface, const char *filename,
+ DXFILEFORMAT format, LPDIRECTXFILESAVEOBJECT *out)
{
- IDirectXFileImpl *This = impl_from_IDirectXFile(iface);
- IDirectXFileSaveObjectImpl *object;
- HRESULT hr;
+ IDirectXFileSaveObjectImpl *object;
+ HRESULT hr;
- FIXME("(%p/%p)->(%s,%x,%p) partial stub!\n", This, iface, szFileName, dwFileFormat, ppSaveObj);
+ FIXME("iface %p, filename %s, format %lu, out %p partial stub!\n", iface, debugstr_a(filename),
+ format, out);
- if (!szFileName || !ppSaveObj)
- return E_POINTER;
+ if (!filename || !out)
+ return E_POINTER;
- hr = IDirectXFileSaveObjectImpl_Create(&object);
- if (SUCCEEDED(hr))
- *ppSaveObj = &object->IDirectXFileSaveObject_iface;
- return hr;
+ hr = IDirectXFileSaveObjectImpl_Create(&object);
+ if (SUCCEEDED(hr))
+ *out = &object->IDirectXFileSaveObject_iface;
+ return hr;
}
static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LPVOID pvData, DWORD cbSize)
@@ -307,7 +311,7 @@ static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LP
buf.rem_bytes = cbSize;
buf.pdxf = This;
- TRACE("(%p/%p)->(%p,%d)\n", This, iface, pvData, cbSize);
+ TRACE("iface %p, data %p, size %lu.\n", iface, pvData, cbSize);
if (!pvData)
return DXFILEERR_BADVALUE;
@@ -339,10 +343,11 @@ static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LP
if (TRACE_ON(d3dxof))
{
- ULONG i;
- TRACE("Registered templates (%d):\n", This->nb_xtemplates);
- for (i = 1; i < This->nb_xtemplates; i++)
- TRACE("%s - %s\n", This->xtemplates[i].name, debugstr_guid(&This->xtemplates[i].class_id));
+ unsigned int i;
+
+ TRACE("Registered templates (%lu):\n", This->nb_xtemplates);
+ for (i = 1; i < This->nb_xtemplates; ++i)
+ TRACE("%s - %s\n", This->xtemplates[i].name, debugstr_guid(&This->xtemplates[i].class_id));
}
hr = DXFILE_OK;
@@ -384,99 +389,91 @@ static inline IDirectXFileBinaryImpl *impl_from_IDirectXFileBinary(IDirectXFileB
return CONTAINING_RECORD(iface, IDirectXFileBinaryImpl, IDirectXFileBinary_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary *iface,
+ REFIID riid, void **out)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
+ IDirectXFileBinaryImpl *object = impl_from_IDirectXFileBinary(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileObject)
- || IsEqualGUID(riid, &IID_IDirectXFileBinary))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileBinary_iface;
- return S_OK;
- }
-
- /* Do not print an error for interfaces that can be queried to retrieve the type of the object */
- if (!IsEqualGUID(riid, &IID_IDirectXFileData)
- && !IsEqualGUID(riid, &IID_IDirectXFileDataReference))
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileObject)
+ || IsEqualGUID(riid, &IID_IDirectXFileBinary))
+ {
+ *out = &object->IDirectXFileBinary_iface;
+ }
+ else
+ {
+ *out = NULL;
+ /* Do not print an error for interfaces that can be queried to
+ * retrieve the type of the object */
+ if (!IsEqualGUID(riid, &IID_IDirectXFileData) && !IsEqualGUID(riid, &IID_IDirectXFileDataReference))
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary* iface)
+static ULONG WINAPI IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary *iface)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileBinaryImpl *object = impl_from_IDirectXFileBinary(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileBinaryImpl_Release(IDirectXFileBinary* iface)
+static ULONG WINAPI IDirectXFileBinaryImpl_Release(IDirectXFileBinary *iface)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileBinaryImpl *object = impl_from_IDirectXFileBinary(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, object);
- return ref;
+ return refcount;
}
-/*** IDirectXFileObject methods ***/
-static HRESULT WINAPI IDirectXFileBinaryImpl_GetName(IDirectXFileBinary* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
-
+static HRESULT WINAPI IDirectXFileBinaryImpl_GetName(IDirectXFileBinary *iface, char *name,
+ DWORD *length)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
+ FIXME("iface %p, name %p, length %p stub!\n", iface, name, length);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileBinaryImpl_GetId(IDirectXFileBinary* iface, LPGUID pGuid)
+static HRESULT WINAPI IDirectXFileBinaryImpl_GetId(IDirectXFileBinary *iface, GUID *guid)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
+ FIXME("iface %p, guid %p stub!\n", iface, guid);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-/*** IDirectXFileBinary methods ***/
-static HRESULT WINAPI IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary* iface, DWORD* pcbSize)
+static HRESULT WINAPI IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary *iface, DWORD *size)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pcbSize);
+ FIXME("iface %p, size %p stub!\n", iface, size);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary* iface, LPCSTR* pszMimeType)
+static HRESULT WINAPI IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary *iface, LPCSTR *mimetype)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pszMimeType);
+ FIXME("iface %p, mimetype %p stub!\n", iface, mimetype);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileBinaryImpl_Read(IDirectXFileBinary* iface, LPVOID pvData, DWORD cbSize, LPDWORD pcbRead)
+static HRESULT WINAPI IDirectXFileBinaryImpl_Read(IDirectXFileBinary *iface, void *data,
+ DWORD size, DWORD *count)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p, %d, %p) stub!\n", This, iface, pvData, cbSize, pcbRead);
+ FIXME("iface %p, data %p, size %lu, count %p stub!\n", iface, data, size, count);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
static const IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl =
@@ -514,62 +511,65 @@ static inline IDirectXFileDataImpl *impl_from_IDirectXFileData(IDirectXFileData
return CONTAINING_RECORD(iface, IDirectXFileDataImpl, IDirectXFileData_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileDataImpl_QueryInterface(IDirectXFileData* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileDataImpl_QueryInterface(IDirectXFileData *iface, REFIID riid,
+ void **out)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
+ IDirectXFileDataImpl *data = impl_from_IDirectXFileData(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
-
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileObject)
- || IsEqualGUID(riid, &IID_IDirectXFileData))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileData_iface;
- return S_OK;
- }
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- /* Do not print an error for interfaces that can be queried to retrieve the type of the object */
- if (!IsEqualGUID(riid, &IID_IDirectXFileBinary)
- && !IsEqualGUID(riid, &IID_IDirectXFileDataReference))
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileObject)
+ || IsEqualGUID(riid, &IID_IDirectXFileData))
+ {
+ *out = &data->IDirectXFileData_iface;
+ }
+ else
+ {
+ *out = NULL;
+ /* Do not print an error for interfaces that can be queried to
+ * retrieve the type of the object */
+ if (!IsEqualGUID(riid, &IID_IDirectXFileBinary) && !IsEqualGUID(riid, &IID_IDirectXFileDataReference))
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileDataImpl_AddRef(IDirectXFileData* iface)
+static ULONG WINAPI IDirectXFileDataImpl_AddRef(IDirectXFileData *iface)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileDataImpl *data = impl_from_IDirectXFileData(iface);
+ ULONG refcount = InterlockedIncrement(&data->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileDataImpl_Release(IDirectXFileData* iface)
+static ULONG WINAPI IDirectXFileDataImpl_Release(IDirectXFileData *iface)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileDataImpl *data = impl_from_IDirectXFileData(iface);
+ ULONG refcount = InterlockedDecrement(&data->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- {
- if (!This->level && !This->from_ref)
+ if (!refcount)
{
- HeapFree(GetProcessHeap(), 0, This->pstrings);
- if (This->pobj)
- {
- HeapFree(GetProcessHeap(), 0, This->pobj->pdata);
- HeapFree(GetProcessHeap(), 0, This->pobj);
- }
+ if (!data->level && !data->from_ref)
+ {
+ HeapFree(GetProcessHeap(), 0, data->pstrings);
+ if (data->pobj)
+ {
+ HeapFree(GetProcessHeap(), 0, data->pobj->pdata);
+ HeapFree(GetProcessHeap(), 0, data->pobj);
+ }
+ }
+ HeapFree(GetProcessHeap(), 0, data);
}
- HeapFree(GetProcessHeap(), 0, This);
- }
- return ref;
+ return refcount;
}
/*** IDirectXFileObject methods ***/
@@ -724,31 +724,29 @@ static HRESULT WINAPI IDirectXFileDataImpl_GetNextObject(IDirectXFileData* iface
return DXFILE_OK;
}
-static HRESULT WINAPI IDirectXFileDataImpl_AddDataObject(IDirectXFileData* iface, LPDIRECTXFILEDATA pDataObj)
+static HRESULT WINAPI IDirectXFileDataImpl_AddDataObject(IDirectXFileData *iface, LPDIRECTXFILEDATA data)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pDataObj);
+ FIXME("iface %p, data %p stub!\n", iface, data);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileDataImpl_AddDataReference(IDirectXFileData* iface, LPCSTR szRef, const GUID* pguidRef)
+static HRESULT WINAPI IDirectXFileDataImpl_AddDataReference(IDirectXFileData *iface,
+ const char *reference, const GUID *guidref)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
-
- FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szRef, pguidRef);
+ FIXME("iface %p, reference %s, guid reference %s stub!\n", iface, debugstr_a(reference),
+ debugstr_guid(guidref));
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData* iface, LPCSTR szName, const GUID* pguid, LPCSTR szMimeType, LPVOID pvData, DWORD cbSize)
+static HRESULT WINAPI IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData *iface, const char *name,
+ const GUID *guid, const char *mimetype, void *data, DWORD size)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
+ FIXME("iface %p, name %s, guid %s, mimetype %s, data %p, size %lu stub!\n", iface, debugstr_a(name),
+ debugstr_guid(guid), debugstr_a(mimetype), data, size);
- FIXME("(%p/%p)->(%s,%p,%s,%p,%d) stub!\n", This, iface, szName, pguid, szMimeType, pvData, cbSize);
-
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
static const IDirectXFileDataVtbl IDirectXFileData_Vtbl =
@@ -789,51 +787,54 @@ static inline IDirectXFileDataReferenceImpl *impl_from_IDirectXFileDataReference
return CONTAINING_RECORD(iface, IDirectXFileDataReferenceImpl, IDirectXFileDataReference_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference *iface,
+ REFIID riid, void **out)
{
- IDirectXFileDataReferenceImpl *This = impl_from_IDirectXFileDataReference(iface);
+ IDirectXFileDataReferenceImpl *object = impl_from_IDirectXFileDataReference(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileObject)
- || IsEqualGUID(riid, &IID_IDirectXFileDataReference))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileDataReference_iface;
- return S_OK;
- }
-
- /* Do not print an error for interfaces that can be queried to retrieve the type of the object */
- if (!IsEqualGUID(riid, &IID_IDirectXFileData)
- && !IsEqualGUID(riid, &IID_IDirectXFileBinary))
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileObject)
+ || IsEqualGUID(riid, &IID_IDirectXFileDataReference))
+ {
+ *out = &object->IDirectXFileDataReference_iface;
+ }
+ else
+ {
+ /* Do not print an error for interfaces that can be queried to
+ * retrieve the type of the object */
+ *out = NULL;
+ if (!IsEqualGUID(riid, &IID_IDirectXFileData) && !IsEqualGUID(riid, &IID_IDirectXFileBinary))
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference* iface)
+static ULONG WINAPI IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference *iface)
{
- IDirectXFileDataReferenceImpl *This = impl_from_IDirectXFileDataReference(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileDataReferenceImpl *object = impl_from_IDirectXFileDataReference(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference* iface)
+static ULONG WINAPI IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference *iface)
{
- IDirectXFileDataReferenceImpl *This = impl_from_IDirectXFileDataReference(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileDataReferenceImpl *object = impl_from_IDirectXFileDataReference(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, object);
- return ref;
+ return refcount;
}
/*** IDirectXFileObject methods ***/
@@ -864,18 +865,19 @@ static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataRefe
return DXFILE_OK;
}
-static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference* iface, LPGUID pGuid)
+static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference *iface,
+ GUID *guid)
{
- IDirectXFileDataReferenceImpl *This = impl_from_IDirectXFileDataReference(iface);
+ IDirectXFileDataReferenceImpl *object = impl_from_IDirectXFileDataReference(iface);
- TRACE("(%p/%p)->(%p)\n", This, iface, pGuid);
+ TRACE("iface %p, guid %p.\n", iface, guid);
- if (!pGuid)
- return DXFILEERR_BADVALUE;
+ if (!guid)
+ return DXFILEERR_BADVALUE;
- *pGuid = This->ptarget->class_id;
+ *guid = object->ptarget->class_id;
- return DXFILE_OK;
+ return DXFILE_OK;
}
/*** IDirectXFileDataReference ***/
@@ -937,54 +939,59 @@ static inline IDirectXFileEnumObjectImpl *impl_from_IDirectXFileEnumObject(IDire
return CONTAINING_RECORD(iface, IDirectXFileEnumObjectImpl, IDirectXFileEnumObject_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject *iface,
+ REFIID riid, void **out)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
+ IDirectXFileEnumObjectImpl *object = impl_from_IDirectXFileEnumObject(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileEnumObject))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileEnumObject_iface;
- return S_OK;
- }
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileEnumObject))
+ {
+ *out = &object->IDirectXFileEnumObject_iface;
+ }
+ else
+ {
+ *out = NULL;
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject* iface)
+static ULONG WINAPI IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject *iface)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileEnumObjectImpl *object = impl_from_IDirectXFileEnumObject(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* iface)
+static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject *iface)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileEnumObjectImpl *object = impl_from_IDirectXFileEnumObject(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- {
- ULONG i;
- for (i = 0; i < This->nb_xobjects; i++)
- IDirectXFileData_Release(This->pRefObjects[i]);
- if (This->mapped_memory)
- UnmapViewOfFile(This->mapped_memory);
- HeapFree(GetProcessHeap(), 0, This->decomp_buffer);
- HeapFree(GetProcessHeap(), 0, This);
- }
+ if (!refcount)
+ {
+ unsigned int i;
+
+ for (i = 0; i < object->nb_xobjects; ++i)
+ IDirectXFileData_Release(object->pRefObjects[i]);
+ if (object->mapped_memory)
+ UnmapViewOfFile(object->mapped_memory);
+ HeapFree(GetProcessHeap(), 0, object->decomp_buffer);
+ HeapFree(GetProcessHeap(), 0, object);
+ }
- return ref;
+ return refcount;
}
/*** IDirectXFileEnumObject methods ***/
@@ -1071,22 +1078,20 @@ error:
return hr;
}
-static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject* iface, REFGUID rguid, LPDIRECTXFILEDATA* ppDataObj)
+static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject *iface,
+ REFGUID guid, LPDIRECTXFILEDATA *data)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
-
- FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, rguid, ppDataObj);
+ FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject* iface, LPCSTR szName, LPDIRECTXFILEDATA* ppDataObj)
+static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject *iface,
+ const char *name, LPDIRECTXFILEDATA *data)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
+ FIXME("iface %p, name %s, data %p stub!\n", iface, debugstr_a(name), data);
- FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szName, ppDataObj);
-
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
static const IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl =
@@ -1122,73 +1127,73 @@ static inline IDirectXFileSaveObjectImpl *impl_from_IDirectXFileSaveObject(IDire
return CONTAINING_RECORD(iface, IDirectXFileSaveObjectImpl, IDirectXFileSaveObject_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject *iface,
+ REFIID riid, void **out)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
+ IDirectXFileSaveObjectImpl *object = impl_from_IDirectXFileSaveObject(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileSaveObject))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileSaveObject_iface;
- return S_OK;
- }
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileSaveObject))
+ {
+ *out = &object->IDirectXFileSaveObject_iface;
+ }
+ else
+ {
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject* iface)
+static ULONG WINAPI IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject *iface)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileSaveObjectImpl *object = impl_from_IDirectXFileSaveObject(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject* iface)
+static ULONG WINAPI IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject *iface)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileSaveObjectImpl *object = impl_from_IDirectXFileSaveObject(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, object);
- return ref;
+ return refcount;
}
-static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject* iface, DWORD cTemplates, const GUID** ppguidTemplates)
+static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject *iface,
+ DWORD count, const GUID **templates)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
+ FIXME("iface %p, count %lu, templates %p stub!\n", iface, count, templates);
- FIXME("(%p/%p)->(%d,%p) stub!\n", This, iface, cTemplates, ppguidTemplates);
-
- return DXFILE_OK;
+ return DXFILE_OK;
}
-static HRESULT WINAPI IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject* iface, REFGUID rguidTemplate, LPCSTR szName, const GUID* pguid, DWORD cbSize, LPVOID pvData, LPDIRECTXFILEDATA* ppDataObj)
+static HRESULT WINAPI IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject *iface, REFGUID template,
+ const char *name, const GUID *guid, DWORD size, void *data, LPDIRECTXFILEDATA *dataobj)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
-
- FIXME("(%p/%p)->(%p,%s,%p,%d,%p,%p) stub!\n", This, iface, rguidTemplate, szName, pguid, cbSize, pvData, ppDataObj);
+ FIXME("iface %p, template %s, name %s, guid %s, size %lu, data %p, dataobj %p stub!\n",
+ iface, debugstr_guid(template), debugstr_a(name), debugstr_guid(guid), size, data, dataobj);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject* iface, LPDIRECTXFILEDATA ppDataObj)
+static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject *iface, LPDIRECTXFILEDATA data)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
+ FIXME("iface %p, data %p stub!\n", iface, data);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
static const IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl =
diff --git a/dlls/d3dxof/parsing.c b/dlls/d3dxof/parsing.c
index 8431078949f..5446124234e 100644
--- a/dlls/d3dxof/parsing.c
+++ b/dlls/d3dxof/parsing.c
@@ -147,7 +147,7 @@ static void dump_template(xtemplate* templates_array, xtemplate* ptemplate)
for (k = 0; k < ptemplate->members[j].nb_dims; k++)
{
if (ptemplate->members[j].dim_fixed[k])
- wine_dbg_printf("[%d]", ptemplate->members[j].dim_value[k]);
+ wine_dbg_printf("[%ld]", ptemplate->members[j].dim_value[k]);
else
wine_dbg_printf("[%s]", ptemplate->members[ptemplate->members[j].dim_value[k]].name);
}
@@ -237,8 +237,8 @@ HRESULT parse_header(parse_buffer * buf, BYTE ** decomp_buffer_ptr)
if (!read_bytes(buf, &decomp_file_size, sizeof(decomp_file_size)))
return DXFILEERR_BADFILETYPE;
- TRACE("Compressed format %s detected: decompressed file size with xof header = %d\n",
- debugstr_fourcc(header[2]), decomp_file_size);
+ TRACE("Compressed format %s detected: decompressed file size with xof header = %lu.\n",
+ debugstr_fourcc(header[2]), decomp_file_size);
/* Does not take xof header into account */
decomp_file_size -= 16;
@@ -274,8 +274,8 @@ HRESULT parse_header(parse_buffer * buf, BYTE ** decomp_buffer_ptr)
}
if ((decomp_buffer - *decomp_buffer_ptr) != decomp_file_size)
- ERR("Size of all decompressed chunks (%u) does not match decompressed file size (%u)\n",
- (DWORD)(decomp_buffer - *decomp_buffer_ptr), decomp_file_size);
+ ERR("Size of all decompressed chunks (%lu) does not match decompressed file size (%lu).\n",
+ (DWORD)(decomp_buffer - *decomp_buffer_ptr), decomp_file_size);
/* Use decompressed data */
buf->buffer = *decomp_buffer_ptr;
@@ -475,19 +475,20 @@ static BOOL is_guid(parse_buffer* buf)
tmp[pos] = 0;
if (pos != 38 /* <+36+> */)
{
- TRACE("Wrong guid %s (%d)\n", tmp, pos);
- return FALSE;
+ TRACE("Wrong guid %s (%lu).\n", tmp, pos);
+ return FALSE;
}
buf->buffer += pos;
buf->rem_bytes -= pos;
- ret = sscanf(tmp, CLSIDFMT, &class_id.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9);
+ ret = sscanf(tmp, "<%08lx-%04lx-%04lx-%02lx%02lx-%02lx%02lx%02lx%02lx%02lx%02lx>",
+ &class_id.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9);
if (ret != 11)
{
- TRACE("Wrong guid %s (%d)\n", tmp, pos);
- return FALSE;
+ TRACE("Wrong guid %s (%lu).\n", tmp, pos);
+ return FALSE;
}
- TRACE("Found guid %s (%d)\n", tmp, pos);
+ TRACE("Found guid %s (%lu).\n", tmp, pos);
class_id.Data2 = tab[0];
class_id.Data3 = tab[1];
@@ -588,9 +589,9 @@ static BOOL is_integer(parse_buffer* buf)
buf->buffer += pos;
buf->rem_bytes -= pos;
- sscanf(tmp, "%d", &integer);
+ sscanf(tmp, "%ld", &integer);
- TRACE("Found integer %s - %d\n", tmp, integer);
+ TRACE("Found integer %s - %ld.\n", tmp, integer);
*(DWORD*)buf->value = integer;
@@ -725,19 +726,19 @@ static WORD parse_TOKEN(parse_buffer * buf)
/* Convert integer and float list into separate elements */
if (token == TOKEN_INTEGER_LIST)
{
- if (!read_bytes(buf, &buf->list_nb_elements, 4))
- return TOKEN_ERROR;
- token = TOKEN_INTEGER;
- buf->list_type_float = FALSE;
- TRACE("Integer list (TOKEN_INTEGER_LIST) of size %d\n", buf->list_nb_elements);
+ if (!read_bytes(buf, &buf->list_nb_elements, 4))
+ return TOKEN_ERROR;
+ token = TOKEN_INTEGER;
+ buf->list_type_float = FALSE;
+ TRACE("Integer list (TOKEN_INTEGER_LIST) of size %lu.\n", buf->list_nb_elements);
}
else if (token == TOKEN_FLOAT_LIST)
{
- if (!read_bytes(buf, &buf->list_nb_elements, 4))
- return TOKEN_ERROR;
- token = TOKEN_FLOAT;
- buf->list_type_float = TRUE;
- TRACE("Float list (TOKEN_FLOAT_LIST) of size %d\n", buf->list_nb_elements);
+ if (!read_bytes(buf, &buf->list_nb_elements, 4))
+ return TOKEN_ERROR;
+ token = TOKEN_FLOAT;
+ buf->list_type_float = TRUE;
+ TRACE("Float list (TOKEN_FLOAT_LIST) of size %lu.\n", buf->list_nb_elements);
}
}
@@ -783,16 +784,16 @@ static WORD parse_TOKEN(parse_buffer * buf)
}
break;
case TOKEN_INTEGER:
- {
+ {
DWORD integer;
if (!read_bytes(buf, &integer, 4))
- return TOKEN_ERROR;
- TRACE("integer = %u\n", integer);
+ return TOKEN_ERROR;
+ TRACE("integer = %lu.\n", integer);
- *(DWORD*)buf->value = integer;
- }
- break;
+ *(DWORD *)buf->value = integer;
+ break;
+ }
case TOKEN_GUID:
{
char strguid[39];
@@ -1089,7 +1090,8 @@ static BOOL parse_template(parse_buffer * buf)
if (get_TOKEN(buf) != TOKEN_CBRACE)
return FALSE;
- TRACE("%d - %s - %s\n", buf->pdxf->nb_xtemplates, buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].name, debugstr_guid(&buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].class_id));
+ TRACE("%lu - %s - %s\n", buf->pdxf->nb_xtemplates, buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].name,
+ debugstr_guid(&buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].class_id));
buf->pdxf->nb_xtemplates++;
return TRUE;
@@ -1161,7 +1163,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
nb_elems *= *(DWORD*)(buf->pxo->root->pdata + buf->pxo->members[pt->members[i].dim_value[k]].start);
}
- TRACE("Elements to consider: %u\n", nb_elems);
+ TRACE("Elements to consider: %lu.\n", nb_elems);
for (k = 0; k < nb_elems; k++)
{
@@ -1201,7 +1203,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
if (token == TOKEN_INTEGER)
{
get_TOKEN(buf);
- TRACE("%s = %d\n", pt->members[i].name, *(DWORD*)buf->value);
+ TRACE("%s = %ld.\n", pt->members[i].name, *(DWORD *)buf->value);
/* Assume larger size */
if (!check_buffer(buf, 4))
return FALSE;
@@ -1217,7 +1219,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
}
else
{
- FIXME("Token %d not supported\n", pt->members[i].type);
+ FIXME("Token %ld not supported.\n", pt->members[i].type);
return FALSE;
}
}
@@ -1234,7 +1236,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
}
else
{
- FIXME("Token %d not supported\n", pt->members[i].type);
+ FIXME("Token %ld not supported.\n", pt->members[i].type);
return FALSE;
}
}
@@ -1259,13 +1261,13 @@ static BOOL parse_object_members_list(parse_buffer * buf)
}
else
{
- FIXME("Token %d not supported\n", pt->members[i].type);
+ FIXME("Token %ld not supported.\n", pt->members[i].type);
return FALSE;
}
}
else
{
- WARN("Unexpected token %d\n", token);
+ WARN("Unexpected token %ld.\n", token);
return FALSE;
}
}
@@ -1369,7 +1371,7 @@ _exit:
if (buf->pxo->nb_children > MAX_CHILDREN)
{
- FIXME("Too many children %d\n", buf->pxo->nb_children);
+ FIXME("Too many children: %lu.\n", buf->pxo->nb_children);
return FALSE;
}
--
2.34.1
1
2
12 Apr '22
Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com>
---
dlls/windowscodecs/tests/metadata.c | 14 +++++++-------
dlls/windowscodecs/tests/pngformat.c | 4 ++--
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c
index 2ec9eb645e80..41f20efa9cd9 100644
--- a/dlls/windowscodecs/tests/metadata.c
+++ b/dlls/windowscodecs/tests/metadata.c
@@ -698,27 +698,27 @@ static void compare_metadata(IWICMetadataReader *reader, const struct test_data
case VT_UI1:
ok(td[i].count == U(value).caub.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).caub.cElems);
for (j = 0; j < U(value).caub.cElems; j++)
- ok(td[i].value[j] == U(value).caub.pElems[j], "%lu: expected value[%ld] %#lx/%#lx, got %#x\n", i, j, (ULONG)td[i].value[j], (ULONG)(td[i].value[j] >> 32), U(value).caub.pElems[j]);
+ ok(td[i].value[j] == U(value).caub.pElems[j], "%lu: expected value[%ld] %#I64x, got %#x\n", i, j, td[i].value[j], U(value).caub.pElems[j]);
break;
case VT_I2:
case VT_UI2:
ok(td[i].count == U(value).caui.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).caui.cElems);
for (j = 0; j < U(value).caui.cElems; j++)
- ok(td[i].value[j] == U(value).caui.pElems[j], "%lu: expected value[%ld] %#lx/%#lx, got %#x\n", i, j, (ULONG)td[i].value[j], (ULONG)(td[i].value[j] >> 32), U(value).caui.pElems[j]);
+ ok(td[i].value[j] == U(value).caui.pElems[j], "%lu: expected value[%ld] %#I64x, got %#x\n", i, j, td[i].value[j], U(value).caui.pElems[j]);
break;
case VT_I4:
case VT_UI4:
case VT_R4:
ok(td[i].count == U(value).caul.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).caul.cElems);
for (j = 0; j < U(value).caul.cElems; j++)
- ok(td[i].value[j] == U(value).caul.pElems[j], "%lu: expected value[%ld] %#lx/%#lx, got %#lx\n", i, j, (ULONG)td[i].value[j], (ULONG)(td[i].value[j] >> 32), U(value).caul.pElems[j]);
+ ok(td[i].value[j] == U(value).caul.pElems[j], "%lu: expected value[%ld] %#I64x, got %#lx\n", i, j, td[i].value[j], U(value).caul.pElems[j]);
break;
case VT_I8:
case VT_UI8:
case VT_R8:
ok(td[i].count == U(value).cauh.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).cauh.cElems);
for (j = 0; j < U(value).cauh.cElems; j++)
- ok(td[i].value[j] == U(value).cauh.pElems[j].QuadPart, "%lu: expected value[%ld] %08lx/%08lx, got %08lx/%08lx\n", i, j, (ULONG)td[i].value[j], (ULONG)(td[i].value[j] >> 32), U(value).cauh.pElems[j].u.LowPart, U(value).cauh.pElems[j].u.HighPart);
+ ok(td[i].value[j] == U(value).cauh.pElems[j].QuadPart, "%lu: expected value[%ld] %I64x, got %08lx/%08lx\n", i, j, td[i].value[j], U(value).cauh.pElems[j].u.LowPart, U(value).cauh.pElems[j].u.HighPart);
break;
case VT_LPSTR:
ok(td[i].count == U(value).calpstr.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).caub.cElems);
@@ -745,8 +745,8 @@ static void compare_metadata(IWICMetadataReader *reader, const struct test_data
ok(!memcmp(td[i].string, U(value).blob.pBlobData, td[i].count), "%lu: expected %s, got %s\n", i, td[i].string, U(value).blob.pBlobData);
}
else
- ok(U(value).uhVal.QuadPart == td[i].value[0], "%lu: expected value %#x/%#x got %#lx/%#lx\n",
- i, (UINT)td[i].value[0], (UINT)(td[i].value[0] >> 32), U(value).uhVal.u.LowPart, U(value).uhVal.u.HighPart);
+ ok(U(value).uhVal.QuadPart == td[i].value[0], "%lu: expected value %#I64x got %#lx/%#lx\n",
+ i, td[i].value[0], U(value).uhVal.u.LowPart, U(value).uhVal.u.HighPart);
PropVariantClear(&schema);
PropVariantClear(&id);
@@ -2067,7 +2067,7 @@ static void test_metadata_APE(void)
ok(value.vt == (VT_UI1|VT_VECTOR), "unexpected vt: %i\n", id.vt);
ok(td[1].count == U(value).caub.cElems, "expected cElems %d, got %ld\n", td[1].count, U(value).caub.cElems);
for (i = 0; i < U(value).caub.cElems; i++)
- ok(td[1].value[i] == U(value).caub.pElems[i], "%u: expected value %#lx/%#lx, got %#x\n", i, (ULONG)td[1].value[i], (ULONG)(td[1].value[i] >> 32), U(value).caub.pElems[i]);
+ ok(td[1].value[i] == U(value).caub.pElems[i], "%u: expected value %#I64x, got %#x\n", i, td[1].value[i], U(value).caub.pElems[i]);
PropVariantClear(&value);
hr = IWICMetadataReader_GetMetadataHandlerInfo(reader, &info);
diff --git a/dlls/windowscodecs/tests/pngformat.c b/dlls/windowscodecs/tests/pngformat.c
index 1181ebbe3690..ca5a220d40d6 100644
--- a/dlls/windowscodecs/tests/pngformat.c
+++ b/dlls/windowscodecs/tests/pngformat.c
@@ -300,8 +300,8 @@ static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitma
zero.QuadPart = 0;
IStream_Seek (stream, zero, STREAM_SEEK_CUR, &pos);
- ok(pos.QuadPart < image_size, "seek beyond the end of stream: %x%08x >= %x\n",
- (UINT)(pos.QuadPart >> 32), (UINT)pos.QuadPart, image_size);
+ ok(pos.QuadPart < image_size, "seek beyond the end of stream: %I64x >= %x\n",
+ pos.QuadPart, image_size);
refcount = IStream_Release(stream);
ok(refcount > 0, "expected stream refcount > 0\n");
2
1
The following series is the result of work from
- Torge Matties, Jacek Caban and myself
- and went through various convergence, merges, rewrite and improvements
(especially patch #2 for various authors)
it provides:
- support for CREATE_NO_WINDOW flag in CreateProcess
- a solution for regression introduced in f034084d49b354811096524d472ae5172ac1cebf
(when a Wine initial process isn't attached to a unix console, it can
generates lots new console window creation, with unwanted side effects,
like not using parents std streams for output)
- with the correspondings non regression tests
v3 -> v4:
- using negative handle values for console pseudo handles
- don't report FIXME to users
- removed Wine only tests
Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com>
---
Supersedes: 231894-231897
Eric Pouech (4):
dlls/kernel32/tests: Add more CreateProcess console management tests.
dlls/{ntdll, kernel*}: Add support for CREATE_NO_WINDOW flag in CreateProcess.
include/condrv.h, server: using negative values for console pseudo handles
dlls/{ntdll,kernel*}: provide a pseudo console environment for initial CUI processes not tied to an Unix tty
dlls/kernel32/tests/console.c | 86 +++++++++++++++++++++++++++++------
dlls/kernelbase/console.c | 39 ++++++++++++----
dlls/kernelbase/process.c | 11 +++--
dlls/ntdll/unix/env.c | 2 +
dlls/ntdll/unix/process.c | 2 +
include/wine/condrv.h | 6 ++-
programs/conhost/conhost.c | 11 +++--
programs/conhost/conhost.h | 1 +
server/process.c | 4 +-
9 files changed, 128 insertions(+), 34 deletions(-)
2
8
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/evr/evr.c | 42 ++++++++++++++++++++++++++++++++++++++++++
dlls/evr/tests/evr.c | 21 ++++++++++++++++++++-
2 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c
index 5e6ca03ea3d..e64151b650c 100644
--- a/dlls/evr/evr.c
+++ b/dlls/evr/evr.c
@@ -34,6 +34,7 @@ struct evr
{
struct strmbase_renderer renderer;
IEVRFilterConfig IEVRFilterConfig_iface;
+ IAMFilterMiscFlags IAMFilterMiscFlags_iface;
};
static struct evr *impl_from_strmbase_renderer(struct strmbase_renderer *iface)
@@ -47,6 +48,8 @@ static HRESULT evr_query_interface(struct strmbase_renderer *iface, REFIID iid,
if (IsEqualGUID(iid, &IID_IEVRFilterConfig))
*out = &filter->IEVRFilterConfig_iface;
+ else if (IsEqualGUID(iid, &IID_IAMFilterMiscFlags))
+ *out = &filter->IAMFilterMiscFlags_iface;
else
return E_NOINTERFACE;
@@ -132,6 +135,44 @@ static const IEVRFilterConfigVtbl filter_config_vtbl =
filter_config_GetNumberOfStreams,
};
+static struct evr *impl_from_IAMFilterMiscFlags(IAMFilterMiscFlags *iface)
+{
+ return CONTAINING_RECORD(iface, struct evr, IAMFilterMiscFlags_iface);
+}
+
+static HRESULT WINAPI filter_misc_flags_QueryInterface(IAMFilterMiscFlags *iface, REFIID iid, void **out)
+{
+ struct evr *filter = impl_from_IAMFilterMiscFlags(iface);
+ return IUnknown_QueryInterface(filter->renderer.filter.outer_unk, iid, out);
+}
+
+static ULONG WINAPI filter_misc_flags_AddRef(IAMFilterMiscFlags *iface)
+{
+ struct evr *filter = impl_from_IAMFilterMiscFlags(iface);
+ return IUnknown_AddRef(filter->renderer.filter.outer_unk);
+}
+
+static ULONG WINAPI filter_misc_flags_Release(IAMFilterMiscFlags *iface)
+{
+ struct evr *filter = impl_from_IAMFilterMiscFlags(iface);
+ return IUnknown_Release(filter->renderer.filter.outer_unk);
+}
+
+static ULONG WINAPI filter_misc_flags_GetMiscFlags(IAMFilterMiscFlags *iface)
+{
+ TRACE("%p.\n", iface);
+
+ return AM_FILTER_MISC_FLAGS_IS_RENDERER;
+}
+
+static const IAMFilterMiscFlagsVtbl filter_misc_flags_vtbl =
+{
+ filter_misc_flags_QueryInterface,
+ filter_misc_flags_AddRef,
+ filter_misc_flags_Release,
+ filter_misc_flags_GetMiscFlags,
+};
+
HRESULT evr_filter_create(IUnknown *outer, void **out)
{
struct evr *object;
@@ -142,6 +183,7 @@ HRESULT evr_filter_create(IUnknown *outer, void **out)
strmbase_renderer_init(&object->renderer, outer,
&CLSID_EnhancedVideoRenderer, L"EVR Input0", &renderer_ops);
object->IEVRFilterConfig_iface.lpVtbl = &filter_config_vtbl;
+ object->IAMFilterMiscFlags_iface.lpVtbl = &filter_misc_flags_vtbl;
TRACE("Created EVR %p.\n", object);
*out = &object->renderer.filter.IUnknown_inner;
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 93e262e52a3..fa9ad2a0b35 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -276,7 +276,7 @@ static void test_interfaces(void)
IBaseFilter *filter = create_evr();
ULONG ref;
- todo_wine check_interface(filter, &IID_IAMFilterMiscFlags, TRUE);
+ check_interface(filter, &IID_IAMFilterMiscFlags, TRUE);
check_interface(filter, &IID_IBaseFilter, TRUE);
check_interface(filter, &IID_IEVRFilterConfig, TRUE);
check_interface(filter, &IID_IMediaFilter, TRUE);
@@ -551,6 +551,24 @@ static void test_unconnected_eos(void)
ok(!ref, "Got outstanding refcount %ld.\n", ref);
}
+static void test_misc_flags(void)
+{
+ IBaseFilter *filter = create_evr();
+ IAMFilterMiscFlags *misc_flags;
+ ULONG ref, flags;
+ HRESULT hr;
+
+ hr = IBaseFilter_QueryInterface(filter, &IID_IAMFilterMiscFlags, (void **)&misc_flags);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ flags = IAMFilterMiscFlags_GetMiscFlags(misc_flags);
+ ok(flags == AM_FILTER_MISC_FLAGS_IS_RENDERER, "Unexpected flags %#lx.\n", flags);
+ IAMFilterMiscFlags_Release(misc_flags);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %ld.\n", ref);
+}
+
static IMFMediaType * create_video_type(const GUID *subtype)
{
IMFMediaType *video_type;
@@ -3207,6 +3225,7 @@ START_TEST(evr)
test_find_pin();
test_pin_info();
test_unconnected_eos();
+ test_misc_flags();
test_default_mixer();
test_default_mixer_type_negotiation();
--
2.35.1
2
1
12 Apr '22
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/wineoss.drv/mmdevdrv.c | 300 ++++--------------------------------
dlls/wineoss.drv/oss.c | 139 +++++++++++++++++
dlls/wineoss.drv/unixlib.h | 21 +++
3 files changed, 191 insertions(+), 269 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 56b188424fb..2ea3c80f3ca 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -260,6 +260,16 @@ int WINAPI AUDDRV_GetPriority(void)
return params.priority;
}
+static HRESULT stream_release(struct oss_stream *stream)
+{
+ struct release_stream_params params;
+
+ params.stream = stream;
+ OSS_CALL(release_stream, ¶ms);
+
+ return params.result;
+}
+
static void oss_lock(struct oss_stream *stream)
{
pthread_mutex_lock(&stream->lock);
@@ -342,13 +352,6 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid)
RegCloseKey(key);
}
-static int open_device(const char *device, EDataFlow flow)
-{
- int flags = ((flow == eRender) ? O_WRONLY : O_RDONLY) | O_NONBLOCK;
-
- return open(device, flags, 0);
-}
-
static void set_stream_volumes(ACImpl *This)
{
struct oss_stream *stream = This->stream;
@@ -524,7 +527,6 @@ static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface)
static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
{
ACImpl *This = impl_from_IAudioClient3(iface);
- struct oss_stream *stream = This->stream;
ULONG ref;
ref = InterlockedDecrement(&This->ref);
@@ -550,21 +552,8 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
LeaveCriticalSection(&g_sessions_lock);
}
HeapFree(GetProcessHeap(), 0, This->vols);
- if(stream){
- SIZE_T size;
- close(stream->fd);
- if(stream->local_buffer){
- size = 0;
- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
- }
- if(stream->tmp_buffer){
- size = 0;
- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
- }
- CoTaskMemFree(stream->fmt);
- pthread_mutex_destroy(&stream->lock);
- HeapFree(GetProcessHeap(), 0, stream);
- }
+ if(This->stream)
+ stream_release(This->stream);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -604,177 +593,6 @@ static void dump_fmt(const WAVEFORMATEX *fmt)
}
}
-static DWORD get_channel_mask(unsigned int channels)
-{
- switch(channels){
- case 0:
- return 0;
- case 1:
- return KSAUDIO_SPEAKER_MONO;
- case 2:
- return KSAUDIO_SPEAKER_STEREO;
- case 3:
- return KSAUDIO_SPEAKER_STEREO | SPEAKER_LOW_FREQUENCY;
- case 4:
- return KSAUDIO_SPEAKER_QUAD; /* not _SURROUND */
- case 5:
- return KSAUDIO_SPEAKER_QUAD | SPEAKER_LOW_FREQUENCY;
- case 6:
- return KSAUDIO_SPEAKER_5POINT1; /* not 5POINT1_SURROUND */
- case 7:
- return KSAUDIO_SPEAKER_5POINT1 | SPEAKER_BACK_CENTER;
- case 8:
- return KSAUDIO_SPEAKER_7POINT1_SURROUND; /* Vista deprecates 7POINT1 */
- }
- FIXME("Unknown speaker configuration: %u\n", channels);
- return 0;
-}
-
-static int get_oss_format(const WAVEFORMATEX *fmt)
-{
- WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)fmt;
-
- if(fmt->wFormatTag == WAVE_FORMAT_PCM ||
- (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))){
- switch(fmt->wBitsPerSample){
- case 8:
- return AFMT_U8;
- case 16:
- return AFMT_S16_LE;
- case 24:
- return AFMT_S24_LE;
- case 32:
- return AFMT_S32_LE;
- }
- return -1;
- }
-
-#ifdef AFMT_FLOAT
- if(fmt->wFormatTag == WAVE_FORMAT_IEEE_FLOAT ||
- (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT))){
- if(fmt->wBitsPerSample != 32)
- return -1;
-
- return AFMT_FLOAT;
- }
-#endif
-
- return -1;
-}
-
-static WAVEFORMATEX *clone_format(const WAVEFORMATEX *fmt)
-{
- WAVEFORMATEX *ret;
- size_t size;
-
- if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- size = sizeof(WAVEFORMATEXTENSIBLE);
- else
- size = sizeof(WAVEFORMATEX);
-
- ret = CoTaskMemAlloc(size);
- if(!ret)
- return NULL;
-
- memcpy(ret, fmt, size);
-
- ret->cbSize = size - sizeof(WAVEFORMATEX);
-
- return ret;
-}
-
-static HRESULT setup_oss_device(AUDCLNT_SHAREMODE mode, int fd,
- const WAVEFORMATEX *fmt, WAVEFORMATEX **out)
-{
- int tmp, oss_format;
- double tenth;
- HRESULT ret = S_OK;
- WAVEFORMATEX *closest = NULL;
-
- tmp = oss_format = get_oss_format(fmt);
- if(oss_format < 0)
- return AUDCLNT_E_UNSUPPORTED_FORMAT;
- if(ioctl(fd, SNDCTL_DSP_SETFMT, &tmp) < 0){
- WARN("SETFMT failed: %d (%s)\n", errno, strerror(errno));
- return E_FAIL;
- }
- if(tmp != oss_format){
- TRACE("Format unsupported by this OSS version: %x\n", oss_format);
- return AUDCLNT_E_UNSUPPORTED_FORMAT;
- }
-
- if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- (fmt->nAvgBytesPerSec == 0 ||
- fmt->nBlockAlign == 0 ||
- ((WAVEFORMATEXTENSIBLE*)fmt)->Samples.wValidBitsPerSample > fmt->wBitsPerSample))
- return E_INVALIDARG;
-
- if(fmt->nChannels == 0)
- return AUDCLNT_E_UNSUPPORTED_FORMAT;
-
- closest = clone_format(fmt);
- if(!closest)
- return E_OUTOFMEMORY;
-
- tmp = fmt->nSamplesPerSec;
- if(ioctl(fd, SNDCTL_DSP_SPEED, &tmp) < 0){
- WARN("SPEED failed: %d (%s)\n", errno, strerror(errno));
- CoTaskMemFree(closest);
- return E_FAIL;
- }
- tenth = fmt->nSamplesPerSec * 0.1;
- if(tmp > fmt->nSamplesPerSec + tenth || tmp < fmt->nSamplesPerSec - tenth){
- ret = S_FALSE;
- closest->nSamplesPerSec = tmp;
- }
-
- tmp = fmt->nChannels;
- if(ioctl(fd, SNDCTL_DSP_CHANNELS, &tmp) < 0){
- WARN("CHANNELS failed: %d (%s)\n", errno, strerror(errno));
- CoTaskMemFree(closest);
- return E_FAIL;
- }
- if(tmp != fmt->nChannels){
- ret = S_FALSE;
- closest->nChannels = tmp;
- }
-
- if(closest->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- ((WAVEFORMATEXTENSIBLE*)closest)->dwChannelMask = get_channel_mask(closest->nChannels);
-
- if(fmt->nBlockAlign != fmt->nChannels * fmt->wBitsPerSample / 8 ||
- fmt->nAvgBytesPerSec != fmt->nBlockAlign * fmt->nSamplesPerSec ||
- (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- ((WAVEFORMATEXTENSIBLE*)fmt)->Samples.wValidBitsPerSample < fmt->wBitsPerSample))
- ret = S_FALSE;
-
- if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE &&
- fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE){
- if(((WAVEFORMATEXTENSIBLE*)fmt)->dwChannelMask == 0 ||
- ((WAVEFORMATEXTENSIBLE*)fmt)->dwChannelMask & SPEAKER_RESERVED)
- ret = S_FALSE;
- }
-
- if(ret == S_FALSE && !out)
- ret = AUDCLNT_E_UNSUPPORTED_FORMAT;
-
- if(ret == S_FALSE && out){
- closest->nBlockAlign =
- closest->nChannels * closest->wBitsPerSample / 8;
- closest->nAvgBytesPerSec =
- closest->nBlockAlign * closest->nSamplesPerSec;
- if(closest->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- ((WAVEFORMATEXTENSIBLE*)closest)->Samples.wValidBitsPerSample = closest->wBitsPerSample;
- *out = closest;
- } else
- CoTaskMemFree(closest);
-
- TRACE("returning: %08x\n", ret);
- return ret;
-}
-
static void session_init_vols(AudioSession *session, UINT channels)
{
if(session->channel_count < channels){
@@ -860,11 +678,9 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
const GUID *sessionguid)
{
ACImpl *This = impl_from_IAudioClient3(iface);
+ struct create_stream_params params;
struct oss_stream *stream;
- oss_audioinfo ai;
- SIZE_T size;
- int i;
- HRESULT hr;
+ unsigned int i;
TRACE("(%p)->(%x, %x, %s, %s, %p, %s)\n", This, mode, flags,
wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid));
@@ -920,92 +736,38 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
return AUDCLNT_E_ALREADY_INITIALIZED;
}
- stream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->stream));
- if(!stream){
- LeaveCriticalSection(&g_sessions_lock);
- return E_OUTOFMEMORY;
- }
- stream->flow = This->dataflow;
- pthread_mutex_init(&stream->lock, NULL);
-
- stream->fd = open_device(This->devnode, This->dataflow);
- if(stream->fd < 0){
- WARN("Unable to open device %s: %d (%s)\n", This->devnode, errno, strerror(errno));
- hr = AUDCLNT_E_DEVICE_INVALIDATED;
- goto exit;
- }
-
- ai.dev = -1;
- if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
- WARN("Unable to get audio info for device %s: %d (%s)\n", This->devnode, errno, strerror(errno));
- hr = E_FAIL;
- goto exit;
- }
-
- TRACE("OSS audioinfo:\n");
- TRACE("devnode: %s\n", ai.devnode);
- TRACE("name: %s\n", ai.name);
- TRACE("busy: %x\n", ai.busy);
- TRACE("caps: %x\n", ai.caps);
- TRACE("iformats: %x\n", ai.iformats);
- TRACE("oformats: %x\n", ai.oformats);
- TRACE("enabled: %d\n", ai.enabled);
- TRACE("min_rate: %d\n", ai.min_rate);
- TRACE("max_rate: %d\n", ai.max_rate);
- TRACE("min_channels: %d\n", ai.min_channels);
- TRACE("max_channels: %d\n", ai.max_channels);
-
- hr = setup_oss_device(mode, stream->fd, fmt, NULL);
- if(FAILED(hr))
- goto exit;
-
- stream->fmt = clone_format(fmt);
- if(!stream->fmt){
- hr = E_OUTOFMEMORY;
- goto exit;
- }
-
- stream->period_us = period / 10;
- stream->period_frames = MulDiv(fmt->nSamplesPerSec, period, 10000000);
+ params.device = This->devnode;
+ params.flow = This->dataflow;
+ params.share = mode;
+ params.flags = flags;
+ params.duration = duration;
+ params.period = period;
+ params.fmt = fmt;
+ params.stream = &stream;
- stream->bufsize_frames = MulDiv(duration, fmt->nSamplesPerSec, 10000000);
- if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE)
- stream->bufsize_frames -= stream->bufsize_frames % stream->period_frames;
- size = stream->bufsize_frames * fmt->nBlockAlign;
- if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, 0, &size,
- MEM_COMMIT, PAGE_READWRITE)){
- hr = E_OUTOFMEMORY;
- goto exit;
+ OSS_CALL(create_stream, ¶ms);
+ if(FAILED(params.result)){
+ LeaveCriticalSection(&g_sessions_lock);
+ return params.result;
}
This->channel_count = fmt->nChannels;
This->vols = HeapAlloc(GetProcessHeap(), 0, This->channel_count * sizeof(float));
if(!This->vols){
- hr = E_OUTOFMEMORY;
+ params.result = E_OUTOFMEMORY;
goto exit;
}
for(i = 0; i < This->channel_count; ++i)
This->vols[i] = 1.f;
- stream->share = mode;
- stream->flags = flags;
- stream->oss_bufsize_bytes = 0;
-
- hr = get_audio_session(sessionguid, This->parent, This->channel_count,
+ params.result = get_audio_session(sessionguid, This->parent, This->channel_count,
&This->session);
exit:
- if(FAILED(hr)){
+ if(FAILED(params.result)){
+ stream_release(stream);
HeapFree(GetProcessHeap(), 0, This->vols);
This->vols = NULL;
- CoTaskMemFree(stream->fmt);
- if(stream->fd >= 0) close(stream->fd);
- if(stream->local_buffer){
- size = 0;
- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
- }
- pthread_mutex_destroy(&stream->lock);
- HeapFree(GetProcessHeap(), 0, stream);
} else {
list_add_tail(&This->session->clients, &This->entry);
This->stream = stream;
@@ -1014,7 +776,7 @@ exit:
LeaveCriticalSection(&g_sessions_lock);
- return hr;
+ return params.result;
}
static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface,
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c
index 389ec73ee10..628d0c5818a 100644
--- a/dlls/wineoss.drv/oss.c
+++ b/dlls/wineoss.drv/oss.c
@@ -31,6 +31,7 @@
#include <unistd.h>
#include <errno.h>
#include <sys/soundcard.h>
+#include <pthread.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@@ -45,6 +46,30 @@
WINE_DEFAULT_DEBUG_CHANNEL(oss);
+/* copied from kernelbase */
+static int muldiv( int a, int b, int c )
+{
+ LONGLONG ret;
+
+ if (!c) return -1;
+
+ /* We want to deal with a positive divisor to simplify the logic. */
+ if (c < 0)
+ {
+ a = -a;
+ c = -c;
+ }
+
+ /* If the result is positive, we "add" to round. else, we subtract to round. */
+ if ((a < 0 && b < 0) || (a >= 0 && b >= 0))
+ ret = (((LONGLONG)a * b) + (c / 2)) / c;
+ else
+ ret = (((LONGLONG)a * b) - (c / 2)) / c;
+
+ if (ret > 2147483647 || ret < -2147483647) return -1;
+ return ret;
+}
+
static NTSTATUS test_connect(void *args)
{
struct test_connect_params *params = args;
@@ -466,6 +491,118 @@ static HRESULT setup_oss_device(AUDCLNT_SHAREMODE share, int fd,
return ret;
}
+static NTSTATUS create_stream(void *args)
+{
+ struct create_stream_params *params = args;
+ WAVEFORMATEXTENSIBLE *fmtex;
+ struct oss_stream *stream;
+ oss_audioinfo ai;
+ SIZE_T size;
+
+ stream = calloc(1, sizeof(*stream));
+ if(!stream){
+ params->result = E_OUTOFMEMORY;
+ return STATUS_SUCCESS;
+ }
+
+ stream->flow = params->flow;
+ pthread_mutex_init(&stream->lock, NULL);
+
+ stream->fd = open_device(params->device, params->flow);
+ if(stream->fd < 0){
+ WARN("Unable to open device %s: %d (%s)\n", params->device, errno, strerror(errno));
+ params->result = AUDCLNT_E_DEVICE_INVALIDATED;
+ goto exit;
+ }
+
+ ai.dev = -1;
+ if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
+ WARN("Unable to get audio info for device %s: %d (%s)\n", params->device, errno, strerror(errno));
+ params->result = E_FAIL;
+ goto exit;
+ }
+
+ TRACE("OSS audioinfo:\n");
+ TRACE("devnode: %s\n", ai.devnode);
+ TRACE("name: %s\n", ai.name);
+ TRACE("busy: %x\n", ai.busy);
+ TRACE("caps: %x\n", ai.caps);
+ TRACE("iformats: %x\n", ai.iformats);
+ TRACE("oformats: %x\n", ai.oformats);
+ TRACE("enabled: %d\n", ai.enabled);
+ TRACE("min_rate: %d\n", ai.min_rate);
+ TRACE("max_rate: %d\n", ai.max_rate);
+ TRACE("min_channels: %d\n", ai.min_channels);
+ TRACE("max_channels: %d\n", ai.max_channels);
+
+ params->result = setup_oss_device(params->share, stream->fd, params->fmt, NULL);
+ if(FAILED(params->result))
+ goto exit;
+
+ fmtex = clone_format(params->fmt);
+ if(!fmtex){
+ params->result = E_OUTOFMEMORY;
+ goto exit;
+ }
+ stream->fmt = &fmtex->Format;
+
+ stream->period_us = params->period / 10;
+ stream->period_frames = muldiv(params->fmt->nSamplesPerSec, params->period, 10000000);
+
+ stream->bufsize_frames = muldiv(params->duration, params->fmt->nSamplesPerSec, 10000000);
+ if(params->share == AUDCLNT_SHAREMODE_EXCLUSIVE)
+ stream->bufsize_frames -= stream->bufsize_frames % stream->period_frames;
+ size = stream->bufsize_frames * params->fmt->nBlockAlign;
+ if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, 0, &size,
+ MEM_COMMIT, PAGE_READWRITE)){
+ params->result = E_OUTOFMEMORY;
+ goto exit;
+ }
+
+ stream->share = params->share;
+ stream->flags = params->flags;
+ stream->oss_bufsize_bytes = 0;
+
+exit:
+ if(FAILED(params->result)){
+ if(stream->fd >= 0) close(stream->fd);
+ if(stream->local_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
+ }
+ pthread_mutex_destroy(&stream->lock);
+ free(stream->fmt);
+ free(stream);
+ }else{
+ *params->stream = stream;
+ }
+
+ return STATUS_SUCCESS;
+}
+
+static NTSTATUS release_stream(void *args)
+{
+ struct release_stream_params *params = args;
+ struct oss_stream *stream = params->stream;
+ SIZE_T size;
+
+ close(stream->fd);
+ if(stream->local_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
+ }
+ if(stream->tmp_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
+ }
+ free(stream->fmt);
+ pthread_mutex_destroy(&stream->lock);
+ free(stream);
+
+ params->result = S_OK;
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS is_format_supported(void *args)
{
struct is_format_supported_params *params = args;
@@ -599,6 +736,8 @@ unixlib_entry_t __wine_unix_call_funcs[] =
{
test_connect,
get_endpoint_ids,
+ create_stream,
+ release_stream,
is_format_supported,
get_mix_format,
};
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
index 8f82518b10e..c0a0b25c374 100644
--- a/dlls/wineoss.drv/unixlib.h
+++ b/dlls/wineoss.drv/unixlib.h
@@ -69,6 +69,25 @@ struct get_endpoint_ids_params
unsigned int default_idx;
};
+struct create_stream_params
+{
+ const char *device;
+ EDataFlow flow;
+ AUDCLNT_SHAREMODE share;
+ UINT flags;
+ REFERENCE_TIME duration;
+ REFERENCE_TIME period;
+ const WAVEFORMATEX *fmt;
+ HRESULT result;
+ struct oss_stream **stream;
+};
+
+struct release_stream_params
+{
+ struct oss_stream *stream;
+ HRESULT result;
+};
+
struct is_format_supported_params
{
const char *device;
@@ -91,6 +110,8 @@ enum oss_funcs
{
oss_test_connect,
oss_get_endpoint_ids,
+ oss_create_stream,
+ oss_release_stream,
oss_is_format_supported,
oss_get_mix_format,
};
--
2.25.1
2
1
[PATCH 5/6] wineoss: Use NtAllocateVirtualMemory() to alloc the buffers returned to the user.
by Huw Davies 12 Apr '22
by Huw Davies 12 Apr '22
12 Apr '22
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/wineoss.drv/mmdevdrv.c | 51 +++++++++++++++++++++++++++----------
1 file changed, 37 insertions(+), 14 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 2fd2e3c08ad..56b188424fb 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -551,9 +551,16 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
}
HeapFree(GetProcessHeap(), 0, This->vols);
if(stream){
+ SIZE_T size;
close(stream->fd);
- HeapFree(GetProcessHeap(), 0, stream->local_buffer);
- HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
+ if(stream->local_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
+ }
+ if(stream->tmp_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
+ }
CoTaskMemFree(stream->fmt);
pthread_mutex_destroy(&stream->lock);
HeapFree(GetProcessHeap(), 0, stream);
@@ -855,6 +862,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
ACImpl *This = impl_from_IAudioClient3(iface);
struct oss_stream *stream;
oss_audioinfo ai;
+ SIZE_T size;
int i;
HRESULT hr;
@@ -963,9 +971,9 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
stream->bufsize_frames = MulDiv(duration, fmt->nSamplesPerSec, 10000000);
if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE)
stream->bufsize_frames -= stream->bufsize_frames % stream->period_frames;
- stream->local_buffer = HeapAlloc(GetProcessHeap(), 0,
- stream->bufsize_frames * fmt->nBlockAlign);
- if(!stream->local_buffer){
+ size = stream->bufsize_frames * fmt->nBlockAlign;
+ if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, 0, &size,
+ MEM_COMMIT, PAGE_READWRITE)){
hr = E_OUTOFMEMORY;
goto exit;
}
@@ -992,7 +1000,10 @@ exit:
This->vols = NULL;
CoTaskMemFree(stream->fmt);
if(stream->fd >= 0) close(stream->fd);
- HeapFree(GetProcessHeap(), 0, stream->local_buffer);
+ if(stream->local_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
+ }
pthread_mutex_destroy(&stream->lock);
HeapFree(GetProcessHeap(), 0, stream);
} else {
@@ -1707,6 +1718,7 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
ACImpl *This = impl_from_IAudioRenderClient(iface);
struct oss_stream *stream = This->stream;
UINT32 write_pos;
+ SIZE_T size;
TRACE("(%p)->(%u, %p)\n", This, frames, data);
@@ -1736,10 +1748,15 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
(stream->lcl_offs_frames + stream->held_frames) % stream->bufsize_frames;
if(write_pos + frames > stream->bufsize_frames){
if(stream->tmp_buffer_frames < frames){
- HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
- stream->tmp_buffer = HeapAlloc(GetProcessHeap(), 0,
- frames * stream->fmt->nBlockAlign);
- if(!stream->tmp_buffer){
+ if(stream->tmp_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
+ stream->tmp_buffer = NULL;
+ }
+ size = frames * stream->fmt->nBlockAlign;
+ if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, 0, &size,
+ MEM_COMMIT, PAGE_READWRITE)){
+ stream->tmp_buffer_frames = 0;
oss_unlock(stream);
return E_OUTOFMEMORY;
}
@@ -1875,6 +1892,7 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
{
ACImpl *This = impl_from_IAudioCaptureClient(iface);
struct oss_stream *stream = This->stream;
+ SIZE_T size;
TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags,
devpos, qpcpos);
@@ -1907,10 +1925,15 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
if(stream->lcl_offs_frames + *frames > stream->bufsize_frames){
UINT32 chunk_bytes, offs_bytes, frames_bytes;
if(stream->tmp_buffer_frames < *frames){
- HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
- stream->tmp_buffer = HeapAlloc(GetProcessHeap(), 0,
- *frames * stream->fmt->nBlockAlign);
- if(!stream->tmp_buffer){
+ if(stream->tmp_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
+ stream->tmp_buffer = NULL;
+ }
+ size = *frames * stream->fmt->nBlockAlign;
+ if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, 0, &size,
+ MEM_COMMIT, PAGE_READWRITE)){
+ stream->tmp_buffer_frames = 0;
oss_unlock(stream);
return E_OUTOFMEMORY;
}
--
2.25.1
3
3
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/wineoss.drv/mmdevdrv.c | 167 +++++++++++++++++-------------------
dlls/wineoss.drv/unixlib.h | 2 +
2 files changed, 83 insertions(+), 86 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 13037e07821..2fd2e3c08ad 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -33,6 +33,7 @@
#include <unistd.h>
#include <math.h>
#include <sys/soundcard.h>
+#include <pthread.h>
#include "windef.h"
#include "winbase.h"
@@ -115,8 +116,6 @@ struct ACImpl {
HANDLE timer;
- CRITICAL_SECTION lock;
-
AudioSession *session;
AudioSessionWrapper *session_wrapper;
@@ -261,6 +260,16 @@ int WINAPI AUDDRV_GetPriority(void)
return params.priority;
}
+static void oss_lock(struct oss_stream *stream)
+{
+ pthread_mutex_lock(&stream->lock);
+}
+
+static void oss_unlock(struct oss_stream *stream)
+{
+ pthread_mutex_unlock(&stream->lock);
+}
+
static void set_device_guid(EDataFlow flow, HKEY drv_key, const WCHAR *key_name,
GUID *guid)
{
@@ -344,9 +353,9 @@ static void set_stream_volumes(ACImpl *This)
{
struct oss_stream *stream = This->stream;
- EnterCriticalSection(&This->lock);
+ oss_lock(stream);
stream->mute = This->session->mute;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
}
static const OSSDevice *get_ossdevice_from_guid(const GUID *guid)
@@ -470,9 +479,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
This->IAudioClock2_iface.lpVtbl = &AudioClock2_Vtbl;
This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl;
- InitializeCriticalSection(&This->lock);
- This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ACImpl.lock");
-
This->parent = dev;
IMMDevice_AddRef(This->parent);
@@ -538,8 +544,6 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
IAudioClient3_Stop(iface);
IMMDevice_Release(This->parent);
IUnknown_Release(This->pUnkFTMarshal);
- This->lock.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection(&This->lock);
if(This->session){
EnterCriticalSection(&g_sessions_lock);
list_remove(&This->entry);
@@ -551,6 +555,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
HeapFree(GetProcessHeap(), 0, stream->local_buffer);
HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
CoTaskMemFree(stream->fmt);
+ pthread_mutex_destroy(&stream->lock);
HeapFree(GetProcessHeap(), 0, stream);
}
HeapFree(GetProcessHeap(), 0, This);
@@ -913,6 +918,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
return E_OUTOFMEMORY;
}
stream->flow = This->dataflow;
+ pthread_mutex_init(&stream->lock, NULL);
stream->fd = open_device(This->devnode, This->dataflow);
if(stream->fd < 0){
@@ -987,6 +993,7 @@ exit:
CoTaskMemFree(stream->fmt);
if(stream->fd >= 0) close(stream->fd);
HeapFree(GetProcessHeap(), 0, stream->local_buffer);
+ pthread_mutex_destroy(&stream->lock);
HeapFree(GetProcessHeap(), 0, stream);
} else {
list_add_tail(&This->session->clients, &This->entry);
@@ -1010,18 +1017,16 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface,
if(!frames)
return E_POINTER;
- EnterCriticalSection(&This->lock);
-
- if(!This->stream){
- LeaveCriticalSection(&This->lock);
+ if(!This->stream)
return AUDCLNT_E_NOT_INITIALIZED;
- }
+
+ oss_lock(stream);
*frames = stream->bufsize_frames;
TRACE("buffer size: %u\n", *frames);
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1037,18 +1042,16 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface,
if(!latency)
return E_POINTER;
- EnterCriticalSection(&This->lock);
-
- if(!This->stream){
- LeaveCriticalSection(&This->lock);
+ if(!This->stream)
return AUDCLNT_E_NOT_INITIALIZED;
- }
+
+ oss_lock(stream);
/* pretend we process audio in Period chunks, so max latency includes
* the period time. Some native machines add .6666ms in shared mode. */
*latency = (REFERENCE_TIME)stream->period_us * 10 + 6666;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1064,18 +1067,16 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface,
if(!numpad)
return E_POINTER;
- EnterCriticalSection(&This->lock);
-
- if(!This->stream){
- LeaveCriticalSection(&This->lock);
+ if(!This->stream)
return AUDCLNT_E_NOT_INITIALIZED;
- }
+
+ oss_lock(stream);
*numpad = stream->held_frames;
TRACE("padding: %u\n", *numpad);
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1310,7 +1311,7 @@ static void CALLBACK oss_period_callback(void *user, BOOLEAN timer)
ACImpl *This = user;
struct oss_stream *stream = This->stream;
- EnterCriticalSection(&This->lock);
+ oss_lock(stream);
if(stream->playing){
if(stream->flow == eRender && stream->held_frames)
@@ -1319,10 +1320,10 @@ static void CALLBACK oss_period_callback(void *user, BOOLEAN timer)
oss_read_data(stream);
}
- LeaveCriticalSection(&This->lock);
-
if(stream->event)
SetEvent(stream->event);
+
+ oss_unlock(stream);
}
static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
@@ -1333,22 +1334,22 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
TRACE("(%p)\n", This);
EnterCriticalSection(&g_sessions_lock);
- EnterCriticalSection(&This->lock);
if(!This->stream){
- LeaveCriticalSection(&This->lock);
LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
+ oss_lock(stream);
+
if((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_EVENTHANDLE_NOT_SET;
}
if(stream->playing){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_NOT_STOPPED;
}
@@ -1362,7 +1363,7 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
stream->playing = TRUE;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
LeaveCriticalSection(&g_sessions_lock);
return S_OK;
@@ -1375,22 +1376,20 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface)
TRACE("(%p)\n", This);
- EnterCriticalSection(&This->lock);
-
- if(!This->stream){
- LeaveCriticalSection(&This->lock);
+ if(!This->stream)
return AUDCLNT_E_NOT_INITIALIZED;
- }
+
+ oss_lock(stream);
if(!stream->playing){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_FALSE;
}
stream->playing = FALSE;
stream->in_oss_frames = 0;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1402,20 +1401,18 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface)
TRACE("(%p)\n", This);
- EnterCriticalSection(&This->lock);
-
- if(!This->stream){
- LeaveCriticalSection(&This->lock);
+ if(!This->stream)
return AUDCLNT_E_NOT_INITIALIZED;
- }
+
+ oss_lock(stream);
if(stream->playing){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_NOT_STOPPED;
}
if(stream->getbuf_last){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_BUFFER_OPERATION_PENDING;
}
@@ -1429,7 +1426,7 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface)
stream->lcl_offs_frames = 0;
stream->in_oss_frames = 0;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1445,27 +1442,25 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface,
if(!event)
return E_INVALIDARG;
- EnterCriticalSection(&This->lock);
-
- if(!This->stream){
- LeaveCriticalSection(&This->lock);
+ if(!This->stream)
return AUDCLNT_E_NOT_INITIALIZED;
- }
+
+ oss_lock(stream);
if(!(stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED;
}
if (stream->event){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
FIXME("called twice\n");
return HRESULT_FROM_WIN32(ERROR_INVALID_NAME);
}
stream->event = event;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1720,20 +1715,20 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
*data = NULL;
- EnterCriticalSection(&This->lock);
+ oss_lock(stream);
if(stream->getbuf_last){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_OUT_OF_ORDER;
}
if(!frames){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
if(stream->held_frames + frames > stream->bufsize_frames){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_BUFFER_TOO_LARGE;
}
@@ -1745,7 +1740,7 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
stream->tmp_buffer = HeapAlloc(GetProcessHeap(), 0,
frames * stream->fmt->nBlockAlign);
if(!stream->tmp_buffer){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return E_OUTOFMEMORY;
}
stream->tmp_buffer_frames = frames;
@@ -1759,7 +1754,7 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
silence_buffer(stream, *data, frames);
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1791,21 +1786,21 @@ static HRESULT WINAPI AudioRenderClient_ReleaseBuffer(
TRACE("(%p)->(%u, %x)\n", This, written_frames, flags);
- EnterCriticalSection(&This->lock);
+ oss_lock(stream);
if(!written_frames){
stream->getbuf_last = 0;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
if(!stream->getbuf_last){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_OUT_OF_ORDER;
}
if(written_frames > (stream->getbuf_last >= 0 ? stream->getbuf_last : -stream->getbuf_last)){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_INVALID_SIZE;
}
@@ -1825,7 +1820,7 @@ static HRESULT WINAPI AudioRenderClient_ReleaseBuffer(
stream->written_frames += written_frames;
stream->getbuf_last = 0;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1892,16 +1887,16 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
if(!frames || !flags)
return E_POINTER;
- EnterCriticalSection(&This->lock);
+ oss_lock(stream);
if(stream->getbuf_last){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_OUT_OF_ORDER;
}
if(stream->held_frames < stream->period_frames){
*frames = 0;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_S_BUFFER_EMPTY;
}
@@ -1916,7 +1911,7 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
stream->tmp_buffer = HeapAlloc(GetProcessHeap(), 0,
*frames * stream->fmt->nBlockAlign);
if(!stream->tmp_buffer){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return E_OUTOFMEMORY;
}
stream->tmp_buffer_frames = *frames;
@@ -1945,7 +1940,7 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
*qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart;
}
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return *frames ? S_OK : AUDCLNT_S_BUFFER_EMPTY;
}
@@ -1958,21 +1953,21 @@ static HRESULT WINAPI AudioCaptureClient_ReleaseBuffer(
TRACE("(%p)->(%u)\n", This, done);
- EnterCriticalSection(&This->lock);
+ oss_lock(stream);
if(!done){
stream->getbuf_last = 0;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
if(!stream->getbuf_last){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_OUT_OF_ORDER;
}
if(stream->getbuf_last != done){
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return AUDCLNT_E_INVALID_SIZE;
}
@@ -1982,7 +1977,7 @@ static HRESULT WINAPI AudioCaptureClient_ReleaseBuffer(
stream->lcl_offs_frames %= stream->bufsize_frames;
stream->getbuf_last = 0;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -1998,11 +1993,11 @@ static HRESULT WINAPI AudioCaptureClient_GetNextPacketSize(
if(!frames)
return E_POINTER;
- EnterCriticalSection(&This->lock);
+ oss_lock(stream);
*frames = stream->held_frames < stream->period_frames ? 0 : stream->period_frames;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
return S_OK;
}
@@ -2079,7 +2074,7 @@ static HRESULT WINAPI AudioClock_GetPosition(IAudioClock *iface, UINT64 *pos,
if(!pos)
return E_POINTER;
- EnterCriticalSection(&This->lock);
+ oss_lock(stream);
if(stream->flow == eRender){
*pos = stream->written_frames - stream->held_frames;
@@ -2108,7 +2103,7 @@ static HRESULT WINAPI AudioClock_GetPosition(IAudioClock *iface, UINT64 *pos,
if(stream->share == AUDCLNT_SHAREMODE_SHARED)
*pos *= stream->fmt->nBlockAlign;
- LeaveCriticalSection(&This->lock);
+ oss_unlock(stream);
if(qpctime){
LARGE_INTEGER stamp, freq;
@@ -2275,14 +2270,14 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface,
}
LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry){
- EnterCriticalSection(&client->lock);
+ oss_lock(client->stream);
if(client->stream->playing){
*state = AudioSessionStateActive;
- LeaveCriticalSection(&client->lock);
+ oss_unlock(client->stream);
LeaveCriticalSection(&g_sessions_lock);
return S_OK;
}
- LeaveCriticalSection(&client->lock);
+ oss_unlock(client->stream);
}
LeaveCriticalSection(&g_sessions_lock);
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
index 26fd6d08e7e..8f82518b10e 100644
--- a/dlls/wineoss.drv/unixlib.h
+++ b/dlls/wineoss.drv/unixlib.h
@@ -35,6 +35,8 @@ struct oss_stream
BYTE *local_buffer, *tmp_buffer;
INT32 getbuf_last; /* <0 when using tmp_buffer */
+
+ pthread_mutex_t lock;
};
/* From <dlls/mmdevapi/mmdevapi.h> */
--
2.25.1
2
1
12 Apr '22
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/wineoss.drv/mmdevdrv.c | 44 ++++++++++++++++++-------------------
1 file changed, 22 insertions(+), 22 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 2b490482df0..13037e07821 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -901,17 +901,14 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
}
EnterCriticalSection(&g_sessions_lock);
- EnterCriticalSection(&This->lock);
if(This->stream){
- LeaveCriticalSection(&This->lock);
LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_ALREADY_INITIALIZED;
}
stream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->stream));
if(!stream){
- LeaveCriticalSection(&This->lock);
LeaveCriticalSection(&g_sessions_lock);
return E_OUTOFMEMORY;
}
@@ -991,11 +988,9 @@ exit:
if(stream->fd >= 0) close(stream->fd);
HeapFree(GetProcessHeap(), 0, stream->local_buffer);
HeapFree(GetProcessHeap(), 0, stream);
- LeaveCriticalSection(&This->lock);
} else {
list_add_tail(&This->session->clients, &This->entry);
This->stream = stream;
- LeaveCriticalSection(&This->lock);
set_stream_volumes(This);
}
@@ -1337,20 +1332,24 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
TRACE("(%p)\n", This);
+ EnterCriticalSection(&g_sessions_lock);
EnterCriticalSection(&This->lock);
if(!This->stream){
LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
if((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event){
LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_EVENTHANDLE_NOT_SET;
}
if(stream->playing){
LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_NOT_STOPPED;
}
@@ -1364,6 +1363,7 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
stream->playing = TRUE;
LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return S_OK;
}
@@ -1481,23 +1481,23 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid,
return E_POINTER;
*ppv = NULL;
- EnterCriticalSection(&This->lock);
+ EnterCriticalSection(&g_sessions_lock);
if(!This->stream){
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
if(IsEqualIID(riid, &IID_IAudioRenderClient)){
if(This->dataflow != eRender){
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
}
IAudioRenderClient_AddRef(&This->IAudioRenderClient_iface);
*ppv = &This->IAudioRenderClient_iface;
}else if(IsEqualIID(riid, &IID_IAudioCaptureClient)){
if(This->dataflow != eCapture){
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
}
IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface);
@@ -1512,7 +1512,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid,
if(!This->session_wrapper){
This->session_wrapper = AudioSessionWrapper_Create(This);
if(!This->session_wrapper){
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return E_OUTOFMEMORY;
}
}else
@@ -1523,7 +1523,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid,
if(!This->session_wrapper){
This->session_wrapper = AudioSessionWrapper_Create(This);
if(!This->session_wrapper){
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return E_OUTOFMEMORY;
}
}else
@@ -1534,7 +1534,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid,
if(!This->session_wrapper){
This->session_wrapper = AudioSessionWrapper_Create(This);
if(!This->session_wrapper){
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return E_OUTOFMEMORY;
}
}else
@@ -1544,11 +1544,11 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid,
}
if(*ppv){
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return S_OK;
}
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
FIXME("stub %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
@@ -2245,9 +2245,9 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface)
TRACE("(%p) Refcount now %u\n", This, ref);
if(!ref){
if(This->client){
- EnterCriticalSection(&This->client->lock);
+ EnterCriticalSection(&g_sessions_lock);
This->client->session_wrapper = NULL;
- LeaveCriticalSection(&This->client->lock);
+ LeaveCriticalSection(&g_sessions_lock);
AudioClient_Release(&This->client->IAudioClient3_iface);
}
HeapFree(GetProcessHeap(), 0, This);
@@ -2635,14 +2635,14 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume(
if(index >= This->channel_count)
return E_INVALIDARG;
- EnterCriticalSection(&This->lock);
+ EnterCriticalSection(&g_sessions_lock);
This->vols[index] = level;
TRACE("OSS doesn't support setting volume\n");
set_stream_volumes(This);
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return S_OK;
}
@@ -2679,7 +2679,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes(
if(count != This->channel_count)
return E_INVALIDARG;
- EnterCriticalSection(&This->lock);
+ EnterCriticalSection(&g_sessions_lock);
for(i = 0; i < count; ++i)
This->vols[i] = levels[i];
@@ -2687,7 +2687,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes(
TRACE("OSS doesn't support setting volume\n");
set_stream_volumes(This);
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return S_OK;
}
@@ -2706,12 +2706,12 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes(
if(count != This->channel_count)
return E_INVALIDARG;
- EnterCriticalSection(&This->lock);
+ EnterCriticalSection(&g_sessions_lock);
for(i = 0; i < count; ++i)
levels[i] = This->vols[i];
- LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return S_OK;
}
--
2.25.1
2
1
Despite only mute being supported in this driver, set_stream_volumes()
is called whenever the volume info is changed to match the other drivers
and to allow a more complete volume implementation in the future.
The implementation will eventually move to the unixlib.
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/wineoss.drv/mmdevdrv.c | 36 +++++++++++++++++++++++++++++++-----
dlls/wineoss.drv/unixlib.h | 2 +-
2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 238ed5af0ba..2b490482df0 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -340,6 +340,15 @@ static int open_device(const char *device, EDataFlow flow)
return open(device, flags, 0);
}
+static void set_stream_volumes(ACImpl *This)
+{
+ struct oss_stream *stream = This->stream;
+
+ EnterCriticalSection(&This->lock);
+ stream->mute = This->session->mute;
+ LeaveCriticalSection(&This->lock);
+}
+
static const OSSDevice *get_ossdevice_from_guid(const GUID *guid)
{
OSSDevice *dev_item;
@@ -982,12 +991,14 @@ exit:
if(stream->fd >= 0) close(stream->fd);
HeapFree(GetProcessHeap(), 0, stream->local_buffer);
HeapFree(GetProcessHeap(), 0, stream);
+ LeaveCriticalSection(&This->lock);
} else {
list_add_tail(&This->session->clients, &This->entry);
This->stream = stream;
+ LeaveCriticalSection(&This->lock);
+ set_stream_volumes(This);
}
- LeaveCriticalSection(&This->lock);
LeaveCriticalSection(&g_sessions_lock);
return hr;
@@ -1164,7 +1175,7 @@ static void silence_buffer(struct oss_stream *stream, BYTE *buffer, UINT32 frame
memset(buffer, 0, frames * stream->fmt->nBlockAlign);
}
-static void oss_write_data(struct oss_stream *stream, BOOL mute)
+static void oss_write_data(struct oss_stream *stream)
{
ssize_t written_bytes;
UINT32 written_frames, in_oss_frames, write_limit, max_period, write_offs_frames, new_frames;
@@ -1235,7 +1246,7 @@ static void oss_write_data(struct oss_stream *stream, BOOL mute)
buf = stream->local_buffer + write_offs_frames * stream->fmt->nBlockAlign;
- if(mute)
+ if(stream->mute)
silence_buffer(stream, buf, to_write_frames);
written_bytes = write(stream->fd, buf, to_write_bytes);
@@ -1259,7 +1270,7 @@ static void oss_write_data(struct oss_stream *stream, BOOL mute)
to_write_frames = min(write_limit - written_frames, new_frames - written_frames);
to_write_bytes = to_write_frames * stream->fmt->nBlockAlign;
- if(mute)
+ if(stream->mute)
silence_buffer(stream, stream->local_buffer, to_write_frames);
TRACE("wrapping to write %lu frames from beginning\n", to_write_frames);
@@ -1308,7 +1319,7 @@ static void CALLBACK oss_period_callback(void *user, BOOLEAN timer)
if(stream->playing){
if(stream->flow == eRender && stream->held_frames)
- oss_write_data(stream, This->session->mute);
+ oss_write_data(stream);
else if(stream->flow == eCapture)
oss_read_data(stream);
}
@@ -2476,6 +2487,7 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume(
{
AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface);
AudioSession *session = This->session;
+ ACImpl *client;
TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context));
@@ -2490,6 +2502,8 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume(
session->master_vol = level;
TRACE("OSS doesn't support setting volume\n");
+ LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry)
+ set_stream_volumes(client);
LeaveCriticalSection(&g_sessions_lock);
@@ -2517,6 +2531,7 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface,
{
AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface);
AudioSession *session = This->session;
+ ACImpl *client;
TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context));
@@ -2524,6 +2539,9 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface,
session->mute = mute;
+ LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry)
+ set_stream_volumes(client);
+
LeaveCriticalSection(&g_sessions_lock);
return S_OK;
@@ -2622,6 +2640,7 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume(
This->vols[index] = level;
TRACE("OSS doesn't support setting volume\n");
+ set_stream_volumes(This);
LeaveCriticalSection(&This->lock);
@@ -2666,6 +2685,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes(
This->vols[i] = levels[i];
TRACE("OSS doesn't support setting volume\n");
+ set_stream_volumes(This);
LeaveCriticalSection(&This->lock);
@@ -2763,6 +2783,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume(
{
AudioSessionWrapper *This = impl_from_IChannelAudioVolume(iface);
AudioSession *session = This->session;
+ ACImpl *client;
TRACE("(%p)->(%d, %f, %s)\n", session, index, level,
wine_dbgstr_guid(context));
@@ -2781,6 +2802,8 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume(
session->channel_vols[index] = level;
TRACE("OSS doesn't support setting volume\n");
+ LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry)
+ set_stream_volumes(client);
LeaveCriticalSection(&g_sessions_lock);
@@ -2812,6 +2835,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes(
{
AudioSessionWrapper *This = impl_from_IChannelAudioVolume(iface);
AudioSession *session = This->session;
+ ACImpl *client;
int i;
TRACE("(%p)->(%d, %p, %s)\n", session, count, levels,
@@ -2832,6 +2856,8 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes(
session->channel_vols[i] = levels[i];
TRACE("OSS doesn't support setting volume\n");
+ LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry)
+ set_stream_volumes(client);
LeaveCriticalSection(&g_sessions_lock);
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
index e0817cbc9c1..26fd6d08e7e 100644
--- a/dlls/wineoss.drv/unixlib.h
+++ b/dlls/wineoss.drv/unixlib.h
@@ -28,7 +28,7 @@ struct oss_stream
int fd;
- BOOL playing;
+ BOOL playing, mute;
UINT64 written_frames, last_pos_frames;
UINT32 period_us, period_frames, bufsize_frames, held_frames, tmp_buffer_frames, in_oss_frames;
UINT32 oss_bufsize_bytes, lcl_offs_frames; /* offs into local_buffer where valid data starts */
--
2.25.1
2
1
12 Apr '22
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/wineoss.drv/mmdevdrv.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index f7c7864e2af..238ed5af0ba 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -113,7 +113,6 @@ struct ACImpl {
UINT32 channel_count;
struct oss_stream *stream;
- BOOL initted;
HANDLE timer;
CRITICAL_SECTION lock;
@@ -532,7 +531,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
IUnknown_Release(This->pUnkFTMarshal);
This->lock.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->lock);
- if(This->initted){
+ if(This->session){
EnterCriticalSection(&g_sessions_lock);
list_remove(&This->entry);
LeaveCriticalSection(&g_sessions_lock);
@@ -895,7 +894,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
EnterCriticalSection(&g_sessions_lock);
EnterCriticalSection(&This->lock);
- if(This->initted){
+ if(This->stream){
LeaveCriticalSection(&This->lock);
LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_ALREADY_INITIALIZED;
@@ -986,7 +985,6 @@ exit:
} else {
list_add_tail(&This->session->clients, &This->entry);
This->stream = stream;
- This->initted = TRUE;
}
LeaveCriticalSection(&This->lock);
@@ -1008,7 +1006,7 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface,
EnterCriticalSection(&This->lock);
- if(!This->initted){
+ if(!This->stream){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
@@ -1035,7 +1033,7 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface,
EnterCriticalSection(&This->lock);
- if(!This->initted){
+ if(!This->stream){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
@@ -1062,7 +1060,7 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface,
EnterCriticalSection(&This->lock);
- if(!This->initted){
+ if(!This->stream){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
@@ -1330,7 +1328,7 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
EnterCriticalSection(&This->lock);
- if(!This->initted){
+ if(!This->stream){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
@@ -1368,7 +1366,7 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface)
EnterCriticalSection(&This->lock);
- if(!This->initted){
+ if(!This->stream){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
@@ -1395,7 +1393,7 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface)
EnterCriticalSection(&This->lock);
- if(!This->initted){
+ if(!This->stream){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
@@ -1438,7 +1436,7 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface,
EnterCriticalSection(&This->lock);
- if(!This->initted){
+ if(!This->stream){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
@@ -1474,7 +1472,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid,
EnterCriticalSection(&This->lock);
- if(!This->initted){
+ if(!This->stream){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_NOT_INITIALIZED;
}
--
2.25.1
2
1