public int Run(string fromPath, List <FilterBase> aFilters, string toPath, ProgressReportCallback Callback) { AudioData audioDataFrom; AudioData audioDataTo; int rv = ReadFlacFile(fromPath, out audioDataFrom); if (rv < 0) { return(rv); } mBarrierReady = new Barrier(audioDataFrom.meta.channels); mBarrierSet = new Barrier(audioDataFrom.meta.channels); mInPcmArray = new double[audioDataFrom.meta.channels][]; Callback(FILE_READ_COMPLETE_PERCENTAGE, new ProgressArgs(Properties.Resources.LogFileReadCompleted, 0)); var fileFormat = FileFormatType.FLAC; if (0 == string.CompareOrdinal(Path.GetExtension(toPath).ToUpperInvariant(), ".DSF")) { fileFormat = FileFormatType.DSF; } rv = SetupResultPcm(audioDataFrom, aFilters, out audioDataTo, fileFormat); if (rv < 0) { return(rv); } { // タグの編集 var tagData = new TagData(); tagData.Meta = new WWFlacRWCS.Metadata(audioDataTo.meta); tagData.Picture = audioDataTo.picture; foreach (var f in aFilters) { tagData = f.TagEdit(tagData); } audioDataTo.meta = tagData.Meta; audioDataTo.picture = tagData.Picture; } Parallel.For(0, audioDataFrom.meta.channels, ch => { var filters = new List <FilterBase>(); foreach (var f in aFilters) { filters.Add(f.CreateCopy()); } FilterSetup(audioDataFrom, ch, filters); var from = audioDataFrom.pcm[ch]; var to = audioDataTo.pcm[ch]; rv = ProcessAudioFile(filters, audioDataFrom.meta.channels, ch, ref from, ref to, Callback); if (rv < 0) { return; } audioDataTo.pcm[ch] = to; if (audioDataTo.pcm[ch].overflow) { var s = string.Format(CultureInfo.CurrentCulture, Properties.Resources.ErrorSampleValueClipped, ch, audioDataTo.pcm[ch].maxMagnitude); Callback(-1, new ProgressArgs(s, 0)); } filters = null; }); if (rv < 0) { return(rv); } Callback(FILE_PROCESS_COMPLETE_PERCENTAGE, new ProgressArgs(string.Format(CultureInfo.CurrentCulture, Properties.Resources.LogfileWriteStarted, toPath), 0)); switch (audioDataTo.fileFormat) { case FileFormatType.FLAC: rv = WriteFlacFile(ref audioDataTo, toPath); break; case FileFormatType.DSF: try { rv = WriteDsfFile(ref audioDataTo, toPath); } catch (Exception ex) { Console.WriteLine(ex); } break; } return(rv); }
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); }
public void Enable() { g_progress_report_callback = OnProgressReportCallback; UnsafeNativeMethods.ON_ProgressReporter_SetReportCallback(g_progress_report_callback); }
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; }
public int Run(string fromPath, List<FilterBase> aFilters, string toPath, ProgressReportCallback Callback) { AudioData audioDataFrom; AudioData audioDataTo; int rv; if (0 == Path.GetExtension(fromPath).CompareTo(".wav")) { rv = ReadWavFile(fromPath, out audioDataFrom); } else { rv = ReadFlacFile(fromPath, out audioDataFrom); } if (rv < 0) { return rv; } mBarrierReady = new Barrier(audioDataFrom.meta.channels); mBarrierSet = new Barrier(audioDataFrom.meta.channels); mInPcmArray = new double[audioDataFrom.meta.channels][]; Callback(FILE_READ_COMPLETE_PERCENTAGE, new ProgressArgs(Properties.Resources.LogFileReadCompleted, 0)); var fileFormat = FileFormatType.FLAC; if (0 == string.CompareOrdinal(Path.GetExtension(toPath).ToUpperInvariant(), ".DSF")) { fileFormat = FileFormatType.DSF; } rv = SetupResultPcm(audioDataFrom, aFilters, out audioDataTo, fileFormat); if (rv < 0) { return rv; } { // タグの編集 var tagData = new TagData(); tagData.Meta = new WWFlacRWCS.Metadata(audioDataTo.meta); tagData.Picture = audioDataTo.picture; foreach (var f in aFilters) { tagData = f.TagEdit(tagData); } audioDataTo.meta = tagData.Meta; audioDataTo.picture = tagData.Picture; } Parallel.For(0, audioDataFrom.meta.channels, ch => { var filters = new List<FilterBase>(); foreach (var f in aFilters) { filters.Add(f.CreateCopy()); } FilterSetup(audioDataFrom, ch, filters); var from = audioDataFrom.pcm[ch]; var to = audioDataTo.pcm[ch]; rv = ProcessAudioFile(filters, audioDataFrom.meta.channels, ch, ref from, ref to, Callback); if (rv < 0) { return; } audioDataTo.pcm[ch] = to; if (audioDataTo.pcm[ch].overflow) { var s = string.Format(CultureInfo.CurrentCulture, Properties.Resources.ErrorSampleValueClipped, ch, audioDataTo.pcm[ch].maxMagnitude); Callback(-1, new ProgressArgs(s, 0)); } filters = null; }); if (rv < 0) { return rv; } Callback(FILE_PROCESS_COMPLETE_PERCENTAGE, new ProgressArgs(string.Format(CultureInfo.CurrentCulture, Properties.Resources.LogfileWriteStarted, toPath), 0)); switch (audioDataTo.preferredSaveFormat) { case FileFormatType.FLAC: rv = WriteFlacFile(ref audioDataTo, toPath); break; case FileFormatType.DSF: try { rv = WriteDsfFile(ref audioDataTo, toPath); } catch (Exception ex) { Console.WriteLine(ex); } break; } return rv; }
public int Run(string fromPath, List <FilterBase> aFilters, string toPath, WWAFUtil.AFSampleFormat outputSampleFormat, bool dither, ProgressReportCallback Callback) { AudioData audioDataFrom; AudioData audioDataTo; int rv = AudioDataIO.Read(fromPath, out audioDataFrom); if (rv < 0) { return(rv); } mBarrierReady = new Barrier(audioDataFrom.meta.channels); mBarrierSet = new Barrier(audioDataFrom.meta.channels); mBarrierClearInPcm = new Barrier(audioDataFrom.meta.channels); mInPcmArray = new WWUtil.LargeArray <double> [audioDataFrom.meta.channels]; Callback(FILE_READ_COMPLETE_PERCENTAGE, new ProgressArgs(Properties.Resources.LogFileReadCompleted, 0)); var fileFormat = WWAFUtil.FileNameToFileFormatType(toPath); rv = SetupResultPcm(audioDataFrom, aFilters, out audioDataTo, fileFormat, outputSampleFormat); if (rv < 0) { return(rv); } { // タグの編集 var tagData = new TagData(); tagData.Meta = new WWFlacRWCS.Metadata(audioDataTo.meta); tagData.Picture = audioDataTo.picture; foreach (var f in aFilters) { tagData = f.TagEdit(tagData); } audioDataTo.meta = tagData.Meta; audioDataTo.picture = tagData.Picture; } //for (int ch=0; ch<audioDataFrom.meta.channels; ++ch) { Parallel.For(0, audioDataFrom.meta.channels, ch => { var filters = new List <FilterBase>(); foreach (var f in aFilters) { filters.Add(f.CreateCopy()); } if (dither) { // 最後にディザを加算。 FilterBase fb = FinalDither(outputSampleFormat); if (fb != null) { filters.Add(fb); } } var pRv = FilterSetup(audioDataFrom, ch, filters); if (null == pRv) { rv = -1; //break; return; } var from = audioDataFrom.pcm[ch]; var to = audioDataTo.pcm[ch]; rv = ProcessAudioFile(filters, audioDataFrom.meta.channels, ch, ref from, ref to, Callback); if (rv < 0) { //break; return; } audioDataTo.pcm[ch] = to; if (audioDataTo.pcm[ch].mOverflow) { var s = string.Format(CultureInfo.CurrentCulture, Properties.Resources.ErrorSampleValueClipped, ch, audioDataTo.pcm[ch].mMaxMagnitude); Callback(-1, new ProgressArgs(s, 0)); } filters = null; }); if (rv < 0) { return(rv); } Callback(FILE_PROCESS_COMPLETE_PERCENTAGE, new ProgressArgs(string.Format(CultureInfo.CurrentCulture, Properties.Resources.LogfileWriteStarted, toPath), 0)); switch (audioDataTo.preferredSaveFormat) { case WWAFUtil.FileFormatType.FLAC: rv = AudioDataIO.WriteFlacFile(ref audioDataTo, toPath); break; case WWAFUtil.FileFormatType.WAVE: rv = AudioDataIO.WriteWavFile(ref audioDataTo, toPath); break; case WWAFUtil.FileFormatType.DSF: try { rv = AudioDataIO.WriteDsfFile(ref audioDataTo, toPath); } catch (Exception ex) { Console.WriteLine(ex); } break; } return(rv); }