Ok, I have a "sound server" written in SDL, heres its code:
sndserv.h:
ok heres how a simple example works:Code:#include <SDL/SDL.h> #include <stdio.h> #include <stdlib.h> #define null NULL #define MAX_PLAYING_SOUNDS 10 #define VOLUME_PER_SOUND SDL_MIX_MAXVOLUME / 2 //Desired Audio Specs #define FREQUENCY 44100; #define FORMAT AUDIO_S16 #define SAMPLES 4096 #define CHANNELS 2 #define CALLBACK AudioCallback #define USERDATA NULL static SDL_AudioSpec desired, obtained; typedef struct Sound_s { Uint8 *samples; Uint32 length; } Sound, *Sound_p; typedef struct playing_s { int active; Sound_p sound; Uint32 position; } playing_t, *playing_p; static playing_t playing[MAX_PLAYING_SOUNDS]; void AudioCallback(void *user_data, Uint8 *audio, int length){ int i; memset(audio, 0, length); for (i = 0; i < MAX_PLAYING_SOUNDS; i++){ if (playing[i].active){ Uint8 *sound_buf; Uint32 sound_len; sound_buf = playing[i].sound->samples; sound_buf += playing[i].position; if ((playing[i].position + length) > playing[i].sound->length){ sound_len = playing[i].sound->length - playing[i].position; } else { sound_len = length; } SDL_MixAudio(audio, sound_buf, sound_len, VOLUME_PER_SOUND); playing[i].position += length; if (playing[i].position >= playing[i].sound->length){ playing[i].active = 0; } } } } int LoadSound(char *filename, Sound_p sound){ SDL_AudioSpec *spec = &obtained; SDL_AudioCVT cvt; SDL_AudioSpec loaded; Uint8 *new_buf; if (SDL_LoadWAV(filename, &loaded, &sound->samples, &sound->length) == null){ printf("Unable to load sound: %s\n", SDL_GetError()); return 1; } if (SDL_BuildAudioCVT(&cvt, loaded.format, loaded.channels, loaded.freq, spec->format, spec->channels, spec->freq) < 0){ printf("Unable to convert sound: %s\n", SDL_GetError()); return 1; } cvt.len = sound->length; new_buf = (Uint8 *)malloc(cvt.len * cvt.len_mult); if (new_buf == null){ printf("Out of memory!\n"); SDL_FreeWAV(sound->samples); return 1; } memcpy(new_buf, sound->samples, sound->length); cvt.buf = new_buf; if (SDL_ConvertAudio(&cvt) < 0){ printf("Audio conversion error:%s\n", SDL_GetError()); free(new_buf); SDL_FreeWAV(sound->samples); return 1; } SDL_FreeWAV(sound->samples); sound->samples = new_buf; sound->length = sound->length * cvt.len_mult; printf("%s was loaded and converted successfully.\n", filename); return 0; } void ClearPlayingSounds(void){ int i; for (i = 0; i < MAX_PLAYING_SOUNDS; i++){ playing[i].active = 0; } } int PlaySound(Sound_p sound){ int i; for (i = 0; i < MAX_PLAYING_SOUNDS; i++){ if (playing[i].active == 0){ break; } } if (i == MAX_PLAYING_SOUNDS){ return 1; } SDL_LockAudio(); playing[i].active = 1; playing[i].sound = sound; playing[i].position = 0; SDL_UnlockAudio(); return 0; } int sndserv_init(){ desired.freq = FREQUENCY; desired.format = FORMAT; desired.samples = SAMPLES; desired.channels = CHANNELS; desired.callback = CALLBACK; desired.userdata = USERDATA; if (SDL_OpenAudio(&desired, &obtained) < 0){ printf("Unable to open Audio Device"); return 1; } atexit(SDL_CloseAudio); ClearPlayingSounds(); SDL_PauseAudio(0); } int sndserv_end(){ SDL_PauseAudio(1); SDL_LockAudio(); } int FreeSound(Sound_p snd){ SDL_LockAudio(); free(snd->samples); SDL_UnlockAudio(); }
sndtest.c:
As you can see you load sounds with LoadSoundCode:#include <SDL/SDL.h> #include "sndserv.h" int main(int argc, char *argv[]){ Sound explosion; SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); atexit(SDL_Quit); sndserv_init(); LoadSound("sound/explosion.wav", &explosion); PlaySound(&explosion); SDL_Delay(5000); sndserv_end(); FreeSound(&explosion); return 0; }
How could I modify the function so that LoadSound works like this:
explosion = LoadSound("sound/explosion.wav");
Any help would be greatly appreaciated.



LinkBack URL
About LinkBacks


