X-Git-Url: https://deadsoftware.ru/gitweb?p=flatwaifu.git;a=blobdiff_plain;f=src%2Fopenal%2Fsound.c;h=f4f07b9b6e91112d15b1b154dad7e8b4bcfa4df3;hp=af75aa381eeef080d04619e3f3a3cd4d2ce0888a;hb=14813cefff1cc036bf217346188c168429b52e81;hpb=7e3cef6902ee44ffebb5319fdcf720cb4ef7a1f3 diff --git a/src/openal/sound.c b/src/openal/sound.c index af75aa3..f4f07b9 100644 --- a/src/openal/sound.c +++ b/src/openal/sound.c @@ -6,9 +6,15 @@ #include "misc.h" // int2host #include "error.h" // logo -#include -#include -#include // SDL_BuildAudioCVT SDL_ConvertAudio +#ifdef __APPLE__ +# include +# include +#else +# include +# include +#endif + +#include "SDL.h" // SDL_BuildAudioCVT SDL_ConvertAudio #include #include // malloc #include // memcpy @@ -35,11 +41,7 @@ typedef struct openal_channel { ALuint source; } openal_channel; -short snd_vol; -short mus_vol; -char music_random; -int music_time; -int music_fade; +static short snd_vol; static ALCdevice *device; static ALCcontext *context; @@ -47,40 +49,92 @@ static ALuint sources[MAX_CHANNELS]; /* Music */ -void S_initmusic (void) { +const cfg_t *MUS_args (void) { + return NULL; +} + +const cfg_t *MUS_conf (void) { + return NULL; +} +const menu_t *MUS_menu (void) { + return NULL; } -void S_donemusic (void) { +void MUS_init (void) { } -void S_startmusic (int time) { +void MUS_done (void) { } -void S_stopmusic (void) { +void MUS_start (int time) { } -void S_volumemusic (int v) { +void MUS_stop (void) { } -void F_loadmus (char n[8]) { +void MUS_volume (int v) { } -void F_freemus (void) { +void MUS_load (char n[8]) { } -void S_updatemusic (void) { +void MUS_free (void) { + +} + +void MUS_update (void) { } /* Sound */ +static int sound_menu_handler (menu_msg_t *msg, const menu_t *m, void *data, int i) { + static int cur; + enum { VOLUME, __NUM__ }; + static const simple_menu_t sm = { + GM_BIG, "Sound", NULL, + { + { "Volume", NULL }, + } + }; + if (i == VOLUME) { + switch (msg->type) { + case GM_GETENTRY: return GM_init_int0(msg, GM_SCROLLER, 0, 0, 0); + case GM_GETINT: return GM_init_int(msg, snd_vol, 0, 128, 8); + case GM_SETINT: S_volume(msg->integer.i); return 1; + } + } + return simple_menu_handler(msg, i, __NUM__, &sm, &cur); +} + +const menu_t *S_menu (void) { + static const menu_t m = { sound_menu_handler }; + return &m; +} + +const cfg_t *S_args (void) { + static const cfg_t args[] = { + { "sndvol", &snd_vol, Y_WORD }, + { NULL, NULL, 0 } + }; + return args; +} + +const cfg_t *S_conf (void) { + static const cfg_t conf[] = { + { "sound_volume", &snd_vol, Y_WORD }, + { NULL, NULL, 0 } + }; + return conf; +} + static void convert_this_ext (Uint32 src_format, int src_chan, int src_rate, Uint32 dst_format, int dst_chan, int dst_rate, const void *buf, int len, void **maxbuf, int *maxlen) { SDL_AudioCVT cvt; *maxlen = 0; @@ -103,7 +157,7 @@ static void convert_this_ext (Uint32 src_format, int src_chan, int src_rate, Uin } } -static openal_snd *new_openal_snd (const void *data, dword len, dword rate, dword lstart, dword llen) { +static openal_snd *new_openal_snd (const void *data, dword len, dword rate, dword lstart, dword llen, int sign) { assert(data); ALuint buffer = 0; openal_snd *snd = NULL; @@ -111,7 +165,7 @@ static openal_snd *new_openal_snd (const void *data, dword len, dword rate, dwor int newlen = 0; // for some reason 8bit formats makes psshshshsh // TODO do this without SDL - convert_this_ext(AUDIO_S8, 1, rate, AUDIO_S16SYS, 1, rate, data, len, &newdata, &newlen); + convert_this_ext(sign ? AUDIO_S8 : AUDIO_U8, 1, rate, AUDIO_S16SYS, 1, rate, data, len, &newdata, &newlen); if (newdata != NULL) { alGenBuffers(1, &buffer); if (alGetError() == AL_NO_ERROR) { @@ -135,30 +189,35 @@ static openal_snd *new_openal_snd (const void *data, dword len, dword rate, dwor } snd_t *S_get (int id) { + void *handle; openal_snd *snd = NULL; - void *handle = M_lock(id); - if (context != NULL && handle != NULL) { - byte *data = handle; - dword len = F_getreslen(id); - dword rate = 8000; - dword lstart = 0; - dword llen = 0; - if (len > 16) { - dmi *hdr = handle; - dword hdr_len = int2host(hdr->len); - dword hdr_rate = int2host(hdr->rate); - dword hdr_lstart = int2host(hdr->lstart); - dword hdr_llen = int2host(hdr->llen); - if (hdr_len <= len - 8 && hdr_lstart + hdr_llen <= len - 16) { - data = hdr->data; - len = hdr_len; - rate = hdr_rate; - lstart = hdr_lstart; - llen = hdr_llen; + if (context != NULL) { + handle = M_lock(id); + if (handle != NULL) { + void *data = handle; + dword len = F_getreslen(id); + dword rate = 11025; + dword lstart = 0; + dword llen = 0; + int sign = 0; + if (len > 16) { + dmi *hdr = handle; + dword hdr_len = int2host(hdr->len); + dword hdr_rate = int2host(hdr->rate); + dword hdr_lstart = int2host(hdr->lstart); + dword hdr_llen = int2host(hdr->llen); + if (hdr_len <= len - 8 && hdr_lstart + hdr_llen <= len - 16) { + data = hdr->data; + len = hdr_len; + rate = hdr_rate; + lstart = hdr_lstart; + llen = hdr_llen; + sign = 1; + } } + snd = new_openal_snd(data, len, rate, lstart, llen, sign); + M_unlock(handle); } - snd = new_openal_snd(data, len, rate, lstart, llen); - M_unlock(handle); } return (snd_t*)snd; } @@ -167,6 +226,28 @@ snd_t *S_load (const char name[8]) { return S_get(F_findres(name)); } +void S_free (snd_t *s) { + int i; + ALint h; + openal_snd *snd = (openal_snd*)s; + if (snd != NULL) { + assert(snd->base.tag == TAG_OAL1); + if (context != NULL) { + for (i = 0; i < MAX_CHANNELS; i++) { + alGetSourcei(sources[i], AL_BUFFER, &h); + if (h == snd->buffer) { + alSourceStop(sources[i]); + alSourcei(sources[i], AL_BUFFER, 0); + } + } + alDeleteBuffers(1, &snd->buffer); + assert(alGetError() == AL_NO_ERROR); + } + snd->base.tag = 0; + free(s); + } +} + void S_init (void) { assert(device == NULL && context == NULL); const ALCint attrs[] = {ALC_MONO_SOURCES, MAX_CHANNELS, 0};