diff options
author | Chris Robinson <[email protected]> | 2013-10-28 14:38:55 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2013-10-28 14:38:55 -0700 |
commit | 21f1e54cb9498ae282bab04db7680987b86da619 (patch) | |
tree | 60ae08b71152426bcc29010a3b26b98b711564a2 | |
parent | f8c95f1e90a9bf4e57dbd4e29604e36916f354e4 (diff) |
Create and use a backend wrapper for capture
-rw-r--r-- | Alc/ALc.c | 23 | ||||
-rw-r--r-- | Alc/backends/base.c | 151 | ||||
-rw-r--r-- | Alc/backends/base.h | 5 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 7 |
4 files changed, 139 insertions, 47 deletions
@@ -1909,10 +1909,7 @@ static ALCvoid FreeDevice(ALCdevice *device) { TRACE("%p\n", device); - if(device->Type != Capture) - VCALL0(device->Backend,close)(); - else - ALCdevice_CloseCapture(device); + VCALL0(device->Backend,close)(); DELETE_OBJ(device->Backend); device->Backend = NULL; @@ -2405,7 +2402,7 @@ ALC_API ALCvoid ALC_APIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsi { case ALC_CAPTURE_SAMPLES: ALCdevice_Lock(device); - *data = ALCdevice_AvailableSamples(device); + *data = VCALL0(device->Backend,availableSamples)(); ALCdevice_Unlock(device); break; @@ -2890,7 +2887,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) device->UpdateSize = 1024; if(!PlaybackBackend.getFactory) - device->Backend = create_backend_wrapper(device); + device->Backend = create_backend_wrapper(device, ALCbackend_Playback); else { ALCbackendFactory *factory = PlaybackBackend.getFactory(); @@ -3156,7 +3153,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, device->DeviceName = NULL; - device->Backend = create_backend_wrapper(device); + device->Backend = create_backend_wrapper(device, ALCbackend_Capture); if(!device->Backend) { al_free(device); @@ -3178,7 +3175,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, device->UpdateSize = samples; device->NumUpdates = 1; - if((err=ALCdevice_OpenCapture(device, deviceName)) != ALC_NO_ERROR) + if((err=VCALL(device->Backend,open)(deviceName)) != ALC_NO_ERROR) { al_free(device); alcSetError(NULL, err); @@ -3227,7 +3224,7 @@ ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device) if(device->Connected) { if(!(device->Flags&DEVICE_RUNNING)) - ALCdevice_StartCapture(device); + VCALL0(device->Backend,start)(); device->Flags |= DEVICE_RUNNING; } ALCdevice_Unlock(device); @@ -3244,7 +3241,7 @@ ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device) { ALCdevice_Lock(device); if((device->Flags&DEVICE_RUNNING)) - ALCdevice_StopCapture(device); + VCALL0(device->Backend,stop)(); device->Flags &= ~DEVICE_RUNNING; ALCdevice_Unlock(device); } @@ -3261,8 +3258,8 @@ ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCenum err = ALC_INVALID_VALUE; ALCdevice_Lock(device); - if(samples >= 0 && ALCdevice_AvailableSamples(device) >= (ALCuint)samples) - err = ALCdevice_CaptureSamples(device, buffer, samples); + if(samples >= 0 && VCALL0(device->Backend,availableSamples)() >= (ALCuint)samples) + err = VCALL(device->Backend,captureSamples)(buffer, samples); ALCdevice_Unlock(device); if(err != ALC_NO_ERROR) @@ -3322,7 +3319,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN InitUIntMap(&device->EffectMap, ~0); InitUIntMap(&device->FilterMap, ~0); - device->Backend = create_backend_wrapper(device); + device->Backend = create_backend_wrapper(device, ALCbackend_Playback); if(!device->Backend) { al_free(device); diff --git a/Alc/backends/base.c b/Alc/backends/base.c index 8837b0c8..22744ab7 100644 --- a/Alc/backends/base.c +++ b/Alc/backends/base.c @@ -36,97 +36,198 @@ void ALCbackend_unlock(ALCbackend *self) } -/* Wrapper to use an old-style backend with the new interface. */ -typedef struct BackendWrapper { +/* Wrappers to use an old-style backend with the new interface. */ +typedef struct PlaybackWrapper { DERIVE_FROM_TYPE(ALCbackend); -} BackendWrapper; -#define BACKENDWRAPPER_INITIALIZER { { GET_VTABLE2(ALCbackend, BackendWrapper) } } +} PlaybackWrapper; +#define PLAYBACKWRAPPER_INITIALIZER { { GET_VTABLE2(ALCbackend, PlaybackWrapper) } } -static void BackendWrapper_Construct(BackendWrapper *self, ALCdevice *device) +static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device) { ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); } -static void BackendWrapper_Destruct(BackendWrapper *self) +static void PlaybackWrapper_Destruct(PlaybackWrapper *self) { ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } -static ALCenum BackendWrapper_open(BackendWrapper *self, const ALCchar *name) +static ALCenum PlaybackWrapper_open(PlaybackWrapper *self, const ALCchar *name) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; return device->Funcs->OpenPlayback(device, name); } -static void BackendWrapper_close(BackendWrapper *self) +static void PlaybackWrapper_close(PlaybackWrapper *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; device->Funcs->ClosePlayback(device); } -static ALCboolean BackendWrapper_reset(BackendWrapper *self) +static ALCboolean PlaybackWrapper_reset(PlaybackWrapper *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; return device->Funcs->ResetPlayback(device); } -static ALCboolean BackendWrapper_start(BackendWrapper *self) +static ALCboolean PlaybackWrapper_start(PlaybackWrapper *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; return device->Funcs->StartPlayback(device); } -static void BackendWrapper_stop(BackendWrapper *self) +static void PlaybackWrapper_stop(PlaybackWrapper *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; device->Funcs->StopPlayback(device); } -ALCenum BackendWrapper_captureSamples(BackendWrapper* UNUSED(self), void* UNUSED(buffer), ALCuint UNUSED(samples)) +ALCenum PlaybackWrapper_captureSamples(PlaybackWrapper* UNUSED(self), void* UNUSED(buffer), ALCuint UNUSED(samples)) { return ALC_INVALID_VALUE; } -ALCuint BackendWrapper_availableSamples(BackendWrapper* UNUSED(self)) +ALCuint PlaybackWrapper_availableSamples(PlaybackWrapper* UNUSED(self)) { return 0; } -static ALint64 BackendWrapper_getLatency(BackendWrapper *self) +static ALint64 PlaybackWrapper_getLatency(PlaybackWrapper *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; return device->Funcs->GetLatency(device); } -static void BackendWrapper_lock(BackendWrapper *self) +static void PlaybackWrapper_lock(PlaybackWrapper *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; return device->Funcs->Lock(device); } -static void BackendWrapper_unlock(BackendWrapper *self) +static void PlaybackWrapper_unlock(PlaybackWrapper *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; return device->Funcs->Unlock(device); } -static void BackendWrapper_Delete(BackendWrapper *self) +static void PlaybackWrapper_Delete(PlaybackWrapper *self) { free(self); } -DEFINE_ALCBACKEND_VTABLE(BackendWrapper); +DEFINE_ALCBACKEND_VTABLE(PlaybackWrapper); -ALCbackend *create_backend_wrapper(ALCdevice *device) +typedef struct CaptureWrapper { + DERIVE_FROM_TYPE(ALCbackend); +} CaptureWrapper; +#define CAPTUREWRAPPER_INITIALIZER { { GET_VTABLE2(ALCbackend, PlaybackWrapper) } } + +static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device) +{ + ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); +} + +static void CaptureWrapper_Destruct(CaptureWrapper *self) +{ + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} + +static ALCenum CaptureWrapper_open(CaptureWrapper *self, const ALCchar *name) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + return device->Funcs->OpenCapture(device, name); +} + +static void CaptureWrapper_close(CaptureWrapper *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + device->Funcs->CloseCapture(device); +} + +static ALCboolean CaptureWrapper_reset(CaptureWrapper* UNUSED(self)) +{ + return ALC_FALSE; +} + +static ALCboolean CaptureWrapper_start(CaptureWrapper *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + device->Funcs->StartCapture(device); + return ALC_TRUE; +} + +static void CaptureWrapper_stop(CaptureWrapper *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + device->Funcs->StopCapture(device); +} + +ALCenum CaptureWrapper_captureSamples(CaptureWrapper *self, void *buffer, ALCuint samples) { - BackendWrapper *backend; + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + return device->Funcs->CaptureSamples(device, buffer, samples); +} + +ALCuint CaptureWrapper_availableSamples(CaptureWrapper *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + return device->Funcs->AvailableSamples(device); +} + +static ALint64 CaptureWrapper_getLatency(CaptureWrapper *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + return device->Funcs->GetLatency(device); +} + +static void CaptureWrapper_lock(CaptureWrapper *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + return device->Funcs->Lock(device); +} + +static void CaptureWrapper_unlock(CaptureWrapper *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + return device->Funcs->Unlock(device); +} + +static void CaptureWrapper_Delete(CaptureWrapper *self) +{ + free(self); +} + +DEFINE_ALCBACKEND_VTABLE(CaptureWrapper); + + +ALCbackend *create_backend_wrapper(ALCdevice *device, ALCbackend_Type type) +{ + if(type == ALCbackend_Playback) + { + PlaybackWrapper *backend; + + backend = malloc(sizeof(*backend)); + if(!backend) return NULL; + SET_VTABLE2(PlaybackWrapper, ALCbackend, backend); + + PlaybackWrapper_Construct(backend, device); + + return STATIC_CAST(ALCbackend, backend); + } + + if(type == ALCbackend_Capture) + { + CaptureWrapper *backend; + + backend = malloc(sizeof(*backend)); + if(!backend) return NULL; + SET_VTABLE2(CaptureWrapper, ALCbackend, backend); - backend = malloc(sizeof(*backend)); - if(!backend) return NULL; - SET_VTABLE2(BackendWrapper, ALCbackend, backend); + CaptureWrapper_Construct(backend, device); - BackendWrapper_Construct(backend, device); + return STATIC_CAST(ALCbackend, backend); + } - return STATIC_CAST(ALCbackend, backend); + return NULL; } diff --git a/Alc/backends/base.h b/Alc/backends/base.h index 9ba33097..ed0fff50 100644 --- a/Alc/backends/base.h +++ b/Alc/backends/base.h @@ -87,7 +87,8 @@ static const struct ALCbackendVtable T##_ALCbackend_vtable = { \ typedef enum ALCbackend_Type { - ALCbackend_Playback + ALCbackend_Playback, + ALCbackend_Capture } ALCbackend_Type; @@ -131,6 +132,6 @@ static const struct ALCbackendFactoryVtable T##_ALCbackendFactory_vtable = { \ ALCbackendFactory *ALCnullBackendFactory_getFactory(void); -ALCbackend *create_backend_wrapper(ALCdevice *device); +ALCbackend *create_backend_wrapper(ALCdevice *device, ALCbackend_Type type); #endif /* AL_BACKENDS_BASE_H */ diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index 037edb11..256275f2 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -407,13 +407,6 @@ struct ALCdevice_struct ALCdevice *volatile next; }; -#define ALCdevice_OpenCapture(a,b) ((a)->Funcs->OpenCapture((a), (b))) -#define ALCdevice_CloseCapture(a) ((a)->Funcs->CloseCapture((a))) -#define ALCdevice_StartCapture(a) ((a)->Funcs->StartCapture((a))) -#define ALCdevice_StopCapture(a) ((a)->Funcs->StopCapture((a))) -#define ALCdevice_CaptureSamples(a,b,c) ((a)->Funcs->CaptureSamples((a), (b), (c))) -#define ALCdevice_AvailableSamples(a) ((a)->Funcs->AvailableSamples((a))) - // Frequency was requested by the app or config file #define DEVICE_FREQUENCY_REQUEST (1<<1) // Channel configuration was requested by the config file |