/// <summary> /// Stops audio from a particular keybind /// </summary> /// <param name="bindToStop">The keybind to stop</param> private void StopAudioIfPlaying(KeybindSound bindToStop) { if (bindToStop.AudioPlayer != null) { if (bindToStop.AudioPlayer.PlaybackState == PlaybackState.Playing) { bindToStop.AudioPlayer.Stop(); bindToStop.AudioReader.Dispose(); bindToStop.AudioReader = null; bindToStop.AudioPlayer.Dispose(); bindToStop.AudioPlayer = null; } } }
/// <summary> /// When a hotkey is triggered, play its sound /// </summary> private void Bind_HotkeyTriggered(object sender, EventArgs e) { //Get the bind that was triggered KeybindSound bindTriggered = (KeybindSound)sender; if (!config.KeybindSounds.Contains(bindTriggered)) { return; } System.Diagnostics.Debug.WriteLine("Triggered: " + bindTriggered.PathToSoundFileOn); //Change the toggle state and overwrite the config bindTriggered.ToggledOn = !bindTriggered.ToggledOn; if (selectedKeybind.Equals(bindTriggered)) { radioButtonToggledOn.Checked = bindTriggered.ToggledOn; radioButtonToggledOff.Checked = !bindTriggered.ToggledOn; } ConfigParser.SaveFile(Useful.pathToConfig, config); //Stop playback if already running StopAudioIfPlaying(bindTriggered); //Create the file reader string pathToUse; if (bindTriggered.ToggledOn) { pathToUse = bindTriggered.PathToSoundFileOn; } else { pathToUse = bindTriggered.PathToSoundFileOff; } try { switch (Path.GetExtension(pathToUse)) { case ".wav": bindTriggered.AudioReader = new WaveFileReader(pathToUse); break; case ".mp3": bindTriggered.AudioReader = new Mp3FileReader(pathToUse); break; case ".aiff": bindTriggered.AudioReader = new AiffFileReader(pathToUse); break; case ".flac": bindTriggered.AudioReader = new FlacReader(pathToUse); break; case ".ogg": bindTriggered.AudioReader = new VorbisWaveReader(pathToUse); break; default: return; } } catch (Exception) { return; } //Create the playback stream bindTriggered.AudioPlayer = new WaveOutEvent(); bindTriggered.AudioPlayer.PlaybackStopped += (o, args) => { if (bindTriggered.AudioReader != null) { if (bindTriggered.AudioPlayer.PlaybackState == PlaybackState.Stopped) { bindTriggered.AudioReader.Dispose(); bindTriggered.AudioReader = null; bindTriggered.AudioPlayer.Dispose(); bindTriggered.AudioPlayer = null; } } }; bindTriggered.AudioPlayer.Init(bindTriggered.AudioReader); bindTriggered.AudioPlayer.Volume = (float)config.Volume / 100.0f; bindTriggered.AudioPlayer.Play(); //Temporarily disable the hotkey and send the keypress again bindTriggered.HotKey.Dispose(); bindTriggered.HotKey = null; InputSimulator sim = new InputSimulator(); List <VirtualKeyCode> modifiers = new List <VirtualKeyCode>(); //Check for ctrl if ((bindTriggered.KeyModifier & 1) != 0) { modifiers.Add(VirtualKeyCode.CONTROL); } //Check for alt if ((bindTriggered.KeyModifier & 2) != 0) { modifiers.Add(VirtualKeyCode.MENU); } //Check for shift if ((bindTriggered.KeyModifier & 4) != 0) { modifiers.Add(VirtualKeyCode.SHIFT); } sim.Keyboard.ModifiedKeyStroke(modifiers, (VirtualKeyCode)bindTriggered.Keybind); bindTriggered.UpdateHotkey(this.Handle); }