diff -r 08313e4080e4 -r 1e10a47cabea openalbridge/ssound.c --- a/openalbridge/ssound.c Fri Oct 16 15:56:42 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,185 +0,0 @@ -/* - * OpenAL Bridge - a simple portable library for OpenAL interface - * Copyright (c) 2009 Vittorio Giovara , - * Mario Liebisch - * - * This program 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; version 2 of the License - * - * This program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "ssound.h" -#include "loaders.h" - -extern SSound_t aSounds[MAX_SOUNDS]; -extern ALuint sources[MAX_SOURCES]; -extern const ALfloat NV[3]; -extern const ALfloat LO[6]; -extern int iNumSounds; -extern char *prog; - -char SSound_load (SSound_t* pSound, const char* cFilename) { - uint32_t magic; - ALenum format; - ALsizei bitsize, freq; - char *data; - FILE* fp; - - snprintf(pSound->Filename, 256, "%s", cFilename); - pSound->source = -1; - alGenBuffers(1, &pSound->Buffer); - - if(alGetError() != AL_NO_ERROR) { - fprintf(stderr, "CSound: Couldn't create buffer.\n"); - return 0; - } - - fp = fopen(pSound->Filename, "rb"); - - if(!fp) { - fprintf(stderr, "CSound: Couldn't open file for reading.\n"); - return 0; - } - - if(fread(&magic, sizeof(uint32_t), 1, fp) < 1) - { - fclose(fp); - fprintf(stderr, "CSound: Couldn't read file header.\n"); - return 0; - } - fclose(fp); - - switch (ENDIAN_BIG_32(magic)) { - case OGG_FILE_FORMAT: - load_oggvorbis (pSound->Filename, &format, &data, &bitsize, &freq); - break; - case WAV_FILE_FORMAT: - load_wavpcm (pSound->Filename, &format, &data, &bitsize, &freq); - break; - default: - errno = EINVAL; - err_ret ("(%s) ERROR - File format (%08X) not supported", prog, ENDIAN_BIG_32(magic)); - return 0; - break; - } - - alBufferData(pSound->Buffer, format, data, bitsize, freq); - if(alGetError() != AL_NO_ERROR) - { - fprintf(stderr, "CSound: Couldn't write buffer data.\n"); - return 0; - } - free(data); - - return 1; -} - -void SSound_close(SSound_t* pSound) -{ - SSound_stop(pSound); - alDeleteBuffers(1, &pSound->Buffer); - return; -} - -void SSound_play(SSound_t* pSound, const char bLoop) { - int i, j; - - if(pSound->source == -1) // need a new source - { - for(i = 0; i < MAX_SOURCES; i++) - { - ALint state; - alGetSourcei(sources[i], AL_SOURCE_STATE, &state); - if(state != AL_PLAYING && state != AL_PAUSED) - { -#ifdef DEBUG - printf("using source %d (state 0x%x) for buffer.\n", i, state); -#endif - alSourceStop(sources[pSound->source]); - alGetError(); - - // lookup buffers associated with this source and reset them - for(j = 0; j < iNumSounds; j++) - if(aSounds[j].source == i) - aSounds[j].source = -1; - break; - } - } - if(i == MAX_SOURCES) // no available source found; skip - { -#ifdef DEBUG - printf("no source to play buffer %d!\n", i); -#endif - return; - } - pSound->source = i; - } - else // reuse already playing source - { - alSourceStop(sources[pSound->source]); - } - alSourcei (sources[pSound->source], AL_BUFFER, pSound->Buffer); - alSourcef (sources[pSound->source], AL_PITCH, 1.0f); - alSourcef (sources[pSound->source], AL_GAIN, 1.0f); - alSourcefv(sources[pSound->source], AL_POSITION, NV ); - alSourcefv(sources[pSound->source], AL_VELOCITY, NV ); - alSourcei (sources[pSound->source], AL_LOOPING, bLoop ); - alSourcePlay(sources[pSound->source]); - - if((i = alGetError()) != AL_NO_ERROR) - { - fprintf(stderr, "CSound: SourcePlay error 0x%4x in source %d\n", i, pSound->source); - } -#ifdef DEBUG - fprintf(stderr, "play %s%s [%d]\n", pSound->Filename, bLoop ? " forever" : " once", pSound->source); -#endif - usleep(0); - return; -} - -void SSound_pause(const SSound_t* pSound) { - if(pSound->source == -1) // not playing - return; - alSourcePause(sources[pSound->source]); -#ifdef DEBUG - fprintf(stderr, "pause %s\n", pSound->Filename); -#endif - return; -} - -void SSound_continue(const SSound_t* pSound) { - if(pSound->source == -1) // not playing - return; - alSourcePlay(sources[pSound->source]); -#ifdef DEBUG - fprintf(stderr, "pause %s\n", pSound->Filename); -#endif - return; -} - -void SSound_stop(SSound_t* pSound) { - if(pSound->source == -1) // not playing - return; - alSourceStop(sources[pSound->source]); - pSound->source = -1; -#ifdef DEBUG - fprintf(stderr, "stop %s\n", pSound->Filename); -#endif - return; -} - -void SSound_volume(const SSound_t* pSound, const float fPercentage) { - if(pSound->source == -1) // not playing - return; - alSourcef(sources[pSound->source], AL_GAIN, fPercentage); - return; -} \ No newline at end of file