141 lines
2.7 KiB
C
141 lines
2.7 KiB
C
#include "audio.h"
|
|
#include "libft.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
t_audio *audio_init(void)
|
|
{
|
|
t_audio *audio;
|
|
ma_engine_config config;
|
|
|
|
audio = (t_audio *)malloc(sizeof(t_audio));
|
|
if (!audio)
|
|
return (NULL);
|
|
memset(audio, 0, sizeof(t_audio));
|
|
config = ma_engine_config_init();
|
|
// config.pUserData = audio;
|
|
// config.pLogCallback = NULL;
|
|
// config.logLevel = MA_LOG_LEVEL_INFO;
|
|
if (ma_engine_init(&config, &audio->engine) != MA_SUCCESS)
|
|
{
|
|
free(audio);
|
|
return (NULL);
|
|
}
|
|
return (audio);
|
|
}
|
|
|
|
void audio_uninit(t_audio *audio)
|
|
{
|
|
int i;
|
|
|
|
if (!audio)
|
|
return ;
|
|
i = 0;
|
|
while (i < SND_SIZE)
|
|
{
|
|
if (&audio->sounds[i])
|
|
{
|
|
ma_sound_uninit(&audio->sounds[i]);
|
|
|
|
}
|
|
i++;
|
|
}
|
|
ma_engine_uninit(&audio->engine);
|
|
free(audio);
|
|
}
|
|
|
|
int audio_load_sounds(t_audio *audio)
|
|
{
|
|
int i;
|
|
const char *sound_files[SND_SIZE] = {
|
|
"sounds/walk.wav",
|
|
"sounds/flash.wav",
|
|
"sounds/damage.wav",
|
|
"sounds/death.wav",
|
|
"sounds/enemy.mp3",
|
|
"sounds/pickup.wav",
|
|
"sounds/hum.wav",
|
|
"sounds/noise.wav"};
|
|
|
|
if (!audio)
|
|
return (FAILURE);
|
|
i = 0;
|
|
while (i < SND_SIZE)
|
|
{
|
|
printf("Loading sound: %s\n", sound_files[i]);
|
|
if (ma_sound_init_from_file(&audio->engine, sound_files[i],
|
|
0, NULL, NULL, &audio->sounds[i]) != MA_SUCCESS)
|
|
{
|
|
audio_uninit(audio);
|
|
return (FAILURE);
|
|
}
|
|
i++;
|
|
}
|
|
return (SUCCESS);
|
|
}
|
|
|
|
int audio_play(t_audio *audio, t_sound sound)
|
|
{
|
|
if (!audio || sound < 0 || sound >= SND_SIZE || !&audio->sounds[sound])
|
|
return (FAILURE);
|
|
ma_sound_seek_to_pcm_frame(&audio->sounds[sound], 0);
|
|
if (ma_sound_start(&audio->sounds[sound]) != MA_SUCCESS)
|
|
return (FAILURE);
|
|
return (SUCCESS);
|
|
}
|
|
|
|
int audio_stop(t_audio *audio, t_sound sound)
|
|
{
|
|
if (!audio || sound < 0 || sound >= SND_SIZE || !&audio->sounds[sound])
|
|
return (FAILURE);
|
|
ma_sound_seek_to_pcm_frame(&audio->sounds[sound], 0);
|
|
if (ma_sound_stop(&audio->sounds[sound]) != MA_SUCCESS)
|
|
return (FAILURE);
|
|
return (SUCCESS);
|
|
}
|
|
|
|
int audio_is_playing(t_audio *audio, t_sound sound)
|
|
{
|
|
if (!audio || sound < 0 || sound >= SND_SIZE || !&audio->sounds[sound])
|
|
return (FAILURE);
|
|
if (ma_sound_is_playing(&audio->sounds[sound]))
|
|
return (SUCCESS);
|
|
return (FAILURE);
|
|
}
|
|
|
|
int audio_loop(t_audio *audio, t_sound sound, int loop)
|
|
{
|
|
if (!audio || sound < 0 || sound >= SND_SIZE || !&audio->sounds[sound])
|
|
return (FAILURE);
|
|
ma_sound_set_looping(&audio->sounds[sound], loop);
|
|
return (SUCCESS);
|
|
}
|
|
|
|
int audio_handle_queues(t_audio *audio)
|
|
{
|
|
int i;
|
|
|
|
if (!audio)
|
|
return (FAILURE);
|
|
i = 0;
|
|
while (i < SND_SIZE)
|
|
{
|
|
if (audio->play_queue[i])
|
|
{
|
|
audio_play(audio, i);
|
|
audio->play_queue[i] = 0;
|
|
}
|
|
if (audio->stop_queue[i])
|
|
{
|
|
audio_stop(audio, i);
|
|
audio->stop_queue[i] = 0;
|
|
}
|
|
audio->is_playing[i] = ma_sound_is_playing(&audio->sounds[i]);
|
|
i++;
|
|
}
|
|
return (SUCCESS);
|
|
}
|
|
|