Beispiel #1
0
        private bool FirDoLoadConvertSave(FirWorkerArgs args, FirDelegate Do, out string result)
        {
            // pcmファイルを読み込んでサンプル配列pcm1chを作成。
            PcmData pcmDataIn = null;

            try {
                pcmDataIn = ReadWavFile(args.inputPath);
            } catch (IOException ex) {
                result = string.Format("WAVファイル {0} 読み込み失敗\r\n{1}", args.inputPath, ex);
                return(false);
            }
            if (null == pcmDataIn)
            {
                result = string.Format("WAVファイル {0} 読み込み失敗", args.inputPath);
                return(false);
            }

            var formatConv = new WasapiPcmUtil.PcmFormatConverter(pcmDataIn.NumChannels);

            pcmDataIn = formatConv.Convert(pcmDataIn, Wasapi.WasapiCS.SampleFormatType.Sdouble, null);

            PcmData pcmDataOutput;

            if (!Do(args, pcmDataIn, out pcmDataOutput))
            {
                result = "FIR処理失敗";
                return(false);
            }

            // サンプルフォーマットが整数型の時だけ音量制限処理する。
            double scale    = 1.0;
            double maxLevel = 0.0f;

            if (args.valueRepresentationType == PcmData.ValueRepresentationType.SInt)
            {
                scale = pcmDataOutput.LimitLevelOnDoubleRange();
            }
            else
            {
                double maxV, minV;
                pcmDataOutput.FindMaxMinValueOnDoubleBuffer(out maxV, out minV);
                maxLevel = Math.Max(Math.Abs(maxV), Math.Abs(minV));
            }

            PcmData pcmDataWrite = formatConv.Convert(pcmDataOutput,
                                                      Wasapi.WasapiCS.BitAndFormatToSampleFormatType(args.outputBitsPerSample, args.outputBitsPerSample, (Wasapi.WasapiCS.BitFormatType)args.valueRepresentationType), null);

            bool writeResult = false;

            try {
                writeResult = WriteWavFile(pcmDataWrite, args.outputPath);
            } catch (IOException ex) {
                result = string.Format("WAVファイル書き込み失敗: {0}\r\n{1}", args.outputPath, ex);
                return(false);
            }
            if (!writeResult)
            {
                result = string.Format("WAVファイル書き込み失敗: {0}", args.outputPath);
                return(false);
            }

            if (args.valueRepresentationType == PcmData.ValueRepresentationType.SInt)
            {
                if (scale == 1.0)
                {
                    result = string.Format("WAVファイル書き込み成功: {0}", args.outputPath);
                }
                else
                {
                    result = string.Format("WAVファイル書き込み成功: {0}\r\nレベルオーバーのため音量を{1:0.######}倍しました({2:0.######}dB)",
                                           args.outputPath, scale, 20.0 * Math.Log10(scale));
                }
            }
            else
            {
                result = string.Format("WAVファイル書き込み成功: {0}\r\nサンプル値の絶対値の最大値 {1:0.######}",
                                       args.outputPath, maxLevel);
            }
            return(true);
        }
        private bool FirDoLoadConvertSave(FirWorkerArgs args, FirDelegate Do, out string result)
        {
            // pcmファイルを読み込んでサンプル配列pcm1chを作成。
            PcmData pcmDataIn = null;
            try {
                pcmDataIn = ReadWavFile(args.inputPath);
            } catch (IOException ex) {
                result = string.Format("WAVファイル {0} 読み込み失敗\r\n{1}", args.inputPath, ex);
                return false;
            }
            if (null == pcmDataIn) {
                result = string.Format("WAVファイル {0} 読み込み失敗", args.inputPath);
                return false;
            }

            var formatConv = new WasapiPcmUtil.PcmFormatConverter(pcmDataIn.NumChannels);
            pcmDataIn = formatConv.Convert(pcmDataIn, Wasapi.WasapiCS.SampleFormatType.Sdouble, null);

            PcmData pcmDataOutput;

            if (!Do(args, pcmDataIn, out pcmDataOutput)) {
                result = "FIR処理失敗";
                return false;
            }

            // サンプルフォーマットが整数型の時だけ音量制限処理する。
            double scale = 1.0;
            double maxLevel = 0.0f;
            if (args.valueRepresentationType == PcmData.ValueRepresentationType.SInt) {
                scale = pcmDataOutput.LimitLevelOnDoubleRange();
            } else {
                double maxV, minV;
                pcmDataOutput.FindMaxMinValueOnDoubleBuffer(out maxV, out minV);
                maxLevel = Math.Max(Math.Abs(maxV), Math.Abs(minV));
            }

            PcmData pcmDataWrite = formatConv.Convert(pcmDataOutput,
                    Wasapi.WasapiCS.BitAndFormatToSampleFormatType(args.outputBitsPerSample, args.outputBitsPerSample, (Wasapi.WasapiCS.BitFormatType)args.valueRepresentationType), null);

            bool writeResult = false;
            try {
                writeResult = WriteWavFile(pcmDataWrite, args.outputPath);
            } catch (IOException ex) {
                result = string.Format("WAVファイル書き込み失敗: {0}\r\n{1}", args.outputPath, ex);
                return false;
            }
            if (!writeResult) {
                result = string.Format("WAVファイル書き込み失敗: {0}", args.outputPath);
                return false;
            }

            if (args.valueRepresentationType == PcmData.ValueRepresentationType.SInt) {
                if (scale == 1.0) {
                    result = string.Format("WAVファイル書き込み成功: {0}", args.outputPath);
                } else {
                    result = string.Format("WAVファイル書き込み成功: {0}\r\nレベルオーバーのため音量を{1:0.######}倍しました({2:0.######}dB)",
                            args.outputPath, scale, 20.0 * Math.Log10(scale));
                }
            } else {
                result = string.Format("WAVファイル書き込み成功: {0}\r\nサンプル値の絶対値の最大値 {1:0.######}",
                        args.outputPath, maxLevel);
            }
            return true;
        }