Skip to content

Commit b465075

Browse files
committed
Follow SDL's behaviour on negative values and values greater than the max + add tests for that
1 parent 865db9a commit b465075

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

src_c/mixer.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,9 @@ snd_set_volume(PyObject *self, PyObject *args)
756756

757757
MIXER_INIT_CHECK();
758758

759-
((pgSoundObject *)self)->volume = volume;
759+
if (volume >= 0.0f) {
760+
((pgSoundObject *)self)->volume = MIN(volume, 1.0f);
761+
}
760762

761763
Mix_VolumeChunk(chunk, (int)(volume * 128));
762764
Py_RETURN_NONE;
@@ -1275,7 +1277,9 @@ chan_set_volume(PyObject *self, PyObject *args)
12751277
volume = 1.0f;
12761278
}
12771279

1278-
channeldata[channelnum].volume = volume;
1280+
if (volume >= 0.0f) {
1281+
channeldata[channelnum].volume = MIN(volume, 1.0f);
1282+
}
12791283

12801284
#ifdef Py_DEBUG
12811285
result =

test/mixer_test.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,25 @@ def test_set_volume(self):
921921
ch.set_volume(0.0)
922922
self.assertAlmostEqual(ch.get_volume(), 0.0)
923923

924+
ch.set_volume(0.5)
925+
self.assertAlmostEqual(ch.get_volume(), 0.5)
926+
ch.set_volume(-0.1)
927+
self.assertAlmostEqual(ch.get_volume(), 0.5)
928+
ch.set_volume(-5)
929+
self.assertAlmostEqual(ch.get_volume(), 0.5)
930+
931+
ch.set_volume(0.99)
932+
self.assertAlmostEqual(ch.get_volume(), 0.99)
933+
ch.set_volume(1.0)
934+
self.assertAlmostEqual(ch.get_volume(), 1.0)
935+
ch.set_volume(1.1)
936+
self.assertAlmostEqual(ch.get_volume(), 1.0)
937+
ch.set_volume(3)
938+
self.assertAlmostEqual(ch.get_volume(), 1.0)
939+
940+
ch.set_volume(-0.5)
941+
self.assertAlmostEqual(ch.get_volume(), 1.0)
942+
924943
for volume_1000x in range(0, 1_000 + 1):
925944
set_volume = volume_1000x / 1_000
926945

@@ -1271,6 +1290,25 @@ def test_set_volume_exact(self):
12711290
snd.set_volume(0.0)
12721291
self.assertAlmostEqual(snd.get_volume(), 0.0)
12731292

1293+
snd.set_volume(0.5)
1294+
self.assertAlmostEqual(snd.get_volume(), 0.5)
1295+
snd.set_volume(-0.1)
1296+
self.assertAlmostEqual(snd.get_volume(), 0.5)
1297+
snd.set_volume(-5)
1298+
self.assertAlmostEqual(snd.get_volume(), 0.5)
1299+
1300+
snd.set_volume(0.99)
1301+
self.assertAlmostEqual(snd.get_volume(), 0.99)
1302+
snd.set_volume(1.0)
1303+
self.assertAlmostEqual(snd.get_volume(), 1.0)
1304+
snd.set_volume(1.1)
1305+
self.assertAlmostEqual(snd.get_volume(), 1.0)
1306+
snd.set_volume(3)
1307+
self.assertAlmostEqual(snd.get_volume(), 1.0)
1308+
1309+
snd.set_volume(-0.5)
1310+
self.assertAlmostEqual(snd.get_volume(), 1.0)
1311+
12741312
for volume_1000x in range(0, 1_000 + 1):
12751313
set_volume = volume_1000x / 1_000
12761314

0 commit comments

Comments
 (0)