Пример #1
0
        // 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;
            }
        }