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; }