public unsafe void SetData <T>(T[] data, int channelsNum, int bytesPerSample, int sampleRate) where T : unmanaged { if (data == null) { throw new ArgumentNullException(nameof(data)); } this.channelsNum = channelsNum; this.bytesPerSample = bytesPerSample; this.sampleRate = sampleRate; LengthInSeconds = data.Length / (float)sampleRate / channelsNum; var format = GetSoundFormat(channelsNum, bytesPerSample); fixed(T *ptr = data) { AL.BufferData(bufferId, format, (IntPtr)ptr, data.Length * Marshal.SizeOf <T>(), sampleRate); } AudioEngine.CheckALErrors(); }