Example #1
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 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;
            }
        }