コード例 #1
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);
        }
コード例 #2
0
        private static int ReadWavFile(string path, out AudioData ad)
        {
            ad = new AudioData();

            using (var br = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) {
                var reader = new WavRWLib2.WavReader();
                if (!reader.ReadHeaderAndSamples(br, 0, -1))
                {
                    MessageBox.Show(
                        string.Format("Error: Failed to read WAV file: {0}", path));
                    return(-1);
                }

                ad.meta              = new WWFlacRWCS.Metadata();
                ad.meta.albumStr     = reader.AlbumName;
                ad.meta.artistStr    = reader.ArtistName;
                ad.meta.titleStr     = reader.Title;
                ad.meta.pictureBytes = reader.PictureBytes;
                ad.picture           = reader.PictureData;
                ad.meta.totalSamples = reader.NumFrames;
                ad.meta.channels     = reader.NumChannels;
                ad.meta.sampleRate   = reader.SampleRate;

                var interleaved    = reader.GetSampleArray();
                int bytesPerSample = reader.BitsPerSample / 8;

                ad.pcm = new List <AudioDataPerChannel>();
                for (int ch = 0; ch < reader.NumChannels; ++ch)
                {
                    var pcmOneChannel = new byte[reader.NumFrames * bytesPerSample];
                    for (int i = 0; i < reader.NumFrames; ++i)
                    {
                        for (int b = 0; b < reader.BitsPerSample / 8; ++b)
                        {
                            pcmOneChannel[bytesPerSample * i + b] =
                                interleaved[bytesPerSample * (reader.NumChannels * i + ch) + b];
                        }
                    }

                    var pcm24 = PcmDataLib.Util.ConvertTo24bit(reader.BitsPerSample, reader.NumFrames, reader.SampleValueRepresentationType, pcmOneChannel);

                    var adp = new AudioDataPerChannel();
                    adp.data          = pcm24;
                    adp.offsBytes     = 0;
                    adp.bitsPerSample = 24;
                    adp.totalSamples  = ad.meta.totalSamples;
                    ad.pcm.Add(adp);
                }

                // converted to 24bit
                ad.meta.bitsPerSample  = 24;
                ad.preferredSaveFormat = FileFormatType.FLAC;
                return(0);
            }
        }
コード例 #3
0
        private static int ReadFlacFile(string path, out AudioData ad)
        {
            ad = new AudioData();

            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[] pcm;
                long   lrv = flac.GetDecodedPcmBytes(ch, 0, out pcm, ad.meta.totalSamples * (ad.meta.bitsPerSample / 8));
                if (lrv < 0)
                {
                    return((int)lrv);
                }

                var pcm24 = PcmDataLib.Util.ConvertTo24bit(ad.meta.bitsPerSample, ad.meta.totalSamples, PcmDataLib.PcmData.ValueRepresentationType.SInt, pcm);

                var adp = new AudioDataPerChannel();
                adp.data          = pcm24;
                adp.offsBytes     = 0;
                adp.bitsPerSample = 24;
                adp.totalSamples  = ad.meta.totalSamples;
                ad.pcm.Add(adp);
            }

            // converted to 24bit
            ad.meta.bitsPerSample  = 24;
            ad.preferredSaveFormat = FileFormatType.FLAC;

            flac.DecodeEnd();

            return(0);
        }
コード例 #4
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);
        }
