/// <summary> /// Parse a REW filters output file /// The users regional locale is also taken into consideration /// </summary> /// <param name="filePath">path to file</param> /// <returns>a rew eq filter object</returns> public static REWEQFilters ReadREWEQFiltersFile(string filePath) { REWEQFilters filters = new REWEQFilters(); // Get current culture's NumberFormatInfo object. NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat; //NumberFormatInfo nfi = CultureInfo.InvariantCulture.NumberFormat; // For debugging // Assign needed property values to variables. string decimalSeparator = nfi.NumberDecimalSeparator; // Form regular expression pattern using the current culture's decimal seperator. Regex digitsAndDecimalSeparatorOnly = new Regex(@"[^\d" + Regex.Escape(decimalSeparator) + "]"); using (StreamReader r = new StreamReader(filePath)) { string line; int filterCount = 0; string regexpPattern = @"^Filter\s+\d+"; bool usingBWOct = false; while ((line = r.ReadLine()) != null) { if (line.StartsWith("Equaliser:")) { // find out what filter parse rule to use if (line.Equals("Equaliser: FBQ2496")) { // Filter 1: ON PEQ Fc 64,0 Hz Gain -5,0 dB BW Oct 0,167 regexpPattern = @"^Filter\s+\d+:\s(\w+)\s+(\w+)\s+Fc ([\D\d" + Regex.Escape(decimalSeparator) + @"]+) Hz Gain ([\s\d" + Regex.Escape(decimalSeparator) + @"\-]+) dB BW Oct ([\s\d" + Regex.Escape(decimalSeparator) + @"]+)$"; usingBWOct = true; } else if(line.Equals("Equaliser: Generic")) { // Filter 1: ON PK Fc 63,8 Hz Gain -5,0 dB Q 8,06 regexpPattern = @"^Filter\s+\d+:\s(\w+)\s+(\w+)\s+Fc ([\D\d" + Regex.Escape(decimalSeparator) + @"]+) Hz Gain ([\s\d" + Regex.Escape(decimalSeparator) + @"\-]+) dB Q ([\s\d" + Regex.Escape(decimalSeparator) + @"]+)$"; usingBWOct = false; } else { Console.Error.WriteLine("No known equaliser format!", line); return null; } } // skip all lines that does not start with "Filter <number>:" if (Regex.IsMatch(line, @"^Filter\s+\d+:")) { // remove any non breaking spaces line = Regex.Replace(line, "\xA0", String.Empty); // skip line if filter type is "None" if(Regex.Match(line, @"^Filter\s+\d+:\s+ON\s+None.*$").Success) continue; Match match = Regex.Match(line, regexpPattern); if (match.Success) { filterCount++; string enabled = match.Groups[1].Value.Trim(); string type = match.Groups[2].Value.Trim(); string freq = match.Groups[3].Value.Trim(); freq = digitsAndDecimalSeparatorOnly.Replace(freq, ""); string gain = match.Groups[4].Value.Trim(); string q = match.Groups[5].Value.Trim(); REWEQBand band = new REWEQBand(); if (enabled.Equals("ON")) band.Enabled = true; if (type.Equals("PEQ") || type.Equals("PK")) band.FilterType = REWEQFilterType.PK; try { band.FilterFreq = Double.Parse(freq, nfi); band.FilterGain = Double.Parse(gain, nfi); if (usingBWOct) { band.FilterBWOct = Double.Parse(q, nfi); band.FilterQ = BWOct2Q(band.FilterBWOct); } else { band.FilterQ = Double.Parse(q, nfi); band.FilterBWOct = Q2BWOct(band.FilterQ); } } catch (Exception e) { Console.Error.WriteLine("Parse error", e.Message); return null; } filters.EqBands.Add(band); } else { // By some reason we failed parsing the Filter line which should have worked! // probably a locale problem Console.Error.WriteLine("Could not parse line: {0}", line); MessageBox.Show(new Form() { WindowState = FormWindowState.Maximized, TopMost = true }, "Failed parsing filter line using Culture: " + CultureInfo.CurrentCulture.DisplayName + ". Does the REW filter file use this Culture? (e.g. '" + nfi.NumberDecimalSeparator + "' as the Decimal Separator?)" + "\n\nUnparsable line:\n" + line, "Critical Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning); return null; } } } } return filters; }
/// <summary> /// Parse a REW filters output file /// The users regional locale is also taken into consideration /// </summary> /// <param name="filePath">path to file</param> /// <returns>a rew eq filter object</returns> public static REWEQFilters ReadREWEQFiltersFile(string filePath) { REWEQFilters filters = new REWEQFilters(); // Get current culture's NumberFormatInfo object. NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat; //NumberFormatInfo nfi = CultureInfo.InvariantCulture.NumberFormat; // For debugging // Assign needed property values to variables. string decimalSeparator = nfi.NumberDecimalSeparator; // Form regular expression pattern using the current culture's decimal seperator. Regex digitsAndDecimalSeparatorOnly = new Regex(@"[^\d" + Regex.Escape(decimalSeparator) + "]"); using (StreamReader r = new StreamReader(filePath)) { string line; int filterCount = 0; string regexpPattern = @"^Filter\s+\d+"; bool usingBWOct = false; while ((line = r.ReadLine()) != null) { if (line.StartsWith("Equaliser:")) { // find out what filter parse rule to use if (line.Equals("Equaliser: FBQ2496")) { // Filter 1: ON PEQ Fc 64,0 Hz Gain -5,0 dB BW Oct 0,167 regexpPattern = @"^Filter\s+\d+:\s(\w+)\s+(\w+)\s+Fc ([\D\d" + Regex.Escape(decimalSeparator) + @"]+) Hz Gain ([\s\d" + Regex.Escape(decimalSeparator) + @"\-]+) dB BW Oct ([\s\d" + Regex.Escape(decimalSeparator) + @"]+)$"; usingBWOct = true; } else if (line.Equals("Equaliser: Generic")) { // Filter 1: ON PK Fc 63,8 Hz Gain -5,0 dB Q 8,06 regexpPattern = @"^Filter\s+\d+:\s(\w+)\s+(\w+)\s+Fc ([\D\d" + Regex.Escape(decimalSeparator) + @"]+) Hz Gain ([\s\d" + Regex.Escape(decimalSeparator) + @"\-]+) dB Q ([\s\d" + Regex.Escape(decimalSeparator) + @"]+)$"; usingBWOct = false; } else { Console.Error.WriteLine("No known equaliser format!", line); return(null); } } // skip all lines that does not start with "Filter <number>:" if (Regex.IsMatch(line, @"^Filter\s+\d+:")) { // remove any non breaking spaces line = Regex.Replace(line, "\xA0", String.Empty); // skip line if filter type is "None" if (Regex.Match(line, @"^Filter\s+\d+:\s+ON\s+None.*$").Success) { continue; } Match match = Regex.Match(line, regexpPattern); if (match.Success) { filterCount++; string enabled = match.Groups[1].Value.Trim(); string type = match.Groups[2].Value.Trim(); string freq = match.Groups[3].Value.Trim(); freq = digitsAndDecimalSeparatorOnly.Replace(freq, ""); string gain = match.Groups[4].Value.Trim(); string q = match.Groups[5].Value.Trim(); REWEQBand band = new REWEQBand(); if (enabled.Equals("ON")) { band.Enabled = true; } if (type.Equals("PEQ") || type.Equals("PK")) { band.FilterType = REWEQFilterType.PK; } try { band.FilterFreq = Double.Parse(freq, nfi); band.FilterGain = Double.Parse(gain, nfi); if (usingBWOct) { band.FilterBWOct = Double.Parse(q, nfi); band.FilterQ = BWOct2Q(band.FilterBWOct); } else { band.FilterQ = Double.Parse(q, nfi); band.FilterBWOct = Q2BWOct(band.FilterQ); } } catch (Exception e) { Console.Error.WriteLine("Parse error", e.Message); return(null); } filters.EqBands.Add(band); } else { // By some reason we failed parsing the Filter line which should have worked! // probably a locale problem Console.Error.WriteLine("Could not parse line: {0}", line); MessageBox.Show(new Form() { WindowState = FormWindowState.Maximized, TopMost = true }, "Failed parsing filter line using Culture: " + CultureInfo.CurrentCulture.DisplayName + ". Does the REW filter file use this Culture? (e.g. '" + nfi.NumberDecimalSeparator + "' as the Decimal Separator?)" + "\n\nUnparsable line:\n" + line, "Critical Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning); return(null); } } } } return(filters); }