2009-12-15 15:35:18 +01:00
|
|
|
/*
|
|
|
|
* Copyright 2009 Maarten Lankhorst
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
*/
|
|
|
|
|
2010-04-05 17:44:23 +02:00
|
|
|
#ifndef __WINE_CONFIG_H
|
|
|
|
# error You must include config.h to use this header
|
|
|
|
#endif
|
|
|
|
|
2009-12-15 15:35:18 +01:00
|
|
|
extern HRESULT MMDevEnum_Create(REFIID riid, void **ppv);
|
2009-12-14 16:04:04 +01:00
|
|
|
extern void MMDevEnum_Free(void);
|
2010-02-21 13:50:42 +01:00
|
|
|
|
2010-02-21 14:06:37 +01:00
|
|
|
extern HRESULT MMDevice_GetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, PROPVARIANT *pv);
|
|
|
|
extern HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, REFPROPVARIANT pv);
|
|
|
|
|
2010-02-21 13:50:42 +01:00
|
|
|
typedef struct MMDevice {
|
|
|
|
const IMMDeviceVtbl *lpVtbl;
|
2010-02-21 14:16:20 +01:00
|
|
|
const IMMEndpointVtbl *lpEndpointVtbl;
|
2010-02-21 13:50:42 +01:00
|
|
|
LONG ref;
|
|
|
|
|
|
|
|
CRITICAL_SECTION crst;
|
|
|
|
|
|
|
|
EDataFlow flow;
|
|
|
|
DWORD state;
|
|
|
|
GUID devguid;
|
|
|
|
WCHAR *alname;
|
2010-04-19 11:52:47 +02:00
|
|
|
void *device, *ctx;
|
2010-02-21 13:50:42 +01:00
|
|
|
} MMDevice;
|
2010-02-21 14:48:39 +01:00
|
|
|
|
2010-04-19 11:52:47 +02:00
|
|
|
extern HRESULT AudioClient_Create(MMDevice *parent, IAudioClient **ppv);
|
|
|
|
|
2010-02-21 14:48:39 +01:00
|
|
|
#ifdef HAVE_OPENAL
|
|
|
|
|
|
|
|
#include "alext.h"
|
|
|
|
|
|
|
|
/* All openal functions */
|
|
|
|
extern int openal_loaded;
|
|
|
|
#ifdef SONAME_LIBOPENAL
|
|
|
|
extern LPALCCREATECONTEXT palcCreateContext;
|
|
|
|
extern LPALCMAKECONTEXTCURRENT palcMakeContextCurrent;
|
|
|
|
extern LPALCPROCESSCONTEXT palcProcessContext;
|
|
|
|
extern LPALCSUSPENDCONTEXT palcSuspendContext;
|
|
|
|
extern LPALCDESTROYCONTEXT palcDestroyContext;
|
|
|
|
extern LPALCGETCURRENTCONTEXT palcGetCurrentContext;
|
|
|
|
extern LPALCGETCONTEXTSDEVICE palcGetContextsDevice;
|
|
|
|
extern LPALCOPENDEVICE palcOpenDevice;
|
|
|
|
extern LPALCCLOSEDEVICE palcCloseDevice;
|
|
|
|
extern LPALCGETERROR palcGetError;
|
|
|
|
extern LPALCISEXTENSIONPRESENT palcIsExtensionPresent;
|
|
|
|
extern LPALCGETPROCADDRESS palcGetProcAddress;
|
|
|
|
extern LPALCGETENUMVALUE palcGetEnumValue;
|
|
|
|
extern LPALCGETSTRING palcGetString;
|
|
|
|
extern LPALCGETINTEGERV palcGetIntegerv;
|
|
|
|
extern LPALCCAPTUREOPENDEVICE palcCaptureOpenDevice;
|
|
|
|
extern LPALCCAPTURECLOSEDEVICE palcCaptureCloseDevice;
|
|
|
|
extern LPALCCAPTURESTART palcCaptureStart;
|
|
|
|
extern LPALCCAPTURESTOP palcCaptureStop;
|
|
|
|
extern LPALCCAPTURESAMPLES palcCaptureSamples;
|
|
|
|
extern LPALENABLE palEnable;
|
|
|
|
extern LPALDISABLE palDisable;
|
|
|
|
extern LPALISENABLED palIsEnabled;
|
|
|
|
extern LPALGETSTRING palGetString;
|
|
|
|
extern LPALGETBOOLEANV palGetBooleanv;
|
|
|
|
extern LPALGETINTEGERV palGetIntegerv;
|
|
|
|
extern LPALGETFLOATV palGetFloatv;
|
|
|
|
extern LPALGETDOUBLEV palGetDoublev;
|
|
|
|
extern LPALGETBOOLEAN palGetBoolean;
|
|
|
|
extern LPALGETINTEGER palGetInteger;
|
|
|
|
extern LPALGETFLOAT palGetFloat;
|
|
|
|
extern LPALGETDOUBLE palGetDouble;
|
|
|
|
extern LPALGETERROR palGetError;
|
|
|
|
extern LPALISEXTENSIONPRESENT palIsExtensionPresent;
|
|
|
|
extern LPALGETPROCADDRESS palGetProcAddress;
|
|
|
|
extern LPALGETENUMVALUE palGetEnumValue;
|
|
|
|
extern LPALLISTENERF palListenerf;
|
|
|
|
extern LPALLISTENER3F palListener3f;
|
|
|
|
extern LPALLISTENERFV palListenerfv;
|
|
|
|
extern LPALLISTENERI palListeneri;
|
|
|
|
extern LPALLISTENER3I palListener3i;
|
|
|
|
extern LPALLISTENERIV palListeneriv;
|
|
|
|
extern LPALGETLISTENERF palGetListenerf;
|
|
|
|
extern LPALGETLISTENER3F palGetListener3f;
|
|
|
|
extern LPALGETLISTENERFV palGetListenerfv;
|
|
|
|
extern LPALGETLISTENERI palGetListeneri;
|
|
|
|
extern LPALGETLISTENER3I palGetListener3i;
|
|
|
|
extern LPALGETLISTENERIV palGetListeneriv;
|
|
|
|
extern LPALGENSOURCES palGenSources;
|
|
|
|
extern LPALDELETESOURCES palDeleteSources;
|
|
|
|
extern LPALISSOURCE palIsSource;
|
|
|
|
extern LPALSOURCEF palSourcef;
|
|
|
|
extern LPALSOURCE3F palSource3f;
|
|
|
|
extern LPALSOURCEFV palSourcefv;
|
|
|
|
extern LPALSOURCEI palSourcei;
|
|
|
|
extern LPALSOURCE3I palSource3i;
|
|
|
|
extern LPALSOURCEIV palSourceiv;
|
|
|
|
extern LPALGETSOURCEF palGetSourcef;
|
|
|
|
extern LPALGETSOURCE3F palGetSource3f;
|
|
|
|
extern LPALGETSOURCEFV palGetSourcefv;
|
|
|
|
extern LPALGETSOURCEI palGetSourcei;
|
|
|
|
extern LPALGETSOURCE3I palGetSource3i;
|
|
|
|
extern LPALGETSOURCEIV palGetSourceiv;
|
|
|
|
extern LPALSOURCEPLAYV palSourcePlayv;
|
|
|
|
extern LPALSOURCESTOPV palSourceStopv;
|
|
|
|
extern LPALSOURCEREWINDV palSourceRewindv;
|
|
|
|
extern LPALSOURCEPAUSEV palSourcePausev;
|
|
|
|
extern LPALSOURCEPLAY palSourcePlay;
|
|
|
|
extern LPALSOURCESTOP palSourceStop;
|
|
|
|
extern LPALSOURCEREWIND palSourceRewind;
|
|
|
|
extern LPALSOURCEPAUSE palSourcePause;
|
|
|
|
extern LPALSOURCEQUEUEBUFFERS palSourceQueueBuffers;
|
|
|
|
extern LPALSOURCEUNQUEUEBUFFERS palSourceUnqueueBuffers;
|
|
|
|
extern LPALGENBUFFERS palGenBuffers;
|
|
|
|
extern LPALDELETEBUFFERS palDeleteBuffers;
|
|
|
|
extern LPALISBUFFER palIsBuffer;
|
|
|
|
extern LPALBUFFERF palBufferf;
|
|
|
|
extern LPALBUFFER3F palBuffer3f;
|
|
|
|
extern LPALBUFFERFV palBufferfv;
|
|
|
|
extern LPALBUFFERI palBufferi;
|
|
|
|
extern LPALBUFFER3I palBuffer3i;
|
|
|
|
extern LPALBUFFERIV palBufferiv;
|
|
|
|
extern LPALGETBUFFERF palGetBufferf;
|
|
|
|
extern LPALGETBUFFER3F palGetBuffer3f;
|
|
|
|
extern LPALGETBUFFERFV palGetBufferfv;
|
|
|
|
extern LPALGETBUFFERI palGetBufferi;
|
|
|
|
extern LPALGETBUFFER3I palGetBuffer3i;
|
|
|
|
extern LPALGETBUFFERIV palGetBufferiv;
|
|
|
|
extern LPALBUFFERDATA palBufferData;
|
|
|
|
extern LPALDOPPLERFACTOR palDopplerFactor;
|
|
|
|
extern LPALDOPPLERVELOCITY palDopplerVelocity;
|
|
|
|
extern LPALDISTANCEMODEL palDistanceModel;
|
|
|
|
extern LPALSPEEDOFSOUND palSpeedOfSound;
|
|
|
|
#else
|
|
|
|
#define palcCreateContext alcCreateContext
|
|
|
|
#define palcMakeContextCurrent alcMakeContextCurrent
|
|
|
|
#define palcProcessContext alcProcessContext
|
|
|
|
#define palcSuspendContext alcSuspendContext
|
|
|
|
#define palcDestroyContext alcDestroyContext
|
|
|
|
#define palcGetCurrentContext alcGetCurrentContext
|
|
|
|
#define palcGetContextsDevice alcGetContextsDevice
|
|
|
|
#define palcOpenDevice alcOpenDevice
|
|
|
|
#define palcCloseDevice alcCloseDevice
|
|
|
|
#define palcGetError alcGetError
|
|
|
|
#define palcIsExtensionPresent alcIsExtensionPresent
|
|
|
|
#define palcGetProcAddress alcGetProcAddress
|
|
|
|
#define palcGetEnumValue alcGetEnumValue
|
|
|
|
#define palcGetString alcGetString
|
|
|
|
#define palcGetIntegerv alcGetIntegerv
|
|
|
|
#define palcCaptureOpenDevice alcCaptureOpenDevice
|
|
|
|
#define palcCaptureCloseDevice alcCaptureCloseDevice
|
|
|
|
#define palcCaptureStart alcCaptureStart
|
|
|
|
#define palcCaptureStop alcCaptureStop
|
|
|
|
#define palcCaptureSamples alcCaptureSamples
|
|
|
|
#define palEnable alEnable
|
|
|
|
#define palDisable alDisable
|
|
|
|
#define palIsEnabled alIsEnabled
|
|
|
|
#define palGetString alGetString
|
|
|
|
#define palGetBooleanv alGetBooleanv
|
|
|
|
#define palGetIntegerv alGetIntegerv
|
|
|
|
#define palGetFloatv alGetFloatv
|
|
|
|
#define palGetDoublev alGetDoublev
|
|
|
|
#define palGetBoolean alGetBoolean
|
|
|
|
#define palGetInteger alGetInteger
|
|
|
|
#define palGetFloat alGetFloat
|
|
|
|
#define palGetDouble alGetDouble
|
|
|
|
#define palGetError alGetError
|
|
|
|
#define palIsExtensionPresent alIsExtensionPresent
|
|
|
|
#define palGetProcAddress alGetProcAddress
|
|
|
|
#define palGetEnumValue alGetEnumValue
|
|
|
|
#define palListenerf alListenerf
|
|
|
|
#define palListener3f alListener3f
|
|
|
|
#define palListenerfv alListenerfv
|
|
|
|
#define palListeneri alListeneri
|
|
|
|
#define palListener3i alListener3i
|
|
|
|
#define palListeneriv alListeneriv
|
|
|
|
#define palGetListenerf alGetListenerf
|
|
|
|
#define palGetListener3f alGetListener3f
|
|
|
|
#define palGetListenerfv alGetListenerfv
|
|
|
|
#define palGetListeneri alGetListeneri
|
|
|
|
#define palGetListener3i alGetListener3i
|
|
|
|
#define palGetListeneriv alGetListeneriv
|
|
|
|
#define palGenSources alGenSources
|
|
|
|
#define palDeleteSources alDeleteSources
|
|
|
|
#define palIsSource alIsSource
|
|
|
|
#define palSourcef alSourcef
|
|
|
|
#define palSource3f alSource3f
|
|
|
|
#define palSourcefv alSourcefv
|
|
|
|
#define palSourcei alSourcei
|
|
|
|
#define palSource3i alSource3i
|
|
|
|
#define palSourceiv alSourceiv
|
|
|
|
#define palGetSourcef alGetSourcef
|
|
|
|
#define palGetSource3f alGetSource3f
|
|
|
|
#define palGetSourcefv alGetSourcefv
|
|
|
|
#define palGetSourcei alGetSourcei
|
|
|
|
#define palGetSource3i alGetSource3i
|
|
|
|
#define palGetSourceiv alGetSourceiv
|
|
|
|
#define palSourcePlayv alSourcePlayv
|
|
|
|
#define palSourceStopv alSourceStopv
|
|
|
|
#define palSourceRewindv alSourceRewindv
|
|
|
|
#define palSourcePausev alSourcePausev
|
|
|
|
#define palSourcePlay alSourcePlay
|
|
|
|
#define palSourceStop alSourceStop
|
|
|
|
#define palSourceRewind alSourceRewind
|
|
|
|
#define palSourcePause alSourcePause
|
|
|
|
#define palSourceQueueBuffers alSourceQueueBuffers
|
|
|
|
#define palSourceUnqueueBuffers alSourceUnqueueBuffers
|
|
|
|
#define palGenBuffers alGenBuffers
|
|
|
|
#define palDeleteBuffers alDeleteBuffers
|
|
|
|
#define palIsBuffer alIsBuffer
|
|
|
|
#define palBufferf alBufferf
|
|
|
|
#define palBuffer3f alBuffer3f
|
|
|
|
#define palBufferfv alBufferfv
|
|
|
|
#define palBufferi alBufferi
|
|
|
|
#define palBuffer3i alBuffer3i
|
|
|
|
#define palBufferiv alBufferiv
|
|
|
|
#define palGetBufferf alGetBufferf
|
|
|
|
#define palGetBuffer3f alGetBuffer3f
|
|
|
|
#define palGetBufferfv alGetBufferfv
|
|
|
|
#define palGetBufferi alGetBufferi
|
|
|
|
#define palGetBuffer3i alGetBuffer3i
|
|
|
|
#define palGetBufferiv alGetBufferiv
|
|
|
|
#define palBufferData alBufferData
|
|
|
|
#define palDopplerFactor alDopplerFactor
|
|
|
|
#define palDopplerVelocity alDopplerVelocity
|
|
|
|
#define palDistanceModel alDistanceModel
|
|
|
|
#define palSpeedOfSound alSpeedOfSound
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* OpenAL only allows for 1 single access to the device at the same time */
|
|
|
|
extern CRITICAL_SECTION openal_crst;
|
|
|
|
extern int local_contexts;
|
|
|
|
extern typeof(alcGetCurrentContext) *get_context;
|
|
|
|
extern typeof(alcMakeContextCurrent) *set_context;
|
|
|
|
|
|
|
|
#define getALError() \
|
|
|
|
do { \
|
|
|
|
ALenum err = palGetError(); \
|
|
|
|
if(err != AL_NO_ERROR) \
|
|
|
|
{ \
|
|
|
|
ERR(">>>>>>>>>>>> Received AL error %#x on context %p, %s:%u\n", err, get_context(), __FUNCTION__, __LINE__); \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define getALCError(dev) \
|
|
|
|
do { \
|
|
|
|
ALenum err = palcGetError(dev); \
|
|
|
|
if(err != ALC_NO_ERROR) \
|
|
|
|
{ \
|
|
|
|
ERR(">>>>>>>>>>>> Received ALC error %#x on device %p, %s:%u\n", err, dev, __FUNCTION__, __LINE__); \
|
|
|
|
} \
|
|
|
|
} while(0)
|
|
|
|
|
|
|
|
#define setALContext(actx) \
|
|
|
|
do { \
|
|
|
|
ALCcontext *__old_ctx, *cur_ctx = actx ; \
|
|
|
|
if (!local_contexts) EnterCriticalSection(&openal_crst); \
|
|
|
|
__old_ctx = get_context(); \
|
|
|
|
if (__old_ctx != cur_ctx && set_context(cur_ctx) == ALC_FALSE) {\
|
|
|
|
ERR("Couldn't set current context!!\n"); \
|
|
|
|
getALCError(palcGetContextsDevice(cur_ctx)); \
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Only restore a NULL context if using global contexts, for TLS contexts always restore */
|
|
|
|
#define popALContext() \
|
|
|
|
if (__old_ctx != cur_ctx \
|
|
|
|
&& (local_contexts || __old_ctx) \
|
|
|
|
&& set_context(__old_ctx) == ALC_FALSE) { \
|
|
|
|
ERR("Couldn't restore old context!!\n"); \
|
|
|
|
getALCError(palcGetContextsDevice(__old_ctx)); \
|
|
|
|
} \
|
|
|
|
if (!local_contexts) LeaveCriticalSection(&openal_crst); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#endif
|