515 lines
21 KiB
C#
515 lines
21 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Runtime.InteropServices;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
|
|
|
|
namespace SoundBoard
|
|
{
|
|
public partial class formMain : Form, IMessageFilter
|
|
{
|
|
private const int WM_KEYDOWN = 0x100;
|
|
public WMPLib.WindowsMediaPlayer Player = new WMPLib.WindowsMediaPlayer();
|
|
public Random randomNum = new Random();
|
|
public ListView listViewEntity = new ListView();
|
|
public string _workingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
|
|
public string[] _soundFiles;
|
|
public string[] _soundDirectories;
|
|
|
|
public formMain()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void formMain_Load(object sender, EventArgs e)
|
|
{
|
|
_soundFiles = Directory.GetFiles(_workingDirectory);
|
|
//Build the UI, foreach directory create one TabPage and one ListView object
|
|
foreach (string sound in _soundFiles)
|
|
{
|
|
CreateUITabs("Working Directory", _workingDirectory);
|
|
}
|
|
_soundDirectories = Directory.GetDirectories(_workingDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string sounds in _soundDirectories)
|
|
{
|
|
CreateUITabs(Path.GetFileName(sounds), sounds);
|
|
}
|
|
|
|
Application.AddMessageFilter(this);
|
|
fileSystemWatcherMain.Path = _workingDirectory; //watch in the application's working directory
|
|
fileSystemWatcherMain.IncludeSubdirectories = true; //and watch in the subfolders for changes, but only one layer down from the app's directory
|
|
fileSystemWatcherMain.Created += new FileSystemEventHandler(fileSystemUpdateDetected); //file or folder created
|
|
fileSystemWatcherMain.Deleted += new FileSystemEventHandler(fileSystemUpdateDetected); //file or folder moved or deleted
|
|
fileSystemWatcherMain.Renamed += new RenamedEventHandler(fileSystemUpdateDetected); //for any file changes like file extension changes
|
|
soundboardTabControl.SelectedIndexChanged += new EventHandler(CheckForDisabledListBox); //disables or enables the Show on Disk file menu object
|
|
Player.PlayStateChange += new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(WMP_PlayStateChange); //eventhandler for the playstate of the Player object
|
|
//check to see if the listView is empty on form load
|
|
if (soundboardTabControl.SelectedTab.Controls[0].Enabled == true)
|
|
{
|
|
mainMenuFileShowOnDisk.Enabled = true;
|
|
btnRandom.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
mainMenuFileShowOnDisk.Enabled = false;
|
|
btnRandom.Enabled = false;
|
|
}
|
|
soundboardTabControl.Select();
|
|
}
|
|
|
|
private void WMP_PlayStateChange(int newState)
|
|
{
|
|
//check to see if the random play functions are running
|
|
if (btnRandom.Enabled == false)
|
|
{
|
|
if (Player.playState == WMPLib.WMPPlayState.wmppsTransitioning)
|
|
{
|
|
//Player is transitioning, so keep the controls disabled
|
|
btnRandom.Enabled = false;
|
|
loopSelectedSoundCheckBox.Enabled = false;
|
|
}
|
|
else if (Player.playState == WMPLib.WMPPlayState.wmppsPlaying)
|
|
{
|
|
//player is still playing the random playlist, keep the controls disbaled
|
|
btnRandom.Enabled = false;
|
|
loopSelectedSoundCheckBox.Enabled = false;
|
|
}
|
|
else if (Player.playState == WMPLib.WMPPlayState.wmppsReady)
|
|
{
|
|
//renable the controls, the Random functions are done
|
|
//first check to see if the loop checkBox is checked, if so set the player to "loop"
|
|
if (soundboardTabControl.SelectedTab.Controls[0].Enabled == true)
|
|
{
|
|
btnRandom.Enabled = true;
|
|
}
|
|
if (loopSelectedSoundCheckBox.Checked == true)
|
|
{
|
|
Player.settings.setMode("loop", true);
|
|
}
|
|
loopSelectedSoundCheckBox.Enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void fileSystemUpdateDetected(object sender, FileSystemEventArgs e)
|
|
{
|
|
//perform the UI refresh operation
|
|
RefreshUIControls();
|
|
}
|
|
|
|
private void CheckForDisabledListBox(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
listViewEntity = (ListView)soundboardTabControl.SelectedTab.Controls[0];
|
|
}
|
|
catch (Exception spam)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (listViewEntity.Enabled == false)
|
|
{
|
|
mainMenuFileShowOnDisk.Enabled = false;
|
|
btnRandom.Enabled = false;
|
|
}
|
|
else
|
|
{
|
|
mainMenuFileShowOnDisk.Enabled = true;
|
|
btnRandom.Enabled = true;
|
|
}
|
|
}
|
|
|
|
private void RefreshUIControls()
|
|
{
|
|
_workingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
|
|
_soundDirectories = Directory.GetDirectories(_workingDirectory);
|
|
|
|
foreach (TabPage tabPage in soundboardTabControl.TabPages)
|
|
{
|
|
foreach (ListView listView in tabPage.Controls)
|
|
{
|
|
listView.Dispose();
|
|
}
|
|
tabPage.Dispose();
|
|
}
|
|
|
|
foreach (string sounds in _soundFiles)
|
|
{
|
|
CreateUITabs("Working Directory", _workingDirectory);
|
|
}
|
|
foreach (string files in _soundDirectories)
|
|
{
|
|
CreateUITabs(Path.GetFileName(files), files);
|
|
}
|
|
//check to see if the listView is empty
|
|
if (soundboardTabControl.SelectedTab.Controls[0].Enabled == true)
|
|
{
|
|
mainMenuFileShowOnDisk.Enabled = true;
|
|
btnRandom.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
mainMenuFileShowOnDisk.Enabled = false;
|
|
btnRandom.Enabled = false;
|
|
}
|
|
}
|
|
|
|
private void CreateUITabs(string tabName, string directoryPath)
|
|
{
|
|
//Add tabs dynamically
|
|
int soundControlHeight = soundboardTabControl.Height;
|
|
int soundControlWidth = soundboardTabControl.Width;
|
|
string[] directoryFiles; //Files in the target directory
|
|
TabPage tab = new TabPage();
|
|
ListView localListView = new ListView();
|
|
string[] columnNames = new string[2]; //Perhaps include a compatibility column to flag files that cause errors?
|
|
ListViewItem listItemObject;
|
|
|
|
if (soundboardTabControl.Controls.ContainsKey(tabName.Replace(" ", "") + "Tab"))
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
//Construct the TabPage and its properties
|
|
tab.Text = tabName; //Display the folder's full name to the user
|
|
tab.Name = tabName.Replace(" ", "") + "Tab"; //create a legal name for the tab's (name) property
|
|
tab.Height = soundControlHeight;
|
|
tab.Height = soundControlWidth;
|
|
soundboardTabControl.Controls.Add(tab);
|
|
|
|
//Construct the ListView and its properties
|
|
localListView.Height = soundControlHeight - 25;
|
|
localListView.Width = soundControlWidth - 5;
|
|
localListView.Name = tabName.Replace(" ", "") + "ListView";
|
|
localListView.FullRowSelect = true;
|
|
localListView.MultiSelect = false;
|
|
localListView.GridLines = true;
|
|
localListView.View = View.Details;
|
|
localListView.Activation = ItemActivation.OneClick;
|
|
localListView.TabStop = false;
|
|
tab.Controls.Add(localListView);
|
|
localListView.Columns.Add("File Name", 340, HorizontalAlignment.Left);
|
|
localListView.Columns.Add("File Ext", 50, HorizontalAlignment.Left);
|
|
localListView.ItemActivate += new EventHandler((sender, e) => ListViewOnLeftClick(sender, e, localListView));
|
|
}
|
|
|
|
directoryFiles = Directory.GetFiles(Path.GetFullPath(directoryPath));
|
|
|
|
foreach (string file in directoryFiles)
|
|
{
|
|
switch (Path.GetExtension(file).ToLower())
|
|
{
|
|
//Only include sound files in the ListView
|
|
case ".mp3":
|
|
case ".wav":
|
|
columnNames[0] = Path.GetFileNameWithoutExtension(file);
|
|
columnNames[1] = Path.GetExtension(file);
|
|
listItemObject = new ListViewItem(columnNames);
|
|
localListView.Items.Add(listItemObject);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (localListView.Items.Count == 0)
|
|
{
|
|
if (tab.Name == "WorkingDirectoryTab")
|
|
{
|
|
localListView.Items.Add("No sound files detected in the application's working directory.");
|
|
}
|
|
else
|
|
{
|
|
localListView.Items.Add("No sound files detected in the " + tabName + " directory");
|
|
}
|
|
|
|
localListView.Enabled = false;
|
|
if (soundboardTabControl.SelectedIndex == 0)
|
|
{
|
|
mainMenuFileShowOnDisk.Enabled = false;
|
|
btnRandom.Enabled = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void ListViewOnLeftClick(object sender, EventArgs e, ListView listView)
|
|
{
|
|
if (btnRandom.Enabled == false)
|
|
{
|
|
//If the btnRandom button is disabled that means a randomise function is running, so don't interupt it
|
|
return;
|
|
}
|
|
string fileName;
|
|
string fileExt;
|
|
string fileLocation;
|
|
|
|
fileName = listView.SelectedItems[0].SubItems[0].Text;
|
|
fileExt = listView.SelectedItems[0].SubItems[1].Text;
|
|
|
|
if (soundboardTabControl.SelectedIndex == 0)
|
|
{
|
|
if (File.Exists(_workingDirectory + "\\" + fileName + fileExt))
|
|
{
|
|
fileLocation = _workingDirectory + "\\" + fileName + fileExt;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (File.Exists(_workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt))
|
|
{
|
|
fileLocation = _workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
PlaySoundFile(fileLocation);
|
|
}
|
|
|
|
private void btnRandom_Click(object sender, EventArgs e)
|
|
{
|
|
int iterations = (int)randomIterationNumericUpDown.Value;
|
|
listViewEntity = (ListView)soundboardTabControl.SelectedTab.Controls[0];
|
|
Player.currentPlaylist.clear();
|
|
|
|
//DOuble check to see if the ListView has any items that can be played
|
|
if (listViewEntity.Enabled == false)
|
|
{
|
|
//the ListView disabled and therefore contains no sounds, so return
|
|
return;
|
|
}
|
|
//disable the Random Button and the loop checkbox
|
|
btnRandom.Enabled = false;
|
|
loopSelectedSoundCheckBox.Enabled = false;
|
|
|
|
if (mainMenuPlayAll.Checked == true)
|
|
{
|
|
playRandomSoundBothColumns(iterations);
|
|
if (soundboardTabControl.SelectedTab.Controls[0].Enabled == true)
|
|
{
|
|
btnRandom.Enabled = true;
|
|
}
|
|
loopSelectedSoundCheckBox.Enabled = true;
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < iterations; i++)
|
|
{
|
|
string fileLocation = "";
|
|
string fileExt;
|
|
string fileName;
|
|
//Check to see if the selected tab is the working directory's tab
|
|
if (soundboardTabControl.SelectedIndex == 0)
|
|
{
|
|
listViewEntity.Items[randomNum.Next(listViewEntity.Items.Count)].Selected = true;
|
|
fileName = listViewEntity.SelectedItems[0].SubItems[0].Text;
|
|
fileExt = listViewEntity.SelectedItems[0].SubItems[1].Text;
|
|
|
|
if (File.Exists(_workingDirectory + "\\" + fileName + fileExt))
|
|
{
|
|
fileLocation = _workingDirectory + "\\" + fileName + fileExt;
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("The file couldn't be found.", "File Not Found", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
if (soundboardTabControl.SelectedTab.Controls[0].Enabled == true)
|
|
{
|
|
btnRandom.Enabled = true;
|
|
}
|
|
loopSelectedSoundCheckBox.Enabled = true;
|
|
Player.currentPlaylist.clear();
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
listViewEntity.Items[randomNum.Next(listViewEntity.Items.Count)].Selected = true;
|
|
fileName = listViewEntity.SelectedItems[0].SubItems[0].Text;
|
|
fileExt = listViewEntity.SelectedItems[0].SubItems[1].Text;
|
|
|
|
if (File.Exists(_workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt))
|
|
{
|
|
fileLocation = _workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt;
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(_workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt, "Not Found");
|
|
if (soundboardTabControl.SelectedTab.Controls[0].Enabled == true)
|
|
{
|
|
btnRandom.Enabled = true;
|
|
}
|
|
loopSelectedSoundCheckBox.Enabled = true;
|
|
Player.currentPlaylist.clear();
|
|
return;
|
|
}
|
|
}
|
|
//load the player with the randomly chosen sounds
|
|
enumeratePlayerPlayList(fileLocation);
|
|
}
|
|
//prepare the Player object and play the playlist
|
|
btnRandom.Enabled = false;
|
|
Player.settings.setMode("loop", false);
|
|
PlayPlayList();
|
|
}
|
|
|
|
private void PlaySoundFile(string fileLocation)
|
|
{
|
|
//Set the file to be played's location
|
|
Player.URL = fileLocation;
|
|
|
|
//Attempt to play the file
|
|
try
|
|
{
|
|
Player.controls.play();
|
|
}
|
|
catch (InvalidOperationException Ex)
|
|
{
|
|
MessageBox.Show("The file couldn't be played.", "Invalid Sound File", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
}
|
|
|
|
private void loopSelectedSoundCheckBox_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (loopSelectedSoundCheckBox.Checked == true)
|
|
{
|
|
Player.settings.setMode("loop", true);
|
|
}
|
|
else
|
|
{
|
|
Player.settings.setMode("loop", false);
|
|
}
|
|
}
|
|
|
|
private void playRandomSoundBothColumns(int iterations)
|
|
{
|
|
int tempRandomNumber;
|
|
string fileLocation = "";
|
|
string fileName;
|
|
string fileExt;
|
|
listViewEntity = (ListView)soundboardTabControl.SelectedTab.Controls[0];
|
|
|
|
for (int i = 0; i <= iterations; i++)
|
|
{
|
|
tempRandomNumber = randomNum.Next(0, soundboardTabControl.TabCount);
|
|
|
|
if (soundboardTabControl.TabPages[tempRandomNumber].Controls[0].Enabled == true)
|
|
{
|
|
soundboardTabControl.SelectedIndex = tempRandomNumber;
|
|
if (soundboardTabControl.SelectedIndex == 0)
|
|
{
|
|
listViewEntity.Items[randomNum.Next(listViewEntity.Items.Count)].Selected = true;
|
|
fileName = listViewEntity.SelectedItems[0].SubItems[0].Text;
|
|
fileExt = listViewEntity.SelectedItems[0].SubItems[1].Text;
|
|
|
|
if (File.Exists(_workingDirectory + "\\" + fileName + fileExt))
|
|
{
|
|
fileLocation = _workingDirectory + "\\" + fileName + fileExt;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
listViewEntity.Items[randomNum.Next(listViewEntity.Items.Count)].Selected = true;
|
|
fileName = listViewEntity.SelectedItems[0].SubItems[0].Text;
|
|
fileExt = listViewEntity.SelectedItems[0].SubItems[1].Text;
|
|
|
|
if (File.Exists(_workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt))
|
|
{
|
|
fileLocation = _workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
enumeratePlayerPlayList(fileLocation);
|
|
}
|
|
else
|
|
{
|
|
playRandomSoundBothColumns(iterations - i);
|
|
}
|
|
}
|
|
PlayPlayList();
|
|
}
|
|
|
|
private void mainMenuFileShowOnDisk_Click(object sender, EventArgs e)
|
|
{
|
|
listViewEntity = (ListView)soundboardTabControl.SelectedTab.Controls[0];
|
|
string fileName;
|
|
string fileExt;
|
|
|
|
fileName = listViewEntity.SelectedItems[0].SubItems[0].Text;
|
|
fileExt = listViewEntity.SelectedItems[0].SubItems[1].Text;
|
|
|
|
if (soundboardTabControl.SelectedIndex == 0)
|
|
{
|
|
if (File.Exists(_workingDirectory + "\\" + fileName + fileExt))
|
|
{
|
|
Process.Start("explorer.exe", "/select, \"" + _workingDirectory + "\\" + fileName + fileExt + "\"");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (File.Exists(_workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt))
|
|
{
|
|
Process.Start("explorer.exe", "/select, \"" + _workingDirectory + "\\" + soundboardTabControl.SelectedTab.Text + "\\" + fileName + fileExt + "\"");
|
|
}
|
|
}
|
|
}
|
|
|
|
private void mainMenuHelpAbout_Click(object sender, EventArgs e)
|
|
{
|
|
aboutForm aboutDialogForm = new aboutForm();
|
|
aboutDialogForm.ShowDialog();
|
|
aboutDialogForm.Dispose();
|
|
}
|
|
|
|
private void mainMenuFileExit_Click(object sender, EventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
private void enumeratePlayerPlayList(string fileLocation)
|
|
{
|
|
WMPLib.IWMPMedia playList = Player.newMedia(fileLocation);
|
|
Player.currentPlaylist.appendItem(playList);
|
|
}
|
|
|
|
private void PlayPlayList()
|
|
{
|
|
Player.controls.play();
|
|
}
|
|
//Handles all messages being sent to controls
|
|
public bool PreFilterMessage(ref Message m)
|
|
{
|
|
Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;
|
|
bool retVal = false;
|
|
|
|
if (m.Msg == WM_KEYDOWN)
|
|
{
|
|
// Handle the keypress
|
|
label1.Text = keyCode.ToString();
|
|
}
|
|
return retVal;
|
|
}
|
|
}
|
|
}
|