7 #include "miniaudio/miniaudio.h"
9 static const char *fmtname(ma_format fmt);
10 static ma_result vopen(ma_vfs *vfs, const char *path, ma_uint32 mode, ma_vfs_file *fret);
11 static ma_result vclose(ma_vfs *vfs, ma_vfs_file fp);
12 static ma_result vread(ma_vfs *vfs, ma_vfs_file fp, void *dest, size_t sz, size_t *numread);
13 static ma_result vseek(ma_vfs *vfs, ma_vfs_file fp, ma_int64 offs, ma_seek_origin from);
14 static ma_result vtell(ma_vfs *vfs, ma_vfs_file fp, ma_int64 *pos);
15 static ma_result vinfo(ma_vfs *vfs, ma_vfs_file fp, ma_file_info *inf);
18 static ma_engine engine;
19 static ma_sound sound;
20 static ma_resource_manager resman;
21 static ma_uint32 sample_rate;
24 static ma_vfs_callbacks vfs = {
35 ma_engine_config engcfg;
36 ma_resource_manager_config rescfg;
41 rescfg = ma_resource_manager_config_init();
43 if(ma_resource_manager_init(&rescfg, &resman) != 0) {
44 fprintf(stderr, "failed to initialize miniaudio resource manager\n");
48 engcfg = ma_engine_config_init();
49 engcfg.pResourceManager = &resman;
51 if(ma_engine_init(&engcfg, &engine) != 0) {
52 fprintf(stderr, "failed to initialize miniaudio engine\n");
56 flags = MA_SOUND_FLAG_STREAM;
57 if(ma_sound_init_from_file(&engine, "data/woodclick.wav", flags, 0, 0, &sound) != 0) {
58 fprintf(stderr, "failed to load music\n");
61 ma_sound_get_data_format(&sound, &fmt, &nchan, &sample_rate, 0, 0);
62 printf("loaded sound: %s %u.%03u khz, %u channels\n", fmtname(fmt),
63 (unsigned int)sample_rate / 1000, (unsigned int)sample_rate % 1000,
71 void destroy_music(void)
74 ma_sound_stop(&sound);
75 ma_sound_uninit(&sound);
76 ma_engine_uninit(&engine);
84 ma_sound_start(&sound);
91 ma_sound_stop(&sound);
95 void seek_music(long tm)
101 frm = (ma_uint64)tm * (ma_uint64)sample_rate / 1000llu;
102 ma_sound_seek_to_pcm_frame(&sound, frm);
106 void set_music_volume(float vol)
110 ma_engine_set_volume(&engine, vol);
115 static const char *fmtname(ma_format fmt)
118 case ma_format_u8: return "8 bit";
119 case ma_format_s16: return "16 bit";
120 case ma_format_s24: return "24 bit";
121 case ma_format_s32: return "32 bit";
122 case ma_format_f32: return "float";
128 static ma_result vopen(ma_vfs *vfs, const char *path, ma_uint32 mode, ma_vfs_file *fret)
132 if(mode != MA_OPEN_MODE_READ) return -1;
134 if(!(fp = ass_fopen(path, "rb"))) {
141 static ma_result vclose(ma_vfs *vfs, ma_vfs_file fp)
147 static ma_result vread(ma_vfs *vfs, ma_vfs_file fp, void *dest, size_t sz, size_t *numread)
151 res = ass_fread(dest, 1, sz, fp);
152 if(numread) *numread = res;
155 if(res == 0) return MA_AT_END;
160 static ma_result vseek(ma_vfs *vfs, ma_vfs_file fp, ma_int64 offs, ma_seek_origin org)
164 case ma_seek_origin_start:
167 case ma_seek_origin_current:
170 case ma_seek_origin_end:
174 return ass_fseek(fp, offs, from) == -1 ? -1 : 0;
177 static ma_result vtell(ma_vfs *vfs, ma_vfs_file fp, ma_int64 *pos)
179 *pos = ass_ftell(fp);
183 static ma_result vinfo(ma_vfs *vfs, ma_vfs_file fp, ma_file_info *inf)
194 if(fstat(fd, &st) != 0) {
197 inf->sizeInBytes = st.st_size;
208 void destroy_music(void)
212 void play_music(void)
216 void stop_music(void)
220 void seek_music(long tm)
225 void set_music_volume(float vol)