fishbowl/engine/include/fishbone/sound.h

102 lines
1.9 KiB
C
Raw Permalink Normal View History

2026-05-25 07:25:59 +09:00
#ifndef __FISHBONE_SOUND_H__
#define __FISHBONE_SOUND_H__
2026-05-27 23:51:37 +09:00
#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(); \
}
2026-05-28 00:53:37 +09:00
#define FB_SOUND_LOADERS \
LOADER(XMP) \
LOADER(Vorbis) \
LOADER(MP3) \
LOADER(FLAC) \
LOADER(WAV)
2026-05-27 23:51:37 +09:00
2026-05-25 07:25:59 +09:00
namespace fishbone {
class SoundDriver;
class SoundLoader;
2026-05-25 12:39:31 +09:00
class Sound;
2026-05-27 23:51:37 +09:00
#define LOADER(X) FB_SOUND_DECL(X);
FB_SOUND_LOADERS
#undef LOADER
2026-05-25 12:12:03 +09:00
}; // namespace fishbone
2026-05-25 07:25:59 +09:00
2026-05-25 12:39:31 +09:00
#include <fishbone/machdep.h>
2026-05-25 07:25:59 +09:00
#include <fishbone/mixer.h>
namespace fishbone {
class SoundDriver {
2026-05-27 21:36:15 +09:00
struct Impl;
Impl* impl;
2026-05-27 16:03:38 +09:00
public:
SoundDriver();
~SoundDriver();
2026-05-25 07:25:59 +09:00
fishbone::Mixer mixer;
};
2026-05-27 16:03:38 +09:00
2026-05-25 07:25:59 +09:00
class SoundLoader {
2026-05-27 16:03:38 +09:00
public:
SoundLoader();
~SoundLoader();
2026-05-27 23:51:37 +09:00
virtual Sound* open(Mixer* mixer, void* buffer, size_t size);
2026-05-27 16:03:38 +09:00
virtual int read(Sound* sound, short* buffer, size_t frames);
2026-05-27 23:51:37 +09:00
virtual void seek(Sound* sound, size_t pos);
2026-05-25 07:25:59 +09:00
};
2026-05-27 16:03:38 +09:00
2026-05-25 12:39:31 +09:00
class Sound {
2026-05-27 23:51:37 +09:00
public:
struct Impl;
Impl* impl;
private:
2026-05-27 16:03:38 +09:00
SoundLoader* loader;
2026-05-27 23:51:37 +09:00
Mixer* mixer;
protected:
bool loop;
bool paused;
2026-05-27 16:03:38 +09:00
public:
2026-05-27 23:51:37 +09:00
Sound(Mixer* mixer, SoundLoader* loader, struct Impl* impl);
2026-05-27 16:03:38 +09:00
2026-05-27 23:51:37 +09:00
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();
2026-05-27 16:03:38 +09:00
2026-05-28 14:07:42 +09:00
int rate;
int channels;
float volume;
bool is3d;
float position[3];
2026-05-25 12:39:31 +09:00
};
2026-05-27 23:51:37 +09:00
#define LOADER(X) FB_SOUND_DEF(X);
FB_SOUND_LOADERS
#undef LOADER
2026-05-25 12:12:03 +09:00
}; // namespace fishbone
2026-05-25 07:25:59 +09:00
#endif