From b6b74c58fe72493b4c7f61ef02997fdcdcd645ae Mon Sep 17 00:00:00 2001
From: pionere <[EMAIL REDACTED]>
Date: Sun, 12 Dec 2021 11:47:39 +0100
Subject: [PATCH] always check 'looping' field to tell if a channel is playing
---
src/mixer.c | 36 +++++++++++++++++++-----------------
1 file changed, 19 insertions(+), 17 deletions(-)
diff --git a/src/mixer.c b/src/mixer.c
index 610d7c8f..3942d6fb 100644
--- a/src/mixer.c
+++ b/src/mixer.c
@@ -951,7 +951,7 @@ int Mix_PlayChannelTimed(int which, Mix_Chunk *chunk, int loops, int ticks)
/* If which is -1, play on the first free channel */
if (which == -1) {
for (i=reserved_channels; i<num_channels; ++i) {
- if (mix_channel[i].playing <= 0)
+ if (!Mix_Playing(i))
break;
}
if (i == num_channels) {
@@ -960,13 +960,14 @@ int Mix_PlayChannelTimed(int which, Mix_Chunk *chunk, int loops, int ticks)
} else {
which = i;
}
+ } else {
+ if (Mix_Playing(which))
+ _Mix_channel_done_playing(which);
}
/* Queue up the audio data for this channel */
if (which >= 0 && which < num_channels) {
- Uint32 sdl_ticks = SDL_GetTicks();
- if (Mix_Playing(which))
- _Mix_channel_done_playing(which);
+ Uint32 sdl_ticks = SDL_GetTicks();
mix_channel[which].samples = chunk->abuf;
mix_channel[which].playing = (int)chunk->alen;
mix_channel[which].looping = loops;
@@ -1022,7 +1023,7 @@ int Mix_FadeInChannelTimed(int which, Mix_Chunk *chunk, int loops, int ms, int t
/* If which is -1, play on the first free channel */
if (which == -1) {
for (i=reserved_channels; i<num_channels; ++i) {
- if (mix_channel[i].playing <= 0)
+ if (!Mix_Playing(i))
break;
}
if (i == num_channels) {
@@ -1030,13 +1031,14 @@ int Mix_FadeInChannelTimed(int which, Mix_Chunk *chunk, int loops, int ms, int t
} else {
which = i;
}
+ } else {
+ if (Mix_Playing(which))
+ _Mix_channel_done_playing(which);
}
/* Queue up the audio data for this channel */
if (which >= 0 && which < num_channels) {
- Uint32 sdl_ticks = SDL_GetTicks();
- if (Mix_Playing(which))
- _Mix_channel_done_playing(which);
+ Uint32 sdl_ticks = SDL_GetTicks();
mix_channel[which].samples = chunk->abuf;
mix_channel[which].playing = (int)chunk->alen;
mix_channel[which].looping = loops;
@@ -1110,7 +1112,7 @@ int Mix_HaltChannel(int which)
}
} else if (which < num_channels) {
Mix_LockAudio();
- if (mix_channel[which].playing) {
+ if (Mix_Playing(which)) {
_Mix_channel_done_playing(which);
mix_channel[which].playing = 0;
mix_channel[which].looping = 0;
@@ -1152,7 +1154,7 @@ int Mix_FadeOutChannel(int which, int ms)
}
} else if (which < num_channels) {
Mix_LockAudio();
- if (mix_channel[which].playing &&
+ if (Mix_Playing(which) &&
(mix_channel[which].volume > 0) &&
(mix_channel[which].fading != MIX_FADING_OUT)) {
mix_channel[which].fade_volume = mix_channel[which].volume;
@@ -1272,12 +1274,12 @@ void Mix_Pause(int which)
int i;
for (i=0; i<num_channels; ++i) {
- if (mix_channel[i].playing > 0) {
+ if (Mix_Playing(i)) {
mix_channel[i].paused = sdl_ticks;
}
}
} else if (which < num_channels) {
- if (mix_channel[which].playing > 0) {
+ if (Mix_Playing((which)) {
mix_channel[which].paused = sdl_ticks;
}
}
@@ -1293,14 +1295,14 @@ void Mix_Resume(int which)
int i;
for (i=0; i<num_channels; ++i) {
- if (mix_channel[i].playing > 0) {
+ if (Mix_Playing(i)) {
if (mix_channel[i].expire > 0)
mix_channel[i].expire += sdl_ticks - mix_channel[i].paused;
mix_channel[i].paused = 0;
}
}
} else if (which < num_channels) {
- if (mix_channel[which].playing > 0) {
+ if (Mix_Playing(which)) {
if (mix_channel[which].expire > 0)
mix_channel[which].expire += sdl_ticks - mix_channel[which].paused;
mix_channel[which].paused = 0;
@@ -1355,7 +1357,7 @@ int Mix_GroupAvailable(int tag)
int i;
for(i=0; i < num_channels; i ++) {
if (((tag == -1) || (tag == mix_channel[i].tag)) &&
- (mix_channel[i].playing <= 0))
+ (!Mix_Playing(i)))
return i;
}
return(-1);
@@ -1379,7 +1381,7 @@ int Mix_GroupOldest(int tag)
Uint32 mintime = SDL_GetTicks();
int i;
for(i=0; i < num_channels; i ++) {
- if ((mix_channel[i].tag==tag || tag==-1) && mix_channel[i].playing > 0
+ if ((mix_channel[i].tag==tag || tag==-1) && Mix_Playing(i)
&& mix_channel[i].start_time <= mintime) {
mintime = mix_channel[i].start_time;
chan = i;
@@ -1395,7 +1397,7 @@ int Mix_GroupNewer(int tag)
Uint32 maxtime = 0;
int i;
for(i=0; i < num_channels; i ++) {
- if ((mix_channel[i].tag==tag || tag==-1) && mix_channel[i].playing > 0
+ if ((mix_channel[i].tag==tag || tag==-1) && Mix_Playing(i)
&& mix_channel[i].start_time >= maxtime) {
maxtime = mix_channel[i].start_time;
chan = i;