private static void SetWithTimeout(AudioWrapper wrapper, AudioWrapper.EDataFlow flow, AudioWrapper.ERole role,
                                           string devId, int timeout)
        {
            var endTime = Environment.TickCount + timeout * 1000;

            for (;;)
            {
                wrapper.SetDefaultDevice(flow, role, devId);
                if (wrapper.GetDefaultDevice(flow, role) == devId || (timeout != -1 && Environment.TickCount > endTime))
                {
                    return;
                }
                Thread.Sleep(1000);
            }
        }
        public static void SaveSettings(string path, int timeout)
        {
            var wrapper = new AudioWrapper();

            var xml = new XmlDocument();

            xml.LoadXml("<config></config>");

            foreach (var flow in DataFlowTypesToWork)
            {
                foreach (var role in RoleTypesToWork)
                {
                    var node = xml.CreateElement(string.Format("{0}-{1}", flow, role));
                    node.InnerText = wrapper.GetDefaultDevice(flow, role);
                    xml.DocumentElement.AppendChild(node);
                }
            }

            xml.Save(path);
        }
        public static void LoadSettings(string path, int timeout)
        {
            var wrapper = new AudioWrapper();

            var xml = new XmlDocument();

            xml.Load(path);

            foreach (var flow in DataFlowTypesToWork)
            {
                foreach (var role in RoleTypesToWork)
                {
                    var selectSingleNode = xml.SelectSingleNode(string.Format("/config/{0}-{1}", flow, role));
                    if (selectSingleNode == null)
                    {
                        continue;
                    }
                    SetWithTimeout(wrapper, flow, role, selectSingleNode.InnerText, timeout);
                }
            }
        }