using System; using System.Runtime.InteropServices; namespace CUETools.Codecs.HDCD { internal static class HDCDDLL { internal const string DllName = "hdcd"; [DllImport("kernel32.dll")] private static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("kernel32.dll")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); internal delegate bool hdcd_decoder_write_callback(IntPtr decoder, IntPtr buffer, int samples, IntPtr client_data); [DllImport(DllName)] internal static extern IntPtr hdcd_decoder_new(); [DllImport(DllName)] internal static extern void hdcd_decoder_delete(IntPtr decoder); [DllImport(DllName)] internal static extern hdcd_decoder_state hdcd_decoder_get_state(IntPtr decoder); [DllImport(DllName)] internal static extern bool hdcd_decoder_set_num_channels(IntPtr decoder, Int16 num_channels); //HDCD_API uint16_t hdcd_decoder_get_num_channels(const hdcd_decoder *const _decoder); [DllImport(DllName)] internal static extern bool hdcd_decoder_set_sample_rate(IntPtr decoder, Int32 sample_rate); //HDCD_API uint32_t hdcd_decoder_get_sample_rate(const hdcd_decoder *const _decoder); [DllImport(DllName)] internal static extern bool hdcd_decoder_set_input_bps(IntPtr decoder, Int16 input_bps); //HDCD_API uint16_t hdcd_decoder_get_input_bps(const hdcd_decoder *const _decoder); [DllImport(DllName)] internal static extern bool hdcd_decoder_set_output_bps(IntPtr decoder, Int16 output_bps); //HDCD_API uint16_t hdcd_decoder_get_output_bps(const hdcd_decoder *const _decoder); [DllImport(DllName)] internal static extern hdcd_decoder_init_status hdcd_decoder_init(IntPtr decoder, IntPtr unused, hdcd_decoder_write_callback write_callback, IntPtr client_data); [DllImport(DllName)] internal static extern bool hdcd_decoder_finish(IntPtr decoder); [DllImport(DllName)] internal static extern bool hdcd_decoder_process_buffer_interleaved(IntPtr decoder, [In, Out] int[,] input_buffer, Int32 samples); [DllImport(DllName)] internal static extern bool hdcd_decoder_flush_buffer(IntPtr decoder); [DllImport(DllName)] internal static extern bool hdcd_decoder_reset(IntPtr decoder); [DllImport(DllName)] internal static extern bool hdcd_decoder_detected_hdcd(IntPtr decoder); [DllImport(DllName)] internal static extern IntPtr hdcd_decoder_get_statistics(IntPtr decoder); static HDCDDLL() { var myPath = new Uri(typeof(HDCDDLL).Assembly.CodeBase).LocalPath; var myFolder = System.IO.Path.GetDirectoryName(myPath); var is64 = IntPtr.Size == 8; var subfolder = is64 ? "x64" : "win32"; #if NET47 IntPtr Dll = LoadLibrary(System.IO.Path.Combine(myFolder, subfolder, DllName + ".dll")); #else IntPtr Dll = LoadLibrary(System.IO.Path.Combine(System.IO.Path.Combine(myFolder, subfolder), DllName + ".dll")); #endif if (Dll == IntPtr.Zero) Dll = LoadLibrary(DllName + ".dll"); if (Dll == IntPtr.Zero) throw new DllNotFoundException(); } } /** \brief Statistics for decoding. */ [StructLayout(LayoutKind.Sequential)] public struct hdcd_decoder_statistics { public UInt32 num_packets; /**