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");
57 flags = MA_SOUND_FLAG_STREAM;
58 if(ma_sound_init_from_file(&engine, "data/woodclick.wav", flags, 0, 0, &sound) != 0) {
59 fprintf(stderr, "failed to load music\n");
62 ma_sound_get_data_format(&sound, &fmt, &nchan, &sample_rate, 0, 0);
63 printf("loaded sound: %s %u.%03u khz, %u channels\n", fmtname(fmt),
64 (unsigned int)sample_rate / 1000, (unsigned int)sample_rate % 1000,
73 void destroy_music(void)
76 ma_sound_stop(&sound);
77 ma_sound_uninit(&sound);
78 ma_engine_uninit(&engine);
86 ma_sound_start(&sound);
93 ma_sound_stop(&sound);
97 void seek_music(long tm)
103 frm = (ma_uint64)tm * (ma_uint64)sample_rate / 1000llu;
104 ma_sound_seek_to_pcm_frame(&sound, frm);
108 void set_music_volume(float vol)
112 ma_engine_set_volume(&engine, vol);
117 static const char *fmtname(ma_format fmt)
120 case ma_format_u8: return "8 bit";
121 case ma_format_s16: return "16 bit";
122 case ma_format_s24: return "24 bit";
123 case ma_format_s32: return "32 bit";
124 case ma_format_f32: return "float";
130 static ma_result vopen(ma_vfs *vfs, const char *path, ma_uint32 mode, ma_vfs_file *fret)
134 if(mode != MA_OPEN_MODE_READ) return -1;
136 if(!(fp = ass_fopen(path, "rb"))) {
143 static ma_result vclose(ma_vfs *vfs, ma_vfs_file fp)
149 static ma_result vread(ma_vfs *vfs, ma_vfs_file fp, void *dest, size_t sz, size_t *numread)
153 res = ass_fread(dest, 1, sz, fp);
154 if(numread) *numread = res;
157 if(res == 0) return MA_AT_END;
162 static ma_result vseek(ma_vfs *vfs, ma_vfs_file fp, ma_int64 offs, ma_seek_origin org)
166 case ma_seek_origin_start:
169 case ma_seek_origin_current:
172 case ma_seek_origin_end:
176 return ass_fseek(fp, offs, from) == -1 ? -1 : 0;
179 static ma_result vtell(ma_vfs *vfs, ma_vfs_file fp, ma_int64 *pos)
181 *pos = ass_ftell(fp);
185 static ma_result vinfo(ma_vfs *vfs, ma_vfs_file fp, ma_file_info *inf)
196 if(fstat(fd, &st) != 0) {
199 inf->sizeInBytes = st.st_size;
210 void destroy_music(void)
214 void play_music(void)
218 void stop_music(void)
222 void seek_music(long tm)
227 void set_music_volume(float vol)