예제 #1
0
        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();
            }
        }
예제 #2
0
        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();
            }
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
        void SetProperty(AudioConverterPropertyID propertyID, double value)
        {
            var res = AudioConverterSetProperty(handle, propertyID, sizeof(double), ref value);

            if (res != AudioConverterError.None)
            {
                throw new ArgumentException(res.ToString());
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
 static extern AudioConverterError AudioConverterSetProperty(IntPtr inAudioConverter, AudioConverterPropertyID inPropertyID,
                                                             int inPropertyDataSize, byte[] inPropertyData);
예제 #7
0
 static extern AudioConverterError AudioConverterGetPropertyInfo(IntPtr inAudioConverter, AudioConverterPropertyID inPropertyID,
                                                                 out int outSize, out bool outWritable);
예제 #8
0
 static extern AudioConverterError AudioConverterGetProperty(IntPtr inAudioConverter, AudioConverterPropertyID inPropertyID,
                                                             ref int ioPropertyDataSize, IntPtr outPropertyData);
예제 #9
0
 unsafe AudioValueRange[] GetAudioValueRange(AudioConverterPropertyID prop)
 {
     return(GetArray <AudioValueRange> (prop, sizeof(AudioValueRange)));
 }
예제 #10
0
 static extern AudioConverterError AudioConverterGetPropertyInfo(IntPtr inAudioConverter, AudioConverterPropertyID inPropertyID,
                                                                 out int outSize, [MarshalAs(UnmanagedType.I1)] out bool outWritable);
예제 #11
0
 AudioValueRange[] GetAudioValueRange(AudioConverterPropertyID prop)
 {
     return(GetArray <AudioValueRange> (prop, Marshal.SizeOf(typeof(AudioValueRange))));
 }