/*
* constructor
*/
-PmISDN::PmISDN(int type, mISDNport *mISDNport, char *portname, struct port_settings *settings, int channel, int exclusive, int mode) : Port(type, portname, settings)
+PmISDN::PmISDN(int type, mISDNport *mISDNport, char *portname, struct port_settings *settings, struct interface *interface, int channel, int exclusive, int mode) : Port(type, portname, settings, interface)
{
p_m_mISDNport = mISDNport;
p_m_portnum = mISDNport->portnum;
void PmISDN::update_load(void)
{
/* don't trigger load event if: */
- if (!p_tone_name[0] && !p_m_crypt_msg_loops && !p_m_inband_send_on)
+ if (!p_tone_name[0] && !p_m_crypt_msg_loops && !p_m_inband_send_on && !(p_bridge && p_m_disable_dejitter && p_m_preload > 0))
return;
/* don't trigger load event if event already active */
if (p_m_mISDNport->b_state[p_m_b_index] != B_STATE_ACTIVE)
return -EINVAL;
+ /* run load-timer when bridged and dejitter is disabled */
+ if (!p_m_loadtimer.active && p_m_disable_dejitter && p_m_preload > 0)
+ update_load();
+
/* check if high priority tones exist
* ignore data in this case
*/
/* preload procedure
* if transmit buffer in DSP module is empty,
* preload it to DSP_LOAD to prevent jitter gaps.
+ *
+ * if load runs empty, preload again.
*/
- if ((!p_bridge || p_m_disable_dejitter) && p_m_load == 0 && p_m_preload > 0) {
+ if (p_m_disable_dejitter && p_m_load == 0 && p_m_preload > 0) {
+//printf("preload=%d\n", p_m_preload);
hh->prim = PH_DATA_REQ;
hh->id = 0;
memset(buf+MISDN_HEADER_LEN, silence, p_m_preload);
/* drop if load would exceed ISDN_MAXLOAD
* this keeps the delay not too high
*/
- if (p_m_load+length > (p_m_preload << 1))
+//printf("load=%d len=%d 2*preload=%d\n", p_m_load, length, p_m_preload << 1);
+ if (p_m_disable_dejitter && p_m_preload > 0 && p_m_load+length > (p_m_preload << 1))
return -EINVAL;
/* make and send frame */