public unsafe AudioFormat[] GetOutputFormatList(byte[] magicCookie = null) { var afi = new AudioFormatInfo(); afi.AudioStreamBasicDescription = this; var type_size = sizeof(AudioFormat); uint size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo(AudioFormatProperty.OutputFormatList, type_size, ref afi, out size) != 0) { return(null); } Debug.Assert(sizeof(AudioFormat) == type_size); var data = new AudioFormat[size / type_size]; fixed(AudioFormat *ptr = &data[0]) { var res = AudioFormatPropertyNative.AudioFormatGetProperty(AudioFormatProperty.OutputFormatList, type_size, ref afi, ref size, ptr); if (res != 0) { return(null); } Array.Resize(ref data, (int)size / type_size); return(data); } }
public unsafe float[] GetBalanceFade() { var type_size = sizeof(Layout); var str = ToStruct(); var ptr = Marshal.AllocHGlobal(type_size); (*(Layout *)ptr) = str; int size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo(AudioFormatProperty.BalanceFade, type_size, ptr, out size) != 0) { return(null); } AudioFormatError res; var data = new float[size / sizeof(float)]; fixed(float *data_ptr = data) { res = AudioFormatPropertyNative.AudioFormatGetProperty(AudioFormatProperty.BalanceFade, type_size, ptr, ref size, data_ptr); } Marshal.FreeHGlobal(str.ChannelLayoutWeak); Marshal.FreeHGlobal(ptr); return(res == 0 ? data : null); }
unsafe static T[]? GetAvailable <T> (AudioFormatProperty prop, AudioFormatType format) { uint size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo(prop, sizeof(AudioFormatType), ref format, out size) != 0) { return(null); } var data = new T[size / Marshal.SizeOf(typeof(T))]; var array_handle = GCHandle.Alloc(data, GCHandleType.Pinned); // This requires a pinned GCHandle, since it's not possible to use unsafe code to get the address of a generic object. try { var ptr = array_handle.AddrOfPinnedObject(); var res = AudioFormatPropertyNative.AudioFormatGetProperty(prop, sizeof(AudioFormatType), ref format, ref size, ptr); if (res != 0) { return(null); } Array.Resize(ref data, (int)size / Marshal.SizeOf(typeof(T))); return(data); } finally { array_handle.Free(); } }
unsafe static AudioFormatType[] GetFormats(AudioFormatProperty prop) { int size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo(prop, 0, IntPtr.Zero, out size) != 0) { return(null); } var elementSize = sizeof(AudioFormatType); var data = new AudioFormatType[size / elementSize]; fixed(AudioFormatType *ptr = data) { var res = AudioFormatPropertyNative.AudioFormatGetProperty(prop, 0, IntPtr.Zero, ref size, (IntPtr)ptr); if (res != 0) { return(null); } Array.Resize(ref data, elementSize); return(data); } }
public unsafe AudioFormat[] GetFormatList(byte[] magicCookie) { if (magicCookie == null) throw new ArgumentNullException ("magicCookie"); var afi = new AudioFormatInfo (); afi.AudioStreamBasicDescription = this; fixed (byte* b = magicCookie) { afi.MagicCookieWeak = b; afi.MagicCookieSize = magicCookie.Length; var type_size = sizeof (AudioFormat); uint size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo (AudioFormatProperty.FormatList, type_size, ref afi, out size) != 0) return null; Debug.Assert (sizeof (AudioFormat) == type_size); var data = new AudioFormat[size / type_size]; fixed (AudioFormat* ptr = &data[0]) { var res = AudioFormatPropertyNative.AudioFormatGetProperty (AudioFormatProperty.FormatList, type_size, ref afi, ref size, ptr); if (res != 0) return null; Array.Resize (ref data, (int)size / type_size); return data; } } }
public unsafe float[] GetPanningMatrix() { var type_size = sizeof(Layout); var str = ToStruct(); var ptr = Marshal.AllocHGlobal(type_size); *((Layout *)ptr) = str; int size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo(AudioFormatProperty.PanningMatrix, type_size, ptr, out size) != 0) return(null); }
public static unsafe int[] GetAvailableEncodeNumberChannels(AudioStreamBasicDescription format) { uint size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo (AudioFormatProperty.AvailableEncodeNumberChannels, sizeof (AudioStreamBasicDescription), ref format, out size) != 0) return null; var data = new int[size / sizeof (int)]; fixed (int* ptr = data) { var res = AudioFormatPropertyNative.AudioFormatGetProperty (AudioFormatProperty.AvailableEncodeNumberChannels, sizeof (AudioStreamBasicDescription), ref format, ref size, ptr); if (res != 0) return null; return data; } }
static AudioChannelLayout GetChannelLayout(AudioFormatProperty property, int value) { int size; AudioFormatPropertyNative.AudioFormatGetPropertyInfo (property, sizeof (AudioFormatProperty), ref value, out size); AudioChannelLayout layout; IntPtr ptr = Marshal.AllocHGlobal (size); if (AudioFormatPropertyNative.AudioFormatGetProperty (property, sizeof (AudioFormatProperty), ref value, ref size, ptr) == 0) layout = new AudioChannelLayout (ptr); else layout = null; Marshal.FreeHGlobal (ptr); return layout; }
public int Reserved; // uint #if !COREBUILD #if !WATCH public static unsafe AudioChannelLayoutTag[] GetAvailableEncodeChannelLayoutTags(AudioStreamBasicDescription format) { var type_size = sizeof (AudioStreamBasicDescription); uint size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo (AudioFormatProperty.AvailableEncodeChannelLayoutTags, type_size, ref format, out size) != 0) return null; var data = new AudioChannelLayoutTag[size / sizeof (AudioChannelLayoutTag)]; fixed (AudioChannelLayoutTag* ptr = data) { var res = AudioFormatPropertyNative.AudioFormatGetProperty (AudioFormatProperty.AvailableEncodeChannelLayoutTags, type_size, ref format, ref size, (int*)ptr); if (res != 0) return null; return data; } }
public static unsafe AudioChannelLayoutTag[] GetTagsForNumberOfChannels(int count) { const int type_size = sizeof (uint); int size; if (AudioFormatPropertyNative.AudioFormatGetPropertyInfo (AudioFormatProperty.TagsForNumberOfChannels, type_size, ref count, out size) != 0) return null; var data = new AudioChannelLayoutTag[size / type_size]; fixed (AudioChannelLayoutTag* ptr = data) { var res = AudioFormatPropertyNative.AudioFormatGetProperty (AudioFormatProperty.TagsForNumberOfChannels, type_size, ref count, ref size, (int*)ptr); if (res != 0) return null; return data; } }