- /* handle bchannel message*/
- if (message_type == MESSAGE_BCHANNEL) {
- switch(param->bchannel.type) {
- case BCHANNEL_ASSIGN:
- CDEBUG(NULL, NULL, "Received BCHANNEL_ASSIGN message. (handle=%08lx) for ref %d\n", param->bchannel.handle, ref);
- if ((bchannel = find_bchannel_handle(param->bchannel.handle))) {
- CERROR(NULL, NULL, "bchannel handle %x already assigned.\n", (int)param->bchannel.handle);
- return -1;
- }
- /* create bchannel */
- bchannel = alloc_bchannel(param->bchannel.handle);
- if (!bchannel) {
- CERROR(NULL, NULL, "alloc bchannel handle %x failed.\n", (int)param->bchannel.handle);
- return -1;
- }
-
- /* configure channel */
- bchannel->b_tx_gain = param->bchannel.tx_gain;
- bchannel->b_rx_gain = param->bchannel.rx_gain;
- strncpy(bchannel->b_pipeline, param->bchannel.pipeline, sizeof(bchannel->b_pipeline)-1);
- if (param->bchannel.crypt_len && param->bchannel.crypt_len <= sizeof(bchannel->b_bf_key)) {
- bchannel->b_bf_len = param->bchannel.crypt_len;
- memcpy(bchannel->b_bf_key, param->bchannel.crypt, param->bchannel.crypt_len);
- }
- bchannel->b_txdata = 0;
- bchannel->b_tx_dejitter = 1;
-
- /* in case, ref is not set, this bchannel instance must
- * be created until it is removed again by LCR */
- /* link to call */
- call = find_call_ref(ref);
- if (call) {
- bchannel->call = call;
- call->bchannel = bchannel;
- if (call->dsp_dtmf)
- bchannel_dtmf(bchannel, 1);
- if (call->bf_len)
- bchannel_blowfish(bchannel, call->bf_key, call->bf_len);
- if (call->pipeline[0])
- bchannel_pipeline(bchannel, call->pipeline);
- if (call->rx_gain)
- bchannel_gain(bchannel, call->rx_gain, 0);
- if (call->tx_gain)
- bchannel_gain(bchannel, call->tx_gain, 1);
- if (call->bridge_id) {
- CDEBUG(call, call->ast, "Join bchannel, because call is already bridged.\n");
- bchannel_join(bchannel, call->bridge_id);
- }
- /* ignore all dsp features, if it is a loopback interface */
- if (param->bchannel.isloopback)
- call->nodsp = 1;
-
- /* create only, if call exists, othewhise it bchannel is freed below... */
- if (bchannel_create(bchannel, ((call->nodsp || call->faxdetect > 0)?1:0) + ((call->hdlc)?2:0), call->nodsp_queue))
- bchannel_activate(bchannel, 1);
- }
- /* acknowledge */
- newparam.bchannel.type = BCHANNEL_ASSIGN_ACK;
- newparam.bchannel.handle = param->bchannel.handle;
- send_message(MESSAGE_BCHANNEL, 0, &newparam);
- /* if call has released before bchannel is assigned */
- if (!call) {
- newparam.bchannel.type = BCHANNEL_RELEASE;
- newparam.bchannel.handle = param->bchannel.handle;
- send_message(MESSAGE_BCHANNEL, 0, &newparam);
- }
-
- break;
-
- case BCHANNEL_REMOVE:
- CDEBUG(NULL, NULL, "Received BCHANNEL_REMOVE message. (handle=%08lx)\n", param->bchannel.handle);
- if (!(bchannel = find_bchannel_handle(param->bchannel.handle))) {
- CERROR(NULL, NULL, "Bchannel handle %x not assigned.\n", (int)param->bchannel.handle);
- return -1;
- }
- /* unklink from call and destroy bchannel */
- free_bchannel(bchannel);
-
- /* acknowledge */
- newparam.bchannel.type = BCHANNEL_REMOVE_ACK;
- newparam.bchannel.handle = param->bchannel.handle;
- send_message(MESSAGE_BCHANNEL, 0, &newparam);
-
- break;
-
- default:
- CDEBUG(NULL, NULL, "Received unknown bchannel message %d.\n", param->bchannel.type);
- }
- return 0;
- }
-