Ejemplo n.º 1
0
 private void GUI_FormClosing(object sender, FormClosingEventArgs e)
 {
     logger.Info("Shutdown");
     Settings.Default.Save();
     if (waveReader != null)
     {
         waveReader.Dispose();
     }
     if (waveOut != null)
     {
         waveOut.Dispose();
     }
 }
Ejemplo n.º 2
0
        // SOUND

        // Play Sound
        public void playSound(HKSound sound)
        {
            if (waveOut != null)
            {
                debugLog("[Sound] Disposed");
                waveOut.Dispose();
            }
            waveOut = new WaveOut();
            waveOut.DeviceNumber = selectedDevice;
            checkSoundState.Stop();
            debugLog("[Action] Sound " + sound.filename);

            // VorbisWaveReader is not in AudioFileReader but is a ISampleProvider
            if (sound.extension == ".ogg")
            {
                if (currentOGG != null)
                {
                    currentOGG.Dispose();
                }
                currentOGG = new VorbisWaveReader(sound.completeFilename);

                waveOut.Init(currentOGG);
                waveOut.Play();
                waveOut.Volume = sound.volume;
                checkSoundState.Start();
                currentSound = sound;
                debugLog("[Sound] Volume : " + sound.volume);
                debugLog("[Sound] OGG Start");
            }
            else if (".mp3.mp4.wav".Contains(sound.extension))
            {
                if (audioFile != null)
                {
                    audioFile.Dispose();
                }
                audioFile = new AudioFileReader(sound.completeFilename);
                waveOut.Init(audioFile);
                waveOut.Play();
                waveOut.Volume = sound.volume;
                checkSoundState.Start();
                currentSound = sound;
                debugLog("[Sound] Volume : " + sound.volume);
                debugLog("[Sound] MP3/MP4/WAV Start");
            }
            else
            {
                debugLog("[Sound] Not MP3, MP4 nor WAV");
            }
        }
Ejemplo n.º 3
0
 private void OnPlaybackStopped(object sender, StoppedEventArgs args)
 {
     outputDevice.Dispose();
     outputDevice = null;
     audioFile.Dispose();
     audioFile = null;
 }
