diff --git a/NAudio.WindowsMediaFormat/Enums.cs b/NAudio.WindowsMediaFormat/Enums.cs
new file mode 100644
index 0000000..0d6eb6d
--- /dev/null
+++ b/NAudio.WindowsMediaFormat/Enums.cs
@@ -0,0 +1,408 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace NAudio.WindowsMediaFormat
+{
+
+
+ [Guid("96406BD9-2B2B-11d3-B36B-00C04F6108FF"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IWMMetadataEditor
+ {
+ uint Open([In, MarshalAs(UnmanagedType.LPWStr)] string pwszFilename);
+ uint Close();
+ uint Flush();
+
+ }
+
+ [Guid("15CC68E3-27CC-4ecd-B222-3F5D02D80BD5"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IWMHeaderInfo3
+ {
+ uint GetAttributeCount(
+ [In] ushort wStreamNum,
+ [Out] out ushort pcAttributes);
+
+ uint GetAttributeByIndex(
+ [In] ushort wIndex,
+ [Out, In] ref ushort pwStreamNum,
+ [Out, MarshalAs(UnmanagedType.LPWStr)] string pwszName,
+ [Out, In] ref ushort pcchNameLen,
+ [Out] out WMT_ATTR_DATATYPE pType,
+ [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pValue,
+ [Out, In] ref ushort pcbLength);
+
+ uint GetAttributeByName(
+ [Out, In] ref ushort pwStreamNum,
+ [Out, MarshalAs(UnmanagedType.LPWStr)] string pszName,
+ [Out] out WMT_ATTR_DATATYPE pType,
+ [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pValue,
+ [Out, In] ref ushort pcbLength);
+
+ uint SetAttribute(
+ [In] ushort wStreamNum,
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pszName,
+ [In] WMT_ATTR_DATATYPE Type,
+ [In, MarshalAs(UnmanagedType.LPArray)] byte[] pValue,
+ [In] ushort cbLength);
+
+ uint GetMarkerCount(
+ [Out] out ushort pcMarkers);
+
+ uint GetMarker(
+ [In] ushort wIndex,
+ [Out, MarshalAs(UnmanagedType.LPWStr)] string pwszMarkerName,
+ [Out, In] ref ushort pcchMarkerNameLen,
+ [Out] out ulong pcnsMarkerTime);
+
+ uint AddMarker(
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pwszMarkerName,
+ [In] ulong cnsMarkerTime);
+
+ uint RemoveMarker(
+ [In] ushort wIndex);
+
+ uint GetScriptCount(
+ [Out] out ushort pcScripts);
+
+ uint GetScript(
+ [In] ushort wIndex,
+ [Out, MarshalAs(UnmanagedType.LPWStr)] string pwszType,
+ [Out, In] ref ushort pcchTypeLen,
+ [Out, MarshalAs(UnmanagedType.LPWStr)] string pwszCommand,
+ [Out, In] ref ushort pcchCommandLen,
+ [Out] out ulong pcnsScriptTime);
+
+ uint AddScript(
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pwszType,
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pwszCommand,
+ [In] ulong cnsScriptTime);
+
+ uint RemoveScript(
+ [In] ushort wIndex);
+
+ uint GetCodecInfoCount(
+ [Out] out uint pcCodecInfos);
+
+ uint GetCodecInfo(
+ [In] uint wIndex,
+ [Out, In] ref ushort pcchName,
+ [Out, MarshalAs(UnmanagedType.LPWStr)] string pwszName,
+ [Out, In] ref ushort pcchDescription,
+ [Out, MarshalAs(UnmanagedType.LPWStr)] string pwszDescription,
+ [Out] out WMT_CODEC_INFO_TYPE pCodecType,
+ [Out, In] ref ushort pcbCodecInfo,
+ [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pbCodecInfo);
+
+ uint GetAttributeCountEx(
+ [In] ushort wStreamNum,
+ [Out] out ushort pcAttributes);
+
+ uint GetAttributeIndices(
+ [In] ushort wStreamNum,
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pwszName,
+ [In] ref ushort pwLangIndex,
+ [Out, MarshalAs(UnmanagedType.LPArray)] ushort[] pwIndices,
+ [Out, In] ref ushort pwCount);
+
+ uint GetAttributeByIndexEx(
+ [In] ushort wStreamNum,
+ [In] ushort wIndex,
+ [Out, MarshalAs(UnmanagedType.LPWStr)] string pwszName,
+ [Out, In] ref ushort pwNameLen,
+ [Out] out WMT_ATTR_DATATYPE pType,
+ [Out] out ushort pwLangIndex,
+ [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pValue,
+ [Out, In] ref uint pdwDataLength);
+
+ uint ModifyAttribute(
+ [In] ushort wStreamNum,
+ [In] ushort wIndex,
+ [In] WMT_ATTR_DATATYPE Type,
+ [In] ushort wLangIndex,
+ [In, MarshalAs(UnmanagedType.LPArray)] byte[] pValue,
+ [In] uint dwLength);
+
+ uint AddAttribute(
+ [In] ushort wStreamNum,
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pszName,
+ [Out] out ushort pwIndex,
+ [In] WMT_ATTR_DATATYPE Type,
+ [In] ushort wLangIndex,
+ [In, MarshalAs(UnmanagedType.LPArray)] byte[] pValue,
+ [In] uint dwLength);
+
+ uint DeleteAttribute(
+ [In] ushort wStreamNum,
+ [In] ushort wIndex);
+
+ uint AddCodecInfo(
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pszName,
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pwszDescription,
+ [In] WMT_CODEC_INFO_TYPE codecType,
+ [In] ushort cbCodecInfo,
+ [In, MarshalAs(UnmanagedType.LPArray)] byte[] pbCodecInfo);
+ }
+
+ public enum WMT_ATTR_DATATYPE
+ {
+ WMT_TYPE_DWORD = 0,
+ WMT_TYPE_STRING = 1,
+ WMT_TYPE_BINARY = 2,
+ WMT_TYPE_BOOL = 3,
+ WMT_TYPE_QWORD = 4,
+ WMT_TYPE_WORD = 5,
+ WMT_TYPE_GUID = 6,
+ }
+
+ public enum WMT_CODEC_INFO_TYPE
+ {
+ WMT_CODECINFO_AUDIO = 0,
+ WMT_CODECINFO_VIDEO = 1,
+ WMT_CODECINFO_UNKNOWN = 0xffffff
+ }
+
+ public enum DRM_HTTP_STATUS
+ {
+ HTTP_NOTINITIATED = 0,
+ HTTP_CONNECTING = 1,
+ HTTP_REQUESTING = 2,
+ HTTP_RECEIVING = 3,
+ HTTP_COMPLETED = 4
+ }
+
+ public enum DRM_INDIVIDUALIZATION_STATUS
+ {
+ INDI_UNDEFINED = 0x0000,
+ INDI_BEGIN = 0x0001,
+ INDI_SUCCEED = 0x0002,
+ INDI_FAIL = 0x0004,
+ INDI_CANCEL = 0x0008,
+ INDI_DOWNLOAD = 0x0010,
+ INDI_INSTALL = 0x0020
+ }
+
+ public enum DRM_LICENSE_STATE_CATEGORY{
+ WM_DRM_LICENSE_STATE_NORIGHT =0,
+ WM_DRM_LICENSE_STATE_UNLIM ,
+ WM_DRM_LICENSE_STATE_COUNT ,
+ WM_DRM_LICENSE_STATE_FROM ,
+ WM_DRM_LICENSE_STATE_UNTIL ,
+ WM_DRM_LICENSE_STATE_FROM_UNTIL ,
+ WM_DRM_LICENSE_STATE_COUNT_FROM ,
+ WM_DRM_LICENSE_STATE_COUNT_UNTIL ,
+ WM_DRM_LICENSE_STATE_COUNT_FROM_UNTIL ,
+ WM_DRM_LICENSE_STATE_EXPIRATION_AFTER_FIRSTUSE // DRM_LICENSE_STATE_CATEGORY
+ }
+
+ public enum NETSOURCE_URLCREDPOLICY_SETTINGS
+ {
+ NETSOURCE_URLCREDPOLICY_SETTING_SILENTLOGONOK =0,
+ NETSOURCE_URLCREDPOLICY_SETTING_MUSTPROMPTUSER =1,
+ NETSOURCE_URLCREDPOLICY_SETTING_ANONYMOUSONLY =2
+ }
+
+ public enum WM_AETYPE
+ {
+ WM_AETYPE_INCLUDE = 'i',
+ WM_AETYPE_EXCLUDE = 'e'
+ }
+
+ public enum WMT_ATTR_IMAGETYPE
+ {
+ WMT_IMAGETYPE_BITMAP = 1,
+ WMT_IMAGETYPE_JPEG = 2,
+ WMT_IMAGETYPE_GIF = 3
+ }
+
+ [Flags]
+ enum WMT_CREDENTIAL_FLAGS
+ {
+ WMT_CREDENTIAL_SAVE = 0x00000001,
+ WMT_CREDENTIAL_DONT_CACHE = 0x00000002,
+ WMT_CREDENTIAL_CLEAR_TEXT = 0x00000004,
+ WMT_CREDENTIAL_PROXY = 0x00000008,
+ WMT_CREDENTIAL_ENCRYPT = 0x00000010
+ }
+
+ enum WMT_DRMLA_TRUST
+ {
+ WMT_DRMLA_UNTRUSTED = 0,
+ WMT_DRMLA_TRUSTED,
+ WMT_DRMLA_TAMPERED
+ }
+
+ enum tagWMT_FILESINK_MODE
+ {
+ WMT_FM_SINGLE_BUFFERS = 1,
+ WMT_FM_FILESINK_DATA_UNITS = 2,
+ WMT_FM_FILESINK_UNBUFFERED = 4
+ }
+
+ enum WMT_IMAGE_TYPE
+ {
+ WMT_IT_NONE = 0,
+ WMT_IT_BITMAP = 1,
+ WMT_IT_JPEG = 2,
+ WMT_IT_GIF = 3
+ }
+
+ enum WMT_INDEX_TYPE
+ {
+ WMT_IT_NEAREST_DATA_UNIT = 1,
+ WMT_IT_NEAREST_OBJECT = 2,
+ WMT_IT_NEAREST_CLEAN_POINT = 3
+ }
+
+ enum WMT_INDEXER_TYPE
+ {
+ WMT_IT_PRESENTATION_TIME = 0,
+ WMT_IT_FRAME_NUMBERS = 1,
+ WMT_IT_TIMECODE = 2
+ }
+
+ enum WMT_NET_PROTOCOL
+ {
+ WMT_PROTOCOL_HTTP = 0,
+ }
+
+ enum WMT_MUSICSPEECH_CLASS_MODE
+ {
+ WMT_MS_CLASS_MUSIC = 0,
+ WMT_MS_CLASS_SPEECH = 1,
+ WMT_MS_CLASS_MIXED = 2
+ }
+
+ enum WMT_OFFSET_FORMAT
+ {
+ WMT_OFFSET_FORMAT_100NS = 0,
+ WMT_OFFSET_FORMAT_FRAME_NUMBERS = 1,
+ WMT_OFFSET_FORMAT_PLAYLIST_OFFSET = 2,
+ WMT_OFFSET_FORMAT_TIMECODE = 3,
+ WMT_OFFSET_FORMAT_100NS_APPROXIMATE = 4
+ }
+
+ enum WMT_PLAY_MODE
+ {
+ WMT_PLAY_MODE_AUTOSELECT = 0,
+ WMT_PLAY_MODE_LOCAL = 1,
+ WMT_PLAY_MODE_DOWNLOAD = 2,
+ WMT_PLAY_MODE_STREAMING = 3
+ }
+
+ enum WMT_PROXY_SETTINGS
+ {
+ WMT_PROXY_SETTING_NONE = 0,
+ WMT_PROXY_SETTING_MANUAL = 1,
+ WMT_PROXY_SETTING_AUTO = 2,
+ WMT_PROXY_SETTING_BROWSER = 3,
+ WMT_PROXY_SETTING_MAX = 4
+ }
+
+ [Flags]
+ public enum WMT_RIGHTS
+ {
+ None = 0,
+ WMT_RIGHT_PLAYBACK = 0x00000001,
+ WMT_RIGHT_COPY_TO_NON_SDMI_DEVICE = 0x00000002,
+ WMT_RIGHT_COPY_TO_CD = 0x00000008,
+ WMT_RIGHT_COPY_TO_SDMI_DEVICE = 0x00000010,
+ WMT_RIGHT_ONE_TIME = 0x00000020,
+ WMT_RIGHT_SAVE_STREAM_PROTECTED = 0x00000040,
+ WMT_RIGHT_COPY = 0x00000080,
+ WMT_RIGHT_COLLABORATIVE_PLAY = 0x00000100,
+ WMT_RIGHT_SDMI_TRIGGER = 0x00010000,
+ WMT_RIGHT_SDMI_NOMORECOPIES = 0x00020000
+ }
+
+ public enum WMT_STATUS
+ {
+ WMT_ERROR = 0,
+ WMT_OPENED = 1,
+ WMT_BUFFERING_START = 2,
+ WMT_BUFFERING_STOP = 3,
+ WMT_EOF = 4,
+ WMT_END_OF_FILE = 4,
+ WMT_END_OF_SEGMENT = 5,
+ WMT_END_OF_STREAMING = 6,
+ WMT_LOCATING = 7,
+ WMT_CONNECTING = 8,
+ WMT_NO_RIGHTS = 9,
+ WMT_MISSING_CODEC = 10,
+ WMT_STARTED = 11,
+ WMT_STOPPED = 12,
+ WMT_CLOSED = 13,
+ WMT_STRIDING = 14,
+ WMT_TIMER = 15,
+ WMT_INDEX_PROGRESS = 16,
+ WMT_SAVEAS_START = 17,
+ WMT_SAVEAS_STOP = 18,
+ WMT_NEW_SOURCEFLAGS = 19,
+ WMT_NEW_METADATA = 20,
+ WMT_BACKUPRESTORE_BEGIN = 21,
+ WMT_SOURCE_SWITCH = 22,
+ WMT_ACQUIRE_LICENSE = 23,
+ WMT_INDIVIDUALIZE = 24,
+ WMT_NEEDS_INDIVIDUALIZATION = 25,
+ WMT_NO_RIGHTS_EX = 26,
+ WMT_BACKUPRESTORE_END = 27,
+ WMT_BACKUPRESTORE_CONNECTING = 28,
+ WMT_BACKUPRESTORE_DISCONNECTING = 29,
+ WMT_ERROR_WITHURL = 30,
+ WMT_RESTRICTED_LICENSE = 31,
+ WMT_CLIENT_CONNECT = 32,
+ WMT_CLIENT_DISCONNECT = 33,
+ WMT_NATIVE_OUTPUT_PROPS_CHANGED = 34,
+ WMT_RECONNECT_START = 35,
+ WMT_RECONNECT_END = 36,
+ WMT_CLIENT_CONNECT_EX = 37,
+ WMT_CLIENT_DISCONNECT_EX = 38,
+ WMT_SET_FEC_SPAN = 39,
+ WMT_PREROLL_READY = 40,
+ WMT_PREROLL_COMPLETE = 41,
+ WMT_CLIENT_PROPERTIES = 42,
+ WMT_LICENSEURL_SIGNATURE_STATE = 43,
+ WMT_INIT_PLAYLIST_BURN = 44,
+ WMT_TRANSCRYPTOR_INIT = 45,
+ WMT_TRANSCRYPTOR_SEEKED = 46,
+ WMT_TRANSCRYPTOR_READ = 47,
+ WMT_TRANSCRYPTOR_CLOSED = 48,
+ WMT_PROXIMITY_RESULT = 49,
+ WMT_PROXIMITY_COMPLETED = 50,
+ WMT_CONTENT_ENABLER = 51
+ }
+
+ enum WMT_STORAGE_FORMAT
+ {
+ WMT_Storage_Format_MP3 = 0,
+ WMT_Storage_Format_V1 = 1,
+ }
+
+ public enum WMT_STREAM_SELECTION
+ {
+ WMT_OFF = 0,
+ WMT_CLEANPOINT_ONLY = 1,
+ WMT_ON = 2
+ }
+
+ enum WMT_TRANSPORT_TYPE
+ {
+ WMT_Transport_Type_Unreliable = 0,
+ WMT_Transport_Type_Reliable = 1
+ }
+
+ enum WMT_VERSION
+ {
+ WMT_VER_4_0 = 0x00040000,
+ WMT_VER_7_0 = 0x00070000,
+ WMT_VER_8_0 = 0x00080000,
+ WMT_VER_9_0 = 0x00090000
+ }
+
+ enum WMT_WATERMARK_ENTRY_TYPE
+ {
+ WMT_WMETYPE_AUDIO = 1,
+ WMT_WMETYPE_VIDEO = 2
+ }
+
+}
diff --git a/NAudio.WindowsMediaFormat/Functions.cs b/NAudio.WindowsMediaFormat/Functions.cs
new file mode 100644
index 0000000..5530666
--- /dev/null
+++ b/NAudio.WindowsMediaFormat/Functions.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace NAudio.WindowsMediaFormat
+{
+ public class Functions
+ {
+ [DllImport("WMVCore.dll", EntryPoint = "WMCreateEditor", SetLastError = true,
+ CharSet = CharSet.Unicode, ExactSpelling = true,
+ CallingConvention = CallingConvention.StdCall)]
+ public static extern uint WMCreateEditor(
+ [Out, MarshalAs(UnmanagedType.Interface)] out IWMMetadataEditor ppMetadataEditor);
+
+ [DllImport("WMVCore.dll", EntryPoint = "WMCreateSyncReader", SetLastError = true,
+ CharSet = CharSet.Unicode, ExactSpelling = true,
+ CallingConvention = CallingConvention.StdCall)]
+ public static extern uint WMCreateSyncReader(
+ [In] IntPtr pUnkCert, // must be set to null
+ [In] WMT_RIGHTS dwRights,
+ [Out] out IWMSyncReader ppSyncReader);
+
+ }
+}
diff --git a/NAudio.WindowsMediaFormat/Interfaces.cs b/NAudio.WindowsMediaFormat/Interfaces.cs
new file mode 100644
index 0000000..960d225
--- /dev/null
+++ b/NAudio.WindowsMediaFormat/Interfaces.cs
@@ -0,0 +1,182 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace NAudio.WindowsMediaFormat
+{
+ // wmsdkidl.h
+ [Guid("96406BD6-2B2B-11d3-B36B-00C04F6108FF"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IWMReader
+ {
+ uint Close();
+ uint GetOutputCount([Out] out uint pcOutputs);
+ uint GetOutputFormat([In] uint dwOutputNumber, [In] uint dwFormatNumber, [Out] out IWMOutputMediaProps ppProps);
+ uint GetOutputFormatCount([In] uint dwOutputNumber, [Out] out uint pcFormats);
+ uint GetOutputProps([In] uint dwOutputNum, [Out] out IWMOutputMediaProps ppOutput);
+ uint Open([In,MarshalAs(UnmanagedType.LPWStr)] string url, [In] IWMReaderCallback pCallback, IntPtr pvContext);
+ uint Pause();
+ uint Resume();
+ uint SetOutputProps([In] uint dwOutputNum, [In] IWMOutputMediaProps pOutput);
+ //WM_START_CURRENTPOSITION = -1
+ uint Start([In] long cnsStart, [In] long cnsDuration, [In] float fRate, [In] IntPtr pvContext);
+ uint Stop();
+ }
+
+ // wmsdkidl.h
+ [Guid("96406BD8-2B2B-11d3-B36B-00C04F6108FF"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IWMReaderCallback : IWMStatusCallback
+ {
+ uint OnSample([In] uint dwOutputNum,
+ [In] long cnsSampleTime,
+ [In] long cnsSampleDuration,
+ [In] uint dwFlags,
+ [In] INSSBuffer pSample,
+ [In] IntPtr pvContext);
+
+ }
+
+ // wmsbuffer.h
+ [Guid("E1CD3524-03D7-11d2-9EED-006097D2D7CF"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface INSSBuffer
+ {
+ uint GetLength([Out] out uint pdwLength);
+ uint SetLength([In] uint dwLength);
+ uint GetMaxLength([Out] uint pdwLength);
+ // BYTE **ppdwBuffer
+ uint GetBuffer([Out] out byte[] ppdwBuffer);
+ uint GetBufferAndLength([Out] out byte[] ppdwBuffer, [Out] out uint pdwLength);
+ }
+
+ // wmsdkidl.h
+ [Guid("96406BD7-2B2B-11d3-B36B-00C04F6108FF"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IWMOutputMediaProps : IWMMediaProps
+ {
+ ///
+ /// HRESULT GetConnectionName(WCHAR* pwszName, WORD* pcchName)
+ ///
+ uint GetConnectionName([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszName, [In, Out]ref ushort pcchName);
+ uint GetStreamGroupName([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszName, [In, Out]ref ushort pcchName);
+ }
+
+
+ // wmsdkidl.h
+ [Guid("96406BCE-2B2B-11d3-B36B-00C04F6108FF"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IWMMediaProps
+ {
+ uint GetType([Out] out Guid pguidType);
+ uint GetMediaType([Out] out WM_MEDIA_TYPE pType,
+ [Out][In] uint pcbType);
+ uint SetMediaType([In] WM_MEDIA_TYPE pType);
+ }
+
+ [Guid("9397F121-7705-4dc9-B049-98B698188414"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IWMSyncReader
+ {
+ uint Open([In, MarshalAs(UnmanagedType.LPWStr)] string pwszFilename);
+
+ uint Close();
+
+ uint SetRange([In] long cnsStartTime, [In] long cnsDuration);
+
+ uint SetRangeByFrame([In] ushort wStreamNum, [In] long qwFrameNumber, [In] long cFramesToRead);
+
+ uint GetNextSample([In] ushort wStreamNum,
+ [Out] out INSSBuffer ppSample,
+ [Out] out long pcnsSampleTime,
+ [Out] out long pcnsDuration,
+ [Out] out uint pdwFlags,
+ [Out] out uint pdwOutputNum,
+ [Out] out ushort pwStreamNum);
+
+ uint SetStreamsSelected(
+ [In] ushort cStreamCount,
+ [In] ushort[] pwStreamNumbers,
+ [In] WMT_STREAM_SELECTION[] pSelections);
+
+ uint GetStreamSelected(
+ [In] ushort wStreamNum,
+ [Out] out WMT_STREAM_SELECTION pSelection);
+
+ uint SetReadStreamSamples(
+ [In] ushort wStreamNum,
+ [In] bool fCompressed);
+
+ uint GetReadStreamSamples(
+ [In] ushort wStreamNum,
+ [Out] out bool pfCompressed);
+
+ uint GetOutputSetting(
+ [In] uint dwOutputNum,
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pszName,
+ [Out] out WMT_ATTR_DATATYPE pType,
+ [Out, In] ref byte[] pValue, // BYTE *
+ [Out, In] ref ushort pcbLength);
+
+ uint SetOutputSetting(
+ [In] uint dwOutputNum,
+ [In, MarshalAs(UnmanagedType.LPWStr)] string pszName,
+ [In] WMT_ATTR_DATATYPE Type,
+ [In] byte[] pValue,
+ [In] ushort cbLength);
+
+ uint GetOutputCount(
+ [Out] out uint pcOutputs);
+
+ uint GetOutputProps(
+ [In] uint dwOutputNum,
+ [Out] out IWMOutputMediaProps ppOutput);
+
+ uint SetOutputProps(
+ [In] uint dwOutputNum,
+ [In] IWMOutputMediaProps pOutput);
+
+ uint GetOutputFormatCount(
+ [In] uint dwOutputNum,
+ [Out] out uint pcFormats);
+
+ uint GetOutputFormat(
+ [In] uint dwOutputNum,
+ [In] uint dwFormatNum,
+ [Out] out IWMOutputMediaProps ppProps);
+
+ uint GetOutputNumberForStream(
+ [In] ushort wStreamNum,
+ [Out] out uint pdwOutputNum);
+
+ uint GetStreamNumberForOutput(
+ [In] uint dwOutputNum,
+ [Out] out ushort pwStreamNum);
+
+ uint GetMaxOutputSampleSize(
+ [In] uint dwOutput,
+ [Out] out uint pcbMax);
+
+ uint GetMaxStreamSampleSize(
+ [In] ushort wStream,
+ [Out] out uint pcbMax);
+
+ uint OpenStream([In] object pStream); // need to find where IStream is defined
+ }
+
+ // wmsdkidl.h
+ [Guid("6d7cdc70-9888-11d3-8edc-00c04f6109cf"),
+ InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IWMStatusCallback
+ {
+ uint OnStatus(
+ [In] WMT_STATUS Status,
+ [In] uint hr,
+ [In] WMT_ATTR_DATATYPE dwType,
+ [In] byte[] pValue, // BYTE *
+ [In] IntPtr pvContext);
+
+ };
+
+
+}
diff --git a/NAudio.WindowsMediaFormat/NAudio.WindowsMediaFormat.csproj b/NAudio.WindowsMediaFormat/NAudio.WindowsMediaFormat.csproj
new file mode 100644
index 0000000..de0d586
--- /dev/null
+++ b/NAudio.WindowsMediaFormat/NAudio.WindowsMediaFormat.csproj
@@ -0,0 +1,58 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {1868FC77-FD6F-4881-9CF5-DE7451806BFA}
+ Library
+ Properties
+ NAudio.WindowsMediaFormat
+ NAudio.WindowsMediaFormat
+ v2.0
+ 512
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/NAudio.WindowsMediaFormat/Properties/AssemblyInfo.cs b/NAudio.WindowsMediaFormat/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..7df71f7
--- /dev/null
+++ b/NAudio.WindowsMediaFormat/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("NAudio.WindowsMediaFormat")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("NAudio.WindowsMediaFormat")]
+[assembly: AssemblyCopyright("Copyright © 2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("48e45559-0547-498d-9b97-66e08b26b3fa")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/NAudio.WindowsMediaFormat/Structures.cs b/NAudio.WindowsMediaFormat/Structures.cs
new file mode 100644
index 0000000..1554e0d
--- /dev/null
+++ b/NAudio.WindowsMediaFormat/Structures.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace NAudio.WindowsMediaFormat
+{
+ // wmsdkidl.h
+ [StructLayout(LayoutKind.Sequential)]
+ public class WM_MEDIA_TYPE
+ {
+ public Guid majortype;
+ public Guid subtype;
+ public bool bFixedSizeSamples;
+ public bool bTemporalCompression;
+ public uint lSampleSize;
+ public Guid formattype;
+ public object pUnk; //IUnknown *pUnk;
+ public uint cbFormat;
+ public IntPtr pbFormat; // BYTE *
+ }
+}
diff --git a/NAudio.WindowsMediaFormat/app.config b/NAudio.WindowsMediaFormat/app.config
new file mode 100644
index 0000000..b7db281
--- /dev/null
+++ b/NAudio.WindowsMediaFormat/app.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/NAudio.sln b/NAudio.sln
index 99fc073..a4bb285 100644
--- a/NAudio.sln
+++ b/NAudio.sln
@@ -13,6 +13,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAudioDemo", "NAudioDemo\NA
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AudioFileInspector", "AudioFileInspector\AudioFileInspector.csproj", "{D29C1659-635C-497B-847E-FE9A5A69ED03}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAudio.WindowsMediaFormat", "NAudio.WindowsMediaFormat\NAudio.WindowsMediaFormat.csproj", "{1868FC77-FD6F-4881-9CF5-DE7451806BFA}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -43,6 +45,10 @@ Global
{D29C1659-635C-497B-847E-FE9A5A69ED03}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D29C1659-635C-497B-847E-FE9A5A69ED03}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D29C1659-635C-497B-847E-FE9A5A69ED03}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1868FC77-FD6F-4881-9CF5-DE7451806BFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1868FC77-FD6F-4881-9CF5-DE7451806BFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1868FC77-FD6F-4881-9CF5-DE7451806BFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1868FC77-FD6F-4881-9CF5-DE7451806BFA}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/NAudio/FileFormats/SoundFont/RiffChunk.cs b/NAudio/FileFormats/SoundFont/RiffChunk.cs
index bdfe510..ef60e1d 100644
--- a/NAudio/FileFormats/SoundFont/RiffChunk.cs
+++ b/NAudio/FileFormats/SoundFont/RiffChunk.cs
@@ -37,7 +37,6 @@ namespace NAudio.SoundFont
/// just reads a chunk ID at the current position
///
/// chunk ID
-
public string ReadChunkID()
{
byte []cid = riffFile.ReadBytes(4);
diff --git a/NAudioTests/NAudioTests.csproj b/NAudioTests/NAudioTests.csproj
index 118d336..498481d 100644
--- a/NAudioTests/NAudioTests.csproj
+++ b/NAudioTests/NAudioTests.csproj
@@ -2,7 +2,7 @@
Debug
AnyCPU
- 9.0.21022
+ 9.0.30729
2.0
{5080281A-F9A1-403F-85C7-0DFF6839B07B}
Library
@@ -65,8 +65,13 @@
+
+
+ {1868FC77-FD6F-4881-9CF5-DE7451806BFA}
+ NAudio.WindowsMediaFormat
+
{DA4F02E3-0B5E-42CD-B8D9-5583FA51D66E}
NAudio
diff --git a/NAudioTests/WindowsMedia/WindowsMediaTests.cs b/NAudioTests/WindowsMedia/WindowsMediaTests.cs
new file mode 100644
index 0000000..092d8b2
--- /dev/null
+++ b/NAudioTests/WindowsMedia/WindowsMediaTests.cs
@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NAudio.WindowsMediaFormat;
+using System.Runtime.InteropServices;
+
+namespace NAudioTests.WindowsMedia
+{
+ [TestFixture]
+ public class WindowsMediaTests
+ {
+ [Test]
+ public void CanCreateSyncReader()
+ {
+ IWMSyncReader reader;
+ uint hresult = Functions.WMCreateSyncReader(IntPtr.Zero, WMT_RIGHTS.None, out reader);
+ Assert.AreEqual(0, hresult);
+ Assert.IsNotNull(reader);
+ Marshal.ReleaseComObject(reader);
+ }
+
+ [Test]
+ public void CanOpenWmaFile()
+ {
+ IWMSyncReader reader = OpenWmaFile();
+ uint hresult = reader.Close();
+ Assert.AreEqual(0, hresult);
+ Marshal.ReleaseComObject(reader);
+ }
+
+ [Test]
+ public void CanGetOutputCount()
+ {
+ IWMSyncReader reader = OpenWmaFile();
+ uint outputs;
+ uint hresult = reader.GetOutputCount(out outputs);
+ Assert.AreEqual(0, hresult);
+ Assert.AreEqual(1, outputs, "Output Count");
+
+ hresult = reader.Close();
+ Assert.AreEqual(0, hresult);
+ Marshal.ReleaseComObject(reader);
+
+ }
+
+ [Test]
+ public void CanGetOutputFormat()
+ {
+ IWMSyncReader reader = OpenWmaFile();
+ IWMOutputMediaProps props;
+ uint hresult = reader.GetOutputFormat(0,0,out props);
+ Assert.AreEqual(0, hresult);
+ Assert.IsNotNull(props);
+
+ hresult = reader.Close();
+ Assert.AreEqual(0, hresult);
+ Marshal.ReleaseComObject(reader);
+ }
+
+ [Test]
+ public void CanGetNextSample()
+ {
+ IWMSyncReader reader = OpenWmaFile();
+ INSSBuffer buffer;
+ long sampleTime;
+ long duration;
+ uint flags;
+ uint outputNum;
+ ushort streamNum;
+ uint hresult = reader.GetNextSample(0, out buffer, out sampleTime, out duration, out flags, out outputNum, out streamNum);
+ Assert.AreEqual(0, hresult);
+ byte[] theBuffer;
+ //buffer.GetBuffer(out theBuffer);
+
+
+ hresult = reader.Close();
+ Assert.AreEqual(0, hresult);
+ Marshal.ReleaseComObject(reader);
+
+ /*
+ //char[] nameBuffer = new char[256];
+ ushort length = 256;
+ string name = new string(' ', 256);
+ props.GetConnectionName(name, ref length);
+ //string name = new string(nameBuffer, 0, length);
+ Assert.IsFalse(String.IsNullOrEmpty(name));*/
+ }
+
+ private static IWMSyncReader OpenWmaFile()
+ {
+ IWMSyncReader reader;
+ uint hresult = Functions.WMCreateSyncReader(IntPtr.Zero, WMT_RIGHTS.None, out reader);
+ Assert.AreEqual(0, hresult);
+ Assert.IsNotNull(reader);
+ hresult = reader.Open(@"C:\Documents and Settings\All Users\Documents\My Music\Sample Music\New Stories (Highway Blues).wma");
+ Assert.AreEqual(0, hresult);
+ return reader;
+ }
+ }
+}