diff options
| author | Cracker64 <cracker642@gmail.com> | 2011-02-02 01:35:41 (GMT) |
|---|---|---|
| committer | Cracker64 <cracker642@gmail.com> | 2011-02-02 01:35:41 (GMT) |
| commit | 5383311cbabf123f2bdeff21d6b0bff5a730000c (patch) | |
| tree | a5a166d486ae89e771e65a98fa77a68af842d668 /src | |
| parent | c558df240bce1e623522bc5b3d84ad9120b1d070 (diff) | |
| download | powder-5383311cbabf123f2bdeff21d6b0bff5a730000c.zip powder-5383311cbabf123f2bdeff21d6b0bff5a730000c.tar.gz | |
testing playing .wav files. lol sounds
Diffstat (limited to 'src')
| -rw-r--r-- | src/interface.c | 3 | ||||
| -rw-r--r-- | src/main.c | 88 |
2 files changed, 87 insertions, 4 deletions
diff --git a/src/interface.c b/src/interface.c index 5940e6e..2989571 100644 --- a/src/interface.c +++ b/src/interface.c @@ -3866,7 +3866,7 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show clearrect(vid_buf, 0, 0, XRES+BARSIZE, 220);//anyway to make it transparent? draw_line(vid_buf, 1, 219, XRES, 219, 228, 228, 228, XRES+BARSIZE); drawtext(vid_buf, 100, 15, "Welcome to The Powder Toy console v.2 (by cracker64)\n" - "Current commands are quit, set, reset, load, create, file, kill\n" + "Current commands are quit, set, reset, load, create, file, kill, sound\n" "You can set type, temp, ctype, life, x, y, vx, vy using this format ('set life particle# 9001')\n" "You can also use 'all' instead of a particle number to do it to everything.\n" "You can now use particle names (ex. set type all deut)\n" @@ -3875,6 +3875,7 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show "Create particles with 'create deut x,y' where x and y are the coords\n" "Run scripts from file 'file filename'\n" "You can delete/kill a particle with 'kill x,y'" + "Play a sound with (sound blah.wav)" ,255, 187, 187, 255); cc = 0; @@ -28,6 +28,7 @@ #include <string.h> #include <math.h> #include <SDL/SDL.h> +#include <SDL/SDL_audio.h> #include <bzlib.h> #include <time.h> @@ -51,6 +52,69 @@ #include <air.h> #include <icon.h> +#define NUM_SOUNDS 2 +struct sample { + Uint8 *data; + Uint32 dpos; + Uint32 dlen; +} sounds[NUM_SOUNDS]; + +void mixaudio(void *unused, Uint8 *stream, int len) +{ + int i; + Uint32 amount; + + for ( i=0; i<NUM_SOUNDS; ++i ) { + amount = (sounds[i].dlen-sounds[i].dpos); + if ( amount > len ) { + amount = len; + } + SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME); + sounds[i].dpos += amount; + } +} + +void PlaySound(char *file) +{ + int index; + SDL_AudioSpec wave; + Uint8 *data; + Uint32 dlen; + SDL_AudioCVT cvt; + + /* Look for an empty (or finished) sound slot */ + for ( index=0; index<NUM_SOUNDS; ++index ) { + if ( sounds[index].dpos == sounds[index].dlen ) { + break; + } + } + if ( index == NUM_SOUNDS ) + return; + + /* Load the sound file and convert it to 16-bit stereo at 22kHz */ + if ( SDL_LoadWAV(file, &wave, &data, &dlen) == NULL ) { + fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError()); + return; + } + SDL_BuildAudioCVT(&cvt, wave.format, wave.channels, wave.freq, + AUDIO_S16, 2, 22050); + cvt.buf = malloc(dlen*cvt.len_mult); + memcpy(cvt.buf, data, dlen); + cvt.len = dlen; + SDL_ConvertAudio(&cvt); + SDL_FreeWAV(data); + + /* Put the sound data in the slot (it starts playing immediately) */ + if ( sounds[index].data ) { + free(sounds[index].data); + } + SDL_LockAudio(); + sounds[index].data = cvt.buf; + sounds[index].dlen = cvt.len_cvt; + sounds[index].dpos = 0; + SDL_UnlockAudio(); +} + static const char *it_msg = "\brThe Powder Toy - http://powdertoy.co.uk/\n" "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" @@ -1135,7 +1199,22 @@ int main(int argc, char *argv[]) pixel *load_img=NULL;//, *fbi_img=NULL; int save_mode=0, save_x=0, save_y=0, save_w=0, save_h=0, copy_mode=0; GSPEED = 1; - + + SDL_AudioSpec fmt; + /* Set 16-bit stereo audio at 22Khz */ + fmt.freq = 22050; + fmt.format = AUDIO_S16; + fmt.channels = 2; + fmt.samples = 512; + fmt.callback = mixaudio; + fmt.userdata = NULL; + /* Open the audio device and start playing sound! */ + if ( SDL_OpenAudio(&fmt, NULL) < 0 ) + { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + exit(1); + } + SDL_PauseAudio(0); #ifdef MT numCores = core_count(); #endif @@ -2303,7 +2382,6 @@ int main(int argc, char *argv[]) cb_bmap[cby][cbx] = bmap[cby][cbx]; cb_emap[cby][cbx] = emap[cby][cbx]; } - create_parts(x, y, bsx, bsy, c); lx = x; ly = y; @@ -2547,7 +2625,7 @@ int main(int argc, char *argv[]) } } - + SDL_CloseAudio(); http_done(); return 0; } @@ -2595,6 +2673,10 @@ char *console5; else sprintf(console_error, "%s does not exist", console3); } + else if(strcmp(console2, "sound")==0 && console3) + { + PlaySound(console3); + } else if(strcmp(console2, "load")==0 && console3) { j = atoi(console3); |