Ejemplo n.º 4
0
            public static void PlayOGGAudioFiles(int BusType, int BusNumber, int audioIndex)
            {
                VorbisWaveReader vorbisStream = new VorbisWaveReader(BGMfiles[audioIndex]);

                try
                {
                    vorbisStream.Dispose();
                    waveOut.Dispose();

                    vorbisStream = new VorbisWaveReader(BGMfiles[audioIndex]);

                    switch (BusType)
                    {
                    //BGM
                    case 0:

                        waveOut.Init(vorbisStream);
                        waveOut.Play();
                        break;

                    //SFX
                    case 1:
                        waveOut.Init(vorbisStream);
                        waveOut.Play();

                        break;
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
Ejemplo n.º 5
0
        public void Dispose()
        {
            AudioManager.audioSources.Remove(name);

            output.Dispose();
            waveChannel.Dispose();
            reader.Dispose();
        }
Ejemplo n.º 6
0
        private void OnPlaybackStopped(object sender, EventArgs e)
        {
            _waveOut.PlaybackStopped -= OnPlaybackStopped;
            _waveOut = null;

            _vorbisReader.Dispose();
            _vorbisReader = null;
        }
Ejemplo n.º 7
0
        public static async void PlaySound(string sound, bool loop)
        {
            Logger.WriteLine($"attempting to play sound: {sound}");

            try
            {
                // gc isn't happy rn
                // create wave out event and initialize it with the vorbis wave reader
                using (WaveOutEvent waveOut = new WaveOutEvent())
                {
                    // create vorbis wave reader
                    using (VorbisWaveReader v = new VorbisWaveReader($"{Static.audioPath}\\{sound}.ogg"))
                    {
                        // also create a loop stream and initialize the wave out event with the loop stream instead of loop is true
                        using (LoopStream loopStream = new LoopStream(v))
                        {
                            if (loop)
                            {
                                waveOut.Init(loopStream);
                            }
                            else
                            {
                                waveOut.Init(v);
                            }

                            // flush and dispose the streams after playback stops
                            void Dispose(object sender, StoppedEventArgs e)
                            {
                                v.Flush();
                                v.Dispose();
                                waveOut.Dispose();
                                loopStream.Flush();
                                loopStream.Dispose();
                            }
                            waveOut.PlaybackStopped += Dispose;

                            // play
                            waveOut.Play();

                            // add the wave out event to the active audio list so it can be stopped manually
                            activeAudio.Add(waveOut);

                            // wait the duration of the sound
                            await Task.Delay(v.TotalTime);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionMessage.New(ex, true);
            }
        }
Ejemplo n.º 8
0
 public void StopSong()
 {
     if (audioFile != null)
     {
         audioFile.Dispose();
         audioFile = null;
     }
     if (oggReader != null)
     {
         oggReader.Dispose();
         oggReader = null;
     }
     audioOutput.Stop();
 }
Ejemplo n.º 9
0
 private void CleanUp()
 {
     if (outputDevice != null)
     {
         outputDevice.Stop();
         outputDevice.Dispose();
         outputDevice = null;
     }
     if (vorbis != null)
     {
         vorbis.Dispose();
         vorbis = null;
     }
 }
Ejemplo n.º 10
0
        public int Read(float[] buffer, int offset, int count)
        {
            if (isDisposed)
            {
                return(0);
            }
            int read = reader.Read(buffer, offset, count);

            if (read == 0)
            {
                reader.Dispose();
                isDisposed = true;
            }
            return(read);
        }
        public int Read(float[] buffer, int offset, int count)
        {
            if (_reader == null)
            {
                return(0);
            }

            var read = _reader.Read(buffer, offset, count);

            if (read == 0)
            {
                _reader.Dispose();
                _reader = null;
            }

            return(read);
        }
Ejemplo n.º 12
0
 public void CleanUp()
 {
     if (vorbisWaveReader != null)
     {
         vorbisWaveReader.Dispose();
         vorbisWaveReader = null;
     }
     if (wavePlayer != null)
     {
         wavePlayer.Dispose();
         wavePlayer = null;
     }
     if (stream != null)
     {
         stream.Dispose();
         stream = null;
     }
 }
Ejemplo n.º 13
0
        public void PlayVorbis(int index, params string[] names)
        {
            if (soundInstances < 4 && index < names.Length)
            {
                string filename = Path.Combine(Environment.CurrentDirectory, string.Concat(names[index], ".ogg"));
                if (!File.Exists(filename))
                {
                    return;
                }

                var vorbisStream = new VorbisWaveReader(filename);
                var waveOut      = new WaveOutEvent();

                Thread currentSound = new Thread(delegate()
                {
                    soundHandle.Reset();
                    waveOut.Init(vorbisStream);
                    waveOut.Play();

                    SpinWait.SpinUntil(() => waveOut.PlaybackState == PlaybackState.Stopped);

                    waveOut.Dispose();
                    vorbisStream.Dispose();

                    if (index + 1 < names.Length)
                    {
                        PlayVorbis(index + 1, names);
                    }
                    else
                    {
                        soundHandle.Set();
                    }

                    soundInstances--;
                });

                currentSound.IsBackground = true;
                currentSound.Start();
                soundInstances++;
            }
        }
        private IWaveProvider GetOggWaveProvider()
        {
            Logger.Info($"Reading Ogg @ {opts.File}");

            var oggReader = new VorbisWaveReader(opts.File);
            int bytes     = (int)oggReader.Length;

            byte[] buffer = new byte[bytes];

            Logger.Info($"Read Ogg - Sample Rate {oggReader.WaveFormat.SampleRate}");

            if (oggReader.WaveFormat.SampleRate < INPUT_SAMPLE_RATE)
            {
                Logger.Error($"Ogg Sample rate must be at least 16000 but is {oggReader.WaveFormat.SampleRate} - Quitting. Use Audacity or another tool to resample as 16000 or Higher");
                Environment.Exit(1);
            }

            int read = oggReader.Read(buffer, 0, (int)bytes);
            BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(oggReader.WaveFormat)
            {
                BufferLength            = read * 2,
                ReadFully               = false,
                DiscardOnBufferOverflow = true
            };

            bufferedWaveProvider.AddSamples(buffer, 0, read);
            VolumeSampleProvider volumeSample =
                new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider())
            {
                Volume = opts.Volume
            };

            oggReader.Close();
            oggReader.Dispose();

            Logger.Info($"Convert to Mono 16bit PCM");

            //after this we've got 16 bit PCM Mono  - just need to sort sample rate
            return(volumeSample.ToMono().ToWaveProvider16());
        }
Ejemplo n.º 15
0
            public void Stop(bool clearCurrentSongString = true)
            {
                if (waveOut != null)
                {
                    waveOut.Stop();
                    waveOut.Dispose();
                }

                if (channel != null)
                {
                    channel.Dispose();
                }

                if (waveReader != null)
                {
                    waveReader.Dispose();
                }

                if (clearCurrentSongString)
                {
                    currentSong = "";
                }
            }
Ejemplo n.º 16
0
        public AudioConvertError Convert(int?loopStart, int?loopEnd, VorbisWaveReader oggFile, out byte[] convertedData)
        {
            var meta = new VorbisReader(oggFile);

            var volume      = 1.0f;
            var numChannels = meta.Channels;
            var sampleRate  = meta.SampleRate;

            loopStart = loopStart ?? 0;
            loopEnd   = loopEnd ?? (int)oggFile.Length;

            MemoryStream scd = CreateSCDHeader((int)oggFile.Length, volume, numChannels, sampleRate, (int)loopStart, (int)loopEnd);

            scd.Seek(0, SeekOrigin.End);
            oggFile.CopyTo(scd);
            scd.Seek(0, SeekOrigin.Begin);

            convertedData = scd.ToArray();

            scd.Dispose();
            oggFile.Dispose();

            return(AudioConvertError.None);
        }
Ejemplo n.º 17
0
        public void ReadData(string path)
        {
            ProgressWindow progress = new ProgressWindow();

            progress.Show();

            if (wavOutput != null)
            {
                wavOutput.Dispose();
            }
            if (wavFile != null)
            {
                wavFile.Dispose();
            }
            if (vorbisFile != null)
            {
                vorbisFile.Dispose();
            }
            textureDisplay.Image = null;
            spriteDisplay.Image  = null;
            loadedAudio          = new byte[] { };
            isOgg = false;
            audioList.Nodes.Clear();
            texList.Items.Clear();
            spriteList.Items.Clear();
            audioList.BeginUpdate();
            texList.BeginUpdate();
            spriteList.BeginUpdate();
            TXTR.Clear();
            AudioGroupList.Clear();
            SPRTList.Clear();
            STRGList.Clear();
            stringList.Items.Clear();
            this.Enabled = false;
            this.Cursor  = Cursors.WaitCursor;
            BinaryReader reader = null;
            string       file   = "";

            if (!path.EndsWith(".exe"))
            {
                if (File.Exists(path + "\\data.win"))
                {
                    file = path + "\\data.win";
                }
                else if (File.Exists(path + "\\game.win"))
                {
                    file = path + "\\game.win";
                }
            }
            else
            {
                progress.SetText("Searching for data.win...");
                reader = new BinaryReader(new FileStream(path, FileMode.Open));
                bool found = false;
                while (reader.BaseStream.Position < reader.BaseStream.Length - 4)
                {
                    long   pos       = reader.BaseStream.Position;
                    byte[] FORMmagic = reader.ReadBytes(4);
                    if (FORMmagic.SequenceEqual(new byte[] { 0x46, 0x4F, 0x52, 0x4D }))
                    {
                        uint   fileLength = reader.ReadUInt32() + 8;
                        byte[] GEN8magic  = reader.ReadBytes(4);
                        if (GEN8magic.SequenceEqual(new byte[] { 0x47, 0x45, 0x4E, 0x38 }))
                        {
                            reader.BaseStream.Seek(pos, SeekOrigin.Begin);
                            if (Directory.Exists(@"C:\gmetemp"))
                            {
                                Directory.Delete(@"C:\gmetemp", true);
                            }
                            Directory.CreateDirectory(@"C:\gmetemp");
                            File.WriteAllBytes(@"C:\gmetemp\tmp.win", reader.ReadBytes((int)fileLength));
                            file  = @"C:\gmetemp\tmp.win";
                            found = true;
                            break;
                        }
                    }
                }
                if (!found)
                {
                    progress.Close();
                    MessageBox.Show("Unable to find data.win");
                    return;
                }
            }
            reader = new BinaryReader(new FileStream(file, FileMode.Open));
            int texOffset = 0x8;

            reader.BaseStream.Seek(0x3C, SeekOrigin.Begin);
            uint version = reader.ReadUInt32();

            reader.BaseStream.Seek(0x38, SeekOrigin.Begin);
            uint projnameoffset = reader.ReadUInt32();

            reader.BaseStream.Seek(projnameoffset - 4, SeekOrigin.Begin);
            string projname = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadInt32()));

            if (version == 1)
            {
                texOffset = 0x4;
            }
            this.Text = "GM2Explorer - Reading game " + projname;

            progress.SetText("Finding next section...");
            //Begin asset search
            reader.BaseStream.Seek(0, SeekOrigin.Begin);
            //Start at FORM
            reader.BaseStream.Seek(8, SeekOrigin.Current);
            //GEN8
            reader.BaseStream.Seek(4, SeekOrigin.Current);
            uint sectLen = reader.ReadUInt32();

            reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            //OPTN
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "OPTN")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //LANG
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "LANG")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //EXTN
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "EXTN")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //SOND
            reader.BaseStream.Seek(4, SeekOrigin.Current);
            sectLen = reader.ReadUInt32();
            uint sondOffs = (uint)reader.BaseStream.Position;

            reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            //AGRP
            progress.SetText("Reading AGRP Section...");
            reader.BaseStream.Seek(4, SeekOrigin.Current);
            sectLen = reader.ReadUInt32();
            uint currentOffset = (uint)reader.BaseStream.Position;

            uint        entryCount     = reader.ReadUInt32();
            uint        entryListStart = (uint)reader.BaseStream.Position;
            List <uint> entryOffsets   = new List <uint>();

            progress.SetProgressValue(0);
            progress.SetProgressMax((int)entryCount);
            for (int i = 0; i < entryCount; i++)
            {
                entryOffsets.Add(reader.ReadUInt32());
            }
            for (int i = 0; i < entryCount; i++)
            {
                progress.SetProgressValue(i);
                progress.SetText($"Reading AGRP Section... {i}/{entryCount} - {(int)(((float)i/(float)entryCount)*100)}");
                AudioGroup _audo = new AudioGroup();
                _audo.fileNames = new List <string>();
                _audo.files     = new List <byte[]>();
                reader.BaseStream.Seek(entryOffsets[i], SeekOrigin.Begin);
                uint nameOffset = reader.ReadUInt32();
                reader.BaseStream.Seek(nameOffset - 4, SeekOrigin.Begin);
                string groupName = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadInt32()));
                _audo.name = groupName;
                AudioGroupList.Add(_audo);
            }
            if (entryCount == 0)
            {
                AudioGroup _audo = new AudioGroup();
                _audo.fileNames = new List <string>();
                _audo.files     = new List <byte[]>();
                _audo.name      = "audiogroup_default";
                AudioGroupList.Add(_audo);
            }

            //Jump back to SOND and fill out the data
            reader.BaseStream.Seek(sondOffs, SeekOrigin.Begin);
            progress.SetText("Reading SOND Section...");
            entryCount     = reader.ReadUInt32();
            entryListStart = (uint)reader.BaseStream.Position;
            entryOffsets   = new List <uint>();

            progress.SetProgressValue(0);
            progress.SetProgressMax((int)entryCount);
            for (int i = 0; i < entryCount; i++)
            {
                entryOffsets.Add(reader.ReadUInt32());
            }
            for (int i = 0; i < entryCount; i++)
            {
                progress.SetProgressValue(i);
                progress.SetText($"Reading SOND Section... {i}/{entryCount} - {(int)(((float)i / (float)entryCount) * 100)}");
                reader.BaseStream.Seek(entryOffsets[i], SeekOrigin.Begin);
                uint nameOffset = reader.ReadUInt32();
                long pos        = reader.BaseStream.Position;
                reader.BaseStream.Seek(nameOffset - 4, SeekOrigin.Begin);
                string audioName = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadInt32()));
                reader.BaseStream.Seek(pos + 0x18, SeekOrigin.Begin);
                int groupIndex = reader.ReadInt32();
                int audioIndex = reader.ReadInt32();
                if (audioIndex != -1)
                {
                    AudioGroup _audo = AudioGroupList[groupIndex];
                    if (_audo.fileNames.Count < audioIndex + 1)
                    {
                        _audo.fileNames.AddRange(new string[(audioIndex + 1) - _audo.fileNames.Count]);
                    }
                    _audo.fileNames[audioIndex] = audioName;
                    AudioGroupList[groupIndex]  = _audo;
                }
            }

            reader.BaseStream.Seek(currentOffset, SeekOrigin.Begin);
            reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            //SPRT
            progress.SetText("Reading SPRT Section...");
            reader.BaseStream.Seek(4, SeekOrigin.Current);
            sectLen       = reader.ReadUInt32();
            currentOffset = (uint)reader.BaseStream.Position;

            uint spriteCount = reader.ReadUInt32();

            progress.SetProgressValue(0);
            progress.SetProgressMax((int)spriteCount);
            List <uint> spriteOffsets = new List <uint>();

            for (int i = 0; i < spriteCount; i++)
            {
                spriteOffsets.Add(reader.ReadUInt32());
            }
            for (int i = 0; i < spriteCount; i++)
            {
                progress.SetProgressValue(i);
                progress.SetText($"Reading SPRT section... {i}/{spriteCount} - {(int)(((float)i / (float)spriteCount) * 100)}");
                SPRT sprt = new SPRT();
                sprt.x      = new List <ushort>();
                sprt.y      = new List <ushort>();
                sprt.width  = new List <ushort>();
                sprt.height = new List <ushort>();
                sprt.sheet  = new List <ushort>();
                reader.BaseStream.Seek(spriteOffsets[i], SeekOrigin.Begin);
                uint nameOffset = reader.ReadUInt32();
                reader.BaseStream.Seek(0x34, SeekOrigin.Current);
                if (version == 2)
                {
                    reader.BaseStream.Seek(0x14, SeekOrigin.Current);
                }
                uint          texCount   = reader.ReadUInt32();
                List <uint>   texOffsets = new List <uint>();
                List <Bitmap> sprites    = new List <Bitmap>();
                for (int t = 0; t < texCount; t++)
                {
                    texOffsets.Add(reader.ReadUInt32());
                }
                for (int t = 0; t < texCount; t++)
                {
                    reader.BaseStream.Seek(texOffsets[t], SeekOrigin.Begin);
                    sprt.x.Add(reader.ReadUInt16());
                    sprt.y.Add(reader.ReadUInt16());
                    sprt.width.Add(reader.ReadUInt16());
                    sprt.height.Add(reader.ReadUInt16());
                    reader.BaseStream.Seek(0xC, SeekOrigin.Current);
                    sprt.sheet.Add(reader.ReadUInt16());
                }
                reader.BaseStream.Seek(nameOffset - 4, SeekOrigin.Begin);
                string name = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadInt32()));
                sprt.name = name;
                SPRTList.Add(sprt);
            }
            reader.BaseStream.Seek(currentOffset, SeekOrigin.Begin);
            reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            progress.SetText("Finding next Section...");
            //BGND
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "BGND")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //PATH
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "PATH")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //SCPT
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "SCPT")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //GLOB
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "GLOB")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //SHDR
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "SHDR")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //FONT
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "FONT")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //TMLN
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "TMLN")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //OBJT
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "OBJT")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //ROOM
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "ROOM")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //DAFL
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "DAFL")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //EMBI
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "EMBI")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //TPAG
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "TPAG")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //TGIN
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "TGIN")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //CODE
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "CODE")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //VARI
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "VARI")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //FUNC
            if (Encoding.UTF8.GetString(reader.ReadBytes(4)) == "FUNC")
            {
                sectLen = reader.ReadUInt32();
                reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            }
            else
            {
                reader.BaseStream.Seek(-0x4, SeekOrigin.Current);
            }
            //STRG
            reader.BaseStream.Seek(4, SeekOrigin.Current);
            sectLen       = reader.ReadUInt32();
            currentOffset = (uint)reader.BaseStream.Position;

            if (MessageBox.Show("Do you want to load the STRG (strings) section?\nNote: This will take a lot longer and will take up a lot more RAM", "GM2Explorer", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                progress.SetText("Reading STRG Section...");
                uint stringCount = reader.ReadUInt32();
                progress.SetProgressValue(0);
                progress.SetProgressMax((int)stringCount);
                for (int i = 0; i < stringCount; i++)
                {
                    progress.SetProgressValue(i);
                    progress.SetText($"Reading STRG section... {i}/{stringCount} - {(int)(((float)i / (float)stringCount) * 100)}");
                    uint pos = (uint)reader.BaseStream.Position;
                    reader.BaseStream.Seek(reader.ReadUInt32(), SeekOrigin.Begin);
                    //Console.WriteLine($"{i}: 0x{pos.ToString("X8")} >> 0x{reader.BaseStream.Position.ToString("X8")}");
                    STRGList.Add(Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadInt32())));
                    reader.BaseStream.Seek(pos + 4, SeekOrigin.Begin);
                }
            }

            reader.BaseStream.Seek(currentOffset, SeekOrigin.Begin);
            reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            //TXTR
            progress.SetText("Reading TXTR Section...");
            reader.BaseStream.Seek(4, SeekOrigin.Current);
            sectLen       = reader.ReadUInt32();
            currentOffset = (uint)reader.BaseStream.Position;

            uint sectionEndOffset = currentOffset + sectLen;
            uint fileCount        = reader.ReadUInt32();
            uint fileListStart    = (uint)reader.BaseStream.Position;

            progress.SetProgressValue(0);
            progress.SetProgressMax((int)fileCount);
            List <uint> fileOffsets = new List <uint>();

            for (int f = 0; f < fileCount; f++)
            {
                uint pos = (uint)reader.BaseStream.Position;
                reader.BaseStream.Seek(reader.ReadUInt32() + texOffset, SeekOrigin.Begin);
                fileOffsets.Add(reader.ReadUInt32());
                reader.BaseStream.Seek(pos + 4, SeekOrigin.Begin);
            }
            for (int f = 0; f < fileOffsets.Count; f++)
            {
                progress.SetProgressValue(f);
                progress.SetText($"Reading TXTR section... {f}/{fileCount} - {(int)(((float)f / (float)fileCount) * 100)}");
                reader.BaseStream.Seek(fileOffsets[f], SeekOrigin.Begin);
                byte[] tex = new byte[] { };
                if (f == fileOffsets.Count - 1)
                {
                    tex = reader.ReadBytes((int)(sectionEndOffset - fileOffsets[f]));
                }
                else
                {
                    tex = reader.ReadBytes((int)(fileOffsets[f + 1] - fileOffsets[f]));
                }
                try
                {
                    MemoryStream stream = new MemoryStream(tex);
                    Image        img    = Image.FromStream(stream);
                    TXTR.Add(new Bitmap(img));
                    stream.Dispose();
                    img.Dispose();
                }
                catch { }
            }
            fileOffsets.Clear();
            reader.BaseStream.Seek(currentOffset, SeekOrigin.Begin);
            reader.BaseStream.Seek(sectLen, SeekOrigin.Current);
            //AUDO
            progress.SetText("Reading AUDO Section...");
            reader.BaseStream.Seek(4, SeekOrigin.Current);
            sectLen = reader.ReadUInt32();

            AudioGroup audo = AudioGroupList[0];

            //Console.WriteLine("Found AUDO Section at 0x" + currentOffset.ToString("X8"));
            fileCount     = reader.ReadUInt32();
            fileListStart = (uint)reader.BaseStream.Position;
            progress.SetProgressValue(0);
            progress.SetProgressMax((int)fileCount);
            fileOffsets = new List <uint>();
            for (int f = 0; f < fileCount; f++)
            {
                uint audoDataOffset = reader.ReadUInt32();
                fileOffsets.Add(audoDataOffset);
            }
            for (int f = 0; f < fileOffsets.Count; f++)
            {
                progress.SetProgressValue(f);
                progress.SetText($"Reading TXTR section... {f}/{fileCount} - {(int)(((float)f / (float)fileCount) * 100)}");
                reader.BaseStream.Seek(fileOffsets[f], SeekOrigin.Begin);
                //Console.WriteLine("Reading audio " + f + " at offset 0x" + fileOffsets[f].ToString("X8"));
                List <byte> audio      = new List <byte>();
                uint        fileLength = reader.ReadUInt32();
                audio.AddRange(reader.ReadBytes((int)fileLength));
                audo.files.Add(audio.ToArray());
                audio.Clear();
            }
            AudioGroupList[0] = audo;
            fileOffsets.Clear();
            reader.Dispose();

            progress.SetProgressValue(0);
            progress.SetText("Reading AudioGroups...");
            if (path.EndsWith(".exe"))
            {
                path = path.Replace("\\" + path.Split('\\').Last(), "");
            }
            string[] audiogroups = Directory.GetFiles(path, "audiogroup*.dat");
            progress.SetProgressMax(audiogroups.Length);
            for (int i = 0; i < audiogroups.Length; i++)
            {
                progress.SetProgressValue(i);
                progress.SetText($"Reading TXTR section... {i}/{audiogroups.Length} - {(int)(((float)i / (float)audiogroups.Length) * 100)}");

                this.Text = "GM2Explorer - Reading \"" + path + "\\" + audiogroups[i].Replace(path + "\\", "") + "\"";
                reader    = new BinaryReader(new FileStream(audiogroups[i], FileMode.Open));
                reader.BaseStream.Seek(0x10, SeekOrigin.Begin);

                audo       = AudioGroupList[i + 1];
                audo.files = new List <byte[]>();
                //Console.WriteLine("Found AUDO Section at 0x" + currentOffset.ToString("X8"));
                fileCount     = reader.ReadUInt32();
                fileListStart = (uint)reader.BaseStream.Position;
                fileOffsets   = new List <uint>();
                for (int f = 0; f < fileCount; f++)
                {
                    uint audoDataOffset = reader.ReadUInt32();
                    fileOffsets.Add(audoDataOffset);
                }
                for (int f = 0; f < fileOffsets.Count; f++)
                {
                    reader.BaseStream.Seek(fileOffsets[f], SeekOrigin.Begin);
                    //Console.WriteLine("Reading audio " + f + " at offset 0x" + fileOffsets[f].ToString("X8"));
                    List <byte> audio      = new List <byte>();
                    uint        fileLength = reader.ReadUInt32();
                    audio.AddRange(reader.ReadBytes((int)fileLength));
                    audo.files.Add(audio.ToArray());
                    audio.Clear();
                }
                AudioGroupList[i + 1] = audo;
            }
            reader.Dispose();

            texList.BeginUpdate();
            spriteList.BeginUpdate();
            audioList.BeginUpdate();
            stringList.BeginUpdate();

            for (int i = 0; i < TXTR.Count; i++)
            {
                texList.Items.Add("tex_" + i);
            }
            for (int i = 0; i < SPRTList.Count; i++)
            {
                spriteList.Items.Add(SPRTList[i].name);
            }
            for (int i = 0; i < AudioGroupList.Count; i++)
            {
                audioList.Nodes.Add(AudioGroupList[i].name);
                for (int a = 0; a < AudioGroupList[i].files.Count; a++)
                {
                    if (AudioGroupList[i].fileNames[a] != "")
                    {
                        audioList.Nodes[i].Nodes.Add(AudioGroupList[i].fileNames[a]);
                    }
                    else
                    {
                        audioList.Nodes[i].Nodes.Add("audio_" + a);
                    }
                }
            }
            for (int i = 0; i < STRGList.Count; i++)
            {
                stringList.Items.Add(STRGList[i]);
            }

            texList.EndUpdate();
            spriteList.EndUpdate();
            audioList.EndUpdate();
            stringList.EndUpdate();

            file = "";
            reader.Dispose();
            sNum.Maximum = TXTR.Count - 1;
            this.Text    = "GM2Explorer";
            this.Cursor  = Cursors.Default;
            this.Enabled = true;
            this.BringToFront();
            audioList.EndUpdate();
            texList.EndUpdate();
            spriteList.EndUpdate();

            if (Directory.Exists(@"C:\gmetemp"))
            {
                Directory.Delete(@"C:\gmetemp", true);
            }

            progress.Close();
        }
