refactor(core/audio): template forEachTargetChannel (DUP-05)
pauseChannel, resumeChannel i stopChannel repetien tres vegades la cadena "if channel == -1 forEach(channels) else if 0<=channel<MAX apply()". S'extreu a forEachTargetChannel(channel, fn) i cada funció es queda només amb la lògica per canal — pausar, reprendre, destruir. Substitueix codi gairebé idèntic triplicat per una declaració de per què fa el que fa cada funció. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
dee00a8de7
commit
6a1ed37242
2 files changed
+31
-45
No files matched your search
@@ -569,62 +569,48 @@ namespace Ja {
|
||||
delete sound;
|
||||
}
|
||||
|
||||
// Aplica `fn` als canals objectiu: tots si channel == -1, o només el d'índex
|
||||
// vàlid si està dins [0, MAX_SIMULTANEOUS_CHANNELS). Centralitza el dispatch
|
||||
// "tots vs un" que pauseChannel/resumeChannel/stopChannel repetien.
|
||||
template <typename Fn>
|
||||
inline void forEachTargetChannel(const int channel, Fn&& fn) {
|
||||
if (channel == -1) {
|
||||
for (auto& ch : channels) { fn(ch); }
|
||||
} else if (channel >= 0 && channel < MAX_SIMULTANEOUS_CHANNELS) {
|
||||
fn(channels[channel]);
|
||||
}
|
||||
}
|
||||
|
||||
inline void pauseChannel(const int channel) {
|
||||
if (!sound_enabled) { return; }
|
||||
|
||||
if (channel == -1) {
|
||||
for (auto& ch : channels) {
|
||||
if (ch.state == ChannelState::PLAYING) {
|
||||
ch.state = ChannelState::PAUSED;
|
||||
SDL_UnbindAudioStream(ch.stream);
|
||||
}
|
||||
forEachTargetChannel(channel, [](Channel& ch) {
|
||||
if (ch.state == ChannelState::PLAYING) {
|
||||
ch.state = ChannelState::PAUSED;
|
||||
SDL_UnbindAudioStream(ch.stream);
|
||||
}
|
||||
} else if (channel >= 0 && channel < MAX_SIMULTANEOUS_CHANNELS) {
|
||||
if (channels[channel].state == ChannelState::PLAYING) {
|
||||
channels[channel].state = ChannelState::PAUSED;
|
||||
SDL_UnbindAudioStream(channels[channel].stream);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
inline void resumeChannel(const int channel) {
|
||||
if (!sound_enabled) { return; }
|
||||
|
||||
if (channel == -1) {
|
||||
for (auto& ch : channels) {
|
||||
if (ch.state == ChannelState::PAUSED) {
|
||||
ch.state = ChannelState::PLAYING;
|
||||
SDL_BindAudioStream(sdl_audio_device, ch.stream);
|
||||
}
|
||||
forEachTargetChannel(channel, [](Channel& ch) {
|
||||
if (ch.state == ChannelState::PAUSED) {
|
||||
ch.state = ChannelState::PLAYING;
|
||||
SDL_BindAudioStream(sdl_audio_device, ch.stream);
|
||||
}
|
||||
} else if (channel >= 0 && channel < MAX_SIMULTANEOUS_CHANNELS) {
|
||||
if (channels[channel].state == ChannelState::PAUSED) {
|
||||
channels[channel].state = ChannelState::PLAYING;
|
||||
SDL_BindAudioStream(sdl_audio_device, channels[channel].stream);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
inline void stopChannel(const int channel) {
|
||||
if (channel == -1) {
|
||||
for (auto& ch : channels) {
|
||||
if (ch.state != ChannelState::FREE) {
|
||||
if (ch.stream != nullptr) { SDL_DestroyAudioStream(ch.stream); }
|
||||
ch.stream = nullptr;
|
||||
ch.state = ChannelState::FREE;
|
||||
ch.pos = 0;
|
||||
ch.sound = nullptr;
|
||||
}
|
||||
forEachTargetChannel(channel, [](Channel& ch) {
|
||||
if (ch.state != ChannelState::FREE) {
|
||||
if (ch.stream != nullptr) { SDL_DestroyAudioStream(ch.stream); }
|
||||
ch.stream = nullptr;
|
||||
ch.state = ChannelState::FREE;
|
||||
ch.pos = 0;
|
||||
ch.sound = nullptr;
|
||||
}
|
||||
} else if (channel >= 0 && channel < MAX_SIMULTANEOUS_CHANNELS) {
|
||||
if (channels[channel].state != ChannelState::FREE) {
|
||||
if (channels[channel].stream != nullptr) { SDL_DestroyAudioStream(channels[channel].stream); }
|
||||
channels[channel].stream = nullptr;
|
||||
channels[channel].state = ChannelState::FREE;
|
||||
channels[channel].pos = 0;
|
||||
channels[channel].sound = nullptr;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
inline auto getChannelState(const int channel) -> ChannelState {
|
||||
|
||||
Reference in new issue
Block a user