diff --git a/SFML.Module.props b/SFML.Module.props index e904eeaa..dbd7d52b 100644 --- a/SFML.Module.props +++ b/SFML.Module.props @@ -21,4 +21,8 @@ + + + + diff --git a/examples/opengl/OpenGL.cs b/examples/opengl/OpenGL.cs index 6de548cd..54443a4b 100644 --- a/examples/opengl/OpenGL.cs +++ b/examples/opengl/OpenGL.cs @@ -58,7 +58,7 @@ private static void Main() { GL.GenTextures(1, out texture); GL.BindTexture(TextureTarget.Texture2D, texture); - GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)image.Size.X, (int)image.Size.Y, 0, PixelFormat.Rgba, PixelType.UnsignedByte, image.Pixels); + GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)image.Size.X, (int)image.Size.Y, 0, PixelFormat.Rgba, PixelType.UnsignedByte, image.Pixels.ToArray()); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); } diff --git a/src/SFML.Audio/EffectProcessor.cs b/src/SFML.Audio/EffectProcessor.cs index 0d9be093..58ca8a01 100644 --- a/src/SFML.Audio/EffectProcessor.cs +++ b/src/SFML.Audio/EffectProcessor.cs @@ -84,8 +84,8 @@ namespace SFML.Audio /// occur. /// //////////////////////////////////////////////////////////// - public delegate long EffectProcessor(float[] inputFrames, float[] outputFrames, uint frameChannelCount); + public delegate long EffectProcessor(ReadOnlySpan inputFrames, out uint inputFramesRead, Span outputFrames, out uint outputFramesWritten, uint frameChannelCount); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - internal delegate long EffectProcessorInternal(IntPtr inputFrames, uint inputFrameCount, IntPtr outputFrames, uint outputFrameCount, uint frameChannelCount); + internal unsafe delegate long EffectProcessorInternal(float* inputFrames, ref uint inputFrameCount, float* outputFrames, ref uint outputFrameCount, uint frameChannelCount); } \ No newline at end of file diff --git a/src/SFML.Audio/Music.cs b/src/SFML.Audio/Music.cs index b9dbfdd5..548e9a91 100644 --- a/src/SFML.Audio/Music.cs +++ b/src/SFML.Audio/Music.cs @@ -46,7 +46,7 @@ public Music(string filename) : /// /// Source stream to read from //////////////////////////////////////////////////////////// - public Music(Stream stream) : + public Music(Stream stream) : // TODO this stream needs to stay alive base(IntPtr.Zero) { _stream = new StreamAdaptor(stream); @@ -71,7 +71,7 @@ public Music(Stream stream) : /// Byte array containing the file contents /// //////////////////////////////////////////////////////////// - public Music(byte[] bytes) : + public Music(byte[] bytes) : // TODO this memory needs to stay alive base(IntPtr.Zero) { unsafe @@ -140,21 +140,21 @@ public Music(byte[] bytes) : /// position during spatialisation. /// //////////////////////////////////////////////////////////// - public SoundChannel[] ChannelMap + public ReadOnlySpan ChannelMap { get { unsafe { var channels = sfMusic_getChannelMap(CPointer, out var count); - var arr = new SoundChannel[(int)count]; + Array.Resize(ref _channels, (int)count); - for (var i = 0; i < arr.Length; i++) + for (var i = 0; i < _channels.Length; i++) { - arr[i] = channels[i]; + _channels[i] = channels[i]; } - return arr; + return _channels; } } } @@ -498,17 +498,16 @@ public TimeSpan LoopPoints //////////////////////////////////////////////////////////// public void SetEffectProcessor(EffectProcessor effectProcessor) { - _effectProcessor = (inputFrames, inputFrameCount, outputFrames, outputFrameCount, frameChannelCount) => + unsafe { - var inputFramesArray = new float[inputFrameCount]; - var outputFramesArray = new float[outputFrameCount]; - - Marshal.Copy(inputFrames, inputFramesArray, 0, inputFramesArray.Length); - var written = effectProcessor(inputFramesArray, outputFramesArray, frameChannelCount); - Marshal.Copy(outputFramesArray, 0, outputFrames, outputFramesArray.Length); + _effectProcessor = (float* inputFrames, ref uint inputFrameCount, float* outputFrames, ref uint outputFrameCount, uint frameChannelCount) => + { + var inputBuffer = new ReadOnlySpan(inputFrames, (int)inputFrameCount); + var outputBuffer = new Span(outputFrames, (int)outputFrameCount); - return written; - }; + return effectProcessor(inputBuffer, out inputFrameCount, outputBuffer, out outputFrameCount, frameChannelCount); + }; + } sfMusic_setEffectProcessor(CPointer, Marshal.GetFunctionPointerForDelegate(_effectProcessor)); } @@ -560,6 +559,7 @@ protected override void Destroy(bool disposing) private readonly StreamAdaptor _stream; private EffectProcessorInternal _effectProcessor; + private SoundChannel[] _channels; /// /// Structure defining a Time range. diff --git a/src/SFML.Audio/Properties/PublishProfiles/FolderProfile.pubxml b/src/SFML.Audio/Properties/PublishProfiles/FolderProfile.pubxml index b1b8edbc..b2cf8ab9 100644 --- a/src/SFML.Audio/Properties/PublishProfiles/FolderProfile.pubxml +++ b/src/SFML.Audio/Properties/PublishProfiles/FolderProfile.pubxml @@ -1,4 +1,4 @@ - +