/// <summary> /// Set an attribute specifying a stream number. Wraps IWMHeaderInfo.SetAttribute /// </summary> /// <param name="StreamNumber">Stream number. Zero for file level attributes.</param> /// <param name="attr">Attribute to set. <see cref="Yeti.WMFSdk.WM_Attr"/></param> public void SetAttribute(int StreamNumber, WM_Attr attr) { object obj; ushort size; switch (attr.DataType) { case WMT_ATTR_DATATYPE.WMT_TYPE_STRING: byte[] arr = Encoding.Unicode.GetBytes((string)attr.Value + (char)0); obj = arr; size = (ushort)arr.Length; break; case WMT_ATTR_DATATYPE.WMT_TYPE_BOOL: obj = (uint)((bool)attr?1:0); size = 4; break; case WMT_ATTR_DATATYPE.WMT_TYPE_BINARY: obj = (byte[])attr.Value; size = (ushort)((byte[])obj).Length; break; case WMT_ATTR_DATATYPE.WMT_TYPE_DWORD: obj = (uint)attr; size = 4; break; case WMT_ATTR_DATATYPE.WMT_TYPE_QWORD: obj = (ulong)attr; size = 8; break; case WMT_ATTR_DATATYPE.WMT_TYPE_WORD: obj = (ushort)attr; size = 2; break; case WMT_ATTR_DATATYPE.WMT_TYPE_GUID: obj = (Guid)attr; size = (ushort)Marshal.SizeOf(typeof(Guid)); break; default: throw new ArgumentException("Invalid data type", "attr"); } GCHandle h = GCHandle.Alloc(obj, GCHandleType.Pinned); try { m_HeaderInfo.SetAttribute((ushort)StreamNumber, attr.Name, attr.DataType, h.AddrOfPinnedObject(), size); } finally { h.Free(); } }
/// <summary> /// Set file level attributes /// </summary> /// <param name="attr">Attribute to set <see cref="Yeti.WMFSdk.WM_Attr"/></param> public void SetAttribute(WM_Attr attr) { SetAttribute(0, attr); }