-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
195 lines (153 loc) · 5 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
using CSCore;
using CSCore.Codecs;
using CSCore.CoreAudioAPI;
using CSCore.DirectSound;
using CSCore.SoundOut;
using NoSilence;
int counter = 0;
float volumeThreshold = 0.0001f;
int resetTime = 5; //*100ms
var fileLocation = string.Empty;
string? partOfOutputDevice = string.Empty;
float volumeInPercents = 20;
var manager = new AudioDeviceManager();
if (args.Length > 0)
{
if (args[0].Contains("help", StringComparison.InvariantCultureIgnoreCase)) {
Console.WriteLine("Either specify arguments, or let the inbuilt setup guide run if you don't specify any. Make sure your primary device is the one you are listening to normally ie with headphones. The one you select will be the music output. They cannot be the same as the program will trigger itself.");
Console.WriteLine();
Console.WriteLine("Arguments are --volume 0-100");
Console.WriteLine("Arguments are --file C:\\test.mp3 (can also be relative path so if the sound file is next to the mp3 just do test.mp3)");
Console.WriteLine("Arguments are --device SAMS (can be part of the name of the sound device, for example given this will match to SAMSUNG TV");
return;
}
if(args.Length != 6)
{
Console.WriteLine("Wrong number of parameters provided");
}
//0 1 2 3 4 5 6
//.exe --volume 20 --file C:\file.mp3 --device SAMSUNG (any order works)
for (int i = 0; i < 3; i ++)
{
CheckForPair(i * 2);
}
}
else
{
UserInput();
}
using var music = GetMusic();
using var soundOut = GetSoundOut();
soundOut.Initialize(music);
soundOut.Volume = volumeInPercents / 100;
Console.WriteLine();
Console.WriteLine("Initialized successfully");
MainLoop();
void CheckForPair(int i)
{
switch (args[i])
{
case "--volume":
volumeInPercents = int.Parse(args[i + 1]);
break;
case "--file":
fileLocation = args[i + 1];
break;
case "--device":
partOfOutputDevice = args[i + 1];
break;
default:
Console.WriteLine($"Parameter {args[i]} is named incorrectly make sure it is spelled right.");
return;
}
}
void UserInput()
{
Console.Write("Please input desired volume in percent: ");
var rawVolume = Console.ReadLine();
float.TryParse(rawVolume, out var volumeInPercents);
Console.WriteLine($"Selected {volumeInPercents}%");
Console.WriteLine();
Console.Write("Please input full path to sound file: ");
do
{
Console.Write("Please input full path to sound file: ");
fileLocation = Console.ReadLine();
if (File.Exists(fileLocation))
{
Console.WriteLine($"File found at path \"{fileLocation}\"");
break;
} else
{
Console.WriteLine($"Error: file not found at path \"{fileLocation}\"");
}
} while (true);
Console.WriteLine();
Console.WriteLine("Please input uniquely identifying part of the name of the device from below list [Do not use primary device]");
Console.WriteLine();
Console.WriteLine(string.Join(", ", DirectSoundDeviceEnumerator.EnumerateDevices().Select(d => $"\"{d.Description}\"")));
Console.WriteLine();
Console.Write("Part of name: ");
partOfOutputDevice = Console.ReadLine();
}
void MainLoop()
{
try
{
while (true)
{
if (counter == resetTime)
{
AttemptChangingPlayState();
counter = 0;
}
counter++;
Thread.Sleep(100);
}
}
finally
{
soundOut.Stop();
}
}
void AttemptChangingPlayState()
{
try
{
using var meter = AudioMeterInformation.FromDevice(manager.GetDefaultDevice());
if (meter.PeakValue > volumeThreshold)
{
Thread.Sleep(3000);
if (meter.PeakValue > volumeThreshold && soundOut.PlaybackState != PlaybackState.Paused)
{
Console.WriteLine($"Noise detected pausing music. Peak: {meter.PeakValue}");
soundOut.Pause();
}
}
else
{
if (soundOut.PlaybackState != PlaybackState.Playing)
{
Console.WriteLine($"Noise stopped starting music. Peak: {meter.PeakValue}");
soundOut.Play();
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Caught an exception will try again in a couple seconds: {ex}");
}
}
ISoundOut GetSoundOut()
{
var devices = DirectSoundDeviceEnumerator.EnumerateDevices();
var backgroundNoiseDevice = devices.First(d => d.Description.Contains(partOfOutputDevice, StringComparison.InvariantCultureIgnoreCase));
Console.WriteLine($"You have selected: {backgroundNoiseDevice.Description}");
var directCount = new DirectSoundOut();
directCount.Device = backgroundNoiseDevice.Guid;
return directCount;
}
IWaveSource GetMusic()
{
return CodecFactory.Instance.GetCodec(fileLocation);
}