Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sound split #16071

Merged
merged 48 commits into from
Mar 6, 2024
Merged

Sound split #16071

merged 48 commits into from
Mar 6, 2024

Conversation

mltony
Copy link
Contributor

@mltony mltony commented Jan 20, 2024

Link to issue number:

Fixes #12985

Summary of the issue:

Feature request: sound split. Splits system sound into two channels: NVDA speaks in one channel (e.g. left), while all other applications play their sound in the other channel (e.g. right).

Description of user facing changes

  • Added global command NVDA+alt+s that toggles sound split between off, NVDA on the left and NVDA on the right (default behavior).
  • Added combo box on Audio panel in NVDA settings that also allows to switch between Sound split modes.
  • Added list of checkboxes in Audio panel, that allows to change behavior of NVDA+alt+s command: it allows to select all modes that the global command will cycle through.

Description of development approach

  1. Added pycaw library as a dependency.
  2. Created file source\audio\soundSplit.py where I implemented all logic.
  3. Contrary to what I said before, I managed to implement sound split without creating an extra monitor thread. It works like this:
    • When sound split is toggled, it uses IAudioSessionEnumerator to set volume in all currently active audio sessions.
    • Then it does sessionManager.RegisterSessionNotification() to create a callback that listens for any new audio sessions being created, an it executes the the same volume updating function upon creation.
    • On the next call or on shutdown we unregister the previous notification callback.

Testing strategy:

  • Performed thorough manual testing on Windows 10 and Windows 11.

Known issues with pull request:

  • Sound split only works in wasapi mode. The reason for that is that when NVDA is using WinMM, adjusting its volume via core audio API doesn't work. In theory this can be worked around by still applying volume inside NVWave player; however since NVDA is migrating to wasapi, I thought this doesn't make much sense at this point.
  • During shotdown we try to restore audio volume of all applications. However if an app is currently not playing any sounds, it doesn't have an active audio session and therefore there is no way to update its volume. As a result some applications might be playing sounds only in 1 channel long after NVDA is shut down. This is a known issue and there appears to be no work around.
  • There is a very unlikely race condition that might occur when an application starts playing sound between the call sessionManager.GetSessionEnumerator() and sessionManager.RegisterSessionNotification(). In this case sound split volume will not be applied to that application. I don't see a way to fix this in code since this is rather a problem of COM API. However turning sound split off and on again is an easy and intuitive workaround in this case.
  • Sound split won't work with applications playing sounds in mono mode or outputting to more than 2 channels (e.g. Dolby Surround). In practice I never encountered such applications.
  • Please note, that sound split doesn't work as a mixer. For example, if an application is playing a stereo sound track while sound split is set to "NVDA on the left and applications on the right", then you will only hear the right channel of the sound track, while the left channel of the sound track will be muted. in order to allow NVDA to use the left channel.
  • Sound split won't work with applications using legacy winMM API to play audio. However during the life span of sound split feature in Tony's enhancements add-on no users have reported of such applications.

Code Review Checklist:

  • Documentation:
    • Change log entry
    • User Documentation
    • Developer / Technical Documentation
    • Context sensitive help for GUI changes
  • Testing:
    • Unit tests
    • System (end to end) tests
    • Manual testing
  • UX of all users considered:
    • Speech
    • Braille
    • Low Vision
    • Different web browsers
    • Localization in other languages / culture than English
  • API is compatible with existing add-ons.
  • Security precautions taken.

@AppVeyorBot
Copy link

  • FAIL: Translation comments check. Translation comments missing or unexpectedly included. See build log for more information.
  • PASS: Unit tests.
  • FAIL: Lint check. See test results for more information.
  • FAIL: System tests (tags: installer NVDA). See test results for more information.
  • Build (for testing PR): https://ci.appveyor.com/api/buildjobs/gunmito0320ss5ca/artifacts/output/nvda_snapshot_pr16071-30730,6b4c666a.exe
  • CI timing (mins):
    INIT 0.0,
    INSTALL_START 0.8,
    INSTALL_END 0.9,
    BUILD_START 0.0,
    BUILD_END 25.1,
    TESTSETUP_START 0.0,
    TESTSETUP_END 0.2,
    TEST_START 0.0,
    TEST_END 0.7,
    FINISH_END 0.2

