+ * dtmf bchannel
+ */
+void bchannel_dtmf(struct bchannel *bchannel, int on)
+{
+ int sock;
+
+ sock = bchannel->b_sock;
+ bchannel->b_dtmf = on;
+ if (bchannel->b_state == BSTATE_ACTIVE && bchannel->b_mode == 0)
+ ph_control(sock, on?DTMF_TONE_START:DTMF_TONE_STOP, 0, "DSP-DTMF", 1, bchannel->b_mode);
+}
+
+
+/*
+ * blowfish bchannel
+ */
+void bchannel_blowfish(struct bchannel *bchannel, unsigned char *key, int len)
+{
+ int sock;
+
+ sock = bchannel->b_sock;
+ memcpy(bchannel->b_bf_key, key, len);
+ bchannel->b_bf_len = len;
+ if (bchannel->b_state == BSTATE_ACTIVE)
+ ph_control_block(sock, DSP_BF_ENABLE_KEY, bchannel->b_bf_key, bchannel->b_bf_len, "DSP-CRYPT", bchannel->b_bf_len, bchannel->b_mode);
+}
+
+
+/*
+ * pipeline bchannel
+ */
+void bchannel_pipeline(struct bchannel *bchannel, char *pipeline)
+{
+ int sock;
+
+ sock = bchannel->b_sock;
+ strncpy(bchannel->b_pipeline, pipeline, sizeof(bchannel->b_pipeline)-1);
+ if (bchannel->b_state == BSTATE_ACTIVE)
+ ph_control_block(sock, DSP_PIPELINE_CFG, bchannel->b_pipeline, strlen(bchannel->b_pipeline)+1, "DSP-PIPELINE", 0, bchannel->b_mode);
+}
+
+
+/*
+ * gain bchannel
+ */
+void bchannel_gain(struct bchannel *bchannel, int gain, int tx)
+{
+ int sock;
+
+ sock = bchannel->b_sock;
+ if (tx)
+ bchannel->b_tx_gain = gain;
+ else
+ bchannel->b_rx_gain = gain;
+ if (bchannel->b_state == BSTATE_ACTIVE && bchannel->b_mode == 0)
+ ph_control(sock, (tx)?DSP_VOL_CHANGE_TX:DSP_VOL_CHANGE_RX, gain, (tx)?"DSP-TX_GAIN":"DSP-RX_GAIN", gain, bchannel->b_mode);
+}
+
+
+/*