// timer callback at VCK low edge on MSM5205 (at rising edge on MSM6585) void update_adpcm() { int val; int new_signal; // callback user handler and latch next data if (!m_vck_legacy_cb.isnull()) { m_vck_legacy_cb.op(1); } // reset check at last hiedge of VCK if (m_reset) { new_signal = 0; m_step = 0; } else { /* update signal */ /* !! MSM5205 has internal 12bit decoding, signal width is 0 to 8191 !! */ val = m_data; new_signal = m_signal + m_diff_lookup[m_step * 16 + (val & 15)]; if (new_signal > 2047) { new_signal = 2047; } else if (new_signal < -2048) { new_signal = -2048; } m_step += index_shift[val & 7]; if (m_step > 48) { m_step = 48; } else if (m_step < 0) { m_step = 0; } } /* update when signal changed */ if (m_signal != new_signal) { m_stream.update(); m_signal = new_signal; } }