/// <summary>
        ///     Extract the Icon out of an AudioDevice
        /// </summary>
        /// <param name="audioDevice"></param>
        /// <param name="largeIcon"></param>
        /// <returns></returns>
        public static Icon ExtractIconFromAudioDevice(MMDevice audioDevice, bool largeIcon)
        {
            Icon ico;
            var  iconKey = new IconKey(audioDevice.IconPath, largeIcon);

            if (IconCache.TryGetValue(iconKey, out ico))
            {
                return(ico);
            }
            try
            {
                if (audioDevice.IconPath.EndsWith(".ico"))
                {
                    ico = Icon.ExtractAssociatedIcon(audioDevice.IconPath);
                }
                else
                {
                    var iconInfo  = audioDevice.IconPath.Split(',');
                    var dllPath   = iconInfo[0];
                    var iconIndex = int.Parse(iconInfo[1]);
                    ico = IconExtractor.Extract(dllPath, iconIndex, largeIcon);
                }
            }
            catch (Exception e)
            {
                AppLogger.Log.Error($"Can't extract icon from {audioDevice.IconPath}\n Ex: ", e);
                switch (audioDevice.DataFlow)
                {
                case DataFlow.Capture:
                    ico = Resources.defaultSpeakers;
                    break;

                case DataFlow.Render:
                    ico = Resources.defaultMicrophone;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            IconCache.Add(iconKey, ico);
            return(ico);
        }
        /// <summary>
        /// Extract an Icon form a given path
        /// </summary>
        /// <param name="path"></param>
        /// <param name="dataFlow"></param>
        /// <param name="largeIcon"></param>
        /// <returns></returns>
        public static Icon ExtractIconFromPath(string path, DataFlow dataFlow, bool largeIcon)
        {
            Icon ico;
            var  key = $"{path}-${largeIcon}";

            if (IconCache.Contains(key))
            {
                return((Icon)IconCache.Get(key));
            }
            try
            {
                if (path.EndsWith(".ico"))
                {
                    ico = Icon.ExtractAssociatedIcon(path);
                }
                else
                {
                    var iconInfo  = path.Split(',');
                    var dllPath   = iconInfo[0];
                    var iconIndex = int.Parse(iconInfo[1]);
                    ico = IconExtractor.Extract(dllPath, iconIndex, largeIcon);
                }
            }
            catch (Exception e)
            {
                Log.Error(e, "Can't extract icon from {path}", path);
                switch (dataFlow)
                {
                case DataFlow.Capture:
                    return(DefaultMicrophone);

                case DataFlow.Render:
                    return(DefaultSpeakers);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            IconCache.Add(key, ico, CacheItemPolicy);
            return(ico);
        }