summaryrefslogtreecommitdiff
path: root/src/channel.c
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-08-30 22:25:43 -0500
committersanine <sanine.not@pm.me>2022-08-30 22:25:43 -0500
commit489c3771e648d412cab283c660996c880149315d (patch)
tree07c8734f4352c460f83e0c9fd0cf9ee00b34e210 /src/channel.c
parentb9761d521087e23ee7a83b854d356b1fa07fe06e (diff)
refactor: use stereo panning model
Diffstat (limited to 'src/channel.c')
-rw-r--r--src/channel.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/channel.c b/src/channel.c
index 603a980..2fd0324 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -9,7 +9,8 @@ void channel_init(struct channel_t *chan)
chan->active = false;
chan->paused = false;
chan->volume = 255;
- chan->pan = 0;
+ chan->pan_left = -128;
+ chan->pan_right = 128;
chan->sound_mutex = p_mutex_new();
chan->sound.left = NULL;
@@ -22,7 +23,8 @@ void channel_reset(struct channel_t *chan)
{
p_atomic_int_set(&(chan->paused), false);
p_atomic_int_set(&(chan->volume), 255);
- p_atomic_int_set(&(chan->pan), 0);
+ p_atomic_int_set(&(chan->pan_left), -128);
+ p_atomic_int_set(&(chan->pan_right), 128);
chan->pos = 0;
p_atomic_int_set(&(chan->active), false);
}
@@ -49,12 +51,16 @@ void channel_set_volume(struct channel_t *chan, float volume)
}
-void channel_set_pan(struct channel_t *chan, float pan)
+void channel_set_pan(struct channel_t *chan, float pan_left, float pan_right)
{
- if (pan > 1.0f) pan = 1.0f;
- if (pan < -1.0f) pan = -1.0f;
+ if (pan_left > 1.0f) pan_left = 1.0f;
+ if (pan_left < -1.0f) pan_left = -1.0f;
- p_atomic_int_set(&(chan->pan), 128*pan);
+ if (pan_right > 1.0f) pan_right = 1.0f;
+ if (pan_right < -1.0f) pan_right = -1.0f;
+
+ p_atomic_int_set(&(chan->pan_left), 128*pan_left);
+ p_atomic_int_set(&(chan->pan_right), 128*pan_right);
}
@@ -76,8 +82,17 @@ void channel_get_next_sample(float *left, float *right, struct channel_t *chan)
return;
}
- *left = chan->sound.left[chan->pos];
- *right = chan->sound.right[chan->pos];
+ float l, r;
+
+ l = chan->sound.left[chan->pos];
+ if (chan->sound.mono)
+ r = l;
+ else
+ r = chan->sound.right[chan->pos];
+
+ float volume = ((float)p_atomic_int_get(&(chan->active)))/255;
+ *left = volume * l;
+ *right = volume * r;
chan->pos += 1;
if (chan->pos >= chan->sound.len) {