diff options
Diffstat (limited to 'intern/audaspace/intern/AUD_C-API.cpp')
-rw-r--r-- | intern/audaspace/intern/AUD_C-API.cpp | 558 |
1 files changed, 558 insertions, 0 deletions
diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp new file mode 100644 index 00000000000..830e1147cbb --- /dev/null +++ b/intern/audaspace/intern/AUD_C-API.cpp @@ -0,0 +1,558 @@ +/* + * $Id$ + * + * ***** BEGIN LGPL LICENSE BLOCK ***** + * + * Copyright 2009 Jörg Hermann Müller + * + * This file is part of AudaSpace. + * + * AudaSpace 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 3 of the License, or + * (at your option) any later version. + * + * AudaSpace 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 AudaSpace. If not, see <http://www.gnu.org/licenses/>. + * + * ***** END LGPL LICENSE BLOCK ***** + */ + +/*#define WITH_SDL +#define WITH_FFMPEG +#define WITH_OPENAL*/ + +#include "AUD_NULLDevice.h" +#include "AUD_I3DDevice.h" +#include "AUD_StreamBufferFactory.h" +#include "AUD_DelayFactory.h" +#include "AUD_LimiterFactory.h" +#include "AUD_PingPongFactory.h" +#include "AUD_LoopFactory.h" +#include "AUD_ReadDevice.h" +#include "AUD_SourceCaps.h" +#include "AUD_IReader.h" + +#ifdef WITH_SDL +#include "AUD_SDLDevice.h" +#include "AUD_FloatMixer.h" +#endif + +#ifdef WITH_OPENAL +#include "AUD_OpenALDevice.h" +#endif + +#ifdef WITH_FFMPEG +#include "AUD_FFMPEGFactory.h" +extern "C" { +#include <libavformat/avformat.h> +} +#endif + +#include <assert.h> + +typedef AUD_IFactory AUD_Sound; +typedef AUD_ReadDevice AUD_Device; + +#define AUD_CAPI_IMPLEMENTATION +#include "AUD_C-API.h" + +#ifndef NULL +#define NULL 0 +#endif + +static AUD_IDevice* AUD_device = NULL; +static int AUD_available_devices[3]; +static AUD_I3DDevice* AUD_3ddevice = NULL; + +int AUD_init(AUD_DeviceType device, AUD_Specs specs, int buffersize) +{ +#ifdef WITH_FFMPEG + av_register_all(); +#endif + AUD_IDevice* dev = NULL; + + try + { + switch(device) + { + case AUD_NULL_DEVICE: + dev = new AUD_NULLDevice(); + break; +#ifdef WITH_SDL + case AUD_SDL_DEVICE: + { + dev = new AUD_SDLDevice(specs, buffersize); + AUD_FloatMixer* mixer = new AUD_FloatMixer(); + ((AUD_SDLDevice*)dev)->setMixer(mixer); + break; + } +#endif +#ifdef WITH_OPENAL + case AUD_OPENAL_DEVICE: + dev = new AUD_OpenALDevice(specs, buffersize); + break; +#endif + default: + return false; + } + + if(AUD_device) + AUD_exit(); + + AUD_device = dev; + if(AUD_device->checkCapability(AUD_CAPS_3D_DEVICE)) + AUD_3ddevice = dynamic_cast<AUD_I3DDevice*>(AUD_device); + + return true; + } + catch(AUD_Exception e) + { + return false; + } +} + +int* AUD_enumDevices() +{ + int i = 0; +#ifdef WITH_SDL + AUD_available_devices[i++] = AUD_SDL_DEVICE; +#endif +#ifdef WITH_OPENAL + AUD_available_devices[i++] = AUD_OPENAL_DEVICE; +#endif + AUD_available_devices[i++] = AUD_NULL_DEVICE; + return AUD_available_devices; +} + +void AUD_exit() +{ + assert(AUD_device); + delete AUD_device; + AUD_device = NULL; + AUD_3ddevice = NULL; +} + +void AUD_lock() +{ + assert(AUD_device); + AUD_device->lock(); +} + +void AUD_unlock() +{ + assert(AUD_device); + AUD_device->unlock(); +} + +AUD_SoundInfo AUD_getInfo(AUD_Sound* sound) +{ + assert(sound); + + AUD_IReader* reader = sound->createReader(); + + AUD_SoundInfo info; + + if(reader) + { + info.specs = reader->getSpecs(); + info.length = reader->getLength() / (float) info.specs.rate; + } + else + { + info.specs.channels = AUD_CHANNELS_INVALID; + info.specs.format = AUD_FORMAT_INVALID; + info.specs.rate = AUD_RATE_INVALID; + info.length = 0.0; + } + + return info; +} + +AUD_Sound* AUD_load(const char* filename) +{ + assert(filename); +#ifdef WITH_FFMPEG + return new AUD_FFMPEGFactory(filename); +#else + return NULL; +#endif +} + +AUD_Sound* AUD_loadBuffer(unsigned char* buffer, int size) +{ + assert(buffer); +#ifdef WITH_FFMPEG + return new AUD_FFMPEGFactory(buffer, size); +#else + return NULL; +#endif +} + +AUD_Sound* AUD_bufferSound(AUD_Sound* sound) +{ + assert(sound); + + try + { + return new AUD_StreamBufferFactory(sound); + } + catch(AUD_Exception e) + { + return NULL; + } +} + +AUD_Sound* AUD_delaySound(AUD_Sound* sound, float delay) +{ + assert(sound); + + try + { + return new AUD_DelayFactory(sound, delay); + } + catch(AUD_Exception e) + { + return NULL; + } +} + +extern AUD_Sound* AUD_limitSound(AUD_Sound* sound, float start, float end) +{ + assert(sound); + + try + { + return new AUD_LimiterFactory(sound, start, end); + } + catch(AUD_Exception e) + { + return NULL; + } +} + +AUD_Sound* AUD_pingpongSound(AUD_Sound* sound) +{ + assert(sound); + + try + { + return new AUD_PingPongFactory(sound); + } + catch(AUD_Exception e) + { + return NULL; + } +} + +AUD_Sound* AUD_loopSound(AUD_Sound* sound) +{ + assert(sound); + + try + { + return new AUD_LoopFactory(sound); + } + catch(AUD_Exception e) + { + return NULL; + } +} + +int AUD_stopLoop(AUD_Handle* handle) +{ + if(handle) + { + AUD_Message message; + message.type = AUD_MSG_LOOP; + message.loopcount = 0; + + try + { + return AUD_device->sendMessage(handle, message); + } + catch(AUD_Exception e) + { + } + } + return false; +} + +void AUD_unload(AUD_Sound* sound) +{ + assert(sound); + delete sound; +} + +AUD_Handle* AUD_play(AUD_Sound* sound, int keep) +{ + assert(AUD_device); + assert(sound); + try + { + return AUD_device->play(sound, keep); + } + catch(AUD_Exception e) + { + return NULL; + } +} + +int AUD_pause(AUD_Handle* handle) +{ + assert(AUD_device); + return AUD_device->pause(handle); +} + +int AUD_resume(AUD_Handle* handle) +{ + assert(AUD_device); + return AUD_device->resume(handle); +} + +int AUD_stop(AUD_Handle* handle) +{ + if(AUD_device) + return AUD_device->stop(handle); + return false; +} + +int AUD_setKeep(AUD_Handle* handle, int keep) +{ + assert(AUD_device); + return AUD_device->setKeep(handle, keep); +} + +int AUD_seek(AUD_Handle* handle, float seekTo) +{ + assert(AUD_device); + return AUD_device->seek(handle, seekTo); +} + +float AUD_getPosition(AUD_Handle* handle) +{ + assert(AUD_device); + return AUD_device->getPosition(handle); +} + +AUD_Status AUD_getStatus(AUD_Handle* handle) +{ + assert(AUD_device); + return AUD_device->getStatus(handle); +} + +AUD_Handle* AUD_play3D(AUD_Sound* sound, int keep) +{ + assert(AUD_device); + assert(sound); + + try + { + if(AUD_3ddevice) + return AUD_3ddevice->play3D(sound, keep); + else + return AUD_device->play(sound, keep); + } + catch(AUD_Exception e) + { + return NULL; + } +} + +int AUD_updateListener(AUD_3DData* data) +{ + assert(AUD_device); + assert(data); + + try + { + if(AUD_3ddevice) + return AUD_3ddevice->updateListener(*data); + } + catch(AUD_Exception e) + { + } + return false; +} + +int AUD_set3DSetting(AUD_3DSetting setting, float value) +{ + assert(AUD_device); + + try + { + if(AUD_3ddevice) + return AUD_3ddevice->setSetting(setting, value); + } + catch(AUD_Exception e) + { + } + return false; +} + +float AUD_get3DSetting(AUD_3DSetting setting) +{ + assert(AUD_device); + + try + { + if(AUD_3ddevice) + return AUD_3ddevice->getSetting(setting); + } + catch(AUD_Exception e) + { + } + return 0.0; +} + +int AUD_update3DSource(AUD_Handle* handle, AUD_3DData* data) +{ + if(handle) + { + assert(AUD_device); + assert(data); + + try + { + if(AUD_3ddevice) + return AUD_3ddevice->updateSource(handle, *data); + } + catch(AUD_Exception e) + { + } + } + return false; +} + +int AUD_set3DSourceSetting(AUD_Handle* handle, + AUD_3DSourceSetting setting, float value) +{ + if(handle) + { + assert(AUD_device); + + try + { + if(AUD_3ddevice) + return AUD_3ddevice->setSourceSetting(handle, setting, value); + } + catch(AUD_Exception e) + { + } + } + return false; +} + +float AUD_get3DSourceSetting(AUD_Handle* handle, AUD_3DSourceSetting setting) +{ + if(handle) + { + assert(AUD_device); + + try + { + if(AUD_3ddevice) + return AUD_3ddevice->getSourceSetting(handle, setting); + } + catch(AUD_Exception e) + { + } + } + return 0.0; +} + +int AUD_setSoundVolume(AUD_Handle* handle, float volume) +{ + if(handle) + { + assert(AUD_device); + AUD_SourceCaps caps; + caps.handle = handle; + caps.value = volume; + + try + { + return AUD_device->setCapability(AUD_CAPS_SOURCE_VOLUME, &caps); + } + catch(AUD_Exception e) {} + } + return false; +} + +int AUD_setSoundPitch(AUD_Handle* handle, float pitch) +{ + if(handle) + { + assert(AUD_device); + AUD_SourceCaps caps; + caps.handle = handle; + caps.value = pitch; + + try + { + return AUD_device->setCapability(AUD_CAPS_SOURCE_PITCH, &caps); + } + catch(AUD_Exception e) {} + } + return false; +} + +AUD_Device* AUD_openReadDevice(AUD_Specs specs) +{ + try + { + return new AUD_ReadDevice(specs); + } + catch(AUD_Exception e) + { + return NULL; + } +} + +int AUD_playDevice(AUD_Device* device, AUD_Sound* sound) +{ + assert(device); + assert(sound); + + try + { + return device->play(sound) != NULL; + } + catch(AUD_Exception e) + { + return false; + } +} + +int AUD_readDevice(AUD_Device* device, sample_t* buffer, int length) +{ + assert(device); + assert(buffer); + + try + { + return device->read(buffer, length); + } + catch(AUD_Exception e) + { + return false; + } +} + +void AUD_closeReadDevice(AUD_Device* device) +{ + assert(device); + + try + { + delete device; + } + catch(AUD_Exception e) + { + } +} |