6 #include <SDL2/SDL_mixer.h>
8 #include "./sound_medium.h"
22 size_t channels_count;
25 static int mix_get_free_channel(int lower_channel,
28 assert(lower_channel >= 0);
29 assert(upper_channel >= 0);
30 assert(lower_channel <= upper_channel);
32 for (int i = lower_channel; i < upper_channel; ++i) {
33 if (!Mix_Playing(i)) {
41 sound_medium_t *create_sound_medium(Mix_Chunk **samples,
47 assert(samples_count > 0);
48 assert(lower_channel >= 0);
49 assert(upper_channel >= 0);
50 assert(lower_channel <= upper_channel);
52 lt_t *lt = create_lt();
57 sound_medium_t *sound_medium = PUSH_LT(lt, malloc(sizeof(sound_medium_t)), free);
58 if (sound_medium == NULL) {
59 throw_error(ERROR_TYPE_LIBC);
63 sound_medium->channels_count = (size_t) (upper_channel - lower_channel + 1);
64 sound_medium->samples = samples;
65 sound_medium->samples_count = samples_count;
66 sound_medium->paused = 0;
67 sound_medium->lower_channel = lower_channel;
68 sound_medium->upper_channel = upper_channel;
70 sound_medium->lt = lt;
75 void destroy_sound_medium(sound_medium_t *sound_medium)
78 RETURN_LT0(sound_medium->lt);
81 int sound_medium_play_sound(sound_medium_t *sound_medium,
90 if (sound_index < sound_medium->samples_count) {
91 const int free_channel = mix_get_free_channel(sound_medium->lower_channel,
92 sound_medium->upper_channel);
94 printf("Found free channel: %d\n", free_channel);
96 if (free_channel >= 0) {
97 return Mix_PlayChannel(free_channel, sound_medium->samples[sound_index], loops);
104 int sound_medium_toggle_pause(sound_medium_t *sound_medium)
106 assert(sound_medium);
108 if (sound_medium->paused) {
114 sound_medium->paused = !sound_medium->paused;