private int ProcessAudioFile(List <FilterBase> filters, int nChannels, ref AudioDataPerChannel from, ref AudioDataPerChannel to) { foreach (var f in filters) { f.FilterStart(); } to.ResetStatistics(); long pos = 0; while (pos < to.totalSamples) { var pcm = FilterNth(filters, filters.Count - 1, 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; mBackgroundWorker.ReportProgress((int)percent, new ProgressArgs("", 0)); } foreach (var f in filters) { f.FilterEnd(); } 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, ref AudioDataPerChannel from) { if (nth == -1) { return(from.GetPcmInDouble(filters[0].NumOfSamplesNeeded())); } else { // サンプル数が貯まるまでn-1番目のフィルターを実行する。 // n番目のフィルターを実行する 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, ref from)); } double [] inPcm; double [] remainings; AssembleSample(inPcmList, filters[nth].NumOfSamplesNeeded(), out inPcm, out remainings); double [] outPcm = filters[nth].FilterDo(inPcm); // length-1番目のフィルター後に余った入力データremainingsをn番目のフィルターにセットする filters[nth].SetPreviousProcessRemains(remainings); return(outPcm); } }
private int SetupResultPcm(AudioData from, out AudioData to, FileFormatType toFileFormat) { to = new AudioData(); to.fileFormat = toFileFormat; var fmt = FilterSetup(from, mFilters); to.meta = new WWFlacRWCS.Metadata(from.meta); to.meta.sampleRate = fmt.SampleRate; to.meta.totalSamples = fmt.NumSamples; to.meta.channels = fmt.Channels; 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, ref AudioDataPerChannel from, ref AudioDataPerChannel to) { foreach (var f in filters) { f.FilterStart(); } to.ResetStatistics(); long pos = 0; while (pos < to.totalSamples) { var pcm = FilterNth(filters, filters.Count - 1, 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; mBackgroundWorker.ReportProgress((int)percent, new ProgressArgs("", 0)); } foreach (var f in filters) { f.FilterEnd(); } return 0; }
private double[] FilterNth(List<FilterBase> filters, int nth, ref AudioDataPerChannel from) { if (nth == -1) { return from.GetPcmInDouble(filters[0].NumOfSamplesNeeded()); } else { // サンプル数が貯まるまでn-1番目のフィルターを実行する。 // n番目のフィルターを実行する 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, ref from)); } double [] inPcm; double [] remainings; AssembleSample(inPcmList, filters[nth].NumOfSamplesNeeded(), out inPcm, out remainings); double [] outPcm = filters[nth].FilterDo(inPcm); // length-1番目のフィルター後に余った入力データremainingsをn番目のフィルターにセットする filters[nth].SetPreviousProcessRemains(remainings); return outPcm; } }
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 int SetupResultPcm(AudioData from, out AudioData to, FileFormatType toFileFormat) { to = new AudioData(); to.fileFormat = toFileFormat; var fmt = FilterSetup(from, mFilters); to.meta = new WWFlacRWCS.Metadata(from.meta); to.meta.sampleRate = fmt.SampleRate; to.meta.totalSamples = fmt.NumSamples; to.meta.channels = fmt.Channels; 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); }