5 #include "miniaudio/miniaudio.h"
7 static const char *fmtname(ma_format fmt);
8 static ma_result vopen(ma_vfs *vfs, const char *path, ma_uint32 mode, ma_vfs_file *fret);
9 static ma_result vclose(ma_vfs *vfs, ma_vfs_file fp);
10 static ma_result vread(ma_vfs *vfs, ma_vfs_file fp, void *dest, size_t sz, size_t *numread);
11 static ma_result vseek(ma_vfs *vfs, ma_vfs_file fp, ma_int64 offs, ma_seek_origin from);
12 static ma_result vtell(ma_vfs *vfs, ma_vfs_file fp, ma_int64 *pos);
13 static ma_result vinfo(ma_vfs *vfs, ma_vfs_file fp, ma_file_info *inf);
16 static ma_engine engine;
17 static ma_sound sound;
18 static ma_resource_manager resman;
19 static ma_uint32 sample_rate;
22 static ma_vfs_callbacks vfs = {
33 ma_engine_config engcfg;
34 ma_resource_manager_config rescfg;
39 rescfg = ma_resource_manager_config_init();
41 if(ma_resource_manager_init(&rescfg, &resman) != 0) {
42 fprintf(stderr, "failed to initialize miniaudio resource manager\n");
46 engcfg = ma_engine_config_init();
47 engcfg.pResourceManager = &resman;
49 if(ma_engine_init(&engcfg, &engine) != 0) {
50 fprintf(stderr, "failed to initialize miniaudio engine\n");
54 flags = MA_SOUND_FLAG_STREAM;
55 if(ma_sound_init_from_file(&engine, "data/woodclick.wav", flags, 0, 0, &sound) != 0) {
56 fprintf(stderr, "failed to load music\n");
59 ma_sound_get_data_format(&sound, &fmt, &nchan, &sample_rate, 0, 0);
60 printf("loaded sound: %s %u.%03u khz, %u channels\n", fmtname(fmt),
61 (unsigned int)sample_rate / 1000, (unsigned int)sample_rate % 1000,
69 void destroy_music(void)
72 ma_sound_stop(&sound);
73 ma_sound_uninit(&sound);
74 ma_engine_uninit(&engine);
82 ma_sound_start(&sound);
89 ma_sound_stop(&sound);
93 void seek_music(long tm)
99 frm = (ma_uint64)tm * (ma_uint64)sample_rate / 1000llu;
100 ma_sound_seek_to_pcm_frame(&sound, frm);
104 void set_music_volume(float vol)
108 ma_engine_set_volume(&engine, vol);
113 static const char *fmtname(ma_format fmt)
116 case ma_format_u8: return "8 bit";
117 case ma_format_s16: return "16 bit";
118 case ma_format_s24: return "24 bit";
119 case ma_format_s32: return "32 bit";
120 case ma_format_f32: return "float";
126 static ma_result vopen(ma_vfs *vfs, const char *path, ma_uint32 mode, ma_vfs_file *fret)
130 if(mode != MA_OPEN_MODE_READ) return -1;
132 if(!(fp = ass_fopen(path, "rb"))) {
139 static ma_result vclose(ma_vfs *vfs, ma_vfs_file fp)
145 static ma_result vread(ma_vfs *vfs, ma_vfs_file fp, void *dest, size_t sz, size_t *numread)
149 res = ass_fread(dest, 1, sz, fp);
150 if(numread) *numread = res;
153 if(res == 0) return MA_AT_END;
158 static ma_result vseek(ma_vfs *vfs, ma_vfs_file fp, ma_int64 offs, ma_seek_origin org)
162 case ma_seek_origin_start:
165 case ma_seek_origin_current:
168 case ma_seek_origin_end:
172 return ass_fseek(fp, offs, from) == -1 ? -1 : 0;
175 static ma_result vtell(ma_vfs *vfs, ma_vfs_file fp, ma_int64 *pos)
177 *pos = ass_ftell(fp);
181 static ma_result vinfo(ma_vfs *vfs, ma_vfs_file fp, ma_file_info *inf)
192 if(fstat(fd, &st) != 0) {
195 inf->sizeInBytes = st.st_size;