X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=tests%2Fsoundtest.c;h=5540624ad564da77b58481b81af23cbdb9cbe6a0;hb=44de8692debacd87df92aa04f88941336a894ce3;hp=a4aae14f3b7f102b8977a8bdaeccea91377de1c7;hpb=0a6b83f80b277780a2c23aaa9c2c433a234f16b3;p=projects%2Fchimara%2Fchimara.git diff --git a/tests/soundtest.c b/tests/soundtest.c index a4aae14..5540624 100644 --- a/tests/soundtest.c +++ b/tests/soundtest.c @@ -1,41 +1,139 @@ #include #include #include +#include + +#define NUM_CHANNELS 2 void glk_main(void) { - if(!glk_gestalt(gestalt_Sound, 0)) { + if(!glk_gestalt(gestalt_Sound2, 0)) { fprintf(stderr, "Sound not supported.\n"); return; } - if(!glk_gestalt(gestalt_SoundVolume, 0)) { - fprintf(stderr, "Sound volume not supported.\n"); - return; - } - schanid_t sc = glk_schannel_create(0); - if(!sc) { - fprintf(stderr, "Could not create sound channel.\n"); - return; + schanid_t sc[NUM_CHANNELS]; + int count; + for(count = 0; count < NUM_CHANNELS; count++) { + sc[count] = glk_schannel_create(count); + if(!sc[count]) { + fprintf(stderr, "Could not create sound channel number %d.\n", count); + return; + } } - if(!glk_schannel_play(sc, 0)) { /* resource number doesn't matter right now */ - fprintf(stderr, "Could not start sound channel.\n"); - return; + /* Open the main window. */ + winid_t mainwin = glk_window_open(0, 0, 0, wintype_TextBuffer, 1); + if (!mainwin) { + /* It's possible that the main window failed to open. There's + nothing we can do without it, so exit. */ + return; + } + glk_set_window(mainwin); + glk_put_string("Copy a sound file to the current directory and rename it " + "to SND3. Supported formats: AIFF, OGG, MOD, S3M, IT, XM. Type 'play' " + "to play it.\n\n" + "If you want to test multi-sound playing, copy another sound file and " + "rename it to SND4 as well. You can't stop it, so make it a short " + "sound effect.\n"); + + char buffer[1024]; + int len; + int finish = 0; + int repeat = 1; + int ramp = 0; + + event_t ev; + while(!finish) { + glk_put_string("\nprompt> "); + glk_request_line_event(mainwin, buffer, 1024, 0); + glk_select(&ev); + printf("Received event:\n"); + printf("Type: %d\n", ev.type); + printf("Win: "); + if(ev.win) + printf( "%d\n", glk_window_get_rock(ev.win) ); + else + printf("NULL\n"); + printf("Var1: %d\n", ev.val1); + printf("Var2: %d\n", ev.val2); + switch(ev.type) { + case evtype_LineInput: + // Null-terminate string + len = ev.val1; + buffer[len] = '\0'; + + if(strcmp(buffer, "quit") == 0) { + glk_put_string("That's all, folks.\n"); + finish = 1; + } else if(strcmp(buffer, "play") == 0) { + glk_put_string("Playing sound.\n"); + if(!glk_schannel_play_ext(sc[0], 3, repeat, 1)) { + fprintf(stderr, "Could not start sound channel.\n"); + finish = 1; + } + } else if(strcmp(buffer, "stop") == 0) { + glk_put_string("Stopping sound.\n"); + glk_schannel_stop(sc[0]); + } else if(strcmp(buffer, "repeat") == 0) { + glk_put_string("Setting repeat to "); + if(repeat == 1) { + glk_put_string("TWICE.\n"); + repeat = 2; + } else if(repeat == 2) { + glk_put_string("INFINITE.\n"); + repeat = -1; + } else if(repeat == -1) { + glk_put_string("DON'T PLAY.\n"); + repeat = 0; + } else if(repeat == 0) { + glk_put_string("ONCE.\n"); + repeat = 1; + } + } else if(strcmp(buffer, "pause") == 0) { + glk_put_string("Pausing channel.\n"); + glk_schannel_pause(sc[0]); + } else if(strcmp(buffer, "unpause") == 0) { + glk_put_string("Unpausing channel.\n"); + glk_schannel_unpause(sc[0]); + } else if(strcmp(buffer, "ramp") == 0) { + glk_put_string("Ramping volume to "); + if(ramp == 0) { + glk_put_string("HALF.\n"); + glk_schannel_set_volume_ext(sc[0], 0x8000, 3000, 42); + ramp = 1; + } else if(ramp == 1) { + glk_put_string("FULL.\n"); + glk_schannel_set_volume_ext(sc[0], 0x10000, 3000, 69); + ramp = 0; + } + } else if(strcmp(buffer, "multi") == 0) { + glk_put_string("Playing two sounds. (These will not repeat.)\n"); + glui32 sounds[NUM_CHANNELS] = { 3, 4 }; + if(glk_schannel_play_multi(sc, NUM_CHANNELS, sounds, NUM_CHANNELS, 1) < 2) { + fprintf(stderr, "Tried to start %d sounds, but not all were successful.", NUM_CHANNELS); + finish = 1; + } + } else if(strcmp(buffer, "help") == 0) { + glk_put_string("Type PLAY or MULTI or REPEAT or PAUSE or UNPAUSE or RAMP or STOP or QUIT.\n"); + } + break; + case evtype_SoundNotify: + glk_cancel_line_event(mainwin, NULL); + glk_put_string("\nGot sound notify event!\n"); + break; + case evtype_VolumeNotify: + glk_cancel_line_event(mainwin, NULL); + glk_put_string("\nGot volume notify event!\n"); + break; + default: + ; + } } - - glk_schannel_set_volume(sc, 0x10000); - sleep(1); - glk_schannel_set_volume(sc, 0x08000); - sleep(1); - glk_schannel_set_volume(sc, 0x04000); - sleep(1); - glk_schannel_set_volume(sc, 0x00000); - glk_schannel_set_volume(sc, 0xA0000); /* max supported volume */ - glk_schannel_set_volume(sc, 0xB0000); /* should be coerced */ - glk_schannel_set_volume(sc, 0x10000); - glk_schannel_stop(sc); - glk_schannel_destroy(sc); + for(count = 0; count < NUM_CHANNELS; count++) { + glk_schannel_stop(sc[count]); + glk_schannel_destroy(sc[count]); + } }