3 #include "stream_sound_source.h"
4 #include "sound_manager.h"
5 #include "sound_file.h"
7 StreamSoundSource::StreamSoundSource(SoundFile* file)
10 alGenBuffers(STREAMFRAGMENTS, buffers);
11 SoundManager::check_al_error("Couldn't allocate audio buffers: ");
12 format = SoundManager::get_sample_format(file);
14 for(size_t i = 0; i < STREAMFRAGMENTS; ++i) {
15 fillBufferAndQueue(buffers[i]);
18 alDeleteBuffers(STREAMFRAGMENTS, buffers);
22 StreamSoundSource::~StreamSoundSource()
24 alDeleteBuffers(STREAMFRAGMENTS, buffers);
25 SoundManager::check_al_error("Couldn't delete audio buffers: ");
29 StreamSoundSource::update()
35 alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);
36 while(processed > 0) {
40 alSourceUnqueueBuffers(source, 1, &buffer);
41 SoundManager::check_al_error("Couldn't unqueu audio buffer: ");
43 fillBufferAndQueue(buffer);
46 // we might have to restart the source if we had a buffer underrun
48 std::cerr << "Restarting audio source because of buffer underrun.\n";
50 SoundManager::check_al_error("Couldn't restart audio source: ");
57 StreamSoundSource::fillBufferAndQueue(ALuint buffer)
60 char* bufferdata = new char[STREAMFRAGMENTSIZE];
63 bytesread += file->read(bufferdata + bytesread,
64 STREAMFRAGMENTSIZE - bytesread);
65 if(bytesread < STREAMFRAGMENTSIZE) {
68 } while(bytesread < STREAMFRAGMENTSIZE);
70 alBufferData(buffer, format, bufferdata, STREAMFRAGMENTSIZE, file->rate);
72 SoundManager::check_al_error("Couldn't refill audio buffer: ");
74 alSourceQueueBuffers(source, 1, &buffer);
75 SoundManager::check_al_error("Couldn't queue audio buffer: ");