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 @@
-
+