forked from MoonsideGames/MoonWorks
				
			StaticSound external byte buffer constructor
							parent
							
								
									8134761e44
								
							
						
					
					
						commit
						3bd435746b
					
				|  | @ -0,0 +1,42 @@ | ||||||
|  | using System.IO; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Audio | ||||||
|  | { | ||||||
|  | 	public static class AudioUtils | ||||||
|  | 	{ | ||||||
|  | 		public struct WaveHeaderData | ||||||
|  | 		{ | ||||||
|  | 			public int FileLength; | ||||||
|  | 			public short FormatTag; | ||||||
|  | 			public short Channels; | ||||||
|  | 			public int SampleRate; | ||||||
|  | 			public short BitsPerSample; | ||||||
|  | 			public short BlockAlign; | ||||||
|  | 			public int DataLength; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static WaveHeaderData ReadWaveHeaderData(string filePath) | ||||||
|  | 		{ | ||||||
|  | 			WaveHeaderData headerData; | ||||||
|  | 			var fileInfo = new FileInfo(filePath); | ||||||
|  | 			using FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); | ||||||
|  | 			using BinaryReader br = new BinaryReader(fs); | ||||||
|  | 
 | ||||||
|  | 			headerData.FileLength = (int)fileInfo.Length - 8; | ||||||
|  | 			fs.Position = 20; | ||||||
|  | 			headerData.FormatTag = br.ReadInt16(); | ||||||
|  | 			fs.Position = 22; | ||||||
|  | 			headerData.Channels = br.ReadInt16(); | ||||||
|  | 			fs.Position = 24; | ||||||
|  | 			headerData.SampleRate = br.ReadInt32(); | ||||||
|  | 			fs.Position = 32; | ||||||
|  | 			headerData.BlockAlign = br.ReadInt16(); | ||||||
|  | 			fs.Position = 34; | ||||||
|  | 			headerData.BitsPerSample = br.ReadInt16(); | ||||||
|  | 			fs.Position = 40; | ||||||
|  | 			headerData.DataLength = br.ReadInt32(); | ||||||
|  | 
 | ||||||
|  | 			return headerData; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -19,6 +19,8 @@ namespace MoonWorks.Audio | ||||||
| 
 | 
 | ||||||
| 		private Stack<StaticSoundInstance> Instances = new Stack<StaticSoundInstance>(); | 		private Stack<StaticSoundInstance> Instances = new Stack<StaticSoundInstance>(); | ||||||
| 
 | 
 | ||||||
|  | 		private bool OwnsBuffer; | ||||||
|  | 
 | ||||||
| 		public static StaticSound LoadOgg(AudioDevice device, string filePath) | 		public static StaticSound LoadOgg(AudioDevice device, string filePath) | ||||||
| 		{ | 		{ | ||||||
| 			var filePointer = FAudio.stb_vorbis_open_filename(filePath, out var error, IntPtr.Zero); | 			var filePointer = FAudio.stb_vorbis_open_filename(filePath, out var error, IntPtr.Zero); | ||||||
|  | @ -190,7 +192,7 @@ namespace MoonWorks.Audio | ||||||
| 			); | 			); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public StaticSound( | 		public unsafe StaticSound( | ||||||
| 			AudioDevice device, | 			AudioDevice device, | ||||||
| 			ushort formatTag, | 			ushort formatTag, | ||||||
| 			ushort bitsPerSample, | 			ushort bitsPerSample, | ||||||
|  | @ -212,33 +214,18 @@ namespace MoonWorks.Audio | ||||||
| 			Handle.Flags = FAudio.FAUDIO_END_OF_STREAM; | 			Handle.Flags = FAudio.FAUDIO_END_OF_STREAM; | ||||||
| 			Handle.pContext = IntPtr.Zero; | 			Handle.pContext = IntPtr.Zero; | ||||||
| 			Handle.AudioBytes = bufferLength; | 			Handle.AudioBytes = bufferLength; | ||||||
| 			Handle.pAudioData = Marshal.AllocHGlobal((int) bufferLength); | 			Handle.pAudioData = (nint) NativeMemory.Alloc(bufferLength); | ||||||
| 			Marshal.Copy(buffer, (int) bufferOffset, Handle.pAudioData, (int) bufferLength); | 			Marshal.Copy(buffer, (int) bufferOffset, Handle.pAudioData, (int) bufferLength); | ||||||
| 			Handle.PlayBegin = 0; | 			Handle.PlayBegin = 0; | ||||||
| 			Handle.PlayLength = 0; | 			Handle.PlayLength = 0; | ||||||
| 
 | 
 | ||||||
| 			if (formatTag == 1) |  | ||||||
| 			{ |  | ||||||
| 				Handle.PlayLength = (uint) ( |  | ||||||
| 					bufferLength / |  | ||||||
| 					channels / |  | ||||||
| 					(bitsPerSample / 8) |  | ||||||
| 				); |  | ||||||
| 			} |  | ||||||
| 			else if (formatTag == 2) |  | ||||||
| 			{ |  | ||||||
| 				Handle.PlayLength = (uint) ( |  | ||||||
| 					bufferLength / |  | ||||||
| 					blockAlign * |  | ||||||
| 					(((blockAlign / channels) - 6) * 2) |  | ||||||
| 				); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			LoopStart = 0; | 			LoopStart = 0; | ||||||
| 			LoopLength = 0; | 			LoopLength = 0; | ||||||
|  | 
 | ||||||
|  | 			OwnsBuffer = true; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public StaticSound( | 		public unsafe StaticSound( | ||||||
| 			AudioDevice device, | 			AudioDevice device, | ||||||
| 			ushort channels, | 			ushort channels, | ||||||
| 			uint samplesPerSecond, | 			uint samplesPerSecond, | ||||||
|  | @ -258,13 +245,44 @@ namespace MoonWorks.Audio | ||||||
| 			Handle.Flags = FAudio.FAUDIO_END_OF_STREAM; | 			Handle.Flags = FAudio.FAUDIO_END_OF_STREAM; | ||||||
| 			Handle.pContext = IntPtr.Zero; | 			Handle.pContext = IntPtr.Zero; | ||||||
| 			Handle.AudioBytes = (uint) bufferLengthInBytes; | 			Handle.AudioBytes = (uint) bufferLengthInBytes; | ||||||
| 			Handle.pAudioData = Marshal.AllocHGlobal(bufferLengthInBytes); | 			Handle.pAudioData = (nint) NativeMemory.Alloc((nuint) bufferLengthInBytes); | ||||||
| 			Marshal.Copy(buffer, (int) bufferOffset, Handle.pAudioData, (int) bufferLength); | 			Marshal.Copy(buffer, (int) bufferOffset, Handle.pAudioData, (int) bufferLength); | ||||||
| 			Handle.PlayBegin = 0; | 			Handle.PlayBegin = 0; | ||||||
| 			Handle.PlayLength = 0; | 			Handle.PlayLength = 0; | ||||||
| 
 | 
 | ||||||
| 			LoopStart = 0; | 			LoopStart = 0; | ||||||
| 			LoopLength = 0; | 			LoopLength = 0; | ||||||
|  | 
 | ||||||
|  | 			OwnsBuffer = true; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public StaticSound( | ||||||
|  | 			AudioDevice device, | ||||||
|  | 			ushort formatTag, | ||||||
|  | 			ushort bitsPerSample, | ||||||
|  | 			ushort blockAlign, | ||||||
|  | 			ushort channels, | ||||||
|  | 			uint samplesPerSecond, | ||||||
|  | 			IntPtr bufferPtr, | ||||||
|  | 			uint bufferLengthInBytes) : base(device) | ||||||
|  | 		{ | ||||||
|  | 			FormatTag = formatTag; | ||||||
|  | 			BitsPerSample = bitsPerSample; | ||||||
|  | 			BlockAlign = blockAlign; | ||||||
|  | 			Channels = channels; | ||||||
|  | 			SamplesPerSecond = samplesPerSecond; | ||||||
|  | 
 | ||||||
|  | 			Handle = new FAudio.FAudioBuffer | ||||||
|  | 			{ | ||||||
|  | 				Flags = FAudio.FAUDIO_END_OF_STREAM, | ||||||
|  | 				pContext = IntPtr.Zero, | ||||||
|  | 				pAudioData = bufferPtr, | ||||||
|  | 				AudioBytes = bufferLengthInBytes, | ||||||
|  | 				PlayBegin = 0, | ||||||
|  | 				PlayLength = 0 | ||||||
|  | 			}; | ||||||
|  | 
 | ||||||
|  | 			OwnsBuffer = false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
|  | @ -287,9 +305,12 @@ namespace MoonWorks.Audio | ||||||
| 			Instances.Push(instance); | 			Instances.Push(instance); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		protected override void Destroy() | 		protected override unsafe void Destroy() | ||||||
| 		{ | 		{ | ||||||
| 			Marshal.FreeHGlobal(Handle.pAudioData); | 			if (OwnsBuffer) | ||||||
|  | 			{ | ||||||
|  | 				NativeMemory.Free((void*) Handle.pAudioData); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue