[ オリジナルレポート ]

BugID: #02936

カテゴリ 重要度 ステータス 解決状況 登録日時 最終更新
サウンド仮承認未処理2009-02-21 08:532009-03-09 01:40
 
テスターchowell担当者 ソース
バージョン0.129u4発生バージョン修正バージョン
修正コミットプルリク
フラグ
セット DISCRETE
セット詳細
 
概 要OPアンプのDISCRETE_MIXERについて、rNode[]を使うとコンデンサのcF指数が正しく再計算されない。
詳 細For the DISC_MIXER_IS_OP_AMP (no rI) version of DISCRETE_MIXER, if a feedback capacitor cF is used, and rNode[]'s are also used, cF's exponent will be recalculated incorrectly.

This doesn't affect any current games, since the only games which have an op-amp DISCRETE_MIXER with a cF don't have rNode[]'s. But it might affect future drivers or refinements of existing ones if left uncorrected.

General circuit diagram of an op-amp DISCRETE_MIXER without rI:
                                               cF
                                          .----||---.
                                          |         |
        rNode[0]    r[0]   c[0]           |    rF   |
   IN0 >--zzzz------zzzz----||---.        +---ZZZZ--+
                                 |        |         |
        rNode[1]    r[1]   c[1]  |        |  |\     |
   IN1 >--zzzz------zzzz----||---+--------+  | \    |
    .      .         .      .    |        '--|- \   |  cAmp
    .      .         .      .    |           |   >--+---||-----> Netlist Node
    .      .         .      .    |        .--|+ /
    .   rNode[7]    r[7]   c[7]  |        |  | /
   IN7 >--zzzz------zzzz----||---'        |  |/
                                          |
  vRef >----------------------------------'


In DISCRETE_STEP(dst_mixer) within emu/sound/disc_mth.c, if cF is present, the following code runs (lines 1143-1153 in 129u4):

        /* Do the low pass filtering for cF */
        if (info->cF != 0)
        {
            if (r_node_bit_flag != 0)
            {
                /* Re-calculate exponent if resistor nodes are used */
                context->exponent_c_f =  RC_CHARGE_EXP(r_total * info->cF);
            }
            context->v_cap_f += (v - v_ref - context->v_cap_f) * context->exponent_c_f;
            v = context->v_cap_f;
        }

If there are rNode[]'s, cF's exponent is recalculated using the present total input resistance. But there is no check for the DISC_MIXER_IS_OP_AMP case, for which cF's exponent is based on cF * rF, with no effect from either the static or dynamic input resistances. In this case, the exponent recalculation is completely inappropriate and should be skipped.

The effect would be to do low-pass filtering on the output with an incorrect cut-off frequency.
再現手順 
追加情報 
 
添付ファイル