Code Monkey home page Code Monkey logo

volume-control's Introduction

[Volume Control Banner]
GitHub tag (latest SemVer)   Downloads   Volume Control CLI Latest Version


Application-specific volume control that supports the keybindings you already use.
Designed for effortless music volume control (Spotify, Deezer, Chrome, Firefox, etc.) without disrupting gaming or VoIP audio.

What It Does

  • Lets you control the volume of specific programs using only the keyboard.
  • Can override pre-existing keys & key combinations, including all of the media keys.
  • All hotkeys are completely user-customizable and can be bound to a variety of actions.
  • New actions can be added via user-created addons.
  • Offers more features and a more compact UI than the Windows Volume Mixer.
  • And more!

How does it work?

Volume Control leverages the Win32 API to establish seamless native hotkeys, effectively superseding default Windows keybindings with imperceptible latency. Employing the same approach as the native Windows volume mixer, it offers compatibility with all applications.

Volume Control empowers users with an unlimited array of unique hotkey combinations, each fully customizable with specific actions. The default options include common actions like "Volume Up", "Volume Down", and "Toggle Mute". Furthermore, you have the flexibility to create and integrate your own custom actions in C# to enhance Volume Control's functionality.

Getting Started

Getting started is simple. Download VolumeControl-Installer.exe from the latest release, and run it. It will guide you through the installation process.

If you prefer to use a package manager, you can use Winget to install Volume Control:

winget install radj307.volume-control

A basic usage guide is available on the wiki.

Manual Installation

Download VolumeControl.exe from the latest release and move it to a location of your choice.

Before starting the program for the first time, you have to unblock the executable from the properties menu.
This is necessary because Windows requires paying >$300 a year for a Microsoft-approved publishing certificate in order to prevent Windows Defender from blocking it.
If you're unsure, you can always run it through VirusTotal first, or check the source code yourself.

  1. R+Click on VolumeControl.exe in the file explorer and select Properties in the context menu.
  2. Check the box next to Unblock:
  3. Click Ok to save the changes.

All that's left now is to run the application.

Contributing

See CONTRIBUTING.md for more information.

Addon Development

Want to develop an addon for Volume Control?
Get started with the tutorial!
We also have doxygen-generated API Documentation available online.

volume-control's People

Contributors

bovirus avatar dem757 avatar dependabot[bot] avatar radj307 avatar sitiom avatar stormingchaos avatar switch123456789 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

volume-control's Issues

[BUG] `EnabledDevices` still contains legacy blank entry

This doesn't actually affect anything, but should still be fixed.

Version

5.2.0-rc4

Actual Behaviour

Excerpt from volumecontrol.json:

"EnabledDevices": [
    ""
  ]

Something is still using the legacy behaviour & adding a blank entry to represent the default device.

Expected Behaviour

The blank entry shouldn't be used since the addition of the EnableDefaultDevice setting.

Reproduction Steps

  1. Delete any pre-existing volumecontrol.json file.
  2. Start Volume Control (re-creates the json file)
  3. View the contents of the JSON file.

Log

No response

Improve WPF UI

Currently the WPF version has a partially-implemented UI that is mainly intended for testing purposes.
This should be improved before the 5.0.0 release.

  • Improve the contrast between the background and foreground layers
  • Fix the bright white DataGrid headers.
  • Improve the layout of the Settings tab by grouping similar settings together.
  • Add a version number watermark.
  • Replace overuse of solid colors with gradients, such as on data grid column headers.
  • Improve gradient colors
  • Add handling for combo boxes
  • Improve layout of controls to reduce clutter

Planned Feature: Cycle Through Target Processes

Target Selection Hotkeys

This should allow cycling the current target audio session using hotkeys, allowing the user to perform common interactions with the application using only the keyboard.

Process Container Overhaul:

  • Process List
    • Predictability of the order of processes is important.
      • Do not allow removal of the current selection to preserve positioning.
      • Allow configurable sorting, but prioritize implementation first.
    • Maintain an iterator pointing to the currently selected process.
      • Increment
        • Used when the Next Target hotkey is pressed.
      • Decrement
        • Used when the Previous Target hotkey is pressed.
      • Set Position
        • Used when loading the program.
      • Get Position
        • Used by almost everything

New Settings:

All of the below settings will only be checked if at least one of the target selection hotkeys is enabled.

  • TargetNotificationEnabled
    • Type: bool
    • Default: true
  • TargetNotificationTimeout
    • Type: uint
    • Default: 1000
  • ListEnabled
    • Type: bool
    • Default: true
  • ListTimeout
    • Type: uint
    • Default: 4000

New Hotkeys:

  • Next Target
    • Self-explanatory.
  • Previous Target
    • Self-explanatory.
  • Show Target List
    • Triggers the target selection notification.
      • Displays the whole target list.
      • Displays the current target with a highlight.
      • Next Target & Previous Target live-update the selection indicator.

Order of Operations

Occurs each time a target selection hotkey is pressed.

  1. Reload the list of audio sessions & update the process list, preserving as much positioning as possible.
  2. Increment/decrement the process indexer if applicable.
  3. If Show Target List was pressed, show the target list window, otherwise show the toast notification if enabled.

Pressing any of the application-specific hotkeys will now affect the newly selected audio session.

Target Process Dropdown:

This is the pre-existing method of notifying the user, but it isn't suitable as an indicator due to the fact that the main window is usually hidden.

Toast Notification:

  • Configurable on-screen toast notification that shows the newly selected process for x milliseconds.

List Window

  • Shows all currently registered audio sessions (applications) in a list

Workaround for `ShowWindow` multi-form limitation

Currently the toast notification form & the volume level indicator form's implementation of ShowWindow conflicts and only the last process to initialize works correctly with it.

