2323@unique
2424class SoundSplitState (DisplayStringIntEnum ):
2525 OFF = 0
26- NVDA_LEFT_APPS_RIGHT = 1
27- NVDA_LEFT_APPS_BOTH = 2
28- NVDA_RIGHT_APPS_LEFT = 3
29- NVDA_RIGHT_APPS_BOTH = 4
30- NVDA_BOTH_APPS_LEFT = 5
31- NVDA_BOTH_APPS_RIGHT = 6
26+ NVDA_BOTH_APPS_BOTH = 1
27+ NVDA_LEFT_APPS_RIGHT = 2
28+ NVDA_LEFT_APPS_BOTH = 3
29+ NVDA_RIGHT_APPS_LEFT = 4
30+ NVDA_RIGHT_APPS_BOTH = 5
31+ NVDA_BOTH_APPS_LEFT = 6
32+ NVDA_BOTH_APPS_RIGHT = 7
33+
3234
3335 @property
3436 def _displayStringLabels (self ) -> dict [IntEnum , str ]:
3537 return {
3638 # Translators: Sound split state
37- SoundSplitState .OFF : pgettext ("SoundSplit" , "Disabled" ),
39+ SoundSplitState .OFF : pgettext ("SoundSplit" , "Sound split disabled" ),
40+ # Translators: Sound split state
41+ SoundSplitState .NVDA_BOTH_APPS_BOTH : pgettext (
42+ "SoundSplit" ,
43+ "NVDA in both channels and applications in both channels" ,
44+ ),
3845 # Translators: Sound split state
3946 SoundSplitState .NVDA_LEFT_APPS_RIGHT : _ ("NVDA on the left and applications on the right" ),
4047 # Translators: Sound split state
@@ -51,7 +58,11 @@ def _displayStringLabels(self) -> dict[IntEnum, str]:
5158
5259 def getAppVolume (self ) -> VolumeTupleT :
5360 match self :
54- case SoundSplitState .OFF | SoundSplitState .NVDA_LEFT_APPS_BOTH | SoundSplitState .NVDA_RIGHT_APPS_BOTH :
61+ case (
62+ SoundSplitState .NVDA_BOTH_APPS_BOTH
63+ | SoundSplitState .NVDA_LEFT_APPS_BOTH
64+ | SoundSplitState .NVDA_RIGHT_APPS_BOTH
65+ ):
5566 return (1.0 , 1.0 )
5667 case SoundSplitState .NVDA_RIGHT_APPS_LEFT | SoundSplitState .NVDA_BOTH_APPS_LEFT :
5768 return (1.0 , 0.0 )
@@ -62,7 +73,11 @@ def getAppVolume(self) -> VolumeTupleT:
6273
6374 def getNVDAVolume (self ) -> VolumeTupleT :
6475 match self :
65- case SoundSplitState .OFF | SoundSplitState .NVDA_BOTH_APPS_LEFT | SoundSplitState .NVDA_BOTH_APPS_RIGHT :
76+ case (
77+ SoundSplitState .NVDA_BOTH_APPS_BOTH
78+ | SoundSplitState .NVDA_BOTH_APPS_LEFT
79+ | SoundSplitState .NVDA_BOTH_APPS_RIGHT
80+ ):
6681 return (1.0 , 1.0 )
6782 case SoundSplitState .NVDA_LEFT_APPS_RIGHT | SoundSplitState .NVDA_LEFT_APPS_BOTH :
6883 return (1.0 , 0.0 )
@@ -93,7 +108,7 @@ def initialize() -> None:
93108@atexit .register
94109def terminate ():
95110 if nvwave .usingWasapiWavePlayer ():
96- setSoundSplitState (SoundSplitState .OFF )
111+ setSoundSplitState (SoundSplitState .NVDA_BOTH_APPS_BOTH )
97112 unregisterCallback ()
98113 else :
99114 log .debug ("Skipping terminating sound split as WASAPI is disabled." )
@@ -154,6 +169,9 @@ def on_session_created(self, new_session: AudioSession):
154169
155170
156171def setSoundSplitState (state : SoundSplitState ) -> dict :
172+ if state == SoundSplitState .OFF :
173+ unregisterCallback ()
174+ return
157175 leftVolume , rightVolume = state .getAppVolume ()
158176 leftNVDAVolume , rightNVDAVolume = state .getNVDAVolume ()
159177 volumeSetter = VolumeSetter (leftVolume , rightVolume , leftNVDAVolume , rightNVDAVolume )
@@ -177,11 +195,15 @@ def toggleSoundSplitState() -> None:
177195 try :
178196 i = allowedStates .index (state )
179197 except ValueError :
180- # State not found, resetting to default (OFF )
198+ # State not found, resetting to default (NVDA_BOTH_APPS_BOTH )
181199 i = - 1
182200 i = (i + 1 ) % len (allowedStates )
183201 newState = SoundSplitState (allowedStates [i ])
184- result = setSoundSplitState (newState )
202+ if newState == SoundSplitState .OFF :
203+ result = setSoundSplitState (SoundSplitState .NVDA_BOTH_APPS_BOTH )
204+ setSoundSplitState (newState )
205+ else :
206+ result = setSoundSplitState (newState )
185207 config .conf ["audio" ]["soundSplitState" ] = newState .value
186208 ui .message (newState .displayString )
187209 if result ["foundSessionWithNot2Channels" ]:
0 commit comments