21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
static Uint8 sound_on;
static Sint16 mmlvolume=32767;
static SDL_AudioSpec spec;
static WaveSound*standardsounds;
static Uint16 nstandardsounds;
static WaveSound*usersounds;
static Uint16 nusersounds;
static FILE*l_fp;
static long l_offset,l_size;
static float wavevolume=1.0;
static Uint8 needs_amplify=0;
static Uint8*volatile wavesound;
static volatile Uint32 wavelen;
static void audio_callback(void*userdata,Uint8*stream,int len) {
if(wavesound) {
if(wavelen<len) {
memcpy(stream,wavesound,wavelen);
memset(stream+wavelen,0,len-wavelen);
wavesound=0;
wavelen=0;
} else {
memcpy(stream,wavesound,len);
wavesound+=len;
len-=len;
}
} else {
memset(stream,0,len);
}
}
static int my_seek(SDL_RWops*cxt,int o,int w) {
switch(w) {
case RW_SEEK_SET: fseek(l_fp,l_offset+o,SEEK_SET); break;
case RW_SEEK_CUR: fseek(l_fp,o,SEEK_CUR); break;
case RW_SEEK_END: fseek(l_fp,l_offset-o,SEEK_SET); break;
}
return ftell(l_fp)-l_offset;
}
static int my_read(SDL_RWops*cxt,void*ptr,int size,int maxnum) {
if(size*maxnum+l_offset>ftell(l_fp)+l_size) maxnum=(ftell(l_fp)-l_offset)/size;
return fread(ptr,size,maxnum,l_fp);
|
>
|
>
|
|
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
static Uint8 sound_on;
static Sint16 mmlvolume=32767;
static SDL_AudioSpec spec;
static WaveSound*standardsounds;
static Uint16 nstandardsounds;
static WaveSound*usersounds;
static Uint16 nusersounds;
static Uint8**user_sound_names;
static FILE*l_fp;
static long l_offset,l_size;
static float wavevolume=1.0;
static Uint8 needs_amplify=0;
static Uint8*volatile wavesound;
static volatile Uint32 wavelen;
static void audio_callback(void*userdata,Uint8*stream,int len) {
if(wavesound) {
if(wavelen<=len) {
memcpy(stream,wavesound,wavelen);
memset(stream+wavelen,0,len-wavelen);
wavesound=0;
wavelen=0;
} else {
memcpy(stream,wavesound,len);
wavesound+=len;
len-=len;
}
} else {
memset(stream,0,len);
}
//TODO: MML sounds
}
static int my_seek(SDL_RWops*cxt,int o,int w) {
switch(w) {
case RW_SEEK_SET: fseek(l_fp,l_offset+o,SEEK_SET); break;
case RW_SEEK_CUR: fseek(l_fp,o,SEEK_CUR); break;
case RW_SEEK_END: fseek(l_fp,l_offset+l_size+o,SEEK_SET); break;
}
return ftell(l_fp)-l_offset;
}
static int my_read(SDL_RWops*cxt,void*ptr,int size,int maxnum) {
if(size*maxnum+l_offset>ftell(l_fp)+l_size) maxnum=(ftell(l_fp)-l_offset)/size;
return fread(ptr,size,maxnum,l_fp);
|
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
Uint8*buf=0;
ws->data=0;
ws->len=0;
l_fp=fp;
l_offset=offset;
l_size=size;
if(!SDL_LoadWAV_RW(&my_rwops,0,&src,&buf,&len)) {
//fprintf(stderr,"[Cannot load wave audio at %ld (%ld bytes): %s]\n",offset,size,SDL_GetError());
return;
}
memset(&cvt,0,sizeof(SDL_AudioCVT));
if(SDL_BuildAudioCVT(&cvt,src.format,src.channels,src.freq,spec.format,spec.channels,spec.freq)<0) goto fail;
cvt.buf=malloc(len*cvt.len_mult);
cvt.len=len;
if(!cvt.buf) goto fail;
memcpy(cvt.buf,buf,len);
if(SDL_ConvertAudio(&cvt)) goto fail;
SDL_FreeWAV(buf);
ws->data=cvt.buf;
ws->len=cvt.len;
amplify_wave_sound(ws);
return;
fail:
//fprintf(stderr,"[Failed to convert wave audio at %ld (%ld bytes)]\n",offset,size);
SDL_FreeWAV(buf);
}
void init_sound(void) {
const char*v;
optionquery[1]=Q_audio;
optionquery[2]=Q_rate;
v=xrm_get_resource(resourcedb,optionquery,optionquery,3);
if(!v) return;
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
Uint8*buf=0;
ws->data=0;
ws->len=0;
l_fp=fp;
l_offset=offset;
l_size=size;
if(!SDL_LoadWAV_RW(&my_rwops,0,&src,&buf,&len)) {
if(main_options['v']) fprintf(stderr,"[Cannot load wave audio at %ld (%ld bytes): %s]\n",offset,size,SDL_GetError());
return;
}
memset(&cvt,0,sizeof(SDL_AudioCVT));
if(SDL_BuildAudioCVT(&cvt,src.format,src.channels,src.freq,spec.format,spec.channels,spec.freq)<0) goto fail;
cvt.buf=malloc(len*cvt.len_mult);
cvt.len=len;
if(!cvt.buf) goto fail;
memcpy(cvt.buf,buf,len);
if(SDL_ConvertAudio(&cvt)) goto fail;
SDL_FreeWAV(buf);
ws->data=cvt.buf;
ws->len=cvt.len;
amplify_wave_sound(ws);
return;
fail:
if(main_options['v']) fprintf(stderr,"[Failed to convert wave audio at %ld (%ld bytes)]\n",offset,size);
SDL_FreeWAV(buf);
}
static void load_sound_set(int is_user) {
const char*v;
char*nam;
FILE*fp;
Uint32 i,j;
if(is_user) {
if(main_options['z']) {
fp=composite_slice(".xclass",0);
if(!fp) return;
} else {
nam=sqlite3_mprintf("%s.xclass",basefilename);
if(!nam) return;
fp=fopen(nam,"r");
sqlite3_free(nam);
if(!fp) return;
}
} else {
optionquery[2]=Q_standardSounds;
v=xrm_get_resource(resourcedb,optionquery,optionquery,3);
if(!v) return;
fp=fopen(v,"r");
if(!fp) fatal("Cannot open standard sounds file (%m)\n");
nstandardsounds=50;
standardsounds=malloc(nstandardsounds*sizeof(WaveSoud));
if(!standardsounds) fatal("Allocation failed\n");
for(i=0;i<nstandardsounds;i++) standardsounds[i].data=0,standardsounds[i].len=0;
}
nam=malloc(256);
for(;;) {
for(i=0;;) {
if(i==255) goto done;
nam[i++]=j=fgetc(fp);
if(j==EOF) goto done;
if(!j) break;
}
i--;
j=fgetc(fp)<<16; j|=fgetc(fp)<<24; j|=fgetc(fp)<<0; j|=fgetc(fp)<<8;
l_offset=ftell(fp); l_size=j;
if(i>4 && nam[i-4]=='.' && nam[i-3]=='W' && nam[i-1]=='V' && (nam[i-2]=='A' || nam[i-2]=='Z')) {
nam[i-4]=0;
if(is_user) {
} else {
}
}
fseek(fp,l_offset+l_size,SEEK_CUR);
}
done:
fclose(fp);
free(nam);
}
void init_sound(void) {
const char*v;
optionquery[1]=Q_audio;
optionquery[2]=Q_rate;
v=xrm_get_resource(resourcedb,optionquery,optionquery,3);
if(!v) return;
|
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
optionquery[2]=Q_waveVolume;
if(v=xrm_get_resource(resourcedb,optionquery,optionquery,3)) {
needs_amplify=1;
wavevolume=strtod(v,0);
}
optionquery[2]=Q_mmlVolume;
if(v=xrm_get_resource(resourcedb,optionquery,optionquery,3)) mmlvolume=fmin(strtod(v,0)*32767.0,32767.0);
fprintf(stderr,"Done.\n");
wavesound=0;
SDL_PauseAudio(0);
sound_on=1;
}
void set_sound_effect(Value v1,Value v2) {
|
>
>
>
|
|
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
optionquery[2]=Q_waveVolume;
if(v=xrm_get_resource(resourcedb,optionquery,optionquery,3)) {
needs_amplify=1;
wavevolume=strtod(v,0);
}
optionquery[2]=Q_mmlVolume;
if(v=xrm_get_resource(resourcedb,optionquery,optionquery,3)) mmlvolume=fmin(strtod(v,0)*32767.0,32767.0);
if(wavevolume>0.00001) {
load_sound_set(0); // Standard sounds
load_sound_set(1); // User sounds
}
fprintf(stderr,"Done.\n");
wavesound=0;
SDL_PauseAudio(0);
sound_on=1;
}
void set_sound_effect(Value v1,Value v2) {
|