public static StreamingSound GetSound(Stream stream, RiffLoader ParsedHeader) { bool IsMono = false; if (ParsedHeader != null) { if (ParsedHeader.Channels == 1) { IsMono = true; } } var mp3 = new MP3Sharp.MP3Stream(stream, IsMono); var snd = new StreamingSound(); snd.Data = mp3; if (mp3.Format == MP3Sharp.SoundFormat.Pcm16BitMono) { snd.Format = Al.AL_FORMAT_MONO16; } else { snd.Format = Al.AL_FORMAT_STEREO16; } snd.Frequency = mp3.Frequency; return(snd); }
public static StreamingSound GetSound(Stream stream) { var mp3 = new MP3Sharp.MP3Stream(stream); var snd = new StreamingSound(); snd.Data = mp3; if (mp3.Format == MP3Sharp.SoundFormat.Pcm16BitMono) { snd.Format = Al.AL_FORMAT_MONO16; } else { snd.Format = Al.AL_FORMAT_STEREO16; } snd.Frequency = mp3.Frequency; return(snd); }
public static double[] ReadMP3(string filePath, int bufferSize = 4096) { List <double> audio = new List <double>(); MP3Sharp.MP3Stream stream = new MP3Sharp.MP3Stream(filePath); byte[] buffer = new byte[bufferSize]; int bytesReturned = 1; while (bytesReturned > 0) { bytesReturned = stream.Read(buffer, 0, bufferSize); for (int i = 0; i < bytesReturned / 2 - 1; i += 2) { audio.Add(BitConverter.ToInt16(buffer, i * 2)); } } stream.Close(); return(audio.ToArray()); }
public static SoundEffect CacheMP3(string wavCacheFilename, byte[] data) { ushort wFormatTag = 1; ushort nChannels; uint nSamplesPerSec; uint nAvgBytesPerSec; ushort nBlockAlign; ushort wBitsPerSample = 16; const int headerSize = 44; var output = new MemoryStream(); using (var input = new MP3Sharp.MP3Stream(new MemoryStream(data))) { using (var writer = new BinaryWriter(output, Encoding.UTF8)) { output.Position = headerSize; input.CopyTo(output); uint wavDataLength = (uint)output.Length - headerSize; output.Position = 0; nChannels = (ushort)input.ChannelCount; nSamplesPerSec = (uint)input.Frequency; nBlockAlign = (ushort)(nChannels * (wBitsPerSample / 8)); nAvgBytesPerSec = (uint)(nSamplesPerSec * nChannels * (wBitsPerSample / 8)); //write the header writer.Write("RIFF".ToCharArray()); //4 writer.Write((uint)(wavDataLength + 36)); // 4 writer.Write("WAVE".ToCharArray()); //4 writer.Write("fmt ".ToCharArray()); //4 writer.Write(16); //4 writer.Write(wFormatTag); // writer.Write((ushort)nChannels); writer.Write(nSamplesPerSec); writer.Write(nAvgBytesPerSec); writer.Write(nBlockAlign); writer.Write(wBitsPerSample); writer.Write("data".ToCharArray()); writer.Write((uint)wavDataLength); output.Position = 0; SaveWavStream(output, wavCacheFilename); return(SoundEffect.FromStream(output)); } } }
public static SoundEffect CacheMP3(string wavCacheFilename, byte[] data) { ushort wFormatTag = 1; ushort nChannels; uint nSamplesPerSec; uint nAvgBytesPerSec; ushort nBlockAlign; ushort wBitsPerSample = 16; const int headerSize = 44; var output = new MemoryStream(); using (var input = new MP3Sharp.MP3Stream(new MemoryStream(data))) { using (var writer = new BinaryWriter(output, Encoding.UTF8)) { output.Position = headerSize; input.CopyTo(output); uint wavDataLength = (uint)output.Length - headerSize; output.Position = 0; nChannels = (ushort)input.ChannelCount; nSamplesPerSec = (uint)input.Frequency; nBlockAlign = (ushort)(nChannels * (wBitsPerSample / 8)); nAvgBytesPerSec = (uint)(nSamplesPerSec * nChannels * (wBitsPerSample / 8)); //write the header writer.Write("RIFF".ToCharArray()); //4 writer.Write((uint)(wavDataLength + 36)); // 4 writer.Write("WAVE".ToCharArray()); //4 writer.Write("fmt ".ToCharArray()); //4 writer.Write(16); //4 writer.Write(wFormatTag); // writer.Write((ushort)nChannels); writer.Write(nSamplesPerSec); writer.Write(nAvgBytesPerSec); writer.Write(nBlockAlign); writer.Write(wBitsPerSample); writer.Write("data".ToCharArray()); writer.Write((uint)wavDataLength); output.Position = 0; SaveWavStream(output, wavCacheFilename); return SoundEffect.FromStream(output); } } }
public static byte[] decodeMP3ToWavMono(byte[] sourceBytes) { using (System.IO.Stream sourceStream = new System.IO.MemoryStream(sourceBytes)) { using (var destinationStream = new System.IO.MemoryStream()) { using (var tempStream = new System.IO.MemoryStream()) { using (MP3Sharp.MP3Stream stream = new MP3Sharp.MP3Stream(sourceStream, 4096, MP3Sharp.SoundFormat.Pcm16BitMono)) { stream.CopyTo(tempStream); WriteWavHeader(destinationStream, false, (ushort)1, 16, stream.Frequency, tempStream.Length); tempStream.Seek(0, SeekOrigin.Begin); tempStream.CopyTo(destinationStream); return(destinationStream.ToArray()); } } } } }
/// <summary> /// 将mp3格式的字节数组转换为audioclip /// </summary> /// <param name="data"></param> /// <returns></returns> private AudioClip GetAudioClipFromMP3ByteArray(byte[] mp3Data) { var mp3MemoryStream = new MemoryStream(mp3Data); MP3Sharp.MP3Stream mp3Stream = new MP3Sharp.MP3Stream(mp3MemoryStream); //Get the converted stream data MemoryStream convertedAudioStream = new MemoryStream(); byte[] buffer = new byte[2048]; int bytesReturned = -1; int totalBytesReturned = 0; while (bytesReturned != 0) { bytesReturned = mp3Stream.Read(buffer, 0, buffer.Length); convertedAudioStream.Write(buffer, 0, bytesReturned); totalBytesReturned += bytesReturned; } Debug.Log("MP3 file has " + mp3Stream.ChannelCount + " channels with a frequency of " + mp3Stream.Frequency); byte[] convertedAudioData = convertedAudioStream.ToArray(); //bug of mp3sharp that audio with 1 channel has right channel data, to skip them byte[] data = new byte[convertedAudioData.Length / 2]; for (int i = 0; i < data.Length; i += 2) { data[i] = convertedAudioData[2 * i]; data[i + 1] = convertedAudioData[2 * i + 1]; } Wav wav = new Wav(data, mp3Stream.ChannelCount, mp3Stream.Frequency); AudioClip audioClip = AudioClip.Create("testSound", wav.SampleCount, 1, wav.Frequency, false); audioClip.SetData(wav.LeftChannel, 0); return(audioClip); }
private static void LoadMod(TmodFile modFile, BuildProperties properties) { AddAssemblyResolver(); string fileName = Path.GetFileNameWithoutExtension(modFile.Name); Interface.loadMods.SetProgressReading(fileName, 0, 2); Assembly modCode; string rootDirectory; if (modFile.HasFile("All")) { modCode = Assembly.Load(modFile.GetFile("All")); } else { modCode = Assembly.Load(modFile.GetFile(windows ? "Windows" : "Other")); } Interface.loadMods.SetProgressReading(fileName, 1, 2); using (MemoryStream memoryStream = new MemoryStream(modFile.GetFile("Resources"))) { using (BinaryReader reader = new BinaryReader(memoryStream)) { rootDirectory = reader.ReadString(); for (string path = reader.ReadString(); path != "end"; path = reader.ReadString()) { byte[] data = reader.ReadBytes(reader.ReadInt32()); files[path] = data; if (Main.dedServ) { continue; } string extension = Path.GetExtension(path); switch (extension) { case ".png": string texturePath = Path.ChangeExtension(path, null); using (MemoryStream buffer = new MemoryStream(data)) { textures[texturePath] = Texture2D.FromStream(Main.instance.GraphicsDevice, buffer); } break; case ".wav": string soundPath = Path.ChangeExtension(path, null); using (MemoryStream buffer = new MemoryStream(data)) { sounds[soundPath] = SoundEffect.FromStream(buffer); } break; case ".mp3": string mp3Path = Path.ChangeExtension(path, null); string wavCacheFilename = mp3Path.Replace('/', '_') + "_" + properties.version + ".wav"; if (WAVCacheIO.WAVCacheAvailable(wavCacheFilename)) { sounds[mp3Path] = SoundEffect.FromStream(WAVCacheIO.GetWavStream(wavCacheFilename)); break; } ushort wFormatTag = 1; ushort nChannels; uint nSamplesPerSec; uint nAvgBytesPerSec; ushort nBlockAlign; ushort wBitsPerSample = 16; const int headerSize = 44; MemoryStream output = new MemoryStream(headerSize + data.Length); using (MemoryStream yourMp3FileStream = new MemoryStream(data)) { using (MP3Sharp.MP3Stream input = new MP3Sharp.MP3Stream(yourMp3FileStream)) { using (BinaryWriter writer = new BinaryWriter(output, Encoding.UTF8)) { output.Position = headerSize; input.CopyTo(output); UInt32 wavDataLength = (UInt32)output.Length - headerSize; output.Position = 0; nChannels = (ushort)input.ChannelCount; nSamplesPerSec = (uint)input.Frequency; nBlockAlign = (ushort)(nChannels * (wBitsPerSample / 8)); nAvgBytesPerSec = (uint)(nSamplesPerSec * nChannels * (wBitsPerSample / 8)); //write the header writer.Write("RIFF".ToCharArray()); //4 writer.Write((UInt32)(wavDataLength + 36)); // 4 writer.Write("WAVE".ToCharArray()); //4 writer.Write("fmt ".ToCharArray()); //4 writer.Write(16); //4 writer.Write(wFormatTag); // writer.Write((ushort)nChannels); writer.Write(nSamplesPerSec); writer.Write(nAvgBytesPerSec); writer.Write(nBlockAlign); writer.Write(wBitsPerSample); writer.Write("data".ToCharArray()); writer.Write((UInt32)(wavDataLength)); output.Position = 0; WAVCacheIO.SaveWavStream(output, wavCacheFilename); sounds[mp3Path] = SoundEffect.FromStream(output); } } } break; } } } } Type[] classes = modCode.GetTypes(); foreach (Type type in classes) { if (type.IsSubclassOf(typeof(Mod))) { Mod mod = (Mod)Activator.CreateInstance(type); mod.file = modFile.Name; mod.buildVersion = properties.modBuildVersion; mod.code = modCode; mod.Init(); if (mod.Name == "Terraria") { throw new DuplicateNameException("Mods cannot be named Terraria"); } if (mods.ContainsKey(mod.Name)) { throw new DuplicateNameException("Two mods share the internal name " + mod.Name); } if (rootDirectory != mod.Name) { throw new MissingResourceException("Mod name " + mod.Name + " does not match source directory name " + rootDirectory); } mods[mod.Name] = mod; loadOrder.Push(mod.Name); } } }
private static void LoadMod(TmodFile modFile, BuildProperties properties) { AddAssemblyResolver(); Interface.loadMods.SetProgressReading(Path.GetFileNameWithoutExtension(modFile.Name)); Assembly modCode; string rootDirectory; if (modFile.HasFile("All")) { modCode = Assembly.Load(modFile.GetFile("All")); } else { modCode = Assembly.Load(modFile.GetFile(windows ? "Windows" : "Other")); } using (MemoryStream memoryStream = new MemoryStream(modFile.GetFile("Resources"))) { using (BinaryReader reader = new BinaryReader(memoryStream)) { memoryStream.Seek(reader.ReadInt32(), SeekOrigin.Current); rootDirectory = reader.ReadString(); for (string path = reader.ReadString(); path != "end"; path = reader.ReadString()) { byte[] data = reader.ReadBytes(reader.ReadInt32()); files[path] = data; string extension = Path.GetExtension(path); switch (extension) { case ".png": string texturePath = Path.ChangeExtension(path, null); using (MemoryStream buffer = new MemoryStream(data)) { textures[texturePath] = Texture2D.FromStream(Main.instance.GraphicsDevice, buffer); } break; case ".wav": string soundPath = Path.ChangeExtension(path, null); using (MemoryStream buffer = new MemoryStream(data)) { sounds[soundPath] = SoundEffect.FromStream(buffer); } break; case ".mp3": // TODO, better way to do this? string mp3Path = Path.ChangeExtension(path, null); MemoryStream wavData = new MemoryStream(); MemoryStream wavFile = new MemoryStream(); ushort wFormatTag = 1; ushort nChannels; uint nSamplesPerSec; uint nAvgBytesPerSec; ushort nBlockAlign; ushort wBitsPerSample = 16; using (MemoryStream buffer = new MemoryStream(data)) { using (MP3Sharp.MP3Stream s = new MP3Sharp.MP3Stream(buffer)) { s.CopyTo(wavData); nChannels = (ushort)s.ChannelCount; nSamplesPerSec = (uint)s.Frequency; } } nBlockAlign = (ushort)(nChannels * (wBitsPerSample / 8)); nAvgBytesPerSec = (uint)(nSamplesPerSec * nChannels * (wBitsPerSample / 8)); using (BinaryWriter bw = new BinaryWriter(wavFile)) { bw.Write("RIFF".ToCharArray()); bw.Write((UInt32)(wavData.Length + 36)); bw.Write("WAVE".ToCharArray()); bw.Write("fmt ".ToCharArray()); bw.Write(16); bw.Write(wFormatTag); bw.Write(nChannels); bw.Write(nSamplesPerSec); bw.Write(nAvgBytesPerSec); bw.Write(nBlockAlign); bw.Write(wBitsPerSample); bw.Write("data".ToCharArray()); bw.Write((UInt32)(wavData.Length)); bw.Write(wavData.ToArray()); } using (MemoryStream buffer = new MemoryStream(wavFile.ToArray())) { sounds[mp3Path] = SoundEffect.FromStream(buffer); } break; } } } } Type[] classes = modCode.GetTypes(); foreach (Type type in classes) { if (type.IsSubclassOf(typeof(Mod))) { Mod mod = (Mod)Activator.CreateInstance(type); mod.file = modFile.Name; mod.code = modCode; mod.Init(); if (mods.ContainsKey(mod.Name)) { throw new DuplicateNameException("Two mods share the internal name " + mod.Name); } if (rootDirectory != mod.Name) { throw new MissingResourceException("Mod name " + mod.Name + " does not match source directory name " + rootDirectory); } mods[mod.Name] = mod; } } }
private static void LoadMod(TmodFile modFile, BuildProperties properties) { AddAssemblyResolver(); string fileName = Path.GetFileNameWithoutExtension(modFile.Name); Interface.loadMods.SetProgressReading(fileName, 0, 2); Assembly modCode; string rootDirectory; if (modFile.HasFile("All")) { modCode = Assembly.Load(modFile.GetFile("All")); } else { modCode = Assembly.Load(modFile.GetFile(windows ? "Windows" : "Other")); } Interface.loadMods.SetProgressReading(fileName, 1, 2); using (MemoryStream memoryStream = new MemoryStream(modFile.GetFile("Resources"))) { using (BinaryReader reader = new BinaryReader(memoryStream)) { memoryStream.Seek(reader.ReadInt32(), SeekOrigin.Current); rootDirectory = reader.ReadString(); for (string path = reader.ReadString(); path != "end"; path = reader.ReadString()) { byte[] data = reader.ReadBytes(reader.ReadInt32()); files[path] = data; string extension = Path.GetExtension(path); switch (extension) { case ".png": string texturePath = Path.ChangeExtension(path, null); using (MemoryStream buffer = new MemoryStream(data)) { textures[texturePath] = Texture2D.FromStream(Main.instance.GraphicsDevice, buffer); } break; case ".wav": string soundPath = Path.ChangeExtension(path, null); using (MemoryStream buffer = new MemoryStream(data)) { sounds[soundPath] = SoundEffect.FromStream(buffer); } break; case ".mp3": string mp3Path = Path.ChangeExtension(path, null); ushort wFormatTag = 1; ushort nChannels; uint nSamplesPerSec; uint nAvgBytesPerSec; ushort nBlockAlign; ushort wBitsPerSample = 16; MemoryStream output = new MemoryStream(); using (MemoryStream yourMp3FileStream = new MemoryStream(data)) using (var input = new MP3Sharp.MP3Stream(yourMp3FileStream)) using (var writer = new BinaryWriter(output, Encoding.UTF8)) { var headerSize = 44; output.Position = headerSize; input.CopyTo(output); UInt32 wavDataLength = (UInt32)output.Length - 44; output.Position = 0; nChannels = (ushort)input.ChannelCount; nSamplesPerSec = (uint)input.Frequency; nBlockAlign = (ushort)(nChannels * (wBitsPerSample / 8)); nAvgBytesPerSec = (uint)(nSamplesPerSec * nChannels * (wBitsPerSample / 8)); //write the header writer.Write("RIFF".ToCharArray()); //4 writer.Write((UInt32)(wavDataLength + 36)); // 4 writer.Write("WAVE".ToCharArray()); //4 writer.Write("fmt ".ToCharArray()); //4 writer.Write(16); //4 writer.Write(wFormatTag); // writer.Write((ushort)nChannels); writer.Write(nSamplesPerSec); writer.Write(nAvgBytesPerSec); writer.Write(nBlockAlign); writer.Write(wBitsPerSample); writer.Write("data".ToCharArray()); writer.Write((UInt32)(wavDataLength)); output.Position = 0; sounds[mp3Path] = SoundEffect.FromStream(output); } break; } } } } Type[] classes = modCode.GetTypes(); foreach (Type type in classes) { if (type.IsSubclassOf(typeof(Mod))) { Mod mod = (Mod)Activator.CreateInstance(type); mod.file = modFile.Name; mod.code = modCode; mod.Init(); if (mods.ContainsKey(mod.Name)) { throw new DuplicateNameException("Two mods share the internal name " + mod.Name); } if (rootDirectory != mod.Name) { throw new MissingResourceException("Mod name " + mod.Name + " does not match source directory name " + rootDirectory); } mods[mod.Name] = mod; loadOrder.Push(mod.Name); } } }