Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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());
        }
Beispiel #4
0
        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));
                }
            }
        }
Beispiel #5
0
		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);
				}
			}
		}
Beispiel #6
0
 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());
                 }
             }
         }
     }
 }
Beispiel #7
0
        /// <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);
        }
Beispiel #8
0
		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);
				}
			}
		}
Beispiel #9
0
 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;
         }
     }
 }
Beispiel #10
0
        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);
                }
            }
        }