X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FSound.cc;h=4cb291300850dec5c29e38a1808c42a986287789;hp=f912b318d153c2dfa13ecf1b991169f4e87751ee;hb=ca0f7bdfba63140dca0bd20586d31980f3938eb2;hpb=7e898e8ec0ff716e2fc722b883a626a6c346f107 diff --git a/src/Moof/Sound.cc b/src/Moof/Sound.cc index f912b31..4cb2913 100644 --- a/src/Moof/Sound.cc +++ b/src/Moof/Sound.cc @@ -38,6 +38,7 @@ #include "Log.hh" #include "Mippleton.hh" #include "Sound.hh" +#include "Timer.hh" #define BUFFER_SIZE (64 * 1024) //#define BUFFER_SIZE (5*2048) @@ -161,7 +162,7 @@ struct Sound::Impl } - void beginStream(ALuint source, int nBuffers = 4) + void beginStream(ALuint source, int nBuffers = 8) { if (!oggStream.datasource) openFile(); if (!oggStream.datasource) return; @@ -299,6 +300,9 @@ struct Sound::Impl alSourcei(source_, AL_LOOPING, AL_FALSE); alSourcePlay(source_); playing_ = true; + + streamTimer.init(boost::bind(&Impl::streamUpdate, this, _1, _2), 1.0, + Timer::REPEAT); } inline void update() @@ -446,6 +450,16 @@ struct Sound::Impl std::queue queue_; std::vector expired_; + + Timer streamTimer; + + void streamUpdate(Timer& timer, Scalar t) + { + // don't let the music die! + update(); + // TODO - might be nice to also allow using threads for streaming rather + // than a timer, probably as a compile-time option + } }; Sound::Sound(const std::string& name) : @@ -459,19 +473,12 @@ void Sound::play() impl_->play(); } - void Sound::stream() { // pass through impl_->stream(); } -void Sound::update(Scalar t, Scalar dt) -{ - // pass through - impl_->update(); -} - void Sound::stop() { @@ -517,13 +524,13 @@ bool Sound::isPlaying() const return impl_->isPlaying(); } -void Sound::setPosition(Vector3 position) +void Sound::setPosition(const Vector3& position) { float p[3] = {position[0], position[1], position[2]}; alSourcefv(impl_->source_, AL_POSITION, p); } -void Sound::setVelocity(Vector3 velocity) +void Sound::setVelocity(const Vector3& velocity) { float v[3] = {velocity[0], velocity[1], velocity[2]}; alSourcefv(impl_->source_, AL_VELOCITY, v); @@ -546,6 +553,31 @@ void Sound::setLooping(bool looping) } +void Sound::setListenerPosition(const Vector3& position) +{ + alListener3f(AL_POSITION, float(position[0]), float(position[1]), + float(position[2])); +} + +void Sound::setListenerVelocity(const Vector3& velocity) +{ + alListener3f(AL_VELOCITY, float(velocity[0]), float(velocity[1]), + float(velocity[2])); +} + +void Sound::setListenerOrientation(const Vector3& forward, const Vector3& up) +{ + float vec[6]; + vec[0] = float(forward[0]); + vec[1] = float(forward[1]); + vec[2] = float(forward[2]); + vec[3] = float(up[0]); + vec[4] = float(up[1]); + vec[5] = float(up[2]); + alListenerfv(AL_ORIENTATION, vec); +} + + std::string Sound::getPath(const std::string& name) { std::string path = Resource::getPath("sounds/" + name + ".ogg");