/// <summary>
        ///     Load a LibVlc function from unmanaged to managed.
        /// </summary>
        /// <exception cref="TypeLoadException">A custom attribute type cannot be loaded. </exception>
        /// <exception cref="NoLibVlcFunctionAttributeException">
        ///     For LibVlcFunction, need LibVlcFunctionAttribute to get Infomation
        ///     of function.
        /// </exception>
        /// <exception cref="FunctionNotFoundException">Can't find function in dll.</exception>
        public LibVlcFunction(IntPtr libHandle, LibVlcVersion version)
        {
            IsEnable = false;
            _version = version;

            var attrs = typeof(T).GetCustomAttributes(typeof(LibVlcFunctionAttribute), false);

            foreach (var item in attrs)
            {
                if (item is LibVlcFunctionAttribute)
                {
                    FunctionInfomation = item as LibVlcFunctionAttribute;
                    break;
                }
            }

            if (FunctionInfomation == null)
            {
                throw new NoLibVlcFunctionAttributeException();
            }

            if (_version == null || _version.IsFunctionAvailable(FunctionInfomation))
            {
                IntPtr procAddress;
                try
                {
                    procAddress = Win32Api.GetProcAddress(libHandle, FunctionInfomation.FunctionName.Trim());
                }
                catch (Win32Exception e)
                {
                    throw new FunctionNotFoundException(FunctionInfomation, _version, e);
                }

                var del = Marshal.GetDelegateForFunctionPointer(procAddress, typeof(T));
                _functionDelegate = (T)Convert.ChangeType(del, typeof(T));
                IsEnable          = true;
            }
        }
Exemple #2
0
        /// <summary>
        ///     Load LibVlc dlls, and mapping all function.
        /// </summary>
        /// <param name="libVlcDirectory">directory of LibVlc</param>
        /// <exception cref="LibVlcLoadLibraryException">
        ///     Can't load LibVlc dlls, check the platform and LibVlc target platform
        ///     (should be same, x86 or x64).
        /// </exception>
        /// <exception cref="TypeLoadException">A custom attribute type cannot be loaded. </exception>
        /// <exception cref="NoLibVlcFunctionAttributeException">
        ///     For LibVlcFunction, need LibVlcFunctionAttribute to get Infomation
        ///     of function.
        /// </exception>
        /// <exception cref="FunctionNotFoundException">Can't find function in dll.</exception>
        /// <exception cref="VersionStringParseException">Can't parse libvlc version string, it must like "2.2.0-Meta Weatherwax".</exception>
        /// <exception cref="OverflowException">
        ///     At least one component of version represents a number greater than
        ///     <see cref="F:System.Int32.MaxValue" />.
        /// </exception>
        public static void LoadLibVlc(String libVlcDirectory = null)
        {
            LibVlcDirectory = libVlcDirectory == null ? "" : libVlcDirectory;

            if (IsLibLoaded) return;

            try
            {
                FileInfo libcore = new FileInfo(Path.Combine(LibVlcDirectory, "libvlccore.dll"));
                FileInfo libvlc = new FileInfo(Path.Combine(LibVlcDirectory, "libvlc.dll"));
                LibVlcVCoreHandle = Win32Api.LoadLibrary(libcore.FullName);
                LibVlcHandle = Win32Api.LoadLibrary(libvlc.FullName);
            }
            catch (Win32Exception e)
            {
                throw new LibVlcLoadLibraryException(e);
            }

            _getVersionFunction = new LibVlcFunction<GetVersion>();
            LibVlcVersion = new LibVlcVersion(GetVersion());

            _getCompilerFunction = new LibVlcFunction<GetCompiler>();
            _getChangesetFunction = new LibVlcFunction<GetChangeset>();
            _freeFunction = new LibVlcFunction<Free>();
            _releaseLibVlcModuleDescriptionFunction = new LibVlcFunction<ReleaseLibVlcModuleDescription>();
            _releaseAudioOutputListFunction = new LibVlcFunction<ReleaseAudioOutputList>();
            _releaseAudioDeviceListFunction = new LibVlcFunction<ReleaseAudioDeviceList>();
            _releaseTrackDescriptionFunction = new LibVlcFunction<ReleaseTrackDescription>();
            _releaseTracksFunction = new LibVlcFunction<ReleaseTracks>();

            Vlc.LoadLibVlc();
            VlcError.LoadLibVlc();
            VlcEventManager.LoadLibVlc();
            VlcMedia.LoadLibVlc();
            VlcMediaPlayer.LoadLibVlc();
            AudioEqualizer.LoadLibVlc();
        }