Ejemplo n.º 18
0
        private static void ConvertSound(Sound sound)
        {
            if (!sound.HasStartFile && !sound.HasStartFile)
            {
                return;
            }

            FileInfo outFile = CurrentDirectory.GetDirectory("out").GetFile($"{sound.Name}.{Arguments.Format.ToString().ToLower()}");

            if (!Arguments.Overwrite && outFile.Exists)
            {
                return;
            }

            FileInfo tempWave = new FileInfo(Path.GetTempFileName());

            WaveReader reader = new WaveReader();
            AudioData  audio  = null;

            Console.WriteLine($"Processing {sound.Name}...");
            if (sound.HasStartFile && !sound.HasLoopFile)
            {
                using (VorbisWaveReader vorbisStart = new VorbisWaveReader(GameSounds.GetFile(sound.StartFileName).FullName))
                {
                    WaveFileWriter.CreateWaveFile(tempWave.FullName, vorbisStart.ToWaveProvider16());
                }
                using (FileStream stream = tempWave.OpenRead())
                {
                    audio = reader.Read(stream);
                }
            }
            else if (sound.HasStartFile && sound.HasLoopFile)
            {
                VorbisWaveReader vorbisStart = new VorbisWaveReader(GameSounds.GetFile(sound.StartFileName).FullName);
                VorbisWaveReader vorbisLoop  = new VorbisWaveReader(GameSounds.GetFile(sound.LoopFileName).FullName);
                if (vorbisStart.WaveFormat.SampleRate < vorbisLoop.WaveFormat.SampleRate)
                {
                    MediaFoundationResampler sampeler = new MediaFoundationResampler(vorbisStart, vorbisLoop.WaveFormat.SampleRate);
                    WaveFileWriter.CreateWaveFile(tempWave.FullName, sampeler.ToSampleProvider().FollowedBy(vorbisLoop).ToWaveProvider16());
                }
                else if (vorbisStart.WaveFormat.SampleRate > vorbisLoop.WaveFormat.SampleRate)
                {
                    MediaFoundationResampler sampeler = new MediaFoundationResampler(vorbisLoop, vorbisStart.WaveFormat.SampleRate);
                    WaveFileWriter.CreateWaveFile(tempWave.FullName, vorbisStart.FollowedBy(sampeler.ToSampleProvider()).ToWaveProvider16());
                }
                else
                {
                    WaveFileWriter.CreateWaveFile(tempWave.FullName, vorbisStart.FollowedBy(vorbisLoop).ToWaveProvider16());
                }
                VorbisReader dataStart = new VorbisReader(GameSounds.GetFile(sound.StartFileName).FullName);
                VorbisReader dataLoop  = new VorbisReader(GameSounds.GetFile(sound.LoopFileName).FullName);
                int          startLoop = (int)dataStart.TotalSamples;
                int          endLoop   = (int)dataStart.TotalSamples + (int)dataLoop.TotalSamples;
                vorbisStart.Dispose();
                vorbisLoop.Dispose();
                dataStart.Dispose();
                dataLoop.Dispose();
                using (FileStream stream = tempWave.OpenRead())
                {
                    audio = reader.Read(stream);
                }

                audio.SetLoop(true, startLoop, endLoop);
            }
            else if (!sound.HasStartFile && sound.HasLoopFile)
            {
                VorbisWaveReader vorbisLoop = new VorbisWaveReader(GameSounds.GetFile(sound.LoopFileName).FullName);
                WaveFileWriter.CreateWaveFile(tempWave.FullName, vorbisLoop.ToWaveProvider16());
                VorbisReader dataLoop     = new VorbisReader(GameSounds.GetFile(sound.LoopFileName).FullName);
                int          totalSamples = (int)dataLoop.TotalSamples;
                vorbisLoop.Dispose();
                dataLoop.Dispose();
                audio = reader.Read(tempWave.OpenRead());

                audio.SetLoop(true, 0, totalSamples);
            }

            if (audio != null)
            {
                BCFstmWriter writer = new BCFstmWriter(Arguments.Target);
                writer.Configuration.Codec      = Arguments.Codec;
                writer.Configuration.Endianness = Arguments.Endianness;
                using (FileStream stream = outFile.OpenWrite())
                {
                    writer.WriteToStream(audio, stream);
                }
            }
        }
Ejemplo n.º 19
0
        public int Read(byte[] buffer, int offset, int count)
        {
            if (count % bytesPerSample != 0)
            {
                count = (count / bytesPerSample) * bytesPerSample;
            }

            lock (this)
            {
                for (int i = 0; i < count;)
                {
                    if (reader.Length - reader.Position <= count - i)
                    {
                        i += reader.Read(buffer, offset + i, (int)reader.Length - (int)reader.Position);
                        reader.Position = loopFrom;
                    }
                    else
                    {
                        i += reader.Read(buffer, offset + i, count - i);
                    }
                }


                #region 淡入淡出
                if (preReader != null)
                {
                    if (UseSmoothSwitchWhenPause)
                    {
                        unsafe
                        {
                            if (buffer1 == null || buffer1.Length < count)
                            {
                                buffer1 = new byte[count];
                            }
                            for (int i = 0; i < count;)
                            {
                                if (preReader.Length - preReader.Position <= count - i)
                                {
                                    i += preReader.Read(buffer1, i, (int)preReader.Length - (int)preReader.Position);
                                    preReader.Position = preLoopFrom;
                                }
                                else
                                {
                                    i += preReader.Read(buffer1, i, count - i);
                                }
                            }
                            float al, ar, bl, br;
                            fixed(byte *pa = buffer)
                            {
                                fixed(byte *pb = buffer1)
                                {
                                    float *fpa = (float *)(pa + offset);
                                    float *fpb = (float *)pb;
                                    int    end = count / bytesPerSample * 2;
                                    float  x;

                                    for (int i = 0; i < end; i += 2)
                                    {
                                        al = fpa[i];
                                        ar = fpa[i + 1];
                                        bl = fpb[i];
                                        br = fpb[i + 1];
                                        x  = (i + 1) * 1.0f / end;

                                        fpa[i]     = al * x + bl * (1 - x);
                                        fpa[i + 1] = ar * x + br * (1 - x);
                                    }
                                }
                            }
                        }
                    }

                    preReader.Dispose();
                    preFile.Dispose();
                    preReader = null;
                    preFile   = null;
                    UseSmoothSwitchWhenPause = true;
                }

                #endregion
            }
            return(count);
        }