using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Diagnostics; using SafeMobileLib; using System.IO; namespace AppServer { class USB3000 { // Thread for handling recordings decoding private Thread decodingThread; // flag that the recordings decoding should be running or not private bool isRunning = false; // queue which will keep a track private InterthreadMessageQueue toDecodeFiles = new InterthreadMessageQueue(); // class which will gestion the usb3000 status private USBMonitoring usbMonitoring; private string usb3000VID = "0403"; private string usb3000PID = "6001"; private int sampleRate = 8000; private int bitdepth = 16; public USB3000(bool startThread, int sr, int bd) { this.sampleRate = sr; this.bitdepth = bd; usbMonitoring = new USBMonitoring(new DeviceInfo(usb3000VID, usb3000PID), 2); usbMonitoring.OnDeviceStatusChanged += delegate(bool isConnected, DeviceInfo device) { Console.ForegroundColor = (isConnected ? ConsoleColor.Cyan : ConsoleColor.DarkRed); Console.WriteLine("USB 3000 is now " + (isConnected ? "connected" : "disconnected")); Console.ForegroundColor = ConsoleColor.Gray; }; usbMonitoring.StartUSBMonitoring(); // start the Thread which if(startThread) StartRecordingsDecoding(); } /// /// Set the USB3000 parameters in order for the detection and communication to be established /// The detection algorithm will receive the COM Port at which USB3000 is connected /// /// Vendor ID for the watched device (without VID_) /// Product ID for the watched device (without PID_) public void SetUSB3000VIDandPID(string vid, string pid) { usbMonitoring.SetWatchedDevice(new DeviceInfo(vid, pid)); } /// /// Add a recording file path to the decoding queue in order to be decoded /// /// File path of the recording which will be decoded public void AddRecordingInDecodingQueue(string filePath) { toDecodeFiles.PostItem(filePath); } /// /// Start the thread which will manage the monitoring of the usb device plug & unplug /// public void StartRecordingsDecoding() { if (this.isRunning) return; this.isRunning = true; decodingThread = new Thread(new ThreadStart(RecordingsDecodingThreadHandler)); decodingThread.Start(); } /// /// Stop the thread which is monitoring the detection of plug & unplug of the usb device /// public void StopRecordingsDecoding() { this.isRunning = false; usbMonitoring.StopUSBMonitoring(); } /// /// Thread function which will handle eveything /// private void RecordingsDecodingThreadHandler() { string folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\recordings\"; if (!Directory.Exists(folder)) { // create folder Directory.CreateDirectory(folder); } // check for old amb files that are not decoded string[] filePaths = Directory.GetFiles(folder, "*.amb"); foreach (string filepath in filePaths) { // add file to the queue if an amb file if (filepath.Contains(".amb")) { toDecodeFiles.PostItem(@"recordings\" + Path.GetFileName(filepath)); } } while (isRunning && MainForm.isRunning) { // check if the com port for the usb3000 was found or not if (usbMonitoring.GetComPortForWatchedDevice().Length < 1) { Thread.Sleep(300); continue; } // wait until the usbMonitor is connected if (!usbMonitoring.IsDeviceConnected()) { Thread.Sleep(300); continue; } try { // get a recordings file path string filePath = toDecodeFiles.GetItem(100); if (filePath == null) continue; Process p = new Process(); p = new Process(); p.StartInfo.FileName = "cmd.exe"; //String arguments = String.Format("/c usb3kcom -port {0} {1} -version", usbMonitoring.GetComPortForWatchedDevice(), 460800); String arguments = String.Format("/c usb3kcom -port {0} {1} -r 34 -dec {2} {3}", usbMonitoring.GetComPortForWatchedDevice(), 460800, filePath, filePath.Replace(".amb",".tmp")); p.StartInfo.Arguments = arguments; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.Start(); String output = p.StandardOutput.ReadToEnd(); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("OUTPUT : " + output); Console.ForegroundColor = ConsoleColor.Gray; // add the file again to the queue if it failes to convert if (output.ToUpper().Contains("CAN") || output.ToUpper().Contains("error")) toDecodeFiles.PostItem(filePath); else { // open file that was decoded but has no WAV Header FileStream tmpDecodedFile = new FileStream(filePath.Replace(".amb", ".tmp"), System.IO.FileMode.Open); // read all bytes from the temp file byte[] tempDecodedArray = new byte[tmpDecodedFile.Length]; tmpDecodedFile.Read(tempDecodedArray, 0, (int)tmpDecodedFile.Length); // create the wav file FileStream wavDecodedFile = new FileStream(filePath.Replace(".amb",".wav"), System.IO.FileMode.Create); // write WAV header to the final WAV file VoiceRecording.WriteHeader(wavDecodedFile, (int)tmpDecodedFile.Length, 1, sampleRate, bitdepth); // write other decoded file to the wav header file System.IO.BinaryWriter bw = new BinaryWriter(wavDecodedFile); bw.Write(tempDecodedArray); bw.Close(); tmpDecodedFile.Close(); wavDecodedFile.Close(); // delete the encoded file .amb if (File.Exists(filePath)) { File.Delete(filePath); } // delete the temporary decoded file .tmp if (File.Exists(filePath.Replace(".amb", ".tmp"))) { File.Delete(filePath.Replace(".amb", ".tmp")); } } } catch (Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleColor.Red); } } Console.WriteLine("USB 3000 Thread ended ♥♥♥"); } } }