This causes the behaviour observed in commit 912155c

[BUG] `5.0.x` Settings aren't preserved when updating

Version

5.0.x

Actual Behaviour

When updating to any 5.0.x version, user settings are not preserved from any previous installations.

Expected Behaviour

I would expect the program to correctly retain its configuration between versions that differ only by their [minor|patch] number.

Reproduction Steps

  1. Have an older-than-latest version of volume control installed but not running; make sure the settings are not set to their default values for that version or the latest version.
  2. Run the latest VolumeControl.exe for the first time.
  3. Observe that the settings from the previous version are not preserved and have been reset to the default values of the latest version.

Log

No response

[BUG] Application sometimes does not start completely minimized

Version

5.2.0-rc*

Actual Behaviour

Upon launching application with "start minimized" on, A minimized version pops up in the bottom left of my screen, I can click it to show the context menu, and double clicking, fully opens the volume control process.

Expected Behaviour

program should open silently and make you think, "wait did it actually open?" prompting you to show hidden items in your taskbar and realising, yes, it is open, it was sneaky like a good little background process

Reproduction Steps

!. Turn on Start minimized
2. close application
3. open application
4. witness minimized title bar in bottom left

Log

a bunch of stuff about how a 32 bit process cannot query information from a 64 bit process

[BUG] Rare Hotkey Registration Failure on Startup

I've noticed that sometimes hotkey registrations aren't successful for no apparent reason - unfortunately I haven't been able to reliably reproduce this and haven't even managed to reproduce it with logging enabled.

[BUG] Multiple Instances of Discord is showing up in Mixer

Version

5.2.5

Actual Behaviour

I only have one instance of Discord Running, but the mixer tab is showing 3 PID associated with Discord. This is confusing as to which controls the volume for that app.

Expected Behaviour

Expect only one PID/Name for an application to be shown

Reproduction Steps

Launch Volume Control, Launch Discord, In Discord Voice Settings: output device is set to Default

Log

HH:mm:ss:fff           === Log Initialized @ Wednesday, January 18, 2023 1:56:04 AM ===  { Filter: 30 (ALL_EXCEPT_DEBUG) }
HH:mm:ss:fff           === Log Re-Initialized @ Wednesday, January 18, 2023 1:56:04 AM ===  { Filter: 31 (ALL) }
20:56:04:265  [DEBUG]  Property '__VERSION__' was modified, saving Config...
20:56:04:297  [DEBUG]  Successfully loaded language config 'C:\Users\<USERNAME>\AppData\Local\radj307\Localization\de.loc.json'
20:56:04:298  [DEBUG]  Successfully loaded language config 'C:\Users\<USERNAME>\AppData\Local\radj307\Localization\en.loc.json'
20:56:04:298  [DEBUG]  Successfully loaded language config 'C:\Users\<USERNAME>\AppData\Local\radj307\Localization\fr.loc.json'
20:56:04:299  [DEBUG]  Successfully loaded language config 'C:\Users\<USERNAME>\AppData\Local\radj307\Localization\it.loc.json'
20:56:04:299  [DEBUG]  Successfully loaded language config 'C:\Users\<USERNAME>\AppData\Local\radj307\Localization\pt.loc.json'
20:56:04:630  [DEBUG]  VCSettings initializing...
20:56:04:787  [DEBUG]  .ctor is setting the hook source to '798280' (Was null)
20:56:04:787  [DEBUG]  Attached a message hook from 'AddMaximizeBugFixHandler'.
20:56:04:790  [DEBUG]  VCSettings.ExecutablePath = 'C:\Users\<USERNAME>\OneDrive\Desktop\Computer Things\Volume Control\VolumeControl.exe'
20:56:04:790  [DEBUG]  VCSettings.CurrentVersion = '5.2.5'
20:56:04:791  [DEBUG]  VCSettings.ReleaseType = 'NORMAL'
20:56:04:792  [DEBUG]  VCSettings initialization completed.
20:56:05:363  [DEBUG]  Skipped loading addons because no search directories were located.
20:56:05:364  [DEBUG]  Initialized ActionAddonAttribute
20:56:05:368  [INFO]   Volume Control v5.2.5
20:56:21:501  [DEBUG]  GetIcons called with path '@%SystemRoot%\System32\AudioSrv.Dll' => 'C:\Windows\System32\AudioSrv.Dll'
20:56:21:520  [WARN]   Session '7692:Discord' doesn't exist; searching for near-matches...
20:56:21:520  [WARN]   Session '7692:Discord' doesn't exist; searching for near-matches...
20:56:21:521  [WARN]   Session '7692:Discord' doesn't exist; searching for near-matches...
20:56:21:521  [WARN]   Session '7692:Discord' doesn't exist; searching for near-matches...
20:56:21:523  [WARN]   Session '7692:Discord' doesn't exist; searching for near-matches...
20:56:21:524  [WARN]   Session '7692:Discord' doesn't exist; searching for near-matches...
20:56:21:525  [WARN]   Session '7692:Discord' doesn't exist; searching for near-matches...
20:56:21:525  [DEBUG]  Finished binding event handler method 'HandleShow' to VolumeControl.Audio.AudioAPI events.
20:56:29:002  [DEBUG]  8220:Discord created an audio session on device 'Headphones (Realtek(R) Audio)'
20:56:29:010  [DEBUG]  GetIcons called with path 'C:\Users\<USERNAME>\AppData\Local\Discord\app-1.0.9008\Discord.exe'
20:56:29:021  [DEBUG]  8220:Discord created an audio session on device 'Broadcast'
20:56:29:036  [DEBUG]  8220:Discord created an audio session on device 'Speakers (Realtek(R) Audio)'
20:56:29:630  [DEBUG]  2424:Discord created an audio session on device 'Speakers (Realtek(R) Audio)'
20:56:29:637  [DEBUG]  GetIcons called with path 'C:\Users\<USERNAME>\AppData\Local\Discord\app-1.0.9008\Discord.exe'
20:56:29:647  [DEBUG]  2424:Discord state changed to AudioSessionStateActive
20:56:31:365  [DEBUG]  8220:Discord state changed to AudioSessionStateActive
20:56:59:646  [DEBUG]  2424:Discord state changed to AudioSessionStateInactive
20:57:11:531  [DEBUG]  2424:Discord created an audio session on device 'Headphones (Realtek(R) Audio)'
20:57:12:372  [DEBUG]  8220:Discord state changed to AudioSessionStateInactive
20:57:12:405  [DEBUG]  8220:Discord state changed to AudioSessionStateActive
20:57:16:376  [DEBUG]  8220:Discord state changed to AudioSessionStateInactive
20:57:16:406  [DEBUG]  8220:Discord state changed to AudioSessionStateActive

