#ifndef __FISHBONE_SOUND_H__ #define __FISHBONE_SOUND_H__ #define FB_SOUND_DECL(prefix) \ class prefix##SoundLoader; \ class prefix##Sound #define FB_SOUND_DEF(prefix) \ class prefix##SoundLoader : public SoundLoader { \ public: \ Sound* open(Mixer* mixer, void* buffer, size_t size); \ int read(Sound* sound, short* buffer, size_t frames); \ void seek(Sound* sound, size_t pos); \ }; \ \ class prefix##Sound : public Sound { \ public: \ prefix##Sound(Mixer* mixer, prefix##SoundLoader* loader, struct Sound::Impl* impl) \ : Sound(mixer, loader, impl){}; \ ~prefix##Sound(); \ } #define FB_SOUND_LOADERS \ LOADER(XMP) \ LOADER(Vorbis) \ LOADER(MP3) \ LOADER(FLAC) \ LOADER(WAV) namespace fishbone { class SoundDriver; class SoundLoader; class Sound; #define LOADER(X) FB_SOUND_DECL(X); FB_SOUND_LOADERS #undef LOADER }; // namespace fishbone #include #include namespace fishbone { class SoundDriver { struct Impl; Impl* impl; public: SoundDriver(); ~SoundDriver(); fishbone::Mixer mixer; }; class SoundLoader { public: SoundLoader(); ~SoundLoader(); virtual Sound* open(Mixer* mixer, void* buffer, size_t size); virtual int read(Sound* sound, short* buffer, size_t frames); virtual void seek(Sound* sound, size_t pos); }; class Sound { public: struct Impl; Impl* impl; private: SoundLoader* loader; Mixer* mixer; protected: bool loop; bool paused; public: Sound(Mixer* mixer, SoundLoader* loader, struct Impl* impl); int read(short* buffer, size_t frames); void seek(size_t pos); void resume(); void pause(); void pauseNoLock(); /* do NOT use this! */ bool isPaused(); void setLoop(bool v); bool isLoop(); int rate; int channels; float volume; bool is3d; float position[3]; }; #define LOADER(X) FB_SOUND_DEF(X); FB_SOUND_LOADERS #undef LOADER }; // namespace fishbone #endif