summaryrefslogtreecommitdiff
path: root/DiscoBot/Audio/AudioService.cs
diff options
context:
space:
mode:
authorTrueDoctor <d-kobert@web.de>2018-04-11 14:19:57 +0200
committerTrueDoctor <d-kobert@web.de>2018-04-11 14:19:57 +0200
commit351067a5203307fc0c1a14ae2be84eae71246af9 (patch)
treea17b63d94b41c87215a03fd2a19edab9f4d53c30 /DiscoBot/Audio/AudioService.cs
parentaa236f67bf1829e2a7c6e9a5f82d109b39147b11 (diff)
Added possibillity for service based soundplaying
Diffstat (limited to 'DiscoBot/Audio/AudioService.cs')
-rw-r--r--DiscoBot/Audio/AudioService.cs101
1 files changed, 101 insertions, 0 deletions
diff --git a/DiscoBot/Audio/AudioService.cs b/DiscoBot/Audio/AudioService.cs
new file mode 100644
index 0000000..25beed0
--- /dev/null
+++ b/DiscoBot/Audio/AudioService.cs
@@ -0,0 +1,101 @@
+namespace DiscoBot.Audio
+{
+ using System.Collections.Concurrent;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Threading.Tasks;
+
+ using Discord;
+ using Discord.Audio;
+
+ public class AudioService
+ {
+ private readonly ConcurrentDictionary<ulong, IAudioClient> connectedChannels = new ConcurrentDictionary<ulong, IAudioClient>();
+
+ public async Task JoinAudio(IGuild guild, IVoiceChannel target)
+ {
+ IAudioClient client;
+ if (this.connectedChannels.TryGetValue(guild.Id, out client))
+ {
+ return;
+ }
+
+ if (target.Guild.Id != guild.Id)
+ {
+ return;
+ }
+
+ var audioClient = await target.ConnectAsync();
+
+ if (this.connectedChannels.TryAdd(guild.Id, audioClient))
+ {
+ // If you add a method to log happenings from this service,
+ // you can uncomment these commented lines to make use of that.
+ //await Log(LogSeverity.Info, $"Connected to voice on {guild.Name}.");
+ }
+ }
+
+ public async Task LeaveAudio(IGuild guild)
+ {
+ IAudioClient client;
+ if (this.connectedChannels.TryRemove(guild.Id, out client))
+ {
+ await client.StopAsync();
+ //await Log(LogSeverity.Info, $"Disconnected from voice on {guild.Name}.");
+ }
+ }
+
+ public async Task SendAudioAsync(IGuild guild, IMessageChannel channel, string path)
+ {
+ // Your task: Get a full path to the file if the value of 'path' is only a filename.
+ if (!File.Exists(path) && false)
+ {
+ await channel.SendMessageAsync("File does not exist.");
+ return;
+ }
+ IAudioClient client;
+ if (this.connectedChannels.TryGetValue(guild.Id, out client))
+ {
+ //await Log(LogSeverity.Debug, $"Starting playback of {path} in {guild.Name}");
+ using (var ffmpeg = this.CreateStream(path))
+ using (var stream = client.CreatePCMStream(AudioApplication.Music))
+ {
+ try { await ffmpeg.StandardOutput.BaseStream.CopyToAsync(stream); }
+ finally { await stream.FlushAsync(); }
+ }
+ }
+ }
+
+ public async Task SendAudioAsync(string path, int Volume)
+ {
+ // Your task: Get a full path to the file if the value of 'path' is only a filename.
+ if (!File.Exists(path) && false)
+ {
+ //await channel.SendMessageAsync("File does not exist.");
+ return;
+ }
+
+ if (this.connectedChannels.TryGetValue(Dsa.GeneralContext.Guild.Id, out var client))
+ {
+ //await Log(LogSeverity.Debug, $"Starting playback of {path} in {guild.Name}");
+ using (var ffmpeg = this.CreateStream(path))
+ using (var stream = client.CreatePCMStream(AudioApplication.Voice))
+ {
+ try { await ffmpeg.StandardOutput.BaseStream.CopyToAsync(stream); }
+ finally { await stream.FlushAsync(); }
+ }
+ }
+ }
+
+ private Process CreateStream(string path)
+ {
+ return Process.Start(new ProcessStartInfo
+ {
+ FileName = "ffmpeg.exe",
+ Arguments = $"-hide_banner -loglevel panic -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1",
+ UseShellExecute = false,
+ RedirectStandardOutput = true
+ });
+ }
+ }
+}