[BUG] Hotkeys Don't Work in Some Games

Version

5.2.2

Actual Behaviour

hotkeys don't work while the game "Euro Truck Simulator 2" (DX11 x64) is focused (Windows 11).

Reproduction Steps

  1. focus ETS2
  2. try hotkeys (they do not work)

[BUG] Notification doesn't show when Main Window Hasn't been visible at least once

Version

5.2.x

Actual Behaviour

When Start Minimized is true & the main window hasn't been visible at least once, the notification window doesn't appear.

I believe this is caused by Windows' implementation of "window handles" (Commonly called HWnd).
This behaviour is described on the MSDN page for the ShowWindow function.

Expected Behaviour

The Notification window appears regardless of the state of the main window.

Reproduction Steps

  1. Enable Start Minimized, select a target & ensure hotkeys are enabled
  2. Restart Volume Control
  3. Notification window doesn't appear when using hotkeys

Log

No response

[BUG] Tooltips are malformed when not provided by a translation

Version

5.2.3

Actual Behaviour

Hovering over "Show in taskbar" and "Always on top" shows the name of the variable instead of the actual tooltip.
image

Brand new installation on computer that has never installed volume control

Expected Behaviour

No response

Reproduction Steps

No response

Log

No response

Volume Control 2.5.1 - Language name issue in language file

@radj307

In xx.loc.json file there is a string

