added audio
[laserbrain_demo] / src / audio / stream.h
diff --git a/src/audio/stream.h b/src/audio/stream.h
new file mode 100644 (file)
index 0000000..9a2387b
--- /dev/null
@@ -0,0 +1,61 @@
+#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_