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 bool OwnsBuffer; | ||||
| 
 | ||||
| 		public static StaticSound LoadOgg(AudioDevice device, string filePath) | ||||
| 		{ | ||||
| 			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, | ||||
| 			ushort formatTag, | ||||
| 			ushort bitsPerSample, | ||||
|  | @ -212,33 +214,18 @@ namespace MoonWorks.Audio | |||
| 			Handle.Flags = FAudio.FAUDIO_END_OF_STREAM; | ||||
| 			Handle.pContext = IntPtr.Zero; | ||||
| 			Handle.AudioBytes = bufferLength; | ||||
| 			Handle.pAudioData = Marshal.AllocHGlobal((int) bufferLength); | ||||
| 			Handle.pAudioData = (nint) NativeMemory.Alloc(bufferLength); | ||||
| 			Marshal.Copy(buffer, (int) bufferOffset, Handle.pAudioData, (int) bufferLength); | ||||
| 			Handle.PlayBegin = 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; | ||||
| 			LoopLength = 0; | ||||
| 
 | ||||
| 			OwnsBuffer = true; | ||||
| 		} | ||||
| 
 | ||||
| 		public StaticSound( | ||||
| 		public unsafe StaticSound( | ||||
| 			AudioDevice device, | ||||
| 			ushort channels, | ||||
| 			uint samplesPerSecond, | ||||
|  | @ -258,13 +245,44 @@ namespace MoonWorks.Audio | |||
| 			Handle.Flags = FAudio.FAUDIO_END_OF_STREAM; | ||||
| 			Handle.pContext = IntPtr.Zero; | ||||
| 			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); | ||||
| 			Handle.PlayBegin = 0; | ||||
| 			Handle.PlayLength = 0; | ||||
| 
 | ||||
| 			LoopStart = 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> | ||||
|  | @ -287,9 +305,12 @@ namespace MoonWorks.Audio | |||
| 			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