See test results for failed build of commit 6b4c666ae8

@AppVeyorBot
Copy link

See test results for failed build of commit 9df913ae92

@AppVeyorBot
Copy link

See test results for failed build of commit e523884049

@mltony mltony marked this pull request as ready for review January 20, 2024 06:24
@mltony mltony requested review from a team as code owners January 20, 2024 06:24
Copy link
Contributor

@lukaszgo1 lukaszgo1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sound split only works in wasapi mode.

While this is obviously fine I'd be nice to have a more technical explanation as to why in the PR description. In particular it is important to know if supporting this is impossible, too difficult to be worth doing or just a intentional design decision.

multiple lint errors are coming from pycaw interface definitions. I hope an exemption can be made here, since we don't want to make potential updating of these files to require manual reformatting every time just to make linter happy.

These can easily be ignored in tests\lint\flake8.ini. Since we do the same for UIAutomation COM interface I don't think that will be problematic.

During shotdown we try to restore audio volume of all applications. However if an app is currently not playing any sounds, it doesn't have an active audio session and therefore there is no way to update its volume. As a result some applications might be playing sounds only in 1 channel long after NVDA is shut down. This is a known issue and there appears to be no work around.

I have no experience with the audio stuff, but my initial intuition will be to register to a notification for destroying sessions and restore the original volume there. Is that possible?

source/audio.py Outdated
result.append(SoundSplitState.NVDA_LEFT)
if 'RIGHT' in self.name:
result.append(SoundSplitState.NVDA_RIGHT)
return result
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't this method be simplified to:

return [SoundSplitState.OFF, self]

source/audio.py Outdated Show resolved Hide resolved
source/audio.py Outdated Show resolved Hide resolved
source/comInterfaces/coreAudio.bak/__init__.py Outdated Show resolved Hide resolved
source/core.py Outdated Show resolved Hide resolved
source/globalCommands.py Outdated Show resolved Hide resolved
source/globalCommands.py Outdated Show resolved Hide resolved
user_docs/en/changes.t2t Outdated Show resolved Hide resolved
user_docs/en/userGuide.t2t Outdated Show resolved Hide resolved
source/audio.py Outdated Show resolved Hide resolved
@cary-rowen
Copy link
Contributor

Glad to see this PR has been drafted. But I sincerely hope you will consider the following request.

Sometimes, when we are watching a movie, we often want to appreciate the sound effects of this movie, but the sound of NVDA is relatively not so important.
I want to reduce the presence of NVDA sounds as much as possible, At this point it's a good idea to direct it to the left or right channel.
Obviously, I don't want to direct the sound of the film to the left or right, because that would definitely destroy the sound of the movie.
It would be nice to have an option that allows adjusting only the output channel of NVDA.
But I'm not denying the validity of that pull request, just pointing out another dilemma I faced.

@CyrilleB79
Copy link
Collaborator

@mltony, a big thank you for taking the time to integrate this feature in core! I think that it will be a real plus in NVDA's features.

I'll take time tomorrow and next week to test it, and will provide review comments (if needed), probably more on the UX point of view.

Copy link
Collaborator

@CyrilleB79 CyrilleB79 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

very nice and useful feature!

I have written a first set of comments, but will continue testing later.

Also a general note:
Implementing Sound Split for legacy audio mode is technically possible since you have done it in the add-on. But IMO, it's not worth doing it since NVDA moves to WASAPI.

source/globalCommands.py Outdated Show resolved Hide resolved
source/gui/settingsDialogs.py Outdated Show resolved Hide resolved
source/gui/settingsDialogs.py Outdated Show resolved Hide resolved
user_docs/en/userGuide.t2t Show resolved Hide resolved
source/config/configSpec.py Outdated Show resolved Hide resolved
@CyrilleB79
Copy link
Collaborator