"LanguageName": {
"Italiano (Italian)": "Italiano"

The first value ("italiano (Italian)" now is what appear in language selection drop down menu

The second value ("Italiano") I didn't udnerstand where is uaed.

In my vision should be work in different way

The first value should be always in English (ex. "italian") and should used for internal processing.

The sceond value should be the name that appear in drop down language file selection.
For me should be "Italiano (Italian)" where appear local name language plus english translation.
The iof someone made a wrong Italin selection can see also english value and identified it.

[BUG] Failed to query information for process XXXX

Version

5.2.0-rc*

Actual Behaviour

cannot query icon information for many 64bit processes
likely to be the cause of unexpected crashes

Expected Behaviour

No response

Reproduction Steps

No response

Log

18:28:18:836  [ERROR]  Failed to query information for process 11688
                       {
                         'Message': 'A 32 bit processes cannot access modules of a 64 bit process.'
                         'HResult': '-2147467259'
                         'Source': 'System.Diagnostics.Process'
                         'TargetSite': {
                           'Name': 'GetModules'
                           'DeclaringType': 'System.Diagnostics.NtProcessManager'
                           'Attributes': 'PrivateScope, Private, Static, HideBySig'
                           'CallingConvention': 'Standard'
                         }
                         'StackTrace': {
                           [0] at System.Diagnostics.NtProcessManager.GetModules(Int32 processId, Boolean firstModuleOnly)
                           [1] at System.Diagnostics.NtProcessManager.GetFirstModule(Int32 processId)
                           [2] at System.Diagnostics.Process.get_MainModule()
                           [3] at VolumeControl.Audio.AudioSession.GetIcons()
                         }
                       }

[BUG] Program not Running on Startup

Version

5.0.x

Actual Behaviour

Registry key points towards TEMP directory.
Volume Control does not launch on startup when the Run at Startup setting is enabled.

Expected Behaviour

Program launches on startup when the Run at Startup setting is enabled.

Reproduction Steps

Turn on Run on Startup Option
Turn off computer
Turn on computer
Observe program not opening automatically

Log

No response

crashes on startup

every time i try to open the application it crashes without opening. the preview version 6.0.0 opens fine but is completely blank as i assume its not finished.

im using windows 11 if that means anything.

here is the full crash report:

`////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                         /// VOLUME CONTROL CRASH REPORT /// 21:55:20:385  [FATAL]   ///

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

HH:mm:ss:fff === Log Initialized @ Saturday, January 28, 2023 5:55:18 AM === { Filter: 30 (ALL_EXCEPT_DEBUG) }
21:55:18:951 [INFO] The version number in the settings file was 0.0.0, settings will be upgraded to 5.2.5.
21:55:20:347 [ERROR] {
'Message': 'Process with an Id of 18864 is not running.'
'HResult': '-2147024809'
'Source': 'System.Diagnostics.Process'
'TargetSite': {
'Name': 'GetProcessById'
'DeclaringType': 'System.Diagnostics.Process'
'Attributes': 'PrivateScope, Public, Static, HideBySig'
'CallingConvention': 'Standard'
}
'StackTrace': {
[0] at System.Diagnostics.Process.GetProcessById(Int32 processId, String machineName)
[1] at System.Diagnostics.Process.GetProcessById(Int32 processId)
[2] at VolumeControl.Audio.AudioSession.GetProcess()
}
}
21:55:20:359 [ERROR] The constructor of 'VolumeControl.Audio.AudioSession' encountered an error when getting process with ID '18864'!
21:55:20:359 [ERROR] An unhandled exception occurred!
Sender: 'System.Windows.Threading.Dispatcher' (System.Windows.Threading.Dispatcher)
{
'Message': 'Exception has been thrown by the target of an invocation.'
'HResult': '-2146232828'
'Source': 'System.Private.CoreLib'
'TargetSite': {
'Name': 'CreateInstanceDefaultCtor'
'DeclaringType': 'System.RuntimeType'
'Attributes': 'PrivateScope, Assembly, HideBySig'
'CallingConvention': 'Standard, HasThis'
}
'Data':{
'System.Object': ''
}
'StackTrace': {
[0] at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)
[1] at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
[2] at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
[3] at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
[4] at System.Activator.CreateInstance(Type type, Object[] args)
[5] at System.Xaml.Schema.SafeReflectionInvoker.CreateInstanceCritical(Type type, Object[] arguments)
[6] at System.Xaml.Schema.XamlTypeInvoker.CreateInstance(Object[] arguments)
[7] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstanceWithCtor(XamlType xamlType, Object[] args)
[8] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstance(XamlType xamlType, Object[] args)
[9] at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx)
[10] at System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember property)
[11] at System.Xaml.XamlWriter.WriteNode(XamlReader reader)
[12] at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack1 stack, IStyleConnector styleConnector) [13] at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) [14] at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) [15] at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) [16] at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc) [17] at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties) [18] at System.Windows.Application.DoStartup() [19] at System.Windows.Application.<.ctor>b__1_0(Object unused) [20] at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) [21] at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) } 'InnerException': { 'Message': 'Exception has been thrown by the target of an invocation.' 'HResult': '-2146232828' 'Source': 'System.Private.CoreLib' 'TargetSite': { 'Name': 'CreateInstanceDefaultCtor' 'DeclaringType': 'System.RuntimeType' 'Attributes': 'PrivateScope, Assembly, HideBySig' 'CallingConvention': 'Standard, HasThis' } 'StackTrace': { [0] at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions) [1] at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions) [2] at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture) [3] at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) [4] at System.Activator.CreateInstance(Type type, Object[] args) [5] at System.Xaml.Schema.SafeReflectionInvoker.CreateInstanceCritical(Type type, Object[] arguments) [6] at System.Xaml.Schema.XamlTypeInvoker.CreateInstance(Object[] arguments) [7] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstanceWithCtor(XamlType xamlType, Object[] args) [8] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstance(XamlType xamlType, Object[] args) [9] at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx) [10] at System.Xaml.XamlObjectWriter.WriteEndObject() [11] at System.Xaml.XamlWriter.WriteNode(XamlReader reader) [12] at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack1 stack, IStyleConnector styleConnector)
[13] at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
[14] at System.Windows.ResourceDictionary.CreateObject(KeyRecord key)
[15] at System.Windows.ResourceDictionary.OnGettingValue(Object key, Object& value, Boolean& canCache)
[16] at System.Windows.ResourceDictionary.OnGettingValuePrivate(Object key, Object& value, Boolean& canCache)
[17] at System.Windows.ResourceDictionary.GetValueWithoutLock(Object key, Boolean& canCache)
[18] at System.Windows.ResourceDictionary.GetValue(Object key, Boolean& canCache)
[19] at System.Windows.ResourceDictionary.FetchResource(Object resourceKey, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference, Boolean canCacheAsThemeResource, Boolean& canCache)
[20] at System.Windows.FrameworkElement.FindResourceInternal(FrameworkElement fe, FrameworkContentElement fce, DependencyProperty dp, Object resourceKey, Object unlinkedParent, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference, DependencyObject boundaryElement, Boolean isImplicitStyleLookup, Object& source)
[21] at System.Windows.StaticResourceExtension.FindResourceInAppOrSystem(IServiceProvider serviceProvider, Boolean allowDeferredReference, Boolean mustReturnDeferredResourceReference)
[22] at System.Windows.StaticResourceExtension.FindResourceInEnviroment(IServiceProvider serviceProvider, Boolean allowDeferredReference, Boolean mustReturnDeferredResourceReference)
[23] at System.Windows.StaticResourceExtension.TryProvideValueImpl(IServiceProvider serviceProvider, Boolean allowDeferredReference, Boolean mustReturnDeferredResourceReference)
[24] at System.Windows.StaticResourceExtension.TryProvideValueInternal(IServiceProvider serviceProvider, Boolean allowDeferredReference, Boolean mustReturnDeferredResourceReference)
[25] at System.Windows.StaticResourceExtension.ProvideValueInternal(IServiceProvider serviceProvider, Boolean allowDeferredReference)
[26] at System.Windows.StaticResourceExtension.ProvideValue(IServiceProvider serviceProvider)
[27] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider)
[28] at System.Xaml.XamlObjectWriter.Logic_ProvideValue(ObjectWriterContext ctx)
[29] at System.Xaml.XamlObjectWriter.Logic_AssignProvidedValue(ObjectWriterContext ctx)
[30] at System.Xaml.XamlObjectWriter.WriteEndMember()
[31] at System.Xaml.XamlWriter.WriteNode(XamlReader reader)
[32] at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack1 stack, IStyleConnector styleConnector) [33] at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) [34] at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) [35] at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) [36] at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) [37] at VolumeControl.Mixer.InitializeComponent() [38] at VolumeControl.Mixer..ctor() [39] at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions) } 'InnerException': { 'Message': 'Object reference not set to an instance of an object.' 'HResult': '-2147467261' 'Source': 'VolumeControl.Audio' 'TargetSite': { 'Name': 'Dispose' 'DeclaringType': 'VolumeControl.Audio.AudioSession' 'Attributes': 'PrivateScope, Public, Final, Virtual, HideBySig, VtableLayoutMask' 'CallingConvention': 'Standard, HasThis' } 'StackTrace': { [0] at VolumeControl.Audio.AudioSession.Dispose() [1] at VolumeControl.Audio.AudioSession..ctor(AudioSessionControl controller) [2] at VolumeControl.Audio.AudioDevice.ReloadSessions() [3] at VolumeControl.Audio.AudioDevice..ctor(MMDevice device) [4] at VolumeControl.Audio.Collections.AudioDeviceCollection.CreateDeviceFromMMDevice(MMDevice mmDevice) [5] at VolumeControl.Audio.Collections.AudioDeviceCollection.Reload(MMDeviceEnumerator enumerator) [6] at VolumeControl.Audio.Collections.AudioDeviceCollection..ctor(AudioAPI api, DataFlow flow) [7] at VolumeControl.Audio.AudioAPI..ctor() [8] at VolumeControl.Helpers.VolumeControlSettings..ctor() [9] at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions) } } } } 21:55:20:364 [FATAL] App exited because of an unhandled exception! { 'Message': 'Exception has been thrown by the target of an invocation.' 'HResult': '-2146232828' 'Source': 'System.Private.CoreLib' 'TargetSite': { 'Name': 'CreateInstanceDefaultCtor' 'DeclaringType': 'System.RuntimeType' 'Attributes': 'PrivateScope, Assembly, HideBySig' 'CallingConvention': 'Standard, HasThis' } 'Data':{ 'System.Object': '' } 'StackTrace': { [0] at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions) [1] at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions) [2] at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture) [3] at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) [4] at System.Activator.CreateInstance(Type type, Object[] args) [5] at System.Xaml.Schema.SafeReflectionInvoker.CreateInstanceCritical(Type type, Object[] arguments) [6] at System.Xaml.Schema.XamlTypeInvoker.CreateInstance(Object[] arguments) [7] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstanceWithCtor(XamlType xamlType, Object[] args) [8] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstance(XamlType xamlType, Object[] args) [9] at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx) [10] at System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember property) [11] at System.Xaml.XamlWriter.WriteNode(XamlReader reader) [12] at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack1 stack, IStyleConnector styleConnector)
[13] at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
[14] at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
[15] at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
[16] at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc)
[17] at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
[18] at System.Windows.Application.DoStartup()
[19] at System.Windows.Application.<.ctor>b__1_0(Object unused)
[20] at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
[21] at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
[22] at System.Windows.Threading.DispatcherOperation.InvokeImpl()
[23] at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
[24] at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
[25] at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[26] --- End of stack trace from previous location ---
[27] at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[28] at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
[29] at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
[30] at System.Windows.Threading.DispatcherOperation.Invoke()
[31] at System.Windows.Threading.Dispatcher.ProcessQueue()
[32] at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
[33] at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
[34] at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
[35] at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
[36] at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
[37] at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
[38] at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
[39] at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
[40] at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
[41] at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
[42] at System.Windows.Threading.Dispatcher.Run()
[43] at System.Windows.Application.RunDispatcher(Object ignore)
[44] at System.Windows.Application.RunInternal(Window window)
[45] at System.Windows.Application.Run()
[46] at VolumeControl.Program.Main(String[] args)
}
'InnerException': {
'Message': 'Exception has been thrown by the target of an invocation.'
'HResult': '-2146232828'
'Source': 'System.Private.CoreLib'
'TargetSite': {
'Name': 'CreateInstanceDefaultCtor'
'DeclaringType': 'System.RuntimeType'
'Attributes': 'PrivateScope, Assembly, HideBySig'
'CallingConvention': 'Standard, HasThis'
}
'StackTrace': {
[0] at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)
[1] at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
[2] at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
[3] at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
[4] at System.Activator.CreateInstance(Type type, Object[] args)
[5] at System.Xaml.Schema.SafeReflectionInvoker.CreateInstanceCritical(Type type, Object[] arguments)
[6] at System.Xaml.Schema.XamlTypeInvoker.CreateInstance(Object[] arguments)
[7] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstanceWithCtor(XamlType xamlType, Object[] args)
[8] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstance(XamlType xamlType, Object[] args)
[9] at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx)
[10] at System.Xaml.XamlObjectWriter.WriteEndObject()
[11] at System.Xaml.XamlWriter.WriteNode(XamlReader reader)
[12] at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack1 stack, IStyleConnector styleConnector) [13] at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) [14] at System.Windows.ResourceDictionary.CreateObject(KeyRecord key) [15] at System.Windows.ResourceDictionary.OnGettingValue(Object key, Object& value, Boolean& canCache) [16] at System.Windows.ResourceDictionary.OnGettingValuePrivate(Object key, Object& value, Boolean& canCache) [17] at System.Windows.ResourceDictionary.GetValueWithoutLock(Object key, Boolean& canCache) [18] at System.Windows.ResourceDictionary.GetValue(Object key, Boolean& canCache) [19] at System.Windows.ResourceDictionary.FetchResource(Object resourceKey, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference, Boolean canCacheAsThemeResource, Boolean& canCache) [20] at System.Windows.FrameworkElement.FindResourceInternal(FrameworkElement fe, FrameworkContentElement fce, DependencyProperty dp, Object resourceKey, Object unlinkedParent, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference, DependencyObject boundaryElement, Boolean isImplicitStyleLookup, Object& source) [21] at System.Windows.StaticResourceExtension.FindResourceInAppOrSystem(IServiceProvider serviceProvider, Boolean allowDeferredReference, Boolean mustReturnDeferredResourceReference) [22] at System.Windows.StaticResourceExtension.FindResourceInEnviroment(IServiceProvider serviceProvider, Boolean allowDeferredReference, Boolean mustReturnDeferredResourceReference) [23] at System.Windows.StaticResourceExtension.TryProvideValueImpl(IServiceProvider serviceProvider, Boolean allowDeferredReference, Boolean mustReturnDeferredResourceReference) [24] at System.Windows.StaticResourceExtension.TryProvideValueInternal(IServiceProvider serviceProvider, Boolean allowDeferredReference, Boolean mustReturnDeferredResourceReference) [25] at System.Windows.StaticResourceExtension.ProvideValueInternal(IServiceProvider serviceProvider, Boolean allowDeferredReference) [26] at System.Windows.StaticResourceExtension.ProvideValue(IServiceProvider serviceProvider) [27] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider) [28] at System.Xaml.XamlObjectWriter.Logic_ProvideValue(ObjectWriterContext ctx) [29] at System.Xaml.XamlObjectWriter.Logic_AssignProvidedValue(ObjectWriterContext ctx) [30] at System.Xaml.XamlObjectWriter.WriteEndMember() [31] at System.Xaml.XamlWriter.WriteNode(XamlReader reader) [32] at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack1 stack, IStyleConnector styleConnector)
[33] at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
[34] at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
[35] at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
[36] at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
[37] at VolumeControl.Mixer.InitializeComponent()
[38] at VolumeControl.Mixer..ctor()
[39] at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)
}
'InnerException': {
'Message': 'Object reference not set to an instance of an object.'
'HResult': '-2147467261'
'Source': 'VolumeControl.Audio'
'TargetSite': {
'Name': 'Dispose'
'DeclaringType': 'VolumeControl.Audio.AudioSession'
'Attributes': 'PrivateScope, Public, Final, Virtual, HideBySig, VtableLayoutMask'
'CallingConvention': 'Standard, HasThis'
}
'StackTrace': {
[0] at VolumeControl.Audio.AudioSession.Dispose()
[1] at VolumeControl.Audio.AudioSession..ctor(AudioSessionControl controller)
[2] at VolumeControl.Audio.AudioDevice.ReloadSessions()
[3] at VolumeControl.Audio.AudioDevice..ctor(MMDevice device)
[4] at VolumeControl.Audio.Collections.AudioDeviceCollection.CreateDeviceFromMMDevice(MMDevice mmDevice)
[5] at VolumeControl.Audio.Collections.AudioDeviceCollection.Reload(MMDeviceEnumerator enumerator)
[6] at VolumeControl.Audio.Collections.AudioDeviceCollection..ctor(AudioAPI api, DataFlow flow)
[7] at VolumeControl.Audio.AudioAPI..ctor()
[8] at VolumeControl.Helpers.VolumeControlSettings..ctor()
[9] at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)
}
}
}
}
`

[IDEA] Full Audio-Mixer Replacement

Full Audio-Mixer Replacement

This, in essence, would mimic the Windows Audio Mixer in terms of appearance & function, with the added benefits of the current target list window's features:

  • Indicate the currently selected target application
  • Indicate the current process volume
  • Select the target using the mouse

[FEATURE] Lock Current Target

Feature Addition

Add a hotkey (and a toggle-switch) for locking the current target, preventing it from being switched even if one of the switch target hotkeys is pressed, or the target becomes unavailable, or any other reason.

This will require wrapping the (audio session <=> list element) data bindings with one capable of inserting a "virtual" process.

WPF Migration Progress

Currently the following features are missing from the WPF version that should be added before the 5.0.0 release:

  • Hotkey overhaul
  • Migrate to using NAudio
  • System Tray Icon
  • Volume Notifications
  • Target Notifications
  • Run on Startup
  • Start Minimized
  • Show in Taskbar
  • Always on Top
  • Polish UI
  • Double-check the list of valid keys for anything that could break things

Improve Rewrite UI

As of 72a00f1 (4.0.0-pre2), all of the main features have been fully implemented.
The only remaining task before a full release is improving on the UI.

  • Add dark theme.
  • Improve the layout of the main form.

Non-Default Audio Device Support

Currently audio process support is limited to the default audio device; the audio API wrapper's implementation is still mostly ripped from Toastify and is in need of replacement.

The audio API should be replaced with one that has better support for audio devices.

[BUG] 5.2.1 - GUI issues

@radj307

Using Italian language I found some issues.

Please check screenshot

image

Some strings are untranslated.
Move from main settings json file to language json file.

The width of "Maiusc" coulmn is too small.
Please enlarge main window width and increase space for "Maiusc" column.

[BUG] [6.0.0-pr3] NotifyIcon isn't visible

Version

6.0.0-pr3

Actual Behaviour

The system tray NotifyIcon doesn't appear in Release configuration.

Expected Behaviour

The system tray NotifyIcon should appear.

Reproduction Steps

  1. Download and run v6.0.0-pr3
  2. NotifyIcon doesn't appear

Log

No response

[BUG] `NotifyIcon` Context Menu Translations are Broken

Version

5.2.1-5.2.2

Actual Behaviour

The text in the notify icon's context menu is broken
image

Expected Behaviour

The text in the notify icon's context menu shows the correct translation and isn't just garbage characters

Reproduction Steps

  1. Launch the program
  2. Open the tray icon's context menu
  3. observe

Log

No response

[BUG] 5.2.4-1 - Button width not enough

Version

5.2.4-1

Actual Behaviour

Button width is not enought for text

image

Expected Behaviour

Button width larger

Reproduction Steps

No response

Log

No response

[FEATURE] Visual for AudioDevice control

When using Hotkeys for Device, it is confusing as to which device I am currently changing, and its current volume. It would be nice to have visuals like for Sessions

UI additions

  • Indication that a button has been clicked (change colour on mouse click)
  • Darken colour of comboboxes
  • darken colour of check boxes
  • darken colour of numericupdown
  • adjust sizing of mixer columns so that the volume number of not cut off when its 100
  • move settings options around for better organization + adjust sizing

Issues with multiple identically-named sessions

This is most often seen with Discord, which sometimes decides, inexplicably, to have 2 identically named audio sessions.

It causes issues in the internal management of the current 'target', which manifests in the 'Next Target' hotkey being unable to increment the current target at all.

D/X-input support

Hey, I wonder if you would consider adding support for Xinput and/or Dinput devices to be used to control the volume?
At the moment I am using AntiMicroX to control some media related stuff with my racing wheel (to mimic radio-controls in ETS2), but I am missing a way to control the volume of the music ONLY. Right now I using a combination of volume-control and AntiMicroX to make it work, but I am sure you can see why this is a pretty janky solution in many regards.

[FEATURE] Drop-Down Menu for "Target Override"

Love everything you guys have done so far. Just wanted to also suggest a drop-down menu within the Hotkeys' "Target Override" option, as this would be an exponential leap in streamlining things, making it hands-down the most accessible option out there, period.

With a drop-down menu displaying every available source right off the bat, there would also be no need to refer to the Mixer tab, and thus no concerns about typing anything incorrectly if someone feels the need to resort to that instead of copying & pasting from the Mixer tab for whatever reason. And again, it would just be soooooooooo dang fast.

If you are to consider such an implementation, it should also have a lil something to let people know it's a drop-down, instead of remaining completely blank when nothing is selected. Like text that says "-- Select --" or a small down arrow on the right side, or maybe both—something that's quick and obvious.

Thanks!

Full Rewrite

  • Rewrite the entire project to eliminate code duplication & improve overall performance/memory usage.

[BUG] Hotkey Target Override no longer works in Preview 3

Version

6.0.0-pr3

Actual Behaviour

This version is very broken since the last release (6.0.0-rc1), as I am incapable of controlling multiple applications/sessions simultaneously, and am only able to control ANYTHING if I have a specific session "Selected" in the Mixer tab.

Expected Behaviour

I understand that this is a "preview release", but so was rc1, and that version works as needed, so there's something missing between then and now.

Reproduction Steps

  1. Open program
  2. Go into "Hotkeys" tab
  3. Delete any unwanted/cluttered hotkeys (the bottom 3)
  4. With "Volume Up", "Volume Down", and "Toggle Mute" as remaining options, edit the "Key" to the desired key for each; from top to bottom: NumPad2, NumPad1, NumPad0. Again, for VolUp, VolDown, and Toggle Mute respectively.
  5. Assign "Alt" as the only modifier for each key.
  6. Check ON all 3 keys by using the left checkbox column selector
  7. Click the tool icon/Target Override, and add my primary internet browser (LibreWolf) as the only application for both Volume Up and Volume Down.
  8. Set Google Chrome ("chrome") as the only source for "Toggle Mute"
  9. Go back into Mixer tab and attempt using hotkeys.
  10. Nothing changes at all.
  11. Click "Select" on either of my applications while in the Mixer tab
  12. Hotkeys work but only for the selected application, since it was "selected" in this section, and not "added" in the Target Override.

Log

HH:mm:ss:fff           === Log Initialized @ April 2, 2023 6:13:54 PM ===  { Filter: 30 (ALL_EXCEPT_DEBUG) }
14:13:55:811  [ERROR]  Hotkey 1 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:13:55:812  [ERROR]  Hotkey 2 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:13:55:813  [ERROR]  Hotkey 3 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:13:55:813  [ERROR]  Hotkey 4 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:13:55:814  [ERROR]  Hotkey 5 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:13:55:814  [ERROR]  Hotkey 6 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:13:55:820  [INFO]   Volume Control v6.0.0-pr3
14:17:49:946  [ERROR]  Hotkey 1 registration failed:  'Hot key is already registered.' (HRESULT: 1409)
14:17:49:947  [ERROR]  Hotkey 2 registration failed:  'Hot key is already registered.' (HRESULT: 1409)
14:17:49:947  [ERROR]  Hotkey 3 registration failed:  'Hot key is already registered.' (HRESULT: 1409)
14:22:07:426  [INFO]   Session selected: '15820:chrome' ({0.0.0.00000000}.{7125a004-daab-499d-9b8e-07658374c6ce}|\Device\HarddiskVolume2\Program Files\Google\Chrome\Application\chrome.exe%b{00000000-0000-0000-0000-000000000000}|10%b15820)


Log for version rc1:

HH:mm:ss:fff           === Log Initialized @ April 2, 2023 6:27:28 PM ===  { Filter: 30 (ALL_EXCEPT_DEBUG) }
14:27:30:756  [INFO]   Volume Control v6.0.0-rc1
14:27:58:400  [ERROR]  Hotkey 3 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:27:58:404  [ERROR]  Hotkey 2 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:27:58:407  [ERROR]  Hotkey 1 unregistration failed:  'Hot key is not registered.' (HRESULT: 1419)
14:27:58:491  [INFO]   App exited with code 0

[BUG] Settings aren't preserved when program is terminated

Version

5.0.x

Actual Behaviour

Currently, all settings are only saved when the program shuts down normally.

This causes problems when the program is terminated, as none of the settings are preserved.

Expected Behaviour

Changing a setting immediately changes the setting, and should be preserved regardless of other user actions.

The setting values should be used directly, and saved whenever they are updated.

Reproduction Steps

  1. Start the program
  2. Change some of the settings or hotkeys
  3. Terminate the program or restart the system
  4. Start the program & observe that none of the changed settings were preserved

Log

No response

[FEATURE] About tab

Originally posted by @bovirus in #32 (comment)

About Tab

I believe it could be interesting to have an "About" tab to show information about the program, like the name and current version, as well as links to the issues (support) page.

Multilanguage GUI

@radj307

Thanks for your software.

Could you pelase consdier to imporve source code to have multilanguage GUI?

Thanks.

Add app selection instead of showing all apps

Hi there,
I was thinking if it would be possible to modify what apps are visible in the app selection menu that appears; instead of showing all apps running in the background/playing audio, would it be possible to choose 1 or 2 that are visible, so that I don't need to scroll through apps that I never change the volume of?
Thanks!

[FEATURE] Ability to Control Multiple Programs At Once

(sorry if it seems like I'm spamming, I just brushed up on the rules and this seems to be the more "appropriate" place to suggest features/ideas)

Like I said on my last post on the "discussion" page, it would be an absolute power move if you were able to make it so that you can control multiple programs at the same time, instead of having to cycle through "sessions". As well as instead of being relegated to the "multi-instance" option.

Cheers

Hotkeys with scrolling

Would be nice to have ability to use scroll wheel directions in Hotkeys. IE: Alt+scroll up can be volume up, and Alt+scroll down is volume down.

Under Keys I see "Scroll" but after testing with it, I cant get it to work.

Change Volume of Active Application

I have a macropad with two Volume Knobs on it. I want to use those knobs to control:

  • discord
  • the game I am currently playing
  • (I use my keyboard's volume controls for global volume)

Volume Control seems really cut out to help me in this, but I can't seem to set it up as it depends on sessions to control volume. The way I am imagining things is that I set up Volume Control like this:

  • create two shortcuts for the session (vol+, vol-) (discord)
  • create two shortcuts for the current application (my current game)

I figure there are multiple ways to resolve this (per application shortcuts for example), but I guess this is sufficient for me.

Volume2 (https://github.com/irzyxa/Volume2) supports 'active application'. So far I have only been able to get what I want by running both programs. Not quite a permanent solution, I guess.

I'd wish I could contribute, but I have zero experience in c#.

[BUG] Changing Volume Step Size Does Nothing

Version

5.2.2

Actual Behaviour

Changing the "volume step" size does nothing, it keeps using the initially loaded value stored in "VolumeControl.json" and also doesn't store the changes in the json-file.

Expected Behaviour

the changes get applied and stored in the json-file.

Reproduction Steps

  • change the volume step size
  • change the volume (won't use set step-size)
  • close app & start app again (value is back to the previous one)

Log

19:48:33:133  [DEBUG]  VCSettings initializing...
19:48:33:284  [DEBUG]  .ctor is setting the hook source to '723432' (Was null)
19:48:33:284  [DEBUG]  Attached a message hook from 'AddMaximizeBugFixHandler'.
19:48:33:288  [DEBUG]  VCSettings.ExecutablePath = 'D:\DESKTOP\VolumeControl.exe'
19:48:33:295  [DEBUG]  VCSettings.CurrentVersion = '5.2.2'
19:48:33:295  [DEBUG]  VCSettings.ReleaseType = 'NORMAL'
19:48:33:297  [DEBUG]  VCSettings initialization completed.
19:48:33:642  [INFO]   Session selection unlocked.
19:48:33:647  [INFO]   Session selection locked.
19:48:33:650  [DEBUG]  Skipped loading addons because no search directories were located.
19:48:33:651  [DEBUG]  Initialized ActionAddonAttribute
19:48:33:657  [INFO]   Volume Control v5.2.2
19:48:34:058  [DEBUG]  Finished binding event handler method 'HandleShow' to VolumeControl.Audio.AudioAPI events.
19:48:34:074  [DEBUG]  GetIcons called with path '@%SystemRoot%\System32\AudioSrv.Dll' => 'C:\Windows\System32\AudioSrv.Dll'
19:48:34:076  [DEBUG]  GetIcons called with path 'C:\Windows\explorer.exe'
19:48:34:099  [DEBUG]  GetIcons called with path 'C:\Users\Switch\AppData\Local\Discord\app-1.0.9006\Discord.exe'
19:48:34:104  [DEBUG]  GetIcons called with path 'C:\Program Files\NVIDIA Corporation\NvContainer\nvcontainer.exe'
19:48:34:110  [DEBUG]  GetIcons called with path 'C:\ProgramData\chocolatey\lib\ungoogled-chromium\tools\ungoogled-chromium_103.0.5060.134-1.1_windows\chrome.exe'
19:48:34:116  [DEBUG]  GetIcons called with path 'C:\Program Files (x86)\Steam\steam.exe'
19:48:34:122  [DEBUG]  GetIcons called with path 'D:\GAMES\Steam\steamapps\common\Euro Truck Simulator 2\bin\win_x64\eurotrucks2.exe'
19:48:34:127  [DEBUG]  GetIcons called with path 'C:\Users\Switch\AppData\Local\Discord\app-1.0.9006\Discord.exe'
19:48:34:129  [DEBUG]  GetIcons called with path 'C:\Program Files\WindowsApps\SpotifyAB.SpotifyMusic_1.191.824.0_x86__zpdnekdrzrea0\Spotify.exe'
19:48:34:134  [DEBUG]  GetIcons called with path 'C:\Program Files\AntiMicroX\bin\antimicrox.exe'
19:48:37:923  [DEBUG]  GetIcons called with path '%windir%\system32\mmres.dll' => 'C:\Windows\system32\mmres.dll'
19:48:39:498  [INFO]   App exited with code 0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.