... | ... |
@@ -49,7 +49,7 @@ apu_render(Apu *c, Sint16 *sample, Sint16 *end) |
49 | 49 |
if(c->i >= c->len) { |
50 | 50 |
if(!c->repeat) { |
51 | 51 |
c->advance = 0; |
52 |
- return 1; |
|
52 |
+ break; |
|
53 | 53 |
} |
54 | 54 |
c->i %= c->len; |
55 | 55 |
} |
... | ... |
@@ -57,6 +57,7 @@ apu_render(Apu *c, Sint16 *sample, Sint16 *end) |
57 | 57 |
*sample++ += s * c->volume[0] / 0x180; |
58 | 58 |
*sample++ += s * c->volume[1] / 0x180; |
59 | 59 |
} |
60 |
+ if(!c->advance) apu_finished_handler(c); |
|
60 | 61 |
return 1; |
61 | 62 |
} |
62 | 63 |
|
... | ... |
@@ -32,7 +32,7 @@ static SDL_Rect gRect; |
32 | 32 |
static Ppu ppu; |
33 | 33 |
static Apu apu[POLYPHONY]; |
34 | 34 |
static Device *devsystem, *devscreen, *devmouse, *devctrl, *devaudio0, *devconsole; |
35 |
-static Uint32 stdin_event; |
|
35 |
+static Uint32 stdin_event, audio0_event; |
|
36 | 36 |
|
37 | 37 |
static Uint8 zoom = 1, reqdraw = 0; |
38 | 38 |
|
... | ... |
@@ -410,6 +410,14 @@ nil_talk(Device *d, Uint8 b0, Uint8 w) |
410 | 410 |
|
411 | 411 |
#pragma mark - Generics |
412 | 412 |
|
413 |
+void |
|
414 |
+apu_finished_handler(Apu *c) |
|
415 |
+{ |
|
416 |
+ SDL_Event event; |
|
417 |
+ event.type = audio0_event + (c - apu); |
|
418 |
+ SDL_PushEvent(&event); |
|
419 |
+} |
|
420 |
+ |
|
413 | 421 |
static int |
414 | 422 |
stdin_handler(void *p) |
415 | 423 |
{ |
... | ... |
@@ -474,6 +482,8 @@ run(Uxn *u) |
474 | 482 |
if(event.type == stdin_event) { |
475 | 483 |
devconsole->dat[0x2] = event.cbutton.button; |
476 | 484 |
uxn_eval(u, mempeek16(devconsole->dat, 0)); |
485 |
+ } else if(event.type >= audio0_event && event.type < audio0_event + POLYPHONY) { |
|
486 |
+ uxn_eval(u, mempeek16((devaudio0 + (event.type - audio0_event))->dat, 0)); |
|
477 | 487 |
} |
478 | 488 |
} |
479 | 489 |
} |
... | ... |
@@ -504,6 +514,7 @@ main(int argc, char **argv) |
504 | 514 |
Uxn u; |
505 | 515 |
|
506 | 516 |
stdin_event = SDL_RegisterEvents(1); |
517 |
+ audio0_event = SDL_RegisterEvents(POLYPHONY); |
|
507 | 518 |
SDL_CreateThread(stdin_handler, "stdin", NULL); |
508 | 519 |
|
509 | 520 |
if(argc < 2) |