From 5aa494745c977e91d564f4a0fdd790e0e0b6fd40 Mon Sep 17 00:00:00 2001 From: markheath Date: Tue, 21 Oct 2008 16:22:59 +0000 Subject: [PATCH] some basic Windows Media Format SDK interop --- NAudio.WindowsMediaFormat/Enums.cs | 408 ++++++++++++++++++ NAudio.WindowsMediaFormat/Functions.cs | 25 ++ NAudio.WindowsMediaFormat/Interfaces.cs | 182 ++++++++ .../NAudio.WindowsMediaFormat.csproj | 58 +++ .../Properties/AssemblyInfo.cs | 36 ++ NAudio.WindowsMediaFormat/Structures.cs | 22 + NAudio.WindowsMediaFormat/app.config | 3 + NAudio.sln | 6 + NAudio/FileFormats/SoundFont/RiffChunk.cs | 1 - NAudioTests/NAudioTests.csproj | 7 +- NAudioTests/WindowsMedia/WindowsMediaTests.cs | 101 +++++ 11 files changed, 847 insertions(+), 2 deletions(-) create mode 100644 NAudio.WindowsMediaFormat/Enums.cs create mode 100644 NAudio.WindowsMediaFormat/Functions.cs create mode 100644 NAudio.WindowsMediaFormat/Interfaces.cs create mode 100644 NAudio.WindowsMediaFormat/NAudio.WindowsMediaFormat.csproj create mode 100644 NAudio.WindowsMediaFormat/Properties/AssemblyInfo.cs create mode 100644 NAudio.WindowsMediaFormat/Structures.cs create mode 100644 NAudio.WindowsMediaFormat/app.config create mode 100644 NAudioTests/WindowsMedia/WindowsMediaTests.cs 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; + } + } +}