コード例 #5
0
        private double[] FilterNth(List <FilterBase> filters, int nth, int channelId, ref AudioDataPerChannel from)
        {
            if (nth == -1)
            {
                return(from.GetPcmInDouble(filters[0].NumOfSamplesNeeded()));
            }
            else
            {
                // サンプル数が貯まるまでn-1番目のフィルターを実行する。

                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, channelId, ref from));
                }


                double[] inPcm;
                double[] remainings;
                AssembleSample(inPcmList, filters[nth].NumOfSamplesNeeded(), out inPcm, out remainings);

                if (filters[nth].WaitUntilAllChannelDataAvailable())
                {
                    mInPcmArray[channelId] = inPcm;

                    // mInPcmArrayに全てのチャンネルのPCMが集まるまで待つ。
                    mBarrierReady.SignalAndWait();

                    for (int ch = 0; ch < mInPcmArray.Length; ++ch)
                    {
                        filters[nth].SetChannelPcm(ch, mInPcmArray[ch]);
                    }

                    // 全てのスレッドのfiltersのSetChannelPcm()が終わるまで待つ。
                    mBarrierSet.SignalAndWait();

                    if (channelId == 0)
                    {
                        // 0番のスレッドが代表して実行。mInPcmArray配列をクリア。
                        for (int ch = 0; ch < mInPcmArray.Length; ++ch)
                        {
                            mInPcmArray[ch] = null;
                        }
                    }
                }

                // n番目のフィルター実行準備が整った。
                // n番目のフィルターを実行する。

                double[] outPcm = filters[nth].FilterDo(inPcm);

                // length-1番目のフィルター後に余った入力データremainingsをn番目のフィルターにセットする
                filters[nth].SetPreviousProcessRemains(remainings);

                return(outPcm);
            }
        }
コード例 #6
0
        private int SetupResultPcm(AudioData from, List <FilterBase> filters, out AudioData to, FileFormatType toFileFormat)
        {
            to            = new AudioData();
            to.fileFormat = toFileFormat;

            var fmt = FilterSetup(from, 0, filters);

            to.meta              = new WWFlacRWCS.Metadata(from.meta);
            to.meta.sampleRate   = fmt.SampleRate;
            to.meta.totalSamples = fmt.NumSamples;
            to.meta.channels     = fmt.NumChannels;

            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);
        }
コード例 #7
0
ファイル: WWAudioFilterCore.cs プロジェクト: kekyo/PlayPcmWin
        private int SetupResultPcm(AudioData from,  List<FilterBase> filters, out AudioData to, FileFormatType toFileFormat)
        {
            to = new AudioData();
            to.preferredSaveFormat = toFileFormat;

            var fmt = FilterSetup(from, 0, filters);

            to.meta = new WWFlacRWCS.Metadata(from.meta);
            to.meta.sampleRate = fmt.SampleRate;
            to.meta.totalSamples = fmt.NumSamples;
            to.meta.channels = fmt.NumChannels;

            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;
        }
コード例 #8
0
ファイル: WWAudioFilterCore.cs プロジェクト: kekyo/PlayPcmWin
        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;
        }
コード例 #9
0
ファイル: WWAudioFilterCore.cs プロジェクト: kekyo/PlayPcmWin
        private double[] FilterNth(List<FilterBase> filters, int nth, int channelId,
                ref AudioDataPerChannel from)
        {
            if (nth == -1) {
                return from.GetPcmInDouble(filters[0].NumOfSamplesNeeded());
            } else {
                // サンプル数が貯まるまでn-1番目のフィルターを実行する。

                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, channelId, ref from));
                }

                double[] inPcm;
                double[] remainings;
                AssembleSample(inPcmList, filters[nth].NumOfSamplesNeeded(), out inPcm, out remainings);

                if (filters[nth].WaitUntilAllChannelDataAvailable()) {
                    mInPcmArray[channelId] = inPcm;

                    // mInPcmArrayに全てのチャンネルのPCMが集まるまで待つ。
                    mBarrierReady.SignalAndWait();

                    for (int ch = 0; ch < mInPcmArray.Length; ++ch) {
                        filters[nth].SetChannelPcm(ch, mInPcmArray[ch]);
                    }

                    // 全てのスレッドのfiltersのSetChannelPcm()が終わるまで待つ。
                    mBarrierSet.SignalAndWait();

                    if (channelId == 0) {
                        // 0番のスレッドが代表して実行。mInPcmArray配列をクリア。
                        for (int ch = 0; ch < mInPcmArray.Length; ++ch) {
                            mInPcmArray[ch] = null;
                        }
                    }
                }

                // n番目のフィルター実行準備が整った。
                // n番目のフィルターを実行する。

                double[] outPcm = filters[nth].FilterDo(inPcm);

                // length-1番目のフィルター後に余った入力データremainingsをn番目のフィルターにセットする
                filters[nth].SetPreviousProcessRemains(remainings);

                return outPcm;
            }
        }
