public Write ( string text, int x = null, int y = null ) : void | ||
text | string | |
x | int | |
y | int | |
Результат | void |
static void FadeVolume(List <OggStream> streams, bool @in, float duration, ConsoleLogger logger) { int index = 0; foreach (var stream in streams) { var from = stream.Volume; var to = @in ? 1f : 0; var speed = @in ? 1 - @from : @from; lock (volumeFades) { CancellationTokenSource token; bool found = volumeFades.TryGetValue(stream, out token); if (found) { token.Cancel(); volumeFades.Remove(stream); } } var sIdx = index++; logger.Write(@in ? "V" : "v", 4, 10 + sIdx); var cts = new CancellationTokenSource(); lock (volumeFades) volumeFades.Add(stream, cts); var sw = Stopwatch.StartNew(); OggStream s = stream; Task.Factory.StartNew(() => { float step; do { step = (float)Math.Min(sw.Elapsed.TotalSeconds / (duration * speed), 1); s.Volume = (to - @from) * step + @from; Thread.Sleep(1000 / 60); } while (step < 1 && !cts.Token.IsCancellationRequested); sw.Stop(); if (!cts.Token.IsCancellationRequested) { lock (volumeFades) volumeFades.Remove(s); logger.Write(" ", 4, 10 + sIdx); } }, cts.Token); } }
static void Main() { #if TRACE Trace.Listeners.Add(new ConsoleTraceListener()); #endif Console.WindowHeight = StreamFiles.Length + 12; Console.WriteLine("Pr[e]pare, [P]lay, [S]top, Pa[u]se, [R]esume, [L]oop toggle, [Q]uit"); Console.WriteLine("Faders (in/out) : Low-pass filter [F]/[G], Volume [V]/[B]"); Console.WriteLine("[Up], [Down] : Change current sample"); Console.WriteLine("[Shift] + Action : Do for all " + StreamFiles.Length + " streams"); var logger = new ConsoleLogger(); logger.Write(" # FX Buffering", 0, 8); using (new AudioContext()) using (var streamer = new OggStreamer(65536)) { streamer.Logger = logger; ALHelper.CheckCapabilities(logger); bool quit = false; var streams = new OggStream[StreamFiles.Length]; for (int i = 0; i < StreamFiles.Length; i++) { streams[i] = new OggStream(StreamFiles[i]) { Logger = logger }; logger.SetStreamIndex(streams[i], i); logger.Write((i + 1).ToString(), 1, 10 + i); } logger.Write(">", 0, 10); foreach (var s in streams) s.Prepare(); int sIdx = 0; var activeSet = new List<OggStream>(); while (!quit) { var input = Console.ReadKey(true); activeSet.Clear(); if ((input.Modifiers & ConsoleModifiers.Shift) == ConsoleModifiers.Shift) activeSet.AddRange(streams); else activeSet.Add(streams[sIdx]); var lower = char.ToLower(input.KeyChar); if (input.Key == ConsoleKey.UpArrow) lower = '-'; if (input.Key == ConsoleKey.DownArrow) lower = '+'; switch (lower) { case 'e': activeSet.ForEach(x => x.Prepare()); break; case 'p': activeSet.ForEach(x => x.Play()); break; case 'u': activeSet.ForEach(x => x.Pause()); break; case 's': activeSet.ForEach(x => x.Stop()); break; case 'r': activeSet.ForEach(x => x.Resume()); break; case 'l': int index = 0; activeSet.ForEach(s => { s.IsLooped = !s.IsLooped; logger.Write(s.IsLooped ? "L" : " ", 3, 10 + index++); }); break; case 'v': FadeVolume(activeSet, true, 1, logger); break; case 'b': FadeVolume(activeSet, false, 1, logger); break; case 'f': FadeFilter(activeSet, true, 1, logger); break; case 'g': FadeFilter(activeSet, false, 1, logger); break; case '+': logger.Write(" ", 0, 10 + sIdx); sIdx++; if (sIdx > streams.Length - 1) sIdx = 0; logger.Write(">", 0, 10 + sIdx); break; case '-': logger.Write(" ", 0, 10 + sIdx); sIdx--; if (sIdx < 0) sIdx = streams.Length - 1; logger.Write(">", 0, 10 + sIdx); break; case 'q': quit = true; foreach (var cts in filterFades.Values) cts.Cancel(); foreach (var cts in volumeFades.Values) cts.Cancel(); foreach (var s in streams) s.Stop(); // nicer and more effective foreach (var s in streams) s.Dispose(); break; } } } }
static void FadeVolume(List<OggStream> streams, bool @in, float duration, ConsoleLogger logger) { int index = 0; foreach (var stream in streams) { var from = stream.Volume; var to = @in ? 1f : 0; var speed = @in ? 1 - @from : @from; lock (volumeFades) { CancellationTokenSource token; bool found = volumeFades.TryGetValue(stream, out token); if (found) { token.Cancel(); volumeFades.Remove(stream); } } var sIdx = index++; logger.Write(@in ? "V" : "v", 4, 10 + sIdx); var cts = new CancellationTokenSource(); lock (volumeFades) volumeFades.Add(stream, cts); var sw = Stopwatch.StartNew(); OggStream s = stream; Task.Factory.StartNew(() => { float step; do { step = (float)Math.Min(sw.Elapsed.TotalSeconds / (duration * speed), 1); s.Volume = (to - @from) * step + @from; Thread.Sleep(1000 / 60); } while (step < 1 && !cts.Token.IsCancellationRequested); sw.Stop(); if (!cts.Token.IsCancellationRequested) { lock (volumeFades) volumeFades.Remove(s); logger.Write(" ", 4, 10 + sIdx); } }, cts.Token); } }
static void Main() { #if TRACE Trace.Listeners.Add(new ConsoleTraceListener()); #endif Console.WindowHeight = StreamFiles.Length + 12; Console.WriteLine("Pr[e]pare, [P]lay, [S]top, Pa[u]se, [R]esume, [L]oop toggle, [Q]uit"); Console.WriteLine("Faders (in/out) : Low-pass filter [F]/[G], Volume [V]/[B]"); Console.WriteLine("[Up], [Down] : Change current sample"); Console.WriteLine("[Shift] + Action : Do for all " + StreamFiles.Length + " streams"); var logger = new ConsoleLogger(); logger.Write(" # FX Buffering", 0, 8); using (new AudioContext()) using (var streamer = new OggStreamer(65536)) { streamer.Logger = logger; ALHelper.CheckCapabilities(logger); bool quit = false; var streams = new OggStream[StreamFiles.Length]; for (int i = 0; i < StreamFiles.Length; i++) { streams[i] = new OggStream(StreamFiles[i]) { Logger = logger }; logger.SetStreamIndex(streams[i], i); logger.Write((i + 1).ToString(), 1, 10 + i); } logger.Write(">", 0, 10); foreach (var s in streams) { s.Prepare(); } int sIdx = 0; var activeSet = new List <OggStream>(); while (!quit) { var input = Console.ReadKey(true); activeSet.Clear(); if ((input.Modifiers & ConsoleModifiers.Shift) == ConsoleModifiers.Shift) { activeSet.AddRange(streams); } else { activeSet.Add(streams[sIdx]); } var lower = char.ToLower(input.KeyChar); if (input.Key == ConsoleKey.UpArrow) { lower = '-'; } if (input.Key == ConsoleKey.DownArrow) { lower = '+'; } switch (lower) { case 'e': activeSet.ForEach(x => x.Prepare()); break; case 'p': activeSet.ForEach(x => x.Play()); break; case 'u': activeSet.ForEach(x => x.Pause()); break; case 's': activeSet.ForEach(x => x.Stop()); break; case 'r': activeSet.ForEach(x => x.Resume()); break; case 'l': int index = 0; activeSet.ForEach(s => { s.IsLooped = !s.IsLooped; logger.Write(s.IsLooped ? "L" : " ", 3, 10 + index++); }); break; case 'v': FadeVolume(activeSet, true, 1, logger); break; case 'b': FadeVolume(activeSet, false, 1, logger); break; case 'f': FadeFilter(activeSet, true, 1, logger); break; case 'g': FadeFilter(activeSet, false, 1, logger); break; case '+': logger.Write(" ", 0, 10 + sIdx); sIdx++; if (sIdx > streams.Length - 1) { sIdx = 0; } logger.Write(">", 0, 10 + sIdx); break; case '-': logger.Write(" ", 0, 10 + sIdx); sIdx--; if (sIdx < 0) { sIdx = streams.Length - 1; } logger.Write(">", 0, 10 + sIdx); break; case 'q': quit = true; foreach (var cts in filterFades.Values) { cts.Cancel(); } foreach (var cts in volumeFades.Values) { cts.Cancel(); } foreach (var s in streams) { s.Stop(); // nicer and more effective } foreach (var s in streams) { s.Dispose(); } break; } } } }