I am getting strange behavior when reading channel.get_sound() value from a supposedly silent channel.
I first play a sound (get the channel object in return), and let it play until the end. channel.get_sound() returns None, as it should. Then I play this sound a second time (storing the returned channel object in another variable). While the sound is still playing, if I query the first channel.get_sound(), I get the reference to the sound object. Is this a bug or it's by design? This behavior messes up my application logic, because I store the returned channel objects to query later if the sound is still playing on them. I tested the problem on both Pygame 1.9.6 and 2.0.0. Here's my test code: import pygame from time import sleep mixer = pygame.mixer mixer.pre_init(44100, -16, 1, 8192) mixer.init() mixer.set_num_channels(10) pygame.init() dog = mixer.Sound('dog.ogg') dog = mixer.Sound('apps/sounds/media/animal: dog.ogg') # Test #1: use channel.get_sound() to see what sound the channel is playing. It should return None, when no sound is playing. This test passes. def channel_test_1(): channel1 = dog.play() sleep(1) print('After 1 second:', channel1.get_sound() == dog) sleep(6) print('After 7 seconds:', channel1.get_sound() == dog) # Test #2: play sound on one channel. Let it play to the end. The channel1.get_sound() returns None. Then play the sound on channel2. The channel1.get_sound() should still return None, however once the sound starts playing on channel2, the channel1.get_sound() is no more None. This test fails. def channel_test_2(): print('Play the sound on channel1') channel1 = dog.play() sleep(1) print('After 1 second: channel1 - ', channel1.get_sound() == dog) sleep(6) print('After 7 seconds: channel1 - ', channel1.get_sound() == dog) print('Play the sound on channel2') channel2 = dog.play() sleep(1) print('After 1 seconds: channel1 - ', channel1.get_sound() == dog, ', channel2 - ', channel2.get_sound() == dog) sleep(3) print('After 4 seconds: channel1 - ', channel1.get_sound() == dog, ', channel2 - ', channel2.get_sound() == dog) sleep(3) print('After 7 seconds: channel1 - ', channel1.get_sound() == dog, ', channel2 - ', channel2.get_sound() == dog) channel_test_2() Here are my results for the channel_test_2(): >>> channel_test_2() Play the sound on channel1 After 1 second: channel1 - True After 7 seconds: channel1 - False Play the sound on channel2 After 1 seconds: channel1 - True , channel2 - True After 4 seconds: channel1 - True , channel2 - True After 7 seconds: channel1 - False , channel2 - False The dog.ogg sound is 5.5 seconds long. For the sake of complete representation, I attach the audio file of this good boy to this post.
dog.ogg
Description: audio/ogg