mirror of
https://github.com/love2d/love.git
synced 2026-08-12 08:30:56 +02:00
211 lines
3.9 KiB
C++
211 lines
3.9 KiB
C++
/**
|
|
* Copyright (c) 2006-2009 LOVE Development Team
|
|
*
|
|
* This software is provided 'as-is', without any express or implied
|
|
* warranty. In no event will the authors be held liable for any damages
|
|
* arising from the use of this software.
|
|
*
|
|
* Permission is granted to anyone to use this software for any purpose,
|
|
* including commercial applications, and to alter it and redistribute it
|
|
* freely, subject to the following restrictions:
|
|
*
|
|
* 1. The origin of this software must not be misrepresented; you must not
|
|
* claim that you wrote the original software. If you use this software
|
|
* in a product, an acknowledgment in the product documentation would be
|
|
* appreciated but is not required.
|
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
* misrepresented as being the original software.
|
|
* 3. This notice may not be removed or altered from any source distribution.
|
|
**/
|
|
|
|
#include "Audio.h"
|
|
|
|
namespace love
|
|
{
|
|
namespace audio
|
|
{
|
|
namespace openal
|
|
{
|
|
Audio::Audio()
|
|
{
|
|
// Passing zero for default device.
|
|
device = alcOpenDevice(0);
|
|
|
|
if(device == 0)
|
|
throw love::Exception("Could not open device.");
|
|
|
|
context = alcCreateContext(device, 0);
|
|
|
|
if(context == 0)
|
|
throw love::Exception("Could not create context.");
|
|
|
|
alcMakeContextCurrent(context);
|
|
|
|
if(alcGetError(device) != ALC_NO_ERROR)
|
|
throw love::Exception("Could not make context current.");
|
|
|
|
// pool must be allocated after AL context.
|
|
pool = new Pool();
|
|
|
|
thread = SDL_CreateThread(Audio::run, (void*)this);
|
|
}
|
|
|
|
Audio::~Audio()
|
|
{
|
|
SDL_KillThread(thread);
|
|
|
|
delete pool;
|
|
|
|
alcMakeContextCurrent(0);
|
|
alcDestroyContext(context);
|
|
alcCloseDevice(device);
|
|
}
|
|
|
|
int Audio::run(void * d)
|
|
{
|
|
Audio * instance = (Audio*)d;
|
|
|
|
while(true)
|
|
{
|
|
instance->pool->update();
|
|
SDL_Delay(10);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
const char * Audio::getName() const
|
|
{
|
|
return "love.audio.openal";
|
|
}
|
|
|
|
love::audio::Sound * Audio::newSound(love::sound::SoundData * data)
|
|
{
|
|
return new Sound(pool, data);
|
|
}
|
|
|
|
love::audio::Music * Audio::newMusic(love::sound::Decoder * decoder)
|
|
{
|
|
return new Music(pool, decoder);
|
|
}
|
|
|
|
love::audio::Source * Audio::newSource(Audible * audible)
|
|
{
|
|
return new Source(pool, audible);
|
|
}
|
|
|
|
int Audio::getNumSources() const
|
|
{
|
|
return pool->getNumSources();
|
|
}
|
|
|
|
int Audio::getMaxSources() const
|
|
{
|
|
return pool->getMaxSources();
|
|
}
|
|
|
|
void Audio::play(love::audio::Source * source)
|
|
{
|
|
source->play();
|
|
}
|
|
|
|
void Audio::play(love::audio::Sound * sound)
|
|
{
|
|
Source * source = new Source(pool, sound);
|
|
play(source);
|
|
source->release();
|
|
}
|
|
|
|
void Audio::play(love::audio::Music * music)
|
|
{
|
|
Source * source = new Source(pool, music->clone());
|
|
play(source);
|
|
source->release();
|
|
}
|
|
|
|
void Audio::stop(love::audio::Source * source)
|
|
{
|
|
source->stop();
|
|
}
|
|
|
|
void Audio::stop()
|
|
{
|
|
pool->stop();
|
|
}
|
|
|
|
void Audio::pause(love::audio::Source * source)
|
|
{
|
|
source->pause();
|
|
}
|
|
|
|
void Audio::pause()
|
|
{
|
|
pool->pause();
|
|
}
|
|
|
|
void Audio::resume(love::audio::Source * source)
|
|
{
|
|
source->resume();
|
|
}
|
|
|
|
void Audio::resume()
|
|
{
|
|
pool->resume();
|
|
}
|
|
|
|
void Audio::rewind(love::audio::Source * source)
|
|
{
|
|
source->rewind();
|
|
}
|
|
|
|
void Audio::rewind()
|
|
{
|
|
pool->rewind();
|
|
}
|
|
|
|
void Audio::setVolume(float volume)
|
|
{
|
|
alListenerf(AL_GAIN, volume);
|
|
}
|
|
|
|
float Audio::getVolume() const
|
|
{
|
|
ALfloat volume;
|
|
alGetListenerf(AL_GAIN, &volume);
|
|
return volume;
|
|
}
|
|
|
|
void Audio::getPosition(float * v) const
|
|
{
|
|
alGetListenerfv(AL_POSITION, v);
|
|
}
|
|
|
|
void Audio::setPosition(float * v)
|
|
{
|
|
alListenerfv(AL_POSITION, v);
|
|
}
|
|
|
|
void Audio::getOrientation(float * v) const
|
|
{
|
|
alGetListenerfv(AL_ORIENTATION, v);
|
|
}
|
|
|
|
void Audio::setOrientation(float * v)
|
|
{
|
|
alListenerfv(AL_ORIENTATION, v);
|
|
}
|
|
|
|
void Audio::getVelocity(float * v) const
|
|
{
|
|
alGetListenerfv(AL_VELOCITY, v);
|
|
}
|
|
|
|
void Audio::setVelocity(float * v)
|
|
{
|
|
alListenerfv(AL_VELOCITY, v);
|
|
}
|
|
|
|
} // openal
|
|
} // audio
|
|
} // love
|