Beispiel #1
0
        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);
        }
Beispiel #2
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);
        }
Beispiel #3
0
 public void Enable()
 {
     g_progress_report_callback = OnProgressReportCallback;
     UnsafeNativeMethods.ON_ProgressReporter_SetReportCallback(g_progress_report_callback);
 }
Beispiel #4
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;
        }
Beispiel #5
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);
        }