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/main.c | |
| parent | c558df240bce1e623522bc5b3d84ad9120b1d070 (diff) | |
| download | powder-5383311cbabf123f2bdeff21d6b0bff5a730000c.zip powder-5383311cbabf123f2bdeff21d6b0bff5a730000c.tar.gz | |
testing playing .wav files. lol sounds
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 88 |
1 files changed, 85 insertions, 3 deletions
@@ -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); |
