# HG changeset patch # User John Tsiombikas # Date 1348021363 -10800 # Node ID 995191474cc0395fd7bb5cb0b8eaaf9048c1c28f # Parent 1ea56011c1ff181858f92b68a87dfc96929b7a82 writting the stream audio player diff -r 1ea56011c1ff -r 995191474cc0 prototype/src/audio/stream.cc --- a/prototype/src/audio/stream.cc Wed Sep 19 01:08:41 2012 +0300 +++ b/prototype/src/audio/stream.cc Wed Sep 19 05:22:43 2012 +0300 @@ -1,13 +1,107 @@ +#include #include "stream.h" +#include "openal.h" + +AudioStream::AudioStream() +{ + alsrc = 0; + poll_interval = 250; + done = true; + loop = false; +} AudioStream::~AudioStream() { + stop(); } -void AudioStream::play() +void AudioStream::play(bool loop) { + this->loop = loop; + done = false; + play_thread = std::thread(&AudioStream::poll_loop, this); } void AudioStream::stop() { + if(alsrc) { + done = true; + alSourceStop(alsrc); + play_thread.join(); + } } + +static ALenum alformat(AudioStreamBuffer *buf) +{ + return buf->channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; +} + +// thread function +void AudioStream::poll_loop() +{ + static const int num_buffers = 3; + AudioStreamBuffer buf; + unsigned int albuf[num_buffers]; + + alGenSources(1, &alsrc); + alGenBuffers(num_buffers, albuf); + + for(int i=0; i +struct AudioStreamBuffer { + void *samples; + int num_samples; + int channels; + int sample_rate; +}; + class AudioStream { private: std::thread play_thread; + bool done, loop; + unsigned int poll_interval; + unsigned int alsrc; - virtual bool more_samples() = 0; + virtual bool more_samples(AudioStreamBuffer *buf) = 0; + + void poll_loop(); public: + AudioStream(); virtual ~AudioStream(); - void play(); + void play(bool loop = false); void stop(); + + virtual void rewind() = 0; }; #endif // AUDIO_STREAM_H_