public void ProduceFullAudioClipData(FullAudioClipData fullAudioClipData) { string ResourcesRootDirectory = BmsChartFolder; BmsAudioGenerator bmsAudioGenerator = new BmsAudioGenerator(44100, 2); int TotalCount = NativeBmsChart.Events.Count; int LoadedCount = 0; foreach (BMSEvent Event in NativeBmsChart.Events) { switch (Event.type) { case BMSEventType.LongNoteEnd: case BMSEventType.LongNoteStart: case BMSEventType.Note: case BMSEventType.WAV: BMSResourceData resourceData = new BMSResourceData(); if (!NativeBmsChart.TryGetResourceData(ResourceType.wav, Event.data2, out resourceData)) { continue; } string FileName = Path.GetFileNameWithoutExtension(resourceData.dataPath); string OggResourcePath = (ResourcesRootDirectory + "/" + FileName + ".ogg").Replace("\\", "/"); string WavResourcePath = (ResourcesRootDirectory + "/" + FileName + ".wav").Replace("\\", "/"); if (File.Exists(OggResourcePath)) { NVorbis.VorbisReader vorbisReader = new NVorbis.VorbisReader(OggResourcePath); float[] oggData = new float[vorbisReader.TotalSamples * vorbisReader.Channels]; vorbisReader.ReadSamples(oggData, 0, (int)(vorbisReader.TotalSamples * vorbisReader.Channels)); bmsAudioGenerator.PutAudioAt((float)Event.time.TotalSeconds, oggData); } else if (File.Exists(WavResourcePath)) { List <float> wavData = new List <float>(); NAudio.Wave.WaveFileReader waveFileReader = new NAudio.Wave.WaveFileReader(WavResourcePath); float[] wavFrame; while (true) { wavFrame = waveFileReader.ReadNextSampleFrame(); if (wavFrame == null) { break; } wavData.AddRange(wavFrame); } bmsAudioGenerator.PutAudioAt((float)Event.time.TotalSeconds, wavData.ToArray()); } break; } LoadedCount++; fullAudioClipData.Percent = 100f * LoadedCount / TotalCount; } fullAudioClipData.Data = bmsAudioGenerator.Data; fullAudioClipData.IsCompleted = true; }
public Task ProduceFullAudioClipDataAsync(FullAudioClipData fullAudioClipData) { return(Task.Run(() => ProduceFullAudioClipData(fullAudioClipData))); }