278 lines · c
1/*2 * Audio support data for ISDN4Linux.3 *4 * Copyright 2002/2003 by Andreas Eversberg (jolly@eversberg.eu)5 *6 * This software may be used and distributed according to the terms7 * of the GNU General Public License, incorporated herein by reference.8 *9 */10 11#define DEBUG_DSP_CTRL 0x000112#define DEBUG_DSP_CORE 0x000213#define DEBUG_DSP_DTMF 0x000414#define DEBUG_DSP_CMX 0x001015#define DEBUG_DSP_TONE 0x002016#define DEBUG_DSP_BLOWFISH 0x004017#define DEBUG_DSP_DELAY 0x010018#define DEBUG_DSP_CLOCK 0x020019#define DEBUG_DSP_DTMFCOEFF 0x8000 /* heavy output */20 21/* options may be:22 *23 * bit 0 = use ulaw instead of alaw24 * bit 1 = enable hfc hardware acceleration for all channels25 *26 */27#define DSP_OPT_ULAW (1 << 0)28#define DSP_OPT_NOHARDWARE (1 << 1)29 30#include <linux/timer.h>31#include <linux/workqueue.h>32 33#include "dsp_ecdis.h"34 35extern int dsp_options;36extern int dsp_debug;37extern int dsp_poll;38extern int dsp_tics;39extern spinlock_t dsp_lock;40extern struct work_struct dsp_workq;41extern u32 dsp_poll_diff; /* calculated fix-comma corrected poll value */42 43/***************44 * audio stuff *45 ***************/46 47extern s32 dsp_audio_alaw_to_s32[256];48extern s32 dsp_audio_ulaw_to_s32[256];49extern s32 *dsp_audio_law_to_s32;50extern u8 dsp_audio_s16_to_law[65536];51extern u8 dsp_audio_alaw_to_ulaw[256];52extern u8 dsp_audio_mix_law[65536];53extern u8 dsp_audio_seven2law[128];54extern u8 dsp_audio_law2seven[256];55extern void dsp_audio_generate_law_tables(void);56extern void dsp_audio_generate_s2law_table(void);57extern void dsp_audio_generate_seven(void);58extern void dsp_audio_generate_mix_table(void);59extern void dsp_audio_generate_ulaw_samples(void);60extern void dsp_audio_generate_volume_changes(void);61extern u8 dsp_silence;62 63 64/*************65 * cmx stuff *66 *************/67 68#define MAX_POLL 256 /* maximum number of send-chunks */69 70#define CMX_BUFF_SIZE 0x8000 /* must be 2**n (0x1000 about 1/2 second) */71#define CMX_BUFF_HALF 0x4000 /* CMX_BUFF_SIZE / 2 */72#define CMX_BUFF_MASK 0x7fff /* CMX_BUFF_SIZE - 1 */73 74/* how many seconds will we check the lowest delay until the jitter buffer75 is reduced by that delay */76#define MAX_SECONDS_JITTER_CHECK 577 78extern struct timer_list dsp_spl_tl;79 80/* the datatype need to match jiffies datatype */81extern unsigned long dsp_spl_jiffies;82 83/* the structure of conferences:84 *85 * each conference has a unique number, given by user space.86 * the conferences are linked in a chain.87 * each conference has members linked in a chain.88 * each dsplayer points to a member, each member points to a dsplayer.89 */90 91/* all members within a conference (this is linked 1:1 with the dsp) */92struct dsp;93struct dsp_conf_member {94 struct list_head list;95 struct dsp *dsp;96};97 98/* the list of all conferences */99struct dsp_conf {100 struct list_head list;101 u32 id;102 /* all cmx stacks with the same ID are103 connected */104 struct list_head mlist;105 int software; /* conf is processed by software */106 int hardware; /* conf is processed by hardware */107 /* note: if both unset, has only one member */108};109 110 111/**************112 * DTMF stuff *113 **************/114 115#define DSP_DTMF_NPOINTS 102116 117#define ECHOCAN_BUFF_SIZE 0x400 /* must be 2**n */118#define ECHOCAN_BUFF_MASK 0x3ff /* -1 */119 120struct dsp_dtmf {121 int enable; /* dtmf is enabled */122 int treshold; /* above this is dtmf (square of) */123 int software; /* dtmf uses software decoding */124 int hardware; /* dtmf uses hardware decoding */125 int size; /* number of bytes in buffer */126 signed short buffer[DSP_DTMF_NPOINTS];127 /* buffers one full dtmf frame */128 u8 lastwhat, lastdigit;129 int count;130 u8 digits[16]; /* dtmf result */131};132 133 134/******************135 * pipeline stuff *136 ******************/137struct dsp_pipeline {138 rwlock_t lock;139 struct list_head list;140 int inuse;141};142 143/***************144 * tones stuff *145 ***************/146 147struct dsp_tone {148 int software; /* tones are generated by software */149 int hardware; /* tones are generated by hardware */150 int tone;151 void *pattern;152 int count;153 int index;154 struct timer_list tl;155};156 157/***************158 * echo stuff *159 ***************/160 161struct dsp_echo {162 int software; /* echo is generated by software */163 int hardware; /* echo is generated by hardware */164};165 166/*****************167 * general stuff *168 *****************/169 170struct dsp {171 struct list_head list;172 struct mISDNchannel ch;173 struct mISDNchannel *up;174 unsigned char name[64];175 int b_active;176 struct dsp_echo echo;177 int rx_disabled; /* what the user wants */178 int rx_is_off; /* what the card is */179 int tx_mix;180 struct dsp_tone tone;181 struct dsp_dtmf dtmf;182 int tx_volume, rx_volume;183 184 /* queue for sending frames */185 struct work_struct workq;186 struct sk_buff_head sendq;187 int hdlc; /* if mode is hdlc */188 int data_pending; /* currently an unconfirmed frame */189 190 /* conference stuff */191 u32 conf_id;192 struct dsp_conf *conf;193 struct dsp_conf_member194 *member;195 196 /* buffer stuff */197 int rx_W; /* current write pos for data without timestamp */198 int rx_R; /* current read pos for transmit clock */199 int rx_init; /* if set, pointers will be adjusted first */200 int tx_W; /* current write pos for transmit data */201 int tx_R; /* current read pos for transmit clock */202 int rx_delay[MAX_SECONDS_JITTER_CHECK];203 int tx_delay[MAX_SECONDS_JITTER_CHECK];204 u8 tx_buff[CMX_BUFF_SIZE];205 u8 rx_buff[CMX_BUFF_SIZE];206 int last_tx; /* if set, we transmitted last poll interval */207 int cmx_delay; /* initial delay of buffers,208 or 0 for dynamic jitter buffer */209 int tx_dejitter; /* if set, dejitter tx buffer */210 int tx_data; /* enables tx-data of CMX to upper layer */211 212 /* hardware stuff */213 struct dsp_features features;214 int features_rx_off; /* set if rx_off is featured */215 int features_fill_empty; /* set if fill_empty is featured */216 int pcm_slot_rx; /* current PCM slot (or -1) */217 int pcm_bank_rx;218 int pcm_slot_tx;219 int pcm_bank_tx;220 int hfc_conf; /* unique id of current conference (or -1) */221 222 /* encryption stuff */223 int bf_enable;224 u32 bf_p[18];225 u32 bf_s[1024];226 int bf_crypt_pos;227 u8 bf_data_in[9];228 u8 bf_crypt_out[9];229 int bf_decrypt_in_pos;230 int bf_decrypt_out_pos;231 u8 bf_crypt_inring[16];232 u8 bf_data_out[9];233 int bf_sync;234 235 struct dsp_pipeline236 pipeline;237};238 239/* functions */240 241extern void dsp_change_volume(struct sk_buff *skb, int volume);242 243extern struct list_head dsp_ilist;244extern struct list_head conf_ilist;245extern void dsp_cmx_debug(struct dsp *dsp);246extern void dsp_cmx_hardware(struct dsp_conf *conf, struct dsp *dsp);247extern int dsp_cmx_conf(struct dsp *dsp, u32 conf_id);248extern void dsp_cmx_receive(struct dsp *dsp, struct sk_buff *skb);249extern void dsp_cmx_hdlc(struct dsp *dsp, struct sk_buff *skb);250extern void dsp_cmx_send(struct timer_list *arg);251extern void dsp_cmx_transmit(struct dsp *dsp, struct sk_buff *skb);252extern int dsp_cmx_del_conf_member(struct dsp *dsp);253extern int dsp_cmx_del_conf(struct dsp_conf *conf);254 255extern void dsp_dtmf_goertzel_init(struct dsp *dsp);256extern void dsp_dtmf_hardware(struct dsp *dsp);257extern u8 *dsp_dtmf_goertzel_decode(struct dsp *dsp, u8 *data, int len,258 int fmt);259 260extern int dsp_tone(struct dsp *dsp, int tone);261extern void dsp_tone_copy(struct dsp *dsp, u8 *data, int len);262extern void dsp_tone_timeout(struct timer_list *t);263 264extern void dsp_bf_encrypt(struct dsp *dsp, u8 *data, int len);265extern void dsp_bf_decrypt(struct dsp *dsp, u8 *data, int len);266extern int dsp_bf_init(struct dsp *dsp, const u8 *key, unsigned int keylen);267extern void dsp_bf_cleanup(struct dsp *dsp);268 269extern int dsp_pipeline_module_init(void);270extern void dsp_pipeline_module_exit(void);271extern int dsp_pipeline_init(struct dsp_pipeline *pipeline);272extern void dsp_pipeline_destroy(struct dsp_pipeline *pipeline);273extern int dsp_pipeline_build(struct dsp_pipeline *pipeline, const char *cfg);274extern void dsp_pipeline_process_tx(struct dsp_pipeline *pipeline, u8 *data,275 int len);276extern void dsp_pipeline_process_rx(struct dsp_pipeline *pipeline, u8 *data,277 int len, unsigned int txlen);278