added audio
[laserbrain_demo] / src / audio / stream.h
1 #ifndef STREAM_H_
2 #define STREAM_H_
3
4 #include <pthread.h>
5 #include "audio.h"
6
7 #define AUDIO_NUM_BUFFERS               8
8 #define AUDIO_BUFFER_MSEC               32
9 // TODO should the sampling rate be hardcoded?
10 #define AUDIO_BUFFER_SAMPLES    (AUDIO_BUFFER_MSEC * 44100 / 1000)
11 // TODO unhardcode the channels number
12 #define AUDIO_BUFFER_BYTES              (AUDIO_BUFFER_SAMPLES * 2 * 2)
13
14 enum AUDIO_PLAYMODE
15 {
16         AUDIO_PLAYMODE_ONCE,
17         AUDIO_PLAYMODE_LOOP
18 };
19
20 struct AudioStreamBuffer {
21         char samples[AUDIO_BUFFER_BYTES];
22
23         int num_samples;
24         int channels;
25         int sample_rate;
26 };
27
28 class AudioStream {
29 private:
30         pthread_t play_thread;
31         pthread_mutex_t mutex;
32
33         float volume, pitch;
34         bool done, loop;
35         unsigned int poll_interval;
36         unsigned int alsrc;
37
38         virtual bool more_samples(AudioStreamBuffer *buf) = 0;
39
40 public:
41         void poll_loop();
42
43         AudioStream();
44         virtual ~AudioStream();
45
46         virtual bool open(const char *fname);
47         virtual void close();
48
49         virtual void set_volume(float vol);
50         virtual float get_volume() const;
51
52         virtual void set_pitch(float p);
53         virtual float get_pitch() const;
54
55         virtual void play(AUDIO_PLAYMODE mode);
56         virtual void stop();
57
58         virtual void rewind() = 0;
59 };
60
61 #endif  // AUDIO_STREAM_H_