unsafe T[] GetArray <T> (AudioConverterPropertyID prop, int elementSize) { int size; bool writable; if (AudioConverterGetPropertyInfo(handle, prop, out size, out writable) != AudioConverterError.None) { return(null); } var data = new T [size / elementSize]; var array_handle = GCHandle.Alloc(data, GCHandleType.Pinned); try { var ptr = array_handle.AddrOfPinnedObject(); var res = AudioConverterGetProperty(handle, prop, ref size, ptr); if (res != 0) { return(null); } Array.Resize(ref data, size / elementSize); return(data); } finally { array_handle.Free(); } }
unsafe T[] GetArray <T> (AudioConverterPropertyID prop, int elementSize) { int size; bool writable; if (AudioConverterGetPropertyInfo(handle, prop, out size, out writable) != AudioConverterError.None) { return(null); } var data = new T [size / elementSize]; 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 = AudioConverterGetProperty(handle, prop, ref size, ptr); if (res != 0) { return(null); } Array.Resize(ref data, size / elementSize); return(data); } finally { array_handle.Free(); } }
unsafe T[] GetArray <T> (AudioConverterPropertyID prop, int elementSize) where T : struct { int size; bool writable; if (AudioConverterGetPropertyInfo(handle, prop, out size, out writable) != AudioConverterError.None) { return(null); } var data = new T[size / elementSize]; fixed(T *ptr = &data[0]) { var res = AudioConverterGetProperty(handle, prop, ref size, (IntPtr)ptr); if (res != 0) { return(null); } Array.Resize(ref data, size / elementSize); return(data); } }
void SetProperty(AudioConverterPropertyID propertyID, double value) { var res = AudioConverterSetProperty(handle, propertyID, sizeof(double), ref value); if (res != AudioConverterError.None) { throw new ArgumentException(res.ToString()); } }
double GetDoubleProperty(AudioConverterPropertyID propertyID) { double value; var size = sizeof(double); var res = AudioConverterGetProperty(handle, propertyID, ref size, out value); if (res != AudioConverterError.None) { throw new ArgumentException(res.ToString()); } return(value); }
static extern AudioConverterError AudioConverterSetProperty(IntPtr inAudioConverter, AudioConverterPropertyID inPropertyID, int inPropertyDataSize, byte[] inPropertyData);
static extern AudioConverterError AudioConverterGetPropertyInfo(IntPtr inAudioConverter, AudioConverterPropertyID inPropertyID, out int outSize, out bool outWritable);
static extern AudioConverterError AudioConverterGetProperty(IntPtr inAudioConverter, AudioConverterPropertyID inPropertyID, ref int ioPropertyDataSize, IntPtr outPropertyData);
unsafe AudioValueRange[] GetAudioValueRange(AudioConverterPropertyID prop) { return(GetArray <AudioValueRange> (prop, sizeof(AudioValueRange))); }
static extern AudioConverterError AudioConverterGetPropertyInfo(IntPtr inAudioConverter, AudioConverterPropertyID inPropertyID, out int outSize, [MarshalAs(UnmanagedType.I1)] out bool outWritable);
AudioValueRange[] GetAudioValueRange(AudioConverterPropertyID prop) { return(GetArray <AudioValueRange> (prop, Marshal.SizeOf(typeof(AudioValueRange)))); }