--- /dev/null
+#ifndef STREAM_H_
+#define STREAM_H_
+
+#include <pthread.h>
+#include "audio.h"
+
+#define AUDIO_NUM_BUFFERS 8
+#define AUDIO_BUFFER_MSEC 32
+// TODO should the sampling rate be hardcoded?
+#define AUDIO_BUFFER_SAMPLES (AUDIO_BUFFER_MSEC * 44100 / 1000)
+// TODO unhardcode the channels number
+#define AUDIO_BUFFER_BYTES (AUDIO_BUFFER_SAMPLES * 2 * 2)
+
+enum AUDIO_PLAYMODE
+{
+ AUDIO_PLAYMODE_ONCE,
+ AUDIO_PLAYMODE_LOOP
+};
+
+struct AudioStreamBuffer {
+ char samples[AUDIO_BUFFER_BYTES];
+
+ int num_samples;
+ int channels;
+ int sample_rate;
+};
+
+class AudioStream {
+private:
+ pthread_t play_thread;
+ pthread_mutex_t mutex;
+
+ float volume, pitch;
+ bool done, loop;
+ unsigned int poll_interval;
+ unsigned int alsrc;
+
+ virtual bool more_samples(AudioStreamBuffer *buf) = 0;
+
+public:
+ void poll_loop();
+
+ AudioStream();
+ virtual ~AudioStream();
+
+ virtual bool open(const char *fname);
+ virtual void close();
+
+ virtual void set_volume(float vol);
+ virtual float get_volume() const;
+
+ virtual void set_pitch(float p);
+ virtual float get_pitch() const;
+
+ virtual void play(AUDIO_PLAYMODE mode);
+ virtual void stop();
+
+ virtual void rewind() = 0;
+};
+
+#endif // AUDIO_STREAM_H_