#include "util/log.hpp"
StreamSoundSource::StreamSoundSource() :
- file(0),
+ file(),
fade_state(NoFading),
fade_start_time(),
fade_time(),
alGenBuffers(STREAMFRAGMENTS, buffers);
SoundManager::check_al_error("Couldn't allocate audio buffers: ");
//add me to update list
- sound_manager->register_for_update( this );
+ SoundManager::current()->register_for_update( this );
}
StreamSoundSource::~StreamSoundSource()
{
//don't update me any longer
- sound_manager->remove_from_update( this );
- delete file;
+ SoundManager::current()->remove_from_update( this );
+ file.reset();
stop();
alDeleteBuffers(STREAMFRAGMENTS, buffers);
SoundManager::check_al_error("Couldn't delete audio buffers: ");
}
void
-StreamSoundSource::set_sound_file(SoundFile* newfile)
+StreamSoundSource::set_sound_file(std::unique_ptr<SoundFile> newfile)
{
- delete file;
- file = newfile;
+ file = std::move(newfile);
ALint queued;
alGetSourcei(source, AL_BUFFERS_QUEUED, &queued);
play();
}
- if(fade_state == FadingOn) {
+ if(fade_state == FadingOn || fade_state == FadingResume) {
float time = real_time - fade_start_time;
if(time >= fade_time) {
set_gain(1.0);
} else {
set_gain(time / fade_time);
}
- } else if(fade_state == FadingOff) {
+ } else if(fade_state == FadingOff || fade_state == FadingPause) {
float time = real_time - fade_start_time;
if(time >= fade_time) {
- stop();
+ if(fade_state == FadingOff)
+ stop();
+ else
+ pause();
fade_state = NoFading;
} else {
set_gain( (fade_time-time) / fade_time);
}
void
-StreamSoundSource::set_fading(FadeState state, float fade_time)
+StreamSoundSource::set_fading(FadeState state, float fade_time_)
{
this->fade_state = state;
- this->fade_time = fade_time;
+ this->fade_time = fade_time_;
this->fade_start_time = real_time;
}
StreamSoundSource::fillBufferAndQueue(ALuint buffer)
{
// fill buffer
- char* bufferdata = new char[STREAMFRAGMENTSIZE];
+ std::unique_ptr<char[]> bufferdata(new char[STREAMFRAGMENTSIZE]);
size_t bytesread = 0;
do {
- bytesread += file->read(bufferdata + bytesread,
+ bytesread += file->read(bufferdata.get() + bytesread,
STREAMFRAGMENTSIZE - bytesread);
// end of sound file
if(bytesread < STREAMFRAGMENTSIZE) {
} while(bytesread < STREAMFRAGMENTSIZE);
if(bytesread > 0) {
- ALenum format = SoundManager::get_sample_format(file);
- alBufferData(buffer, format, bufferdata, bytesread, file->rate);
+ ALenum format = SoundManager::get_sample_format(*file);
+ alBufferData(buffer, format, bufferdata.get(), bytesread, file->rate);
SoundManager::check_al_error("Couldn't refill audio buffer: ");
alSourceQueueBuffers(source, 1, &buffer);
SoundManager::check_al_error("Couldn't queue audio buffer: ");
}
- delete[] bufferdata;
// return false if there aren't more buffers to fill
return bytesread >= STREAMFRAGMENTSIZE;