Example #1
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);
        }
Example #2
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);
        }
Example #3
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;
        }
Example #8
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);
        }