X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Faudio%2Fstream.h;fp=src%2Faudio%2Fstream.h;h=9a2387b68f5975923a404a774a2c16acb44fce46;hb=fb11663a3654acd0132e71e5652e35b0ea72d544;hp=0000000000000000000000000000000000000000;hpb=536b7259fa8cc9d99170c5df84f2dca638ce5061;p=laserbrain_demo diff --git a/src/audio/stream.h b/src/audio/stream.h new file mode 100644 index 0000000..9a2387b --- /dev/null +++ b/src/audio/stream.h @@ -0,0 +1,61 @@ +#ifndef STREAM_H_ +#define STREAM_H_ + +#include +#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_