コード例 #10
0
ファイル: WWAudioFilterCore.cs プロジェクト: kekyo/PlayPcmWin
        private static int ReadWavFile(string path, out AudioData ad)
        {
            ad = new AudioData();

            using (var br = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) {
                var reader = new WavRWLib2.WavReader();
                if (!reader.ReadHeaderAndSamples(br, 0, -1)) {
                    MessageBox.Show(
                        string.Format("Error: Failed to read WAV file: {0}", path));
                    return -1;
                }

                ad.meta = new WWFlacRWCS.Metadata();
                ad.meta.albumStr = reader.AlbumName;
                ad.meta.artistStr = reader.ArtistName;
                ad.meta.titleStr = reader.Title;
                ad.meta.pictureBytes = reader.PictureBytes;
                ad.picture = reader.PictureData;
                ad.meta.totalSamples = reader.NumFrames;
                ad.meta.channels = reader.NumChannels;
                ad.meta.sampleRate = reader.SampleRate;

                var interleaved = reader.GetSampleArray();
                int bytesPerSample = reader.BitsPerSample / 8;

                ad.pcm = new List<AudioDataPerChannel>();
                for (int ch = 0; ch < reader.NumChannels; ++ch) {

                    var pcmOneChannel = new byte[reader.NumFrames * bytesPerSample];
                    for (int i = 0; i < reader.NumFrames; ++i) {
                        for (int b = 0; b < reader.BitsPerSample / 8; ++b) {
                            pcmOneChannel[bytesPerSample * i + b] =
                                interleaved[bytesPerSample * (reader.NumChannels * i + ch) + b];
                        }
                    }

                    var pcm24 = PcmDataLib.Util.ConvertTo24bit(reader.BitsPerSample, reader.NumFrames, reader.SampleValueRepresentationType, pcmOneChannel);

                    var adp = new AudioDataPerChannel();
                    adp.data = pcm24;
                    adp.offsBytes = 0;
                    adp.bitsPerSample = 24;
                    adp.totalSamples = ad.meta.totalSamples;
                    ad.pcm.Add(adp);
                }

                // converted to 24bit
                ad.meta.bitsPerSample = 24;
                ad.preferredSaveFormat = FileFormatType.FLAC;
                return 0;
            }
        }
コード例 #11
0
ファイル: WWAudioFilterCore.cs プロジェクト: kekyo/PlayPcmWin
        private static int ReadFlacFile(string path, out AudioData ad)
        {
            ad = new AudioData();

            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[] pcm;
                long lrv = flac.GetDecodedPcmBytes(ch, 0, out pcm, ad.meta.totalSamples * (ad.meta.bitsPerSample / 8));
                if (lrv < 0) {
                    return (int)lrv;
                }

                var pcm24 = PcmDataLib.Util.ConvertTo24bit(ad.meta.bitsPerSample, ad.meta.totalSamples, PcmDataLib.PcmData.ValueRepresentationType.SInt, pcm);

                var adp = new AudioDataPerChannel();
                adp.data = pcm24;
                adp.offsBytes = 0;
                adp.bitsPerSample = 24;
                adp.totalSamples = ad.meta.totalSamples;
                ad.pcm.Add(adp);
            }

            // converted to 24bit
            ad.meta.bitsPerSample = 24;
            ad.preferredSaveFormat = FileFormatType.FLAC;

            flac.DecodeEnd();

            return 0;
        }