... | ... |
@@ -2608,23 +2608,20 @@ audio_handler(void *ctx, Uint8 *out_stream, int len) { |
2608 | 2608 |
|
2609 | 2609 |
for (int n = 0; n < N_CHANNELS; n++) { |
2610 | 2610 |
Uint8 device = (3 + n) << 4; |
2611 |
- // TODO: Make sure this works properly and evals to the audio stack |
|
2612 |
- // instead of the regular stack. |
|
2613 |
- // Uxn *u = (Uxn *)ctx; |
|
2614 |
- // Uint8 *addr = &u->dev[device]; |
|
2615 |
- // if (channel[n].duration <= 0 && PEEK2(addr)) { |
|
2616 |
- // uxn_eval(u, PEEK2(addr)); |
|
2617 |
- // } |
|
2618 |
- // printf("DEVICE: %x\n", device); |
|
2619 |
- // printf("ADDR: %x\n", PEEK2(addr)); |
|
2620 |
- if (channel[n].sample.data != 0) { |
|
2621 |
- channel[n].duration -= SOUND_TIMER; |
|
2611 |
+ Uxn *u = (Uxn *)ctx; |
|
2612 |
+ Uint8 *addr = &u->dev[device]; |
|
2613 |
+ if (channel[n].duration <= 0 && PEEK2(addr)) { |
|
2614 |
+ uxn_eval(u, PEEK2(addr)); |
|
2615 |
+ // printf("EVAL: %x\n", device); |
|
2616 |
+ // printf("ADDR: %x\n", PEEK2(addr)); |
|
2617 |
+ // printf("----\n"); |
|
2622 | 2618 |
} |
2619 |
+ channel[n].duration -= SOUND_TIMER; |
|
2623 | 2620 |
|
2624 | 2621 |
int x = 0; |
2625 | 2622 |
if (channel[n].xfade) { |
2626 | 2623 |
float delta = 1.0f / (XFADE_SAMPLES); |
2627 |
- while (x < XFADE_SAMPLES * 2) { |
|
2624 |
+ while (x < XFADE_SAMPLES * 2 && x < len / 2) { |
|
2628 | 2625 |
float alpha = x * delta; |
2629 | 2626 |
float beta = 1.0f - alpha; |
2630 | 2627 |
Sint16 next_a = next_a = next_sample(&channel[n].next_sample); |
... | ... |
@@ -15,8 +15,8 @@ typedef signed int Sint32; |
15 | 15 |
#define AUDIO_DEIMASK 0x0014 |
16 | 16 |
#define AUDIO_DEOMASK 0x8000 |
17 | 17 |
|
18 |
-#define AUDIO_BUFSIZE 256 |
|
19 |
-#define SAMPLE_FREQUENCY 44100 |
|
18 |
+#define AUDIO_BUFSIZE 256.0f |
|
19 |
+#define SAMPLE_FREQUENCY 44100.0f |
|
20 | 20 |
#define POLYPHONY 4 |
21 | 21 |
|
22 | 22 |
Uint8 audio_get_vu(int instance); |
... | ... |
@@ -103,7 +103,6 @@ audio_deo(int instance, Uint8 *d, Uint8 port, Uxn *u) |
103 | 103 |
SDL_LockAudioDevice(audio_id); |
104 | 104 |
audio_start(instance, d, u); |
105 | 105 |
SDL_UnlockAudioDevice(audio_id); |
106 |
- SDL_PauseAudioDevice(audio_id, 0); |
|
107 | 106 |
} |
108 | 107 |
} |
109 | 108 |
|
... | ... |
@@ -251,7 +250,7 @@ emu_redraw(Uxn *u) |
251 | 250 |
} |
252 | 251 |
|
253 | 252 |
static int |
254 |
-emu_init(void) |
|
253 |
+emu_init(Uxn *u) |
|
255 | 254 |
{ |
256 | 255 |
SDL_AudioSpec as; |
257 | 256 |
SDL_zero(as); |
... | ... |
@@ -260,7 +259,7 @@ emu_init(void) |
260 | 259 |
as.channels = 2; |
261 | 260 |
as.callback = audio_handler; |
262 | 261 |
as.samples = AUDIO_BUFSIZE; |
263 |
- as.userdata = NULL; |
|
262 |
+ as.userdata = u; |
|
264 | 263 |
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) |
265 | 264 |
return system_error("sdl", SDL_GetError()); |
266 | 265 |
|
... | ... |
@@ -280,6 +279,7 @@ emu_init(void) |
280 | 279 |
deadline_interval = ms_interval * TIMEOUT_MS; |
281 | 280 |
exec_deadline = SDL_GetPerformanceCounter() + deadline_interval; |
282 | 281 |
screen_resize(WIDTH, HEIGHT); |
282 |
+ SDL_PauseAudioDevice(audio_id, 0); |
|
283 | 283 |
return 1; |
284 | 284 |
} |
285 | 285 |
|
... | ... |
@@ -541,7 +541,11 @@ emu_end(Uxn *u) |
541 | 541 |
int |
542 | 542 |
main(int argc, char **argv) |
543 | 543 |
{ |
544 |
+ Uint8 dev[0x100] = {0}; |
|
544 | 545 |
Uxn u = {0}; |
546 |
+ u.dev = &dev; |
|
547 |
+ Uxn u_audio = {0}; |
|
548 |
+ u_audio.dev = &dev; |
|
545 | 549 |
int i = 1; |
546 | 550 |
if(i == argc) |
547 | 551 |
return system_error("usage", "uxnemu [-v] | uxnemu [-f | -2x | -3x | --] file.rom [args...]"); |
... | ... |
@@ -559,10 +563,16 @@ main(int argc, char **argv) |
559 | 563 |
} |
560 | 564 |
} |
561 | 565 |
/* Start system. */ |
562 |
- if(!emu_init()) |
|
563 |
- return system_error("Init", "Failed to initialize varvara."); |
|
564 |
- if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++])) |
|
566 |
+ Uint8 *ram = (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)); |
|
567 |
+ char *rom = argv[i++]; |
|
568 |
+ if(!system_init(&u, ram, rom)) { |
|
569 |
+ return system_error("Init", "Failed to initialize uxn."); |
|
570 |
+ } |
|
571 |
+ if(!system_init(&u_audio, ram, rom)) { |
|
565 | 572 |
return system_error("Init", "Failed to initialize uxn."); |
573 |
+ } |
|
574 |
+ if(!emu_init(&u_audio)) |
|
575 |
+ return system_error("Init", "Failed to initialize varvara."); |
|
566 | 576 |
/* Game Loop */ |
567 | 577 |
u.dev[0x17] = argc - i; |
568 | 578 |
if(uxn_eval(&u, PAGE_PROGRAM)) { |