From c79150b24aa7f3ab3b748754e34834c4376fac63 Mon Sep 17 00:00:00 2001 From: JailDoctor Date: Thu, 1 Dec 2022 19:42:20 +0100 Subject: [PATCH] - Types changed, SDL_Mixer version included --- jail_audio.cpp | 52 +++++++++------------ jail_audio.h | 23 ++++----- jail_audio_sdlmixer.cpp | 101 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 44 deletions(-) create mode 100644 jail_audio_sdlmixer.cpp diff --git a/jail_audio.cpp b/jail_audio.cpp index 3e80eaf..42907fe 100644 --- a/jail_audio.cpp +++ b/jail_audio.cpp @@ -1,3 +1,4 @@ +#ifndef JA_USESDLMIXER #include "jail_audio.h" #include "stb_vorbis.c" #include @@ -11,7 +12,7 @@ struct JA_Sound_t { }; struct JA_Channel_t { - JA_Sound sound; + JA_Sound_t *sound; int pos {0}; int times {0}; JA_Channel_state state { JA_CHANNEL_FREE }; @@ -25,25 +26,24 @@ struct JA_Music_t { JA_Music_state state {JA_MUSIC_INVALID}; }; -JA_Music current_music{NULL}; +JA_Music_t *current_music{NULL}; JA_Channel_t channels[JA_MAX_SIMULTANEOUS_CHANNELS]; int JA_freq {48000}; SDL_AudioFormat JA_format {AUDIO_S16}; Uint8 JA_channels {2}; -int JA_musicvolume = 128; -int JA_soundvolume = 64; +int JA_volume = 128; SDL_AudioDeviceID sdlAudioDevice = 0; void audioCallback(void * userdata, uint8_t * stream, int len) { SDL_memset(stream, 0, len); if (current_music != NULL && current_music->state == JA_MUSIC_PLAYING) { const int size = SDL_min(len, current_music->samples*2-current_music->pos); - SDL_MixAudioFormat(stream, (Uint8*)(current_music->output+current_music->pos), AUDIO_S16, size, JA_musicvolume); + SDL_MixAudioFormat(stream, (Uint8*)(current_music->output+current_music->pos), AUDIO_S16, size, JA_volume); current_music->pos += size/2; if (size < len) { if (current_music->times != 0) { - SDL_MixAudioFormat(stream+size, (Uint8*)current_music->output, AUDIO_S16, len-size, JA_musicvolume); + SDL_MixAudioFormat(stream+size, (Uint8*)current_music->output, AUDIO_S16, len-size, JA_volume); current_music->pos = (len-size)/2; if (current_music->times > 0) current_music->times--; } else { @@ -56,11 +56,11 @@ void audioCallback(void * userdata, uint8_t * stream, int len) { for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) { if (channels[i].state == JA_CHANNEL_PLAYING) { const int size = SDL_min(len, channels[i].sound->length - channels[i].pos); - SDL_MixAudioFormat(stream, channels[i].sound->buffer + channels[i].pos, AUDIO_S16, size, JA_soundvolume); + SDL_MixAudioFormat(stream, channels[i].sound->buffer + channels[i].pos, AUDIO_S16, size, JA_volume/2); channels[i].pos += size; if (size < len) { if (channels[i].times != 0) { - SDL_MixAudioFormat(stream + size, channels[i].sound->buffer, AUDIO_S16, len-size, JA_soundvolume); + SDL_MixAudioFormat(stream + size, channels[i].sound->buffer, AUDIO_S16, len-size, JA_volume/2); channels[i].pos = len-size; if (channels[i].times > 0) channels[i].times--; } else { @@ -87,7 +87,7 @@ void JA_Quit() { sdlAudioDevice = 0; } -JA_Music JA_LoadMusic(const char* filename) { +JA_Music_t *JA_LoadMusic(const char* filename) { int chan, samplerate; // [RZC 28/08/22] Carreguem primer el arxiu en memòria i després el descomprimim. Es algo més rapid. @@ -99,7 +99,7 @@ JA_Music JA_LoadMusic(const char* filename) { if (fread(buffer, fsize, 1, f)!=1) return NULL; fclose(f); - JA_Music music = new JA_Music_t(); + JA_Music_t *music = new JA_Music_t(); music->samples = stb_vorbis_decode_memory(buffer, fsize, &chan, &samplerate, &music->output); free(buffer); @@ -122,7 +122,7 @@ JA_Music JA_LoadMusic(const char* filename) { return music; } -void JA_PlayMusic(JA_Music music, const int loop) { +void JA_PlayMusic(JA_Music_t *music, const int loop) { if (current_music != NULL) { current_music->pos = 0; current_music->state = JA_MUSIC_STOPPED; @@ -154,21 +154,21 @@ JA_Music_state JA_GetMusicState() { return current_music->state; } -void JA_DeleteMusic(JA_Music music) { +void JA_DeleteMusic(JA_Music_t *music) { if (current_music == music) current_music = NULL; free(music->output); delete music; } -JA_Sound JA_NewSound(Uint8* buffer, Uint32 length) { - JA_Sound sound = new JA_Sound_t(); +JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length) { + JA_Sound_t *sound = new JA_Sound_t(); sound->buffer = buffer; sound->length = length; return sound; } -JA_Sound JA_LoadSound(const char* filename) { - JA_Sound sound = new JA_Sound_t(); +JA_Sound_t *JA_LoadSound(const char* filename) { + JA_Sound_t *sound = new JA_Sound_t(); SDL_AudioSpec wavSpec; SDL_LoadWAV(filename, &wavSpec, &sound->buffer, &sound->length); @@ -185,7 +185,7 @@ JA_Sound JA_LoadSound(const char* filename) { return sound; } -int JA_PlaySound(JA_Sound sound, const int loop) { +int JA_PlaySound(JA_Sound_t *sound, const int loop) { int channel = 0; while (channel < JA_MAX_SIMULTANEOUS_CHANNELS && channels[channel].state != JA_CHANNEL_FREE) { channel++; } if (channel == JA_MAX_SIMULTANEOUS_CHANNELS) channel = 0; @@ -197,7 +197,7 @@ int JA_PlaySound(JA_Sound sound, const int loop) { return channel; } -void JA_DeleteSound(JA_Sound sound) { +void JA_DeleteSound(JA_Sound_t *sound) { for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) { if (channels[i].sound == sound) JA_StopChannel(i); } @@ -244,18 +244,8 @@ JA_Channel_state JA_GetChannelState(const int channel) { return channels[channel].state; } -int JA_SetSoundVolume(int volume) { - JA_soundvolume = volume > 128 ? 128 : volume < 0 ? 0 : volume; - return JA_soundvolume; -} - -int JA_SetMusicVolume(int volume) { - JA_musicvolume = volume > 128 ? 128 : volume < 0 ? 0 : volume; - return JA_musicvolume; -} - int JA_SetVolume(int volume) { - JA_musicvolume = volume > 128 ? 128 : volume < 0 ? 0 : volume; - JA_soundvolume = JA_musicvolume/2; - return JA_musicvolume; + JA_volume = volume > 128 ? 128 : volume < 0 ? 0 : volume; + return JA_volume; } +#endif \ No newline at end of file diff --git a/jail_audio.h b/jail_audio.h index c4e115a..4c4d7f9 100644 --- a/jail_audio.h +++ b/jail_audio.h @@ -4,30 +4,27 @@ enum JA_Channel_state { JA_CHANNEL_INVALID, JA_CHANNEL_FREE, JA_CHANNEL_PLAYING, JA_CHANNEL_PAUSED }; enum JA_Music_state { JA_MUSIC_INVALID, JA_MUSIC_PLAYING, JA_MUSIC_PAUSED, JA_MUSIC_STOPPED }; -typedef struct JA_Sound_t *JA_Sound; -typedef struct JA_Music_t *JA_Music; +struct JA_Sound_t; +struct JA_Music_t; void JA_Init(const int freq, const SDL_AudioFormat format, const int channels); void JA_Quit(); -JA_Music JA_LoadMusic(const char* filename); -void JA_PlayMusic(JA_Music music, const int loop = -1); +JA_Music_t *JA_LoadMusic(const char* filename); +void JA_PlayMusic(JA_Music_t *music, const int loop = -1); void JA_PauseMusic(); void JA_ResumeMusic(); void JA_StopMusic(); -int JA_SetVolume(int volume); -int JA_SetMusicVolume(int volume); JA_Music_state JA_GetMusicState(); -void JA_DeleteMusic(JA_Music music); - -JA_Sound JA_NewSound(Uint8* buffer, Uint32 length); -JA_Sound JA_LoadSound(const char* filename); -int JA_PlaySound(JA_Sound sound, const int loop = 0); -void JA_DeleteSound(JA_Sound sound); -int JA_SetSoundVolume(int volume); +void JA_DeleteMusic(JA_Music_t *music); +JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length); +JA_Sound_t *JA_LoadSound(const char* filename); +int JA_PlaySound(JA_Sound_t *sound, const int loop = 0); void JA_PauseChannel(const int channel); void JA_ResumeChannel(const int channel); void JA_StopChannel(const int channel); JA_Channel_state JA_GetChannelState(const int channel); +void JA_DeleteSound(JA_Sound_t *sound); +int JA_SetVolume(int volume); \ No newline at end of file diff --git a/jail_audio_sdlmixer.cpp b/jail_audio_sdlmixer.cpp new file mode 100644 index 0000000..ddb6b61 --- /dev/null +++ b/jail_audio_sdlmixer.cpp @@ -0,0 +1,101 @@ +#ifdef JA_USESDLMIXER +#include "jail_audio.h" +#include +#include +#include + +struct JA_Sound_t {}; // Dummy structs +struct JA_Music_t {}; + +int JA_freq {48000}; +SDL_AudioFormat JA_format {AUDIO_S16}; +Uint8 JA_channels {2}; + +void JA_Init(const int freq, const SDL_AudioFormat format, const int channels) { + JA_freq = freq; + JA_format = format; + JA_channels = channels; + Mix_OpenAudio(JA_freq, JA_format, JA_channels, 1024); +} + +void JA_Quit() { + Mix_CloseAudio(); +} + +JA_Music_t *JA_LoadMusic(const char* filename) { + return (JA_Music_t*)Mix_LoadMUS(filename); +} + +void JA_PlayMusic(JA_Music_t *music, const int loop) { + Mix_PlayMusic((Mix_Music*)music, loop); +} + +void JA_PauseMusic() { + Mix_PauseMusic(); +} + +void JA_ResumeMusic() { + Mix_ResumeMusic(); +} + +void JA_StopMusic() { + Mix_HaltMusic(); +} + +JA_Music_state JA_GetMusicState() { + if (Mix_PausedMusic()) { + return JA_MUSIC_PAUSED; + } else if (Mix_PlayingMusic()) { + return JA_MUSIC_PLAYING; + } else { + return JA_MUSIC_STOPPED; + } +} + +void JA_DeleteMusic(JA_Music_t *music) { + Mix_FreeMusic((Mix_Music*)music); +} + +JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length) { + return NULL; +} + +JA_Sound_t *JA_LoadSound(const char* filename) { + JA_Sound_t *sound = (JA_Sound_t*)Mix_LoadWAV(filename); + return sound; +} + +int JA_PlaySound(JA_Sound_t *sound, const int loop) { + return Mix_PlayChannel(-1, (Mix_Chunk*)sound, loop); +} + +void JA_DeleteSound(JA_Sound_t *sound) { + Mix_FreeChunk((Mix_Chunk*)sound); +} + +void JA_PauseChannel(const int channel) { + Mix_Pause(channel); +} + +void JA_ResumeChannel(const int channel) { + Mix_Resume(channel); +} + +void JA_StopChannel(const int channel) { + Mix_HaltChannel(channel); +} + +JA_Channel_state JA_GetChannelState(const int channel) { + if (Mix_Paused(channel)) { + return JA_CHANNEL_PAUSED; + } else if (Mix_Playing(channel)) { + return JA_CHANNEL_PLAYING; + } else { + return JA_CHANNEL_FREE; + } +} + +int JA_SetVolume(int volume) { + return Mix_Volume(-1, volume); +} +#endif