Also one small issue:
For applications playing a stereo signal, sound split keeps only one channel and puts NVDA in the other one. This can be heard for example listening to Bohemian Rhapsody (Youtube) at time 3:15. With sound split enabled, we can hear well only one "Galelileo" in two, the other one being heard very far.
A better behaviour would be to have a mix (a sum) of left and right channel of the song on one side and NVDA on the other side.

If it is not possible for technical reasons or other, this request should not block this PR though, since the feature as developed in this PR is already more than useful, e.g. in meetings where stereo is of no use.
Though, this limitation should be documented, at least in this PR, and maybe also in the User Guide.

@mltony
Copy link
Contributor Author

mltony commented Jan 21, 2024

@lukaszgo1,

  1. Updated PR description.
  2. I am looking at tests\lint\flake8.ini and I see source/comInterfaces/*, appears to be already excluded. So not sure why linter is still complaining.
  3. In order to register a notification we'll need to keep NVDA process running. Since applications may play sound any time, this would mean we'd need to keep NVDA (or any other surrogate processs of it) to keep running indefinitely after we quit NVDA. That can be done in theory, but I believe this is not worth it. Moreover it might create some confusion, as we'll be running a process quietly that adjusts audio volumes of all applications - that just doesn't sound like a good idea.

@mltony
Copy link
Contributor Author

mltony commented Jan 22, 2024

Also one small issue: For applications playing a stereo signal, sound split keeps only one channel and puts NVDA in the other one. This can be heard for example listening to Bohemian Rhapsody (Youtube) at time 3:15. With sound split enabled, we can hear well only one "Galelileo" in two, the other one being heard very far. A better behaviour would be to have a mix (a sum) of left and right channel of the song on one side and NVDA on the other side.

If it is not possible for technical reasons or other, this request should not block this PR though, since the feature as developed in this PR is already more than useful, e.g. in meetings where stereo is of no use. Though, this limitation should be documented, at least in this PR, and maybe also in the User Guide.

I believe this is not possible - in coreAudio API I can only set volumes for left and right channels. What you are talking about would be mixer functionality I guess. I mentioned this both in this PR and documentation.

@mltony
Copy link
Contributor Author

mltony commented Jan 22, 2024

@lukaszgo1 , @CyrilleB79, I addressed all your comments. Also @cary-rowen, I implemented your idea as well.

@cary-rowen
Copy link
Contributor

Great, thanks @mltony for the great work.
I'll try this out once the CI build is complete.

@AppVeyorBot
Copy link

See test results for failed build of commit db34b63cd0

@seanbudd seanbudd added the conceptApproved Similar 'triaged' for issues, PR accepted in theory, implementation needs review. label Jan 22, 2024
Copy link
Collaborator

@CyrilleB79 CyrilleB79 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here are some more review items, if you want to have a look.
I have to stop now; maybe there will be other ones tomorrow.

Key: ``NVDA+alt+s``

This option allows you to make NVDA sound output to be directed to either left or right channel and application volume to be directed to the other channel. This could be useful for users of headphones or stereo speakers.
- Disabled sound split: both NVDA and other applications output sounds to both left and right channels.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This list is now incomplete.

If you remove the first section, you should put in this paragraph all the information that was in the first one.

@@ -546,6 +546,27 @@ A gesture allows cycling through the various speech modes:

If you only need to switch between a limited subset of speech modes, see [Modes available in the Cycle speech mode command #SpeechModesDisabling] for a way to disable unwanted modes.

++ Sound split modes ++[SpeechModes]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This paragraph is not needed here.

Its content should be moved in the paragraph describing the sound split control in the audio settings panel, and duplicate information (e.g. NVDA+alt+S gesture) should be merged.

You have probably made something similar to speech mode. But speech mode has no control in the GUI to set a specific speech mode (off, beeps, etc.); that's why its description cannot be done along with settings descriptions.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then perhaps I should remove the combobox from settings as well - if speech mode doesn't have a combo box then why sound split needs one?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then perhaps I should remove the combobox from settings as well - if speech mode doesn't have a combo box then why sound split needs one?

Usually, NVDA settings are reachable either through the GUI (settings dialog) or through gestures (assigned or unassigned). The features that are not modifiable through settings dialogs are the exception.

Having the feature controllable in the settings dialog allows:

  • saving the config on exit and restoring it at NVDA startup
  • using different profiles
  • a better discoverability of the feature since its control is visible in the GUI; someone can use it even without knowing the shortcut NVDA+alt+S

IMO, this is suitable for sound split:

  • maybe this is not very common but we cannot exclude that someone wants to have sound split always enabled, so also at NVDA startup
  • profiles may be useful in the following cases:
    • VLC profile using: NVDA left and application in both channels
    • Teams / Skype / any conferencing application using : NVDA left and application right

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please merge this section into SelectSoundSplitMode and CustomizeSoundSplitModes

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think as cyrille outlined here, the paragraph is not necessary. The documentation in settings should be sufficient

source/gui/settingsDialogs.py Outdated Show resolved Hide resolved
if gui.messageBox(
_(
# Translators: Warning shown when 'OFF' sound split mode is disabled in settings.
"You did not choose 'Off' as one of your sound split mode options. "
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO, this warning is not needed. I do not know how often someone has only one channel broken... The risk to lose speech is very low and not due to NVDA configuration in the first place.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, but would like to hear more feedback on this. The warning certainly doesn't hurt much, but I don't imagine anyone wanting remove "Off" from the list.

user_docs/en/userGuide.t2t Outdated Show resolved Hide resolved
source/gui/settingsDialogs.py Show resolved Hide resolved
Comment on lines +2819 to +2820
# Translators: Message shown when no sound split modes are enabled.
_("At least one sound split mode has to be checked."),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At least two modes for a cycling command:

Suggested change
# Translators: Message shown when no sound split modes are enabled.
_("At least one sound split mode has to be checked."),
# Translators: Message shown when less than two sound split modes are enabled.
_("At least two sound split mode have to be checked."),

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again I see no point in forcing user to select the second mode if they don't want it. It is still going to cycle through 1 mode, nothing is going to break. Let's not add artificial restrictions on the user.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again I see no point in forcing user to select the second mode if they don't want it. It is still going to cycle through 1 mode, nothing is going to break. Let's not add artificial restrictions on the user.

First of all, note that the speech mode has the same type of configuration of available values in a cycling command. And the choice has been done to keep two values. So it would be consistent to make the same choice for both commands. Still, we can re-discuss it here if you think that the choice made for speech mode was unadapted.

Second, there is no use case that I know where the user would configure only one sound split value in the command. If the user configures it with only one value, it's very likely unintended. If the user only wants one value, they will just not use the cycling command, so there is no point in configuring the available values for this command.
Thus, if only one value is present in the cycling command, it's better to warn the user as early as possible.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My opinion is that in this case cycling by a single option is justified. I don't think comparing this with the speech modes cycling makes sense, since the only way to change the mode is by a keyboard command, or restart of NVDA. For sound split you can have a default preferred mode and a second one which you need rarely, but switching to it has to be done fast. In that case you use the cycle command as a single way toggle and enable whatever mode you use as your main one from the GUI afterwards.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So let's take an example to check we understand well each other:

  • default preferred mode = disabled
  • second mode rarely needed, but switching to it has to be done fast = NVDA left and other apps right.

The user uses the second mode when receiving a call, so that switching can be done very fast.

If there are two modes available in the cycling command, I do not know why switching would be less fast:

  • if the user is already in split mode when the call arrives, there is nothing to do, so it's as fast as possible
  • if the user is in default mode when the call arrives, just pressing NVDA+alt+S is needed, which is as fast as with only one mode in the cycling command.

Have I missed something?
I maintain that a cycling command with only one possible value is a confusing user experience. So if there is no use case where a one-value cycling command is more efficient than a two-value cycling command, there is no point in allowing it.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@seanbudd, could you give your opinion about allowing or not to have only one mode in the cycling command?

My opinion is that there is no use case for a cycling command with only one mode. And if such use case is exhibited, I think that a cycling command with only one value is a bad UX; in this case the UX should be thought differently to support this use case more clearly.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CyrilleB79 - I mentioned here: #16071 (comment)

I agree, but would like to hear more feedback on this. The warning certainly doesn't hurt much, but I don't imagine anyone wanting remove "Off" from the list.

@seanbudd seanbudd marked this pull request as draft January 23, 2024 00:17
@AppVeyorBot
Copy link

See test results for failed build of commit b4f60f4746

@hwf1324
Copy link
Contributor

hwf1324 commented Jan 23, 2024

You can add comInterfaces/coreAudio to the Glob(exclude) parameter of the Clean function in comInterfaces_sconscript. to exclude it during SCons cleanup.

source/config/configSpec.py Outdated Show resolved Hide resolved
Comment on lines +2819 to +2820
# Translators: Message shown when no sound split modes are enabled.
_("At least one sound split mode has to be checked."),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My opinion is that in this case cycling by a single option is justified. I don't think comparing this with the speech modes cycling makes sense, since the only way to change the mode is by a keyboard command, or restart of NVDA. For sound split you can have a default preferred mode and a second one which you need rarely, but switching to it has to be done fast. In that case you use the cycle command as a single way toggle and enable whatever mode you use as your main one from the GUI afterwards.

user_docs/en/userGuide.t2t Outdated Show resolved Hide resolved
mltony and others added 6 commits February 28, 2024 14:49
Co-authored-by: Sean Budd <seanbudd123@gmail.com>
Co-authored-by: Sean Budd <seanbudd123@gmail.com>
Co-authored-by: Sean Budd <seanbudd123@gmail.com>
Co-authored-by: Sean Budd <seanbudd123@gmail.com>
Co-authored-by: Sean Budd <seanbudd123@gmail.com>
Co-authored-by: Sean Budd <seanbudd123@gmail.com>
@AppVeyorBot
Copy link

See test results for failed build of commit 7c0845a988

user_docs/en/changes.t2t Outdated Show resolved Hide resolved
user_docs/en/changes.t2t Outdated Show resolved Hide resolved
Copy link
Member

@seanbudd seanbudd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @mltony

@seanbudd seanbudd merged commit 6ceb015 into nvaccess:master Mar 6, 2024
1 check was pending
@nvaccessAuto nvaccessAuto added this to the 2024.2 milestone Mar 6, 2024
seanbudd pushed a commit that referenced this pull request Mar 6, 2024
Closes #16269
Fixup of #16071

Summary of the issue:
Exception _ctypes.COMError is thrown at startup on AppVeyor CI runner because hno sound device is present.

Description of user facing changes
N/A

Description of development approach
Catching and logging exception. Returning from soundSplit.initialize function so that initialization can continue.

Testing strategy:
Not sure how to test on AppVeyor, but judging by the exception providded - this should fix the error.
Tested on my local computer to avoid syntax errors.
Adriani90 pushed a commit to Adriani90/nvda that referenced this pull request Mar 13, 2024
Related to nvaccess#16071

Summary of the issue:
When linting we exclude certain directories where the code is auto generated. These exclusions are not working (this probably regressed with the Flake8 update, though I haven't checked).

Description of user facing changes
When linting exclusions in Flake8 configuration are once again respected.

Description of development approach
Flake8 considers that paths in the exclusion list are provided relative to the config file location not to the CWD, our exclusions were modified to account for this
After the file was modified I started getting errors due to usage of inline comments, apparently this was never supposed to work, as per this quote from the documentation:
Following the recommended settings for Python’s configparser, Flake8 does not support inline comments for any of the keys. So while this is fine:...

Therefore we no longer use inline comments in the config.
Adriani90 pushed a commit to Adriani90/nvda that referenced this pull request Mar 13, 2024
Fixes nvaccess#12985

Summary of the issue:
Feature request: sound split. Splits system sound into two channels: NVDA speaks in one channel (e.g. left), while all other applications play their sound in the other channel (e.g. right).

Description of user facing changes
Added global command NVDA+alt+s that toggles sound split between off, NVDA on the left and NVDA on the right (default behavior).
Added combo box on Audio panel in NVDA settings that also allows to switch between Sound split modes.
Added list of checkboxes in Audio panel, that allows to change behavior of NVDA+alt+s command: it allows to select all modes that the global command will cycle through.
Description of development approach
Added pycaw library as a dependency.
Created file source\audio\soundSplit.py where I implemented all logic.
Contrary to what I said before, I managed to implement sound split without creating an extra monitor thread. It works like this:
When sound split is toggled, it uses IAudioSessionEnumerator to set volume in all currently active audio sessions.
Then it does sessionManager.RegisterSessionNotification() to create a callback that listens for any new audio sessions being created, an it executes the the same volume updating function upon creation.
On the next call or on shutdown we unregister the previous notification callback.
Adriani90 pushed a commit to Adriani90/nvda that referenced this pull request Mar 13, 2024
…ess#16270)

Closes nvaccess#16269
Fixup of nvaccess#16071

Summary of the issue:
Exception _ctypes.COMError is thrown at startup on AppVeyor CI runner because hno sound device is present.

Description of user facing changes
N/A

Description of development approach
Catching and logging exception. Returning from soundSplit.initialize function so that initialization can continue.

Testing strategy:
Not sure how to test on AppVeyor, but judging by the exception providded - this should fix the error.
Tested on my local computer to avoid syntax errors.
@paulber19
Copy link

paulber19 commented Mar 14, 2024 via email

@CyrilleB79
Copy link
Collaborator

Because its technical implementation is not the same with and without WASAPI. Since WASAPI is the default mode and should remain the only one possible in the future, there was no point in spending time to also support sound split without WASAPI.

seanbudd added a commit that referenced this pull request May 10, 2024
Reverts PR
Reverts #16273

Issues fixed
Fixes #16409
Fixes #16402

Issues reopened
#16052

Brief reason for revert
We started with mltony creating:
#16051 Feature request: Sound split

Which was a duplicate of:
#12985 Audio settings with stereo headset (or speakers) - Send NVDA sounds on one side and the rest of Windows sounds on the other side

And then implemented by:
#16071 Sound split

mltony also created:
#16052 Feature request: add command to adjust volume of all applications except for NVDA

Which was implemented in:
#16273 Keystrokes to adjust applications volume and mute

This PR was approved and merged and was then found to cause issues:
#16402 Unmuting other apps does not work as expected
#16409 Apps mute and volume features work very unexpectedly with WASAPI disabled

Due to these issues and the considerable debate on the approach, the above PR #16273 was reverted by:
#16440

As an alternative to the revert #16440 to resolve the 2 issues (#16402, #16409) and keep #16273, mltony created:
#16404

The question now becomes, how do we proceed from here?

NV Access's position is that the sound split functionality (#16051) is a useful feature to add into core. However, due to the following reasons, we believe that further work on the volume adjustment features (#16273, #16404) to improve the UX is required on a branch (off master/alpha) before it can be added back in:

Windows sound mixer has reasonable accessibility.
Sound split on its own provides value to users.
The UX of swapping between NVDA volume control and windows volume control needs to be resolved.
The UX of resolving volume issues due to NVDA crashes needs to be resolved.
As one of the contributors on the threads said, "So now there are two mixers in the chain, one of which can be invisible, and overrides the other, or makes its settings relative instead of absolute."
seanbudd pushed a commit that referenced this pull request May 26, 2024
Various issues found in Sound Split feature description in the User Guide and in the GUI:

The User Guide does not explain the difference between "Sound split disabled" mode and "NVDA in both channels and applications in both channels" mode.
In the User Guide, the default option is called "Disabled sound split", but "Sound split disabled" in the GUI.
In the User Guide, the description of the way to restore the sound in both channels after a crash is not always correct, especially now that the "disabled" option does not modify audio processing at all.
The GUI warning when unchecking the Disabled mode is not correct since there are various other possible modes with speech in both channels (among them the new "NVDA both and app both"). The removal of this warning had been discussed and approved in Sound split #16071 (comment) but never completed.
Description of user facing changes
User Guide updated for 3 first items.
Warning removed from the GUI
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
conceptApproved Similar 'triaged' for issues, PR accepted in theory, implementation needs review.
Projects
None yet