+static float listener_position[3];
+
+
+static inline bool source_too_close(const int channel)
+{
+ const OPENAL_Channels *chan = &channels[channel];
+ const float *pos = chan->position;
+ const float distance = sqrtf(powf((pos[0] - listener_position[0]), 2.0f) +
+ powf((pos[1] - listener_position[1]), 2.0f) +
+ powf((pos[2] - listener_position[2]), 2.0f));
+ return (distance <= chan->sample->min_distance);
+}
+
+
+static void set_channel_position(const int channel, const float x,
+ const float y, const float z)
+{
+ OPENAL_Channels *chan = &channels[channel];
+
+ chan->position[0] = x;
+ chan->position[1] = y;
+ chan->position[2] = z;
+
+ FSOUND_SAMPLE *sptr = chan->sample;
+ if (sptr == NULL)
+ return;
+
+ const ALuint sid = chan->sid;
+ const bool no_attenuate = ((sptr->is2d) || (source_too_close(channel)));
+
+ if (no_attenuate)
+ {
+ alSourcei(sid, AL_SOURCE_RELATIVE, AL_TRUE);
+ alSource3f(sid, AL_POSITION, 0.0f, 0.0f, 0.0f);
+ }
+ else
+ {
+ alSourcei(sid, AL_SOURCE_RELATIVE, AL_FALSE);
+ alSource3f(sid, AL_POSITION, x, y, z);
+ }
+}