private int ProcessAudioFile(List <FilterBase> filters, int nChannels, int channelId, ref AudioDataPerChannel from, ref AudioDataPerChannel to, ProgressReportCallback Callback) { foreach (var f in filters) { f.FilterStart(); } to.ResetStatistics(); long pos = 0; while (pos < to.totalSamples) { var pcm = FilterNth(filters, filters.Count - 1, channelId, ref from); to.SetPcmInDouble(pcm, pos); pos += pcm.LongLength; long currentSamples = System.Threading.Interlocked.Add(ref mProgressSamples, pcm.LongLength); double percent = (double)FILE_READ_COMPLETE_PERCENTAGE + ((double)FILE_PROCESS_COMPLETE_PERCENTAGE - FILE_READ_COMPLETE_PERCENTAGE) * currentSamples / to.totalSamples / nChannels; Callback((int)percent, new ProgressArgs("", 0)); } foreach (var f in filters) { f.FilterEnd(); } return(0); }
private static int ReadWavFile(string path, out AudioData ad) { ad = new AudioData(); using (var br = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) { var reader = new WavRWLib2.WavReader(); if (!reader.ReadHeaderAndSamples(br, 0, -1)) { MessageBox.Show( string.Format("Error: Failed to read WAV file: {0}", path)); return(-1); } ad.meta = new WWFlacRWCS.Metadata(); ad.meta.albumStr = reader.AlbumName; ad.meta.artistStr = reader.ArtistName; ad.meta.titleStr = reader.Title; ad.meta.pictureBytes = reader.PictureBytes; ad.picture = reader.PictureData; ad.meta.totalSamples = reader.NumFrames; ad.meta.channels = reader.NumChannels; ad.meta.sampleRate = reader.SampleRate; var interleaved = reader.GetSampleArray(); int bytesPerSample = reader.BitsPerSample / 8; ad.pcm = new List <AudioDataPerChannel>(); for (int ch = 0; ch < reader.NumChannels; ++ch) { var pcmOneChannel = new byte[reader.NumFrames * bytesPerSample]; for (int i = 0; i < reader.NumFrames; ++i) { for (int b = 0; b < reader.BitsPerSample / 8; ++b) { pcmOneChannel[bytesPerSample * i + b] = interleaved[bytesPerSample * (reader.NumChannels * i + ch) + b]; } } var pcm24 = PcmDataLib.Util.ConvertTo24bit(reader.BitsPerSample, reader.NumFrames, reader.SampleValueRepresentationType, pcmOneChannel); var adp = new AudioDataPerChannel(); adp.data = pcm24; adp.offsBytes = 0; adp.bitsPerSample = 24; adp.totalSamples = ad.meta.totalSamples; ad.pcm.Add(adp); } // converted to 24bit ad.meta.bitsPerSample = 24; ad.preferredSaveFormat = FileFormatType.FLAC; return(0); } }
private static int ReadFlacFile(string path, out AudioData ad) { ad = new AudioData(); var flac = new WWFlacRWCS.FlacRW(); int rv = flac.DecodeAll(path); if (rv < 0) { return(rv); } rv = flac.GetDecodedMetadata(out ad.meta); if (rv < 0) { return(rv); } rv = flac.GetDecodedPicture(out ad.picture, ad.meta.pictureBytes); if (rv < 0) { return(rv); } ad.pcm = new List <AudioDataPerChannel>(); for (int ch = 0; ch < ad.meta.channels; ++ch) { byte[] pcm; long lrv = flac.GetDecodedPcmBytes(ch, 0, out pcm, ad.meta.totalSamples * (ad.meta.bitsPerSample / 8)); if (lrv < 0) { return((int)lrv); } var pcm24 = PcmDataLib.Util.ConvertTo24bit(ad.meta.bitsPerSample, ad.meta.totalSamples, PcmDataLib.PcmData.ValueRepresentationType.SInt, pcm); var adp = new AudioDataPerChannel(); adp.data = pcm24; adp.offsBytes = 0; adp.bitsPerSample = 24; adp.totalSamples = ad.meta.totalSamples; ad.pcm.Add(adp); } // converted to 24bit ad.meta.bitsPerSample = 24; ad.preferredSaveFormat = FileFormatType.FLAC; flac.DecodeEnd(); return(0); }
private static int ReadFlacFile(string path, out AudioData ad) { ad = new AudioData(); ad.fileFormat = FileFormatType.FLAC; var flac = new WWFlacRWCS.FlacRW(); int rv = flac.DecodeAll(path); if (rv < 0) { return(rv); } rv = flac.GetDecodedMetadata(out ad.meta); if (rv < 0) { return(rv); } rv = flac.GetDecodedPicture(out ad.picture, ad.meta.pictureBytes); if (rv < 0) { return(rv); } ad.pcm = new List <AudioDataPerChannel>(); for (int ch = 0; ch < ad.meta.channels; ++ch) { byte[] data; long lrv = flac.GetDecodedPcmBytes(ch, 0, out data, ad.meta.totalSamples * (ad.meta.bitsPerSample / 8)); if (lrv < 0) { return((int)lrv); } var adp = new AudioDataPerChannel(); adp.data = data; adp.offsBytes = 0; adp.bitsPerSample = ad.meta.bitsPerSample; adp.totalSamples = ad.meta.totalSamples; ad.pcm.Add(adp); } flac.DecodeEnd(); return(0); }
private double[] FilterNth(List <FilterBase> filters, int nth, int channelId, ref AudioDataPerChannel from) { if (nth == -1) { return(from.GetPcmInDouble(filters[0].NumOfSamplesNeeded())); } else { // サンプル数が貯まるまでn-1番目のフィルターを実行する。 List <double[]> inPcmList = new List <double[]>(); { // 前回フィルタ処理で余った入力データ double[] prevRemainings = filters[nth].GetPreviousProcessRemains(); if (prevRemainings != null && 0 < prevRemainings.LongLength) { inPcmList.Add(prevRemainings); } } while (CountTotalSamples(inPcmList) < filters[nth].NumOfSamplesNeeded()) { inPcmList.Add(FilterNth(filters, nth - 1, channelId, ref from)); } double[] inPcm; double[] remainings; AssembleSample(inPcmList, filters[nth].NumOfSamplesNeeded(), out inPcm, out remainings); if (filters[nth].WaitUntilAllChannelDataAvailable()) { mInPcmArray[channelId] = inPcm; // mInPcmArrayに全てのチャンネルのPCMが集まるまで待つ。 mBarrierReady.SignalAndWait(); for (int ch = 0; ch < mInPcmArray.Length; ++ch) { filters[nth].SetChannelPcm(ch, mInPcmArray[ch]); } // 全てのスレッドのfiltersのSetChannelPcm()が終わるまで待つ。 mBarrierSet.SignalAndWait(); if (channelId == 0) { // 0番のスレッドが代表して実行。mInPcmArray配列をクリア。 for (int ch = 0; ch < mInPcmArray.Length; ++ch) { mInPcmArray[ch] = null; } } } // n番目のフィルター実行準備が整った。 // n番目のフィルターを実行する。 double[] outPcm = filters[nth].FilterDo(inPcm); // length-1番目のフィルター後に余った入力データremainingsをn番目のフィルターにセットする filters[nth].SetPreviousProcessRemains(remainings); return(outPcm); } }
private int SetupResultPcm(AudioData from, List <FilterBase> filters, out AudioData to, FileFormatType toFileFormat) { to = new AudioData(); to.fileFormat = toFileFormat; var fmt = FilterSetup(from, 0, filters); to.meta = new WWFlacRWCS.Metadata(from.meta); to.meta.sampleRate = fmt.SampleRate; to.meta.totalSamples = fmt.NumSamples; to.meta.channels = fmt.NumChannels; switch (toFileFormat) { case FileFormatType.FLAC: #if true to.meta.bitsPerSample = 24; #endif break; case FileFormatType.DSF: to.meta.bitsPerSample = 1; break; } if (from.picture != null) { to.picture = new byte[from.picture.Length]; System.Array.Copy(from.picture, to.picture, to.picture.Length); } // allocate "to" pcm data to.pcm = new List <AudioDataPerChannel>(); for (int ch = 0; ch < to.meta.channels; ++ch) { byte[] data; // set silent sample values to output buffer switch (toFileFormat) { case FileFormatType.DSF: if (0x7FFFFFC7 < (to.meta.totalSamples + 7) / 8) { return((int)WWFlacRWCS.FlacErrorCode.OutputFileTooLarge); } data = new byte[(to.meta.totalSamples + 7) / 8]; for (long i = 0; i < data.LongLength; ++i) { data[i] = 0x69; } break; case FileFormatType.FLAC: if (0x7FFFFFC7 < to.meta.totalSamples * (to.meta.bitsPerSample / 8)) { return((int)WWFlacRWCS.FlacErrorCode.OutputFileTooLarge); } data = new byte[to.meta.totalSamples * (to.meta.bitsPerSample / 8)]; break; default: System.Diagnostics.Debug.Assert(false); data = null; break; } var adp = new AudioDataPerChannel(); adp.data = data; adp.bitsPerSample = to.meta.bitsPerSample; adp.totalSamples = to.meta.totalSamples; to.pcm.Add(adp); } return(0); }
private int SetupResultPcm(AudioData from, List<FilterBase> filters, out AudioData to, FileFormatType toFileFormat) { to = new AudioData(); to.preferredSaveFormat = toFileFormat; var fmt = FilterSetup(from, 0, filters); to.meta = new WWFlacRWCS.Metadata(from.meta); to.meta.sampleRate = fmt.SampleRate; to.meta.totalSamples = fmt.NumSamples; to.meta.channels = fmt.NumChannels; switch (toFileFormat) { case FileFormatType.FLAC: #if true to.meta.bitsPerSample = 24; #endif break; case FileFormatType.DSF: to.meta.bitsPerSample = 1; break; } if (from.picture != null) { to.picture = new byte[from.picture.Length]; System.Array.Copy(from.picture, to.picture, to.picture.Length); } // allocate "to" pcm data to.pcm = new List<AudioDataPerChannel>(); for (int ch = 0; ch < to.meta.channels; ++ch) { byte[] data; // set silent sample values to output buffer switch (toFileFormat) { case FileFormatType.DSF: if (0x7FFFFFC7 < (to.meta.totalSamples + 7) / 8) { return (int)WWFlacRWCS.FlacErrorCode.OutputFileTooLarge; } data = new byte[(to.meta.totalSamples + 7) / 8]; for (long i = 0; i < data.LongLength; ++i) { data[i] = 0x69; } break; case FileFormatType.FLAC: if (0x7FFFFFC7 < to.meta.totalSamples * (to.meta.bitsPerSample / 8)) { return (int)WWFlacRWCS.FlacErrorCode.OutputFileTooLarge; } data = new byte[to.meta.totalSamples * (to.meta.bitsPerSample / 8)]; break; default: System.Diagnostics.Debug.Assert(false); data = null; break; } var adp = new AudioDataPerChannel(); adp.data = data; adp.bitsPerSample = to.meta.bitsPerSample; adp.totalSamples = to.meta.totalSamples; to.pcm.Add(adp); } return 0; }
private int ProcessAudioFile(List<FilterBase> filters, int nChannels, int channelId, ref AudioDataPerChannel from, ref AudioDataPerChannel to, ProgressReportCallback Callback) { foreach (var f in filters) { f.FilterStart(); } to.ResetStatistics(); long pos = 0; while (pos < to.totalSamples) { var pcm = FilterNth(filters, filters.Count - 1, channelId, ref from); to.SetPcmInDouble(pcm, pos); pos += pcm.LongLength; long currentSamples = System.Threading.Interlocked.Add(ref mProgressSamples, pcm.LongLength); double percent = (double)FILE_READ_COMPLETE_PERCENTAGE + ((double)FILE_PROCESS_COMPLETE_PERCENTAGE - FILE_READ_COMPLETE_PERCENTAGE) * currentSamples / to.totalSamples / nChannels; Callback((int)percent, new ProgressArgs("", 0)); } foreach (var f in filters) { f.FilterEnd(); } return 0; }
private double[] FilterNth(List<FilterBase> filters, int nth, int channelId, ref AudioDataPerChannel from) { if (nth == -1) { return from.GetPcmInDouble(filters[0].NumOfSamplesNeeded()); } else { // サンプル数が貯まるまでn-1番目のフィルターを実行する。 List<double[]> inPcmList = new List<double[]>(); { // 前回フィルタ処理で余った入力データ double[] prevRemainings = filters[nth].GetPreviousProcessRemains(); if (prevRemainings != null && 0 < prevRemainings.LongLength) { inPcmList.Add(prevRemainings); } } while (CountTotalSamples(inPcmList) < filters[nth].NumOfSamplesNeeded()) { inPcmList.Add(FilterNth(filters, nth - 1, channelId, ref from)); } double[] inPcm; double[] remainings; AssembleSample(inPcmList, filters[nth].NumOfSamplesNeeded(), out inPcm, out remainings); if (filters[nth].WaitUntilAllChannelDataAvailable()) { mInPcmArray[channelId] = inPcm; // mInPcmArrayに全てのチャンネルのPCMが集まるまで待つ。 mBarrierReady.SignalAndWait(); for (int ch = 0; ch < mInPcmArray.Length; ++ch) { filters[nth].SetChannelPcm(ch, mInPcmArray[ch]); } // 全てのスレッドのfiltersのSetChannelPcm()が終わるまで待つ。 mBarrierSet.SignalAndWait(); if (channelId == 0) { // 0番のスレッドが代表して実行。mInPcmArray配列をクリア。 for (int ch = 0; ch < mInPcmArray.Length; ++ch) { mInPcmArray[ch] = null; } } } // n番目のフィルター実行準備が整った。 // n番目のフィルターを実行する。 double[] outPcm = filters[nth].FilterDo(inPcm); // length-1番目のフィルター後に余った入力データremainingsをn番目のフィルターにセットする filters[nth].SetPreviousProcessRemains(remainings); return outPcm; } }
private static int ReadWavFile(string path, out AudioData ad) { ad = new AudioData(); using (var br = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) { var reader = new WavRWLib2.WavReader(); if (!reader.ReadHeaderAndSamples(br, 0, -1)) { MessageBox.Show( string.Format("Error: Failed to read WAV file: {0}", path)); return -1; } ad.meta = new WWFlacRWCS.Metadata(); ad.meta.albumStr = reader.AlbumName; ad.meta.artistStr = reader.ArtistName; ad.meta.titleStr = reader.Title; ad.meta.pictureBytes = reader.PictureBytes; ad.picture = reader.PictureData; ad.meta.totalSamples = reader.NumFrames; ad.meta.channels = reader.NumChannels; ad.meta.sampleRate = reader.SampleRate; var interleaved = reader.GetSampleArray(); int bytesPerSample = reader.BitsPerSample / 8; ad.pcm = new List<AudioDataPerChannel>(); for (int ch = 0; ch < reader.NumChannels; ++ch) { var pcmOneChannel = new byte[reader.NumFrames * bytesPerSample]; for (int i = 0; i < reader.NumFrames; ++i) { for (int b = 0; b < reader.BitsPerSample / 8; ++b) { pcmOneChannel[bytesPerSample * i + b] = interleaved[bytesPerSample * (reader.NumChannels * i + ch) + b]; } } var pcm24 = PcmDataLib.Util.ConvertTo24bit(reader.BitsPerSample, reader.NumFrames, reader.SampleValueRepresentationType, pcmOneChannel); var adp = new AudioDataPerChannel(); adp.data = pcm24; adp.offsBytes = 0; adp.bitsPerSample = 24; adp.totalSamples = ad.meta.totalSamples; ad.pcm.Add(adp); } // converted to 24bit ad.meta.bitsPerSample = 24; ad.preferredSaveFormat = FileFormatType.FLAC; return 0; } }
private static int ReadFlacFile(string path, out AudioData ad) { ad = new AudioData(); var flac = new WWFlacRWCS.FlacRW(); int rv = flac.DecodeAll(path); if (rv < 0) { return rv; } rv = flac.GetDecodedMetadata(out ad.meta); if (rv < 0) { return rv; } rv = flac.GetDecodedPicture(out ad.picture, ad.meta.pictureBytes); if (rv < 0) { return rv; } ad.pcm = new List<AudioDataPerChannel>(); for (int ch = 0; ch < ad.meta.channels; ++ch) { byte[] pcm; long lrv = flac.GetDecodedPcmBytes(ch, 0, out pcm, ad.meta.totalSamples * (ad.meta.bitsPerSample / 8)); if (lrv < 0) { return (int)lrv; } var pcm24 = PcmDataLib.Util.ConvertTo24bit(ad.meta.bitsPerSample, ad.meta.totalSamples, PcmDataLib.PcmData.ValueRepresentationType.SInt, pcm); var adp = new AudioDataPerChannel(); adp.data = pcm24; adp.offsBytes = 0; adp.bitsPerSample = 24; adp.totalSamples = ad.meta.totalSamples; ad.pcm.Add(adp); } // converted to 24bit ad.meta.bitsPerSample = 24; ad.preferredSaveFormat = FileFormatType.FLAC; flac.DecodeEnd(); return 0; }