fishbowl/engine/include/fishbone/sound.h
2026-05-28 14:07:42 +09:00

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