static unsafe extern IntPtr SongcastCreate(string aDomain, uint aSubnet, uint aChannel, uint aTtl, uint aLatency, bool aMulticast, bool aEnabled, uint aPreset, DelegateReceiverCallback aReceiverCallback, IntPtr aReceiverPtr, DelegateSubnetCallback aSubnetCallback, IntPtr aSubnetPtr, DelegateConfigurationChangedCallback aConfigurationChangedCallback, IntPtr aConfigurationChangedPtr, DelegateFatalErrorCallback aFatalErrorCallback, IntPtr aFatalErrorPtr, string aManufacturer, string aManufacturerUrl, string aModelUrl, byte[] aImagePtr, int aImageBytes, string aMimeType);
        public unsafe Songcast(string aDomain, uint aSubnet, uint aChannel, uint aTtl, uint aLatency, bool aMulticast, bool aEnabled, uint aPreset, IReceiverHandler aReceiverHandler, ISubnetHandler aSubnetHandler, IConfigurationChangedHandler aConfigurationChangedHandler, string aManufacturer, string aManufacturerUrl, string aModelUrl, byte[] aImage, string aMimeType)
        {
            iReceiverHandler = aReceiverHandler;
            iSubnetHandler = aSubnetHandler;
            iConfigurationChangedHandler = aConfigurationChangedHandler;
            iReceiverCallback = new DelegateReceiverCallback(ReceiverCallback);
            iSubnetCallback = new DelegateSubnetCallback(SubnetCallback);
            iConfigurationChangedCallback = new DelegateConfigurationChangedCallback(ConfigurationChangedCallback);
            iFatalErrorCallback = new DelegateFatalErrorCallback(FatalErrorCallback);
            iReceiverList = new List<Receiver>();
            iSubnetList = new List<Subnet>();

            iHandle = SongcastCreate(aDomain, aSubnet, aChannel, aTtl, aLatency, aMulticast, aEnabled, aPreset, iReceiverCallback, IntPtr.Zero, iSubnetCallback, IntPtr.Zero, iConfigurationChangedCallback, IntPtr.Zero, iFatalErrorCallback, IntPtr.Zero, aManufacturer, aManufacturerUrl, aModelUrl, aImage, aImage.Length, aMimeType);

            if (iHandle == IntPtr.Zero)
            {
                throw (new SongcastError());
            }
        }