summaryrefslogtreecommitdiffhomepage
path: root/src/audio/rodeo_audio.c
blob: 0adb3eb2cab23b982bf0e3d2c300a46b48222335 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

// -- internal --
// public
#include "rodeo/audio.h"
#include "rodeo/log.h"
// private
#include "audio/rodeo_audio_t.h"

// -- external --
#include "SDL.h"
#include "SDL_mixer.h"

static int32_t **irodeo_audio_channelPool;

void
rodeo_audio_initialize(int32_t num_sound_pools, int32_t size_sound_pools)
{
	if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
	{
		rodeo_log(
			rodeo_logLevel_error,
			"Failed to initialize SDL Audio. SDL_Error: %s",
			SDL_GetError()
		);
	}
	else
	{
		irodeo_audio_channelPool = malloc((uint32_t)(num_sound_pools * size_sound_pools) * sizeof(int32_t));
		Mix_AllocateChannels(num_sound_pools * size_sound_pools);

		int32_t temp_channel_id = 0;
		for(int i = 0; i < num_sound_pools; ++i)
		{
			//irodeo_audio_channelPool[i] = 
			for(int j = 0; j < size_sound_pools; ++j)
			{
				irodeo_audio_channelPool[i][j] = temp_channel_id;
				temp_channel_id += 1;
			}
		}

		rodeo_audio_masterVolume_set(0.5f);
	}
}

void
rodeo_audio_deinitialize(void)
{
	Mix_Quit();
}

void
rodeo_audio_masterVolume_set(float volume_level)
{
	Mix_MasterVolume((int32_t)(volume_level * 128));
	Mix_VolumeMusic((int32_t)(volume_level * 128));
}

float
rodeo_audio_masterVolume_get(void)
{
	return ((float)Mix_MasterVolume(-1)) / (float)MIX_MAX_VOLUME;
}

rodeo_audio_sound_t*
rodeo_audio_sound_create_from_path(cstr path)
{
	rodeo_audio_sound_t *sample_sound = malloc(sizeof(rodeo_audio_sound_t));
	sample_sound->sdl_sound = Mix_LoadWAV(cstr_str(&path));
	if(NULL == sample_sound->sdl_sound)
	{
		rodeo_log(
			rodeo_logLevel_error,
			"Failed to load sound. Mix_Error: %s",
			Mix_GetError()
		);
	}
	return sample_sound;
}

void
rodeo_audio_sound_destroy(rodeo_audio_sound_t* sound)
{
	Mix_FreeChunk(sound->sdl_sound);
	free(sound);
}

void
rodeo_audio_sound_play(rodeo_audio_sound_t *sound, int32_t pool_id)
{
	Mix_PlayChannel(pool_id, sound->sdl_sound, 0);
}