102 lines
1.9 KiB
C++
102 lines
1.9 KiB
C++
#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 <fishbone/machdep.h>
|
|
#include <fishbone/mixer.h>
|
|
|
|
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
|