Inheritance: INotifyPropertyChanged
        private void PatternScan(byte[] blockData)
        {
            var magic   = "CWAV".Select(c => (byte)c).ToArray();
            var indexes = ScanBuffer(blockData, magic);

            foreach (int index in indexes)
            {
                var sz = BitConverter.ToInt32(blockData, index + 0x0C);

                // Probably a Mismatch
                // Or an invalid CWAV File Header
                // Read to End of Block and pray
                if (index + sz > blockData.Length)
                {
                    sz = blockData.Length - index;
                }

                byte[] fileData = new byte[sz];
                Buffer.BlockCopy(blockData, index, fileData, 0, sz);
                var cwav = new CwavFile(fileData)
                {
                    Tag = "0x" + index.ToString("X8")
                };
                Scanned.Add(cwav);
            }
        }
 private void Remove_Execute(CwavKind obj)
 {
     Import_PostExecute(new ImportResults()
     {
         CWAV   = CwavFile.Empty(),
         Target = obj,
         Loaded = true
     });
 }
        public CwavBlock()
        {
            Sounds = new SoundDictionary
            {
                { CwavKind.Cursor, CwavFile.Empty() },
                { CwavKind.Launch, CwavFile.Empty() },
                { CwavKind.Folder, CwavFile.Empty() },
                { CwavKind.Close, CwavFile.Empty() },
                { CwavKind.Frame0, CwavFile.Empty() },
                { CwavKind.Frame1, CwavFile.Empty() },
                { CwavKind.Frame2, CwavFile.Empty() },
                { CwavKind.OpenLid, CwavFile.Empty() },
            };
            Scanned = new List <CwavFile>(7);

            foreach (var pair in Sounds)
            {
                pair.Value.PropertyChanged += SoundEffectOnPropertyChanged;
            }
        }
        private Task <ImportResults> Import_Execute(CwavKind cwavKind)
        {
            return(Task <ImportResults> .Factory.StartNew(() =>
            {
                var result = new ImportResults
                {
                    Loaded = false,
                    Target = cwavKind
                };
                OpenFileDialog opfd = new OpenFileDialog
                {
                    Filter = ThirdPartyTools.CtrWaveConveter.Present
                                 ? "Supported Files|*.wav;*.bcwav|DSP ADCPM Audio|*.bcwav|PCM Audio|*.wav"
                                 : "Supported Files|*.bcwav|DSP ADCPM Audio|*.bcwav"
                };
                var dlg = opfd.ShowDialog();
                if (dlg.HasValue && dlg.Value)
                {
                    try
                    {
                        switch (opfd.FilterIndex)
                        {
                        case 1:
                            {
                                if (opfd.FileName.EndsWith(".bcwav", StringComparison.OrdinalIgnoreCase))
                                {
                                    goto case 2;
                                }
                                if (opfd.FileName.EndsWith(".wav", StringComparison.OrdinalIgnoreCase))
                                {
                                    goto case 3;
                                }
                                break;
                            }

                        case 2:
                            {
                                // Read CWAV
                                var cwavData = File.ReadAllBytes(opfd.FileName);
                                result.Loaded = true;
                                result.CWAV = new CwavFile(cwavData);
                                break;
                            }

                        case 3:
                            {
                                // Convert Wav
                                var wavData = File.ReadAllBytes(opfd.FileName);
                                byte[] cwavData = CwavFile.EncodeCwav(wavData);
                                if (cwavData.Length == 3)
                                {
                                    return result;
                                }
                                result.Loaded = true;
                                result.CWAV = new CwavFile(cwavData);
                                break;
                            }
                        }
                    }
                    catch
                    {
                        // Ignore
                    }
                }
                return result;
            }));
        }