Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using NAudio.CoreAudioApi;
- using NAudio.CoreAudioApi.Interfaces;
- using System;
- using System.Threading;
- namespace VolumeAdjuster
- {
- class Program
- {
- private static DateTime lastVolumeChangeTime = DateTime.MinValue;
- private static bool volumeAdjusted = false;
- private static int channelToAdjust = 0; // 0 for left, 1 for right
- private static float adjustmentPercentage = 0.75f; // 25% lower
- static void Main(string[] args)
- {
- Console.WriteLine("Which channel should be lower? (0 for left, 1 for right):");
- channelToAdjust = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("By what percentage should the selected channel be lower? (Enter a value between 0 and 100):");
- adjustmentPercentage = 1 - (Convert.ToSingle(Console.ReadLine()) / 100);
- AdjustVolumeOnUserChange();
- }
- static void AdjustVolumeOnUserChange()
- {
- var deviceEnumerator = new MMDeviceEnumerator();
- var defaultDevice = deviceEnumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
- defaultDevice.AudioEndpointVolume.OnVolumeNotification += AudioEndpointVolume_OnVolumeNotification;
- Console.WriteLine("Listening for volume changes. Press any key to exit...");
- Console.ReadKey(); // Keep the application running
- }
- private static void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
- {
- if (volumeAdjusted)
- {
- return;
- }
- DateTime now = DateTime.Now;
- // Delay for at least 1 second between changes
- if ((now - lastVolumeChangeTime).TotalSeconds < 1)
- {
- return;
- }
- if (data.Muted == false && data.MasterVolume > 0) // Ensure volume is not muted and greater than zero
- {
- float currentVolume = data.MasterVolume; // Get the current master volume
- float adjustedVolume = currentVolume * adjustmentPercentage; // Adjust the volume
- // Adjust the selected channel volume
- var deviceEnumerator = new MMDeviceEnumerator();
- var defaultDevice = deviceEnumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
- defaultDevice.AudioEndpointVolume.Channels[channelToAdjust].VolumeLevelScalar = adjustedVolume;
- Console.WriteLine($"Volume changed. Master Volume: {currentVolume * 100}%, Adjusted Channel: {adjustedVolume * 100}%");
- // Update the last volume change time and set the flag
- lastVolumeChangeTime = DateTime.Now;
- volumeAdjusted = true;
- }
- // Reset the volumeAdjusted flag after 2 seconds to allow further adjustments
- Timer timer = new Timer(ResetVolumeAdjustedFlag, null, 2000, Timeout.Infinite);
- }
- private static void ResetVolumeAdjustedFlag(object state)
- {
- volumeAdjusted = false;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement