@@ -31,13 +31,16 @@ def setUp(self):
3131 self .buzzer = MockPWM (MockPin (46 ))
3232 self .i2s_pins = {'sck' : 2 , 'ws' : 47 , 'sd' : 16 }
3333
34- # Reset volume to default before each test
35- AudioFlinger .set_volume ( 70 )
34+ # Reset singleton instance for each test
35+ AudioFlinger ._instance = None
3636
3737 AudioFlinger (
3838 i2s_pins = self .i2s_pins ,
3939 buzzer_instance = self .buzzer
4040 )
41+
42+ # Reset volume to default after creating instance
43+ AudioFlinger .set_volume (70 )
4144
4245 def tearDown (self ):
4346 """Clean up after each test."""
@@ -52,20 +55,24 @@ def test_initialization(self):
5255 def test_has_i2s (self ):
5356 """Test has_i2s() returns correct value."""
5457 # With I2S configured
58+ AudioFlinger ._instance = None
5559 AudioFlinger (i2s_pins = self .i2s_pins , buzzer_instance = None )
5660 self .assertTrue (AudioFlinger .has_i2s ())
5761
5862 # Without I2S configured
63+ AudioFlinger ._instance = None
5964 AudioFlinger (i2s_pins = None , buzzer_instance = self .buzzer )
6065 self .assertFalse (AudioFlinger .has_i2s ())
6166
6267 def test_has_buzzer (self ):
6368 """Test has_buzzer() returns correct value."""
6469 # With buzzer configured
70+ AudioFlinger ._instance = None
6571 AudioFlinger (i2s_pins = None , buzzer_instance = self .buzzer )
6672 self .assertTrue (AudioFlinger .has_buzzer ())
6773
6874 # Without buzzer configured
75+ AudioFlinger ._instance = None
6976 AudioFlinger (i2s_pins = self .i2s_pins , buzzer_instance = None )
7077 self .assertFalse (AudioFlinger .has_buzzer ())
7178
@@ -95,6 +102,7 @@ def test_volume_control(self):
95102 def test_no_hardware_rejects_playback (self ):
96103 """Test that no hardware rejects all playback requests."""
97104 # Re-initialize with no hardware
105+ AudioFlinger ._instance = None
98106 AudioFlinger (i2s_pins = None , buzzer_instance = None )
99107
100108 # WAV should be rejected (no I2S)
@@ -108,6 +116,7 @@ def test_no_hardware_rejects_playback(self):
108116 def test_i2s_only_rejects_rtttl (self ):
109117 """Test that I2S-only config rejects buzzer playback."""
110118 # Re-initialize with I2S only
119+ AudioFlinger ._instance = None
111120 AudioFlinger (i2s_pins = self .i2s_pins , buzzer_instance = None )
112121
113122 # RTTTL should be rejected (no buzzer)
@@ -117,6 +126,7 @@ def test_i2s_only_rejects_rtttl(self):
117126 def test_buzzer_only_rejects_wav (self ):
118127 """Test that buzzer-only config rejects I2S playback."""
119128 # Re-initialize with buzzer only
129+ AudioFlinger ._instance = None
120130 AudioFlinger (i2s_pins = None , buzzer_instance = self .buzzer )
121131
122132 # WAV should be rejected (no I2S)
@@ -125,6 +135,9 @@ def test_buzzer_only_rejects_wav(self):
125135
126136 def test_is_playing_initially_false (self ):
127137 """Test that is_playing() returns False initially."""
138+ # Reset to ensure clean state
139+ AudioFlinger ._instance = None
140+ AudioFlinger (i2s_pins = self .i2s_pins , buzzer_instance = self .buzzer )
128141 self .assertFalse (AudioFlinger .is_playing ())
129142
130143 def test_stop_with_no_playback (self ):
@@ -157,32 +170,36 @@ def setUp(self):
157170 # I2S pins without microphone input
158171 self .i2s_pins_no_mic = {'sck' : 2 , 'ws' : 47 , 'sd' : 16 }
159172
160- # Reset state
161- af = AudioFlinger .get ()
162- af ._current_recording = None
163- AudioFlinger .set_volume (70 )
173+ # Reset singleton instance for each test
174+ AudioFlinger ._instance = None
164175
165176 AudioFlinger (
166177 i2s_pins = self .i2s_pins_with_mic ,
167178 buzzer_instance = self .buzzer
168179 )
180+
181+ # Reset volume to default after creating instance
182+ AudioFlinger .set_volume (70 )
169183
170184 def tearDown (self ):
171185 """Clean up after each test."""
172186 AudioFlinger .stop ()
173187
174188 def test_has_microphone_with_sd_in (self ):
175189 """Test has_microphone() returns True when sd_in pin is configured."""
190+ AudioFlinger ._instance = None
176191 AudioFlinger (i2s_pins = self .i2s_pins_with_mic , buzzer_instance = None )
177192 self .assertTrue (AudioFlinger .has_microphone ())
178193
179194 def test_has_microphone_without_sd_in (self ):
180195 """Test has_microphone() returns False when sd_in pin is not configured."""
196+ AudioFlinger ._instance = None
181197 AudioFlinger (i2s_pins = self .i2s_pins_no_mic , buzzer_instance = None )
182198 self .assertFalse (AudioFlinger .has_microphone ())
183199
184200 def test_has_microphone_no_i2s (self ):
185201 """Test has_microphone() returns False when no I2S is configured."""
202+ AudioFlinger ._instance = None
186203 AudioFlinger (i2s_pins = None , buzzer_instance = self .buzzer )
187204 self .assertFalse (AudioFlinger .has_microphone ())
188205
@@ -192,11 +209,13 @@ def test_is_recording_initially_false(self):
192209
193210 def test_record_wav_no_microphone (self ):
194211 """Test that record_wav() fails when no microphone is configured."""
212+ AudioFlinger ._instance = None
195213 AudioFlinger (i2s_pins = self .i2s_pins_no_mic , buzzer_instance = None )
196214 result = AudioFlinger .record_wav ("test.wav" )
197215 self .assertFalse (result , "record_wav() fails when no microphone is configured" )
198216
199217 def test_record_wav_no_i2s (self ):
218+ AudioFlinger ._instance = None
200219 AudioFlinger (i2s_pins = None , buzzer_instance = self .buzzer )
201220 result = AudioFlinger .record_wav ("test.wav" )
202221 self .assertFalse (result , "record_wav() should fail when no I2S is configured" )
0 commit comments