/* * OpenAL Helpers * * Copyright (c) 2011 by Chris Robinson * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* This file contains routines to help with some menial OpenAL-related tasks, * such as opening a device and setting up a context, closing the device and * destroying its context, converting between frame counts and byte lengths, * finding an appropriate buffer format, and getting readable strings for * channel configs and sample types. */ #include "common.h" #include "audio/alhelpers.h" /* InitAL opens the default device and sets up a context using default * attributes, making the program ready to call OpenAL functions. */ ALCcontext* InitAL(void) { ALCdevice *device; ALCcontext *ctx; /* Open and initialize a device with default settings */ device = alcOpenDevice(NULL); if(!device) { ERRLOG("Could not open a device!"); return NULL; } ctx = alcCreateContext(device, NULL); if(ctx == NULL || alcMakeContextCurrent(ctx) == ALC_FALSE) { if(ctx != NULL) { alcDestroyContext(ctx); } alcCloseDevice(device); ERRLOG("Could not set a context!"); return NULL; } LOG("Opened \"%s\"", alcGetString(device, ALC_DEVICE_SPECIFIER)); return ctx; } /* CloseAL closes the device belonging to the current context, and destroys the * context. */ void CloseAL(void) { ALCdevice *device; ALCcontext *ctx; ctx = alcGetCurrentContext(); if(ctx == NULL) { return; } device = alcGetContextsDevice(ctx); alcMakeContextCurrent(NULL); alcDestroyContext(ctx); alcCloseDevice(device); }