Esempio n. 1
0
        static NativeMethods()
        {
            IntPtr image;

            if (PlatformDetails.IsMac)
            {
                image = LibraryLoader.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Audio", "Codecs", "Opus", "Libs", "32bit", "libopus.dylib"));
            }
            else if (PlatformDetails.IsWindows)
            {
                if (!Environment.Is64BitProcess)
                {
                    image = LibraryLoader.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Audio", "Codecs", "Opus", "Libs", "32bit", "opus.dll"));
                }
                else
                {
                    image = LibraryLoader.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Audio", "Codecs", "Opus", "Libs", "64bit", "opus.dll"));
                }
            }
            else
            {
                image = LibraryLoader.Load("libopus.so.0");
                if (image.Equals(IntPtr.Zero))
                {
                    image = LibraryLoader.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Audio", "Codecs", "Opus", "Libs", "libopus.so"));
                }
            }

            if (image != IntPtr.Zero)
            {
                var type = typeof(NativeMethods);
                foreach (var member in type.GetFields(BindingFlags.Static | BindingFlags.NonPublic))
                {
                    var methodName = member.Name;
                    if (methodName == "opus_encoder_ctl_out")
                    {
                        methodName = "opus_encoder_ctl";
                    }
                    var fieldType = member.FieldType;
                    var ptr       = LibraryLoader.ResolveSymbol(image, methodName);
                    if (ptr == IntPtr.Zero)
                    {
                        throw new Exception(string.Format("Could not resolve symbol \"{0}\"", methodName));
                    }
                    member.SetValue(null, Marshal.GetDelegateForFunctionPointer(ptr, fieldType));
                }
            }
        }