Index: chan_alsa.c =================================================================== --- chan_alsa.c (revision 41164) +++ chan_alsa.c (working copy) @@ -73,13 +73,12 @@ #endif /*! Global jitterbuffer configuration - by default, jb is disabled */ -static struct ast_jb_conf default_jbconf = -{ - .flags = 0, - .max_size = -1, - .resync_threshold = -1, - .impl = "" -}; + static struct ast_jb_conf default_jbconf = { + .flags = 0, + .max_size = -1, + .resync_threshold = -1, + .impl = "" + }; static struct ast_jb_conf global_jbconf; #define DEBUG 0 @@ -90,7 +89,7 @@ /* Lets use 160 sample frames, just like GSM. */ #define FRAME_SIZE 160 -#define PERIOD_FRAMES 80 /* 80 Frames, at 2 bytes each */ +#define PERIOD_FRAMES 80 /* 80 Frames, at 2 bytes each */ /* When you set the frame size, you have to come up with the right buffer format as well. */ @@ -129,9 +128,9 @@ static char exten[AST_MAX_EXTENSION] = "s"; static char mohinterpret[MAX_MUSICCLASS]; -static int hookstate=0; +static int hookstate = 0; -static short silence[FRAME_SIZE] = {0, }; +static short silence[FRAME_SIZE] = { 0, }; struct sound { int ind; @@ -143,11 +142,11 @@ }; static struct sound sounds[] = { - { AST_CONTROL_RINGING, ringtone, sizeof(ringtone)/2, 16000, 32000, 1 }, - { AST_CONTROL_BUSY, busy, sizeof(busy)/2, 4000, 4000, 1 }, - { AST_CONTROL_CONGESTION, busy, sizeof(busy)/2, 2000, 2000, 1 }, - { AST_CONTROL_RING, ring10, sizeof(ring10)/2, 16000, 32000, 1 }, - { AST_CONTROL_ANSWER, answer, sizeof(answer)/2, 2200, 0, 0 }, + {AST_CONTROL_RINGING, ringtone, sizeof(ringtone) / 2, 16000, 32000, 1}, + {AST_CONTROL_BUSY, busy, sizeof(busy) / 2, 4000, 4000, 1}, + {AST_CONTROL_CONGESTION, busy, sizeof(busy) / 2, 2000, 2000, 1}, + {AST_CONTROL_RING, ring10, sizeof(ring10) / 2, 16000, 32000, 1}, + {AST_CONTROL_ANSWER, answer, sizeof(answer) / 2, 2200, 0, 0}, }; /* Sound command pipe */ @@ -163,7 +162,7 @@ snd_pcm_t *card; #endif snd_pcm_t *icard, *ocard; - + } alsa; /* Number of buffers... Each is FRAMESIZE/8 ms long. For example @@ -182,9 +181,9 @@ static int cursound = -1; static int sampsent = 0; -static int silencelen=0; -static int offset=0; -static int nosound=0; +static int silencelen = 0; +static int offset = 0; +static int nosound = 0; /* ZZ */ static struct ast_channel *alsa_request(const char *type, int format, void *data, int *cause); @@ -219,7 +218,7 @@ short myframe[FRAME_SIZE]; int total = FRAME_SIZE; short *frame = NULL; - int amt=0; + int amt = 0; int res; int myoff; snd_pcm_state_t state; @@ -227,10 +226,10 @@ if (cursound > -1) { res = total; if (sampsent < sounds[cursound].samplen) { - myoff=0; - while(total) { + myoff = 0; + while (total) { amt = total; - if (amt > (sounds[cursound].datalen - offset)) + if (amt > (sounds[cursound].datalen - offset)) amt = sounds[cursound].datalen - offset; memcpy(myframe + myoff, sounds[cursound].data + offset, amt * 2); total -= amt; @@ -241,7 +240,7 @@ offset = 0; } /* Set it up for silence */ - if (sampsent >= sounds[cursound].samplen) + if (sampsent >= sounds[cursound].samplen) silencelen = sounds[cursound].silencelen; frame = myframe; } else { @@ -257,16 +256,16 @@ cursound = -1; nosound = 0; } - return 0; + return 0; } } - + if (res == 0 || !frame) { return 0; } #ifdef ALSA_MONITOR - alsa_monitor_write((char *)frame, res * 2); -#endif + alsa_monitor_write((char *) frame, res * 2); +#endif state = snd_pcm_state(alsa.ocard); if (state == SND_PCM_STATE_XRUN) { snd_pcm_prepare(alsa.ocard); @@ -285,7 +284,7 @@ fd_set wfds; int max; int res; - for(;;) { + for (;;) { FD_ZERO(&rfds); FD_ZERO(&wfds); max = sndcmd[0]; @@ -313,7 +312,7 @@ snd_pcm_state_t state; short buf[FRAME_SIZE]; int r; - + state = snd_pcm_state(alsa.ocard); if (state == SND_PCM_STATE_XRUN) { snd_pcm_prepare(alsa.ocard); @@ -330,9 +329,9 @@ } else if (r < 0) { ast_log(LOG_ERROR, "Read error: %s\n", snd_strerror(r)); } else - alsa_monitor_read((char *)buf, r * 2); - } -#endif + alsa_monitor_read((char *) buf, r * 2); + } +#endif if (FD_ISSET(sndcmd[0], &rfds)) { read(sndcmd[0], &cursound, sizeof(cursound)); silencelen = 0; @@ -406,7 +405,7 @@ ast_log(LOG_DEBUG, "Period size is %d\n", err); } - buffer_size = 4096 * 2; /* period_size * 16; */ + buffer_size = 4096 * 2; /* period_size * 16; */ err = snd_pcm_hw_params_set_buffer_size_near(handle, hwparams, &buffer_size); if (err < 0) { ast_log(LOG_WARNING, "Problem setting buffer size of %ld: %s\n", buffer_size, snd_strerror(err)); @@ -513,7 +512,7 @@ static int alsa_digit(struct ast_channel *c, char digit) { ast_mutex_lock(&alsalock); - ast_verbose( " << Console Received digit %c >> \n", digit); + ast_verbose(" << Console Received digit %c >> \n", digit); ast_mutex_unlock(&alsalock); return 0; } @@ -521,14 +520,14 @@ static int alsa_text(struct ast_channel *c, const char *text) { ast_mutex_lock(&alsalock); - ast_verbose( " << Console Received text %s >> \n", text); + ast_verbose(" << Console Received text %s >> \n", text); ast_mutex_unlock(&alsalock); return 0; } static void grab_owner(void) { - while(alsa.owner && ast_mutex_trylock(&alsa.owner->lock)) { + while (alsa.owner && ast_mutex_trylock(&alsa.owner->lock)) { ast_mutex_unlock(&alsalock); usleep(1); ast_mutex_lock(&alsalock); @@ -540,9 +539,9 @@ int res = 3; struct ast_frame f = { AST_FRAME_CONTROL }; ast_mutex_lock(&alsalock); - ast_verbose( " << Call placed to '%s' on console >> \n", dest); + ast_verbose(" << Call placed to '%s' on console >> \n", dest); if (autoanswer) { - ast_verbose( " << Auto-answered >> \n" ); + ast_verbose(" << Auto-answered >> \n"); grab_owner(); if (alsa.owner) { f.subclass = AST_CONTROL_ANSWER; @@ -550,7 +549,7 @@ ast_mutex_unlock(&alsa.owner->lock); } } else { - ast_verbose( " << Type 'answer' to answer, or use 'autoanswer' for future calls >> \n"); + ast_verbose(" << Type 'answer' to answer, or use 'autoanswer' for future calls >> \n"); grab_owner(); if (alsa.owner) { f.subclass = AST_CONTROL_RINGING; @@ -571,13 +570,13 @@ nosound = 1; res = 4; write(sndcmd[1], &res, sizeof(res)); - + } static int alsa_answer(struct ast_channel *c) { ast_mutex_lock(&alsalock); - ast_verbose( " << Console call has been answered >> \n"); + ast_verbose(" << Console call has been answered >> \n"); answer_sound(); ast_setstate(c, AST_STATE_UP); cursound = -1; @@ -594,7 +593,7 @@ cursound = -1; c->tech_pvt = NULL; alsa.owner = NULL; - ast_verbose( " << Hangup on console >> \n"); + ast_verbose(" << Hangup on console >> \n"); ast_mutex_lock(&usecnt_lock); usecnt--; ast_mutex_unlock(&usecnt_lock); @@ -632,8 +631,8 @@ snd_pcm_prepare(alsa.ocard); cursound = -1; } - + /* We have to digest the frame in 160-byte portions */ if (f->datalen > sizeof(sizbuf) - sizpos) { ast_log(LOG_WARNING, "Frame too large\n"); @@ -649,14 +648,14 @@ if (state == SND_PCM_STATE_XRUN) { snd_pcm_prepare(alsa.ocard); } - res = snd_pcm_writei(alsa.ocard, sizbuf, len/2); + res = snd_pcm_writei(alsa.ocard, sizbuf, len / 2); if (res == -EPIPE) { #if DEBUG ast_log(LOG_DEBUG, "XRUN write\n"); #endif snd_pcm_prepare(alsa.ocard); - res = snd_pcm_writei(alsa.ocard, sizbuf, len/2); - if (res != len/2) { + res = snd_pcm_writei(alsa.ocard, sizbuf, len / 2); + if (res != len / 2) { ast_log(LOG_ERROR, "Write error: %s\n", snd_strerror(res)); res = -1; } else if (res < 0) { @@ -680,7 +679,7 @@ static struct ast_frame *alsa_read(struct ast_channel *chan) { static struct ast_frame f; - static short __buf[FRAME_SIZE + AST_FRIENDLY_OFFSET/2]; + static short __buf[FRAME_SIZE + AST_FRIENDLY_OFFSET / 2]; short *buf; static int readpos = 0; static int left = FRAME_SIZE; @@ -689,7 +688,7 @@ int off = 0; ast_mutex_lock(&alsalock); - /* Acknowledge any pending cmd */ + /* Acknowledge any pending cmd */ f.frametype = AST_FRAME_NULL; f.subclass = 0; f.samples = 0; @@ -702,12 +701,11 @@ f.delivery.tv_usec = 0; state = snd_pcm_state(alsa.icard); - if ((state != SND_PCM_STATE_PREPARED) && - (state != SND_PCM_STATE_RUNNING)) { + if ((state != SND_PCM_STATE_PREPARED) && (state != SND_PCM_STATE_RUNNING)) { snd_pcm_prepare(alsa.icard); } - buf = __buf + AST_FRIENDLY_OFFSET/2; + buf = __buf + AST_FRIENDLY_OFFSET / 2; r = snd_pcm_readi(alsa.icard, buf + readpos, left); if (r == -EPIPE) { @@ -745,8 +743,8 @@ f.src = "Console"; f.mallocd = 0; #ifdef ALSA_MONITOR - alsa_monitor_read((char *)buf, FRAME_SIZE * 2); -#endif + alsa_monitor_read((char *) buf, FRAME_SIZE * 2); +#endif } ast_mutex_unlock(&alsalock); @@ -767,41 +765,41 @@ int res = 0; ast_mutex_lock(&alsalock); - - switch(cond) { - case AST_CONTROL_BUSY: - res = 1; - break; - case AST_CONTROL_CONGESTION: - res = 2; - break; - case AST_CONTROL_RINGING: - break; - case -1: - res = -1; - break; - case AST_CONTROL_VIDUPDATE: - res = -1; - break; - case AST_CONTROL_HOLD: - ast_verbose( " << Console Has Been Placed on Hold >> \n"); - ast_moh_start(chan, data, mohinterpret); - break; - case AST_CONTROL_UNHOLD: - ast_verbose( " << Console Has Been Retrieved from Hold >> \n"); - ast_moh_stop(chan); - break; - default: - ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, chan->name); - res = -1; + + switch (cond) { + case AST_CONTROL_BUSY: + res = 1; + break; + case AST_CONTROL_CONGESTION: + res = 2; + break; + case AST_CONTROL_RINGING: + break; + case -1: + res = -1; + break; + case AST_CONTROL_VIDUPDATE: + res = -1; + break; + case AST_CONTROL_HOLD: + ast_verbose(" << Console Has Been Placed on Hold >> \n"); + ast_moh_start(chan, data, mohinterpret); + break; + case AST_CONTROL_UNHOLD: + ast_verbose(" << Console Has Been Retrieved from Hold >> \n"); + ast_moh_stop(chan); + break; + default: + ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, chan->name); + res = -1; } - + if (res > -1) write(sndcmd[1], &res, sizeof(res)); ast_mutex_unlock(&alsalock); - return res; + return res; } static struct ast_channel *alsa_new(struct chan_alsa_pvt *p, int state) @@ -843,7 +841,7 @@ static struct ast_channel *alsa_request(const char *type, int format, void *data, int *cause) { int oldformat = format; - struct ast_channel *tmp=NULL; + struct ast_channel *tmp = NULL; format &= AST_FORMAT_SLINEAR; if (!format) { ast_log(LOG_NOTICE, "Asked to get a channel of format '%d'\n", oldformat); @@ -854,7 +852,7 @@ ast_log(LOG_NOTICE, "Already have a call on the ALSA channel\n"); *cause = AST_CAUSE_BUSY; } else { - tmp= alsa_new(&alsa, AST_STATE_DOWN); + tmp = alsa_new(&alsa, AST_STATE_DOWN); if (!tmp) { ast_log(LOG_WARNING, "Unable to create new ALSA channel\n"); } @@ -888,24 +886,23 @@ #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif - switch(state) { - case 0: - if (!ast_strlen_zero(word) && !strncasecmp(word, "on", MIN(strlen(word), 2))) - return ast_strdup("on"); - case 1: - if (!ast_strlen_zero(word) && !strncasecmp(word, "off", MIN(strlen(word), 3))) - return ast_strdup("off"); - default: - return NULL; + switch (state) { + case 0: + if (!ast_strlen_zero(word) && !strncasecmp(word, "on", MIN(strlen(word), 2))) + return ast_strdup("on"); + case 1: + if (!ast_strlen_zero(word) && !strncasecmp(word, "off", MIN(strlen(word), 3))) + return ast_strdup("off"); + default: + return NULL; } return NULL; } static const char autoanswer_usage[] = -"Usage: autoanswer [on|off]\n" -" Enables or disables autoanswer feature. If used without\n" -" argument, displays the current on/off status of autoanswer.\n" -" The default value of autoanswer is in 'alsa.conf'.\n"; + "Usage: autoanswer [on|off]\n" + " Enables or disables autoanswer feature. If used without\n" + " argument, displays the current on/off status of autoanswer.\n" " The default value of autoanswer is in 'alsa.conf'.\n"; static int console_answer(int fd, int argc, char *argv[]) { @@ -933,9 +930,7 @@ return RESULT_SUCCESS; } -static char sendtext_usage[] = -"Usage: send text \n" -" Sends a text message for display on the remote terminal.\n"; +static char sendtext_usage[] = "Usage: send text \n" " Sends a text message for display on the remote terminal.\n"; static int console_sendtext(int fd, int argc, char *argv[]) { @@ -951,7 +946,7 @@ struct ast_frame f = { AST_FRAME_TEXT, 0 }; char text2send[256] = ""; text2send[0] = '\0'; - while(tmparg < argc) { + while (tmparg < argc) { strncat(text2send, argv[tmparg++], sizeof(text2send) - strlen(text2send) - 1); strncat(text2send, " ", sizeof(text2send) - strlen(text2send) - 1); } @@ -973,9 +968,7 @@ return res; } -static char answer_usage[] = -"Usage: answer\n" -" Answers an incoming call on the console (ALSA) channel.\n"; +static char answer_usage[] = "Usage: answer\n" " Answers an incoming call on the console (ALSA) channel.\n"; static int console_hangup(int fd, int argc, char *argv[]) { @@ -999,9 +992,7 @@ return res; } -static char hangup_usage[] = -"Usage: hangup\n" -" Hangs up any call currently placed on the console.\n"; +static char hangup_usage[] = "Usage: hangup\n" " Hangs up any call currently placed on the console.\n"; static int console_dial(int fd, int argc, char *argv[]) @@ -1019,7 +1010,7 @@ grab_owner(); if (alsa.owner) { struct ast_frame f = { AST_FRAME_DTMF }; - while(*d) { + while (*d) { f.subclass = *d; ast_queue_frame(alsa.owner, &f); d++; @@ -1034,9 +1025,9 @@ mye = exten; myc = context; if (argc == 2) { - char *stringp=NULL; - strncpy(tmp, argv[1], sizeof(tmp)-1); - stringp=tmp; + char *stringp = NULL; + strncpy(tmp, argv[1], sizeof(tmp) - 1); + stringp = tmp; strsep(&stringp, "@"); tmp2 = strsep(&stringp, "@"); if (!ast_strlen_zero(tmp)) @@ -1045,8 +1036,8 @@ myc = tmp2; } if (ast_exists_extension(NULL, myc, mye, 1, NULL)) { - strncpy(alsa.exten, mye, sizeof(alsa.exten)-1); - strncpy(alsa.context, myc, sizeof(alsa.context)-1); + strncpy(alsa.exten, mye, sizeof(alsa.exten) - 1); + strncpy(alsa.context, myc, sizeof(alsa.context) - 1); hookstate = 1; alsa_new(&alsa, AST_STATE_RINGING); } else @@ -1056,17 +1047,15 @@ return res; } -static char dial_usage[] = -"Usage: dial [extension[@context]]\n" -" Dials a given extension (and context if specified)\n"; +static char dial_usage[] = "Usage: dial [extension[@context]]\n" " Dials a given extension (and context if specified)\n"; static struct ast_cli_entry myclis[] = { - { { "answer", NULL }, console_answer, "Answer an incoming console call", answer_usage }, - { { "hangup", NULL }, console_hangup, "Hangup a call on the console", hangup_usage }, - { { "dial", NULL }, console_dial, "Dial an extension on the console", dial_usage }, - { { "send", "text", NULL }, console_sendtext, "Send text to the remote device", sendtext_usage }, - { { "autoanswer", NULL }, console_autoanswer, "Sets/displays autoanswer", autoanswer_usage, autoanswer_complete } + {{"answer", NULL}, console_answer, "Answer an incoming console call", answer_usage}, + {{"hangup", NULL}, console_hangup, "Hangup a call on the console", hangup_usage}, + {{"dial", NULL}, console_dial, "Dial an extension on the console", dial_usage}, + {{"send", "text", NULL}, console_sendtext, "Send text to the remote device", sendtext_usage}, + {{"autoanswer", NULL}, console_autoanswer, "Sets/displays autoanswer", autoanswer_usage, autoanswer_complete} }; static int load_module(void) @@ -1087,7 +1076,7 @@ /* handle jb conf */ if (!ast_jb_read_conf(&global_jbconf, v->name, v->value)) continue; - + if (!strcasecmp(v->name, "autoanswer")) autoanswer = ast_true(v->value); else if (!strcasecmp(v->name, "silencesuppression")) @@ -1128,23 +1117,23 @@ ast_log(LOG_ERROR, "Unable to register channel class 'Console'\n"); return -1; } - for (x=0;x