nuclear@54: #include nuclear@53: #include "stream.h" nuclear@54: #include "openal.h" nuclear@54: nuclear@54: AudioStream::AudioStream() nuclear@54: { nuclear@54: alsrc = 0; nuclear@54: poll_interval = 250; nuclear@54: done = true; nuclear@54: loop = false; nuclear@54: } nuclear@53: nuclear@53: AudioStream::~AudioStream() nuclear@53: { nuclear@54: stop(); nuclear@53: } nuclear@53: nuclear@54: void AudioStream::play(bool loop) nuclear@53: { nuclear@54: this->loop = loop; nuclear@54: done = false; nuclear@54: play_thread = std::thread(&AudioStream::poll_loop, this); nuclear@53: } nuclear@53: nuclear@53: void AudioStream::stop() nuclear@53: { nuclear@54: if(alsrc) { nuclear@54: done = true; nuclear@54: alSourceStop(alsrc); nuclear@54: play_thread.join(); nuclear@54: } nuclear@53: } nuclear@54: nuclear@54: static ALenum alformat(AudioStreamBuffer *buf) nuclear@54: { nuclear@54: return buf->channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; nuclear@54: } nuclear@54: nuclear@54: // thread function nuclear@54: void AudioStream::poll_loop() nuclear@54: { nuclear@54: static const int num_buffers = 3; nuclear@54: AudioStreamBuffer buf; nuclear@54: unsigned int albuf[num_buffers]; nuclear@54: nuclear@54: alGenSources(1, &alsrc); nuclear@54: alGenBuffers(num_buffers, albuf); nuclear@54: nuclear@54: for(int i=0; i