diff --git a/build_tools/menuselect-deps.in b/build_tools/menuselect-deps.in index 161c67b39a..586985faaf 100644 --- a/build_tools/menuselect-deps.in +++ b/build_tools/menuselect-deps.in @@ -46,7 +46,6 @@ OGG=@PBX_OGG@ OPUS=@PBX_OPUS@ OPUSFILE=@PBX_OPUSFILE@ OSPTK=@PBX_OSPTK@ -OSS=@PBX_OSS@ PGSQL=@PBX_PGSQL@ PJPROJECT=@PBX_PJPROJECT@ POPT=@PBX_POPT@ diff --git a/channels/chan_oss.c b/channels/chan_oss.c deleted file mode 100644 index 69dd71f1ee..0000000000 --- a/channels/chan_oss.c +++ /dev/null @@ -1,1529 +0,0 @@ -/* - * Asterisk -- An open source telephony toolkit. - * - * Copyright (C) 1999 - 2007, Digium, Inc. - * - * Mark Spencer - * - * FreeBSD changes and multiple device support by Luigi Rizzo, 2005.05.25 - * note-this code best seen with ts=8 (8-spaces tabs) in the editor - * - * See http://www.asterisk.org for more information about - * the Asterisk project. Please do not directly contact - * any of the maintainers of this project for assistance; - * the project provides a web site, mailing lists and IRC - * channels for your use. - * - * This program is free software, distributed under the terms of - * the GNU General Public License Version 2. See the LICENSE file - * at the top of the source tree. - */ - -// #define HAVE_VIDEO_CONSOLE // uncomment to enable video -/*! \file - * - * \brief Channel driver for OSS sound cards - * - * \author Mark Spencer - * \author Luigi Rizzo - * - * \ingroup channel_drivers - */ - -/*! \li \ref chan_oss.c uses the configuration file \ref oss.conf - * \addtogroup configuration_file - */ - -/*! \page oss.conf oss.conf - * \verbinclude oss.conf.sample - */ - -/*** MODULEINFO - oss - deprecated - 16 - 19 - ***/ - -#include "asterisk.h" - -#include /* isalnum() used here */ -#include -#include - -#ifdef __linux -#include -#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__CYGWIN__) || defined(__GLIBC__) || defined(__sun) -#include -#else -#include -#endif - -#include "asterisk/channel.h" -#include "asterisk/file.h" -#include "asterisk/callerid.h" -#include "asterisk/module.h" -#include "asterisk/pbx.h" -#include "asterisk/cli.h" -#include "asterisk/causes.h" -#include "asterisk/musiconhold.h" -#include "asterisk/app.h" -#include "asterisk/bridge.h" -#include "asterisk/format_cache.h" - -#include "console_video.h" - -/*! Global jitterbuffer configuration - by default, jb is disabled - * \note Values shown here match the defaults shown in oss.conf.sample */ -static struct ast_jb_conf default_jbconf = -{ - .flags = 0, - .max_size = 200, - .resync_threshold = 1000, - .impl = "fixed", - .target_extra = 40, -}; -static struct ast_jb_conf global_jbconf; - -/* - * Basic mode of operation: - * - * we have one keyboard (which receives commands from the keyboard) - * and multiple headset's connected to audio cards. - * Cards/Headsets are named as the sections of oss.conf. - * The section called [general] contains the default parameters. - * - * At any time, the keyboard is attached to one card, and you - * can switch among them using the command 'console foo' - * where 'foo' is the name of the card you want. - * - * oss.conf parameters are -START_CONFIG - -[general] - ; General config options, with default values shown. - ; You should use one section per device, with [general] being used - ; for the first device and also as a template for other devices. - ; - ; All but 'debug' can go also in the device-specific sections. - ; - ; debug = 0x0 ; misc debug flags, default is 0 - - ; Set the device to use for I/O - ; device = /dev/dsp - - ; Optional mixer command to run upon startup (e.g. to set - ; volume levels, mutes, etc. - ; mixer = - - ; Software mic volume booster (or attenuator), useful for sound - ; cards or microphones with poor sensitivity. The volume level - ; is in dB, ranging from -20.0 to +20.0 - ; boost = n ; mic volume boost in dB - - ; Set the callerid for outgoing calls - ; callerid = John Doe <555-1234> - - ; autoanswer = no ; no autoanswer on call - ; autohangup = yes ; hangup when other party closes - ; extension = s ; default extension to call - ; context = default ; default context for outgoing calls - ; language = "" ; default language - - ; Default Music on Hold class to use when this channel is placed on hold in - ; the case that the music class is not set on the channel with - ; Set(CHANNEL(musicclass)=whatever) in the dialplan and the peer channel - ; putting this one on hold did not suggest a class to use. - ; - ; mohinterpret=default - - ; If you set overridecontext to 'yes', then the whole dial string - ; will be interpreted as an extension, which is extremely useful - ; to dial SIP, IAX and other extensions which use the '@' character. - ; The default is 'no' just for backward compatibility, but the - ; suggestion is to change it. - ; overridecontext = no ; if 'no', the last @ will start the context - ; if 'yes' the whole string is an extension. - - ; low level device parameters in case you have problems with the - ; device driver on your operating system. You should not touch these - ; unless you know what you are doing. - ; queuesize = 10 ; frames in device driver - ; frags = 8 ; argument to SETFRAGMENT - - ;------------------------------ JITTER BUFFER CONFIGURATION -------------------------- - ; jbenable = yes ; Enables the use of a jitterbuffer on the receiving side of an - ; OSS channel. Defaults to "no". An enabled jitterbuffer will - ; be used only if the sending side can create and the receiving - ; side can not accept jitter. The OSS channel can't accept jitter, - ; thus an enabled jitterbuffer on the receive OSS side will always - ; be used if the sending side can create jitter. - - ; jbmaxsize = 200 ; Max length of the jitterbuffer in milliseconds. - - ; jbresyncthreshold = 1000 ; Jump in the frame timestamps over which the jitterbuffer is - ; resynchronized. Useful to improve the quality of the voice, with - ; big jumps in/broken timestamps, usualy sent from exotic devices - ; and programs. Defaults to 1000. - - ; jbimpl = fixed ; Jitterbuffer implementation, used on the receiving side of an OSS - ; channel. Two implementations are currenlty available - "fixed" - ; (with size always equals to jbmax-size) and "adaptive" (with - ; variable size, actually the new jb of IAX2). Defaults to fixed. - - ; jblog = no ; Enables jitterbuffer frame logging. Defaults to "no". - ;----------------------------------------------------------------------------------- - -[card1] - ; device = /dev/dsp1 ; alternate device - -END_CONFIG - -.. and so on for the other cards. - - */ - -/* - * The following parameters are used in the driver: - * - * FRAME_SIZE the size of an audio frame, in samples. - * 160 is used almost universally, so you should not change it. - * - * FRAGS the argument for the SETFRAGMENT ioctl. - * Overridden by the 'frags' parameter in oss.conf - * - * Bits 0-7 are the base-2 log of the device's block size, - * bits 16-31 are the number of blocks in the driver's queue. - * There are a lot of differences in the way this parameter - * is supported by different drivers, so you may need to - * experiment a bit with the value. - * A good default for linux is 30 blocks of 64 bytes, which - * results in 6 frames of 320 bytes (160 samples). - * FreeBSD works decently with blocks of 256 or 512 bytes, - * leaving the number unspecified. - * Note that this only refers to the device buffer size, - * this module will then try to keep the lenght of audio - * buffered within small constraints. - * - * QUEUE_SIZE The max number of blocks actually allowed in the device - * driver's buffer, irrespective of the available number. - * Overridden by the 'queuesize' parameter in oss.conf - * - * Should be >=2, and at most as large as the hw queue above - * (otherwise it will never be full). - */ - -#define FRAME_SIZE 160 -#define QUEUE_SIZE 10 - -#if defined(__FreeBSD__) -#define FRAGS 0x8 -#else -#define FRAGS ( ( (6 * 5) << 16 ) | 0x6 ) -#endif - -/* - * XXX text message sizes are probably 256 chars, but i am - * not sure if there is a suitable definition anywhere. - */ -#define TEXT_SIZE 256 - -#if 0 -#define TRYOPEN 1 /* try to open on startup */ -#endif -#define O_CLOSE 0x444 /* special 'close' mode for device */ -/* Which device to use */ -#if defined( __OpenBSD__ ) || defined( __NetBSD__ ) -#define DEV_DSP "/dev/audio" -#else -#define DEV_DSP "/dev/dsp" -#endif - -static char *config = "oss.conf"; /* default config file */ - -static int oss_debug; - -/*! - * \brief descriptor for one of our channels. - * - * There is one used for 'default' values (from the [general] entry in - * the configuration file), and then one instance for each device - * (the default is cloned from [general], others are only created - * if the relevant section exists). - */ -struct chan_oss_pvt { - struct chan_oss_pvt *next; - - char *name; - int total_blocks; /*!< total blocks in the output device */ - int sounddev; - enum { - CHAN_OSS_DUPLEX_UNSET, - CHAN_OSS_DUPLEX_FULL, - CHAN_OSS_DUPLEX_READ, - CHAN_OSS_DUPLEX_WRITE - } duplex; - int autoanswer; /*!< Boolean: whether to answer the immediately upon calling */ - int autohangup; /*!< Boolean: whether to hangup the call when the remote end hangs up */ - int hookstate; /*!< Boolean: 1 if offhook; 0 if onhook */ - char *mixer_cmd; /*!< initial command to issue to the mixer */ - unsigned int queuesize; /*!< max fragments in queue */ - unsigned int frags; /*!< parameter for SETFRAGMENT */ - - int warned; /*!< various flags used for warnings */ -#define WARN_used_blocks 1 -#define WARN_speed 2 -#define WARN_frag 4 - int w_errors; /*!< overfull in the write path */ - struct timeval lastopen; - - int overridecontext; - int mute; - - /*! boost support. BOOST_SCALE * 10 ^(BOOST_MAX/20) must - * be representable in 16 bits to avoid overflows. - */ -#define BOOST_SCALE (1<<9) -#define BOOST_MAX 40 /*!< slightly less than 7 bits */ - int boost; /*!< input boost, scaled by BOOST_SCALE */ - char device[64]; /*!< device to open */ - - pthread_t sthread; - - struct ast_channel *owner; - - struct video_desc *env; /*!< parameters for video support */ - - char ext[AST_MAX_EXTENSION]; - char ctx[AST_MAX_CONTEXT]; - char language[MAX_LANGUAGE]; - char cid_name[256]; /*!< Initial CallerID name */ - char cid_num[256]; /*!< Initial CallerID number */ - char mohinterpret[MAX_MUSICCLASS]; - - /*! buffers used in oss_write */ - char oss_write_buf[FRAME_SIZE * 2]; - int oss_write_dst; - /*! buffers used in oss_read - AST_FRIENDLY_OFFSET space for headers - * plus enough room for a full frame - */ - char oss_read_buf[FRAME_SIZE * 2 + AST_FRIENDLY_OFFSET]; - int readpos; /*!< read position above */ - struct ast_frame read_f; /*!< returned by oss_read */ -}; - -/*! forward declaration */ -static struct chan_oss_pvt *find_desc(const char *dev); - -static char *oss_active; /*!< the active device */ - -/*! \brief return the pointer to the video descriptor */ -struct video_desc *get_video_desc(struct ast_channel *c) -{ - struct chan_oss_pvt *o = c ? ast_channel_tech_pvt(c) : find_desc(oss_active); - return o ? o->env : NULL; -} -static struct chan_oss_pvt oss_default = { - .sounddev = -1, - .duplex = CHAN_OSS_DUPLEX_UNSET, /* XXX check this */ - .autoanswer = 1, - .autohangup = 1, - .queuesize = QUEUE_SIZE, - .frags = FRAGS, - .ext = "s", - .ctx = "default", - .readpos = AST_FRIENDLY_OFFSET, /* start here on reads */ - .lastopen = { 0, 0 }, - .boost = BOOST_SCALE, -}; - - -static int setformat(struct chan_oss_pvt *o, int mode); - -static struct ast_channel *oss_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, - const char *data, int *cause); -static int oss_digit_begin(struct ast_channel *c, char digit); -static int oss_digit_end(struct ast_channel *c, char digit, unsigned int duration); -static int oss_text(struct ast_channel *c, const char *text); -static int oss_hangup(struct ast_channel *c); -static int oss_answer(struct ast_channel *c); -static struct ast_frame *oss_read(struct ast_channel *chan); -static int oss_call(struct ast_channel *c, const char *dest, int timeout); -static int oss_write(struct ast_channel *chan, struct ast_frame *f); -static int oss_indicate(struct ast_channel *chan, int cond, const void *data, size_t datalen); -static int oss_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); -static char tdesc[] = "OSS Console Channel Driver"; - -/* cannot do const because need to update some fields at runtime */ -static struct ast_channel_tech oss_tech = { - .type = "Console", - .description = tdesc, - .requester = oss_request, - .send_digit_begin = oss_digit_begin, - .send_digit_end = oss_digit_end, - .send_text = oss_text, - .hangup = oss_hangup, - .answer = oss_answer, - .read = oss_read, - .call = oss_call, - .write = oss_write, - .write_video = console_write_video, - .indicate = oss_indicate, - .fixup = oss_fixup, -}; - -/*! - * \brief returns a pointer to the descriptor with the given name - */ -static struct chan_oss_pvt *find_desc(const char *dev) -{ - struct chan_oss_pvt *o = NULL; - - if (!dev) - ast_log(LOG_WARNING, "null dev\n"); - - for (o = oss_default.next; o && o->name && dev && strcmp(o->name, dev) != 0; o = o->next); - - if (!o) - ast_log(LOG_WARNING, "could not find <%s>\n", dev ? dev : "--no-device--"); - - return o; -} - -/* ! - * \brief split a string in extension-context, returns pointers to malloc'ed - * strings. - * - * If we do not have 'overridecontext' then the last @ is considered as - * a context separator, and the context is overridden. - * This is usually not very necessary as you can play with the dialplan, - * and it is nice not to need it because you have '@' in SIP addresses. - * - * \return the buffer address. - */ -static char *ast_ext_ctx(const char *src, char **ext, char **ctx) -{ - struct chan_oss_pvt *o = find_desc(oss_active); - - if (ext == NULL || ctx == NULL) - return NULL; /* error */ - - *ext = *ctx = NULL; - - if (src && *src != '\0') - *ext = ast_strdup(src); - - if (*ext == NULL) - return NULL; - - if (!o->overridecontext) { - /* parse from the right */ - *ctx = strrchr(*ext, '@'); - if (*ctx) - *(*ctx)++ = '\0'; - } - - return *ext; -} - -/*! - * \brief Returns the number of blocks used in the audio output channel - */ -static int used_blocks(struct chan_oss_pvt *o) -{ - struct audio_buf_info info; - - if (ioctl(o->sounddev, SNDCTL_DSP_GETOSPACE, &info)) { - if (!(o->warned & WARN_used_blocks)) { - ast_log(LOG_WARNING, "Error reading output space\n"); - o->warned |= WARN_used_blocks; - } - return 1; - } - - if (o->total_blocks == 0) { - if (0) /* debugging */ - ast_log(LOG_WARNING, "fragtotal %d size %d avail %d\n", info.fragstotal, info.fragsize, info.fragments); - o->total_blocks = info.fragments; - } - - return o->total_blocks - info.fragments; -} - -/*! Write an exactly FRAME_SIZE sized frame */ -static int soundcard_writeframe(struct chan_oss_pvt *o, short *data) -{ - int res; - - if (o->sounddev < 0) - setformat(o, O_RDWR); - if (o->sounddev < 0) - return 0; /* not fatal */ - /* - * Nothing complex to manage the audio device queue. - * If the buffer is full just drop the extra, otherwise write. - * XXX in some cases it might be useful to write anyways after - * a number of failures, to restart the output chain. - */ - res = used_blocks(o); - if (res > o->queuesize) { /* no room to write a block */ - if (o->w_errors++ == 0 && (oss_debug & 0x4)) - ast_log(LOG_WARNING, "write: used %d blocks (%d)\n", res, o->w_errors); - return 0; - } - o->w_errors = 0; - return write(o->sounddev, (void *)data, FRAME_SIZE * 2); -} - -/*! - * reset and close the device if opened, - * then open and initialize it in the desired mode, - * trigger reads and writes so we can start using it. - */ -static int setformat(struct chan_oss_pvt *o, int mode) -{ - int fmt, desired, res, fd; - - if (o->sounddev >= 0) { - ioctl(o->sounddev, SNDCTL_DSP_RESET, 0); - close(o->sounddev); - o->duplex = CHAN_OSS_DUPLEX_UNSET; - o->sounddev = -1; - } - if (mode == O_CLOSE) /* we are done */ - return 0; - if (ast_tvdiff_ms(ast_tvnow(), o->lastopen) < 1000) - return -1; /* don't open too often */ - o->lastopen = ast_tvnow(); - fd = o->sounddev = open(o->device, mode | O_NONBLOCK); - if (fd < 0) { - ast_log(LOG_WARNING, "Unable to re-open DSP device %s: %s\n", o->device, strerror(errno)); - return -1; - } - if (o->owner) - ast_channel_set_fd(o->owner, 0, fd); - -#if __BYTE_ORDER == __LITTLE_ENDIAN - fmt = AFMT_S16_LE; -#else - fmt = AFMT_S16_BE; -#endif - res = ioctl(fd, SNDCTL_DSP_SETFMT, &fmt); - if (res < 0) { - ast_log(LOG_WARNING, "Unable to set format to 16-bit signed\n"); - return -1; - } - switch (mode) { - case O_RDWR: - res = ioctl(fd, SNDCTL_DSP_SETDUPLEX, 0); - /* Check to see if duplex set (FreeBSD Bug) */ - res = ioctl(fd, SNDCTL_DSP_GETCAPS, &fmt); - if (res == 0 && (fmt & DSP_CAP_DUPLEX)) { - ast_verb(2, "Console is full duplex\n"); - o->duplex = CHAN_OSS_DUPLEX_FULL; - }; - break; - - case O_WRONLY: - o->duplex = CHAN_OSS_DUPLEX_WRITE; - break; - - case O_RDONLY: - o->duplex = CHAN_OSS_DUPLEX_READ; - break; - } - - fmt = 0; - res = ioctl(fd, SNDCTL_DSP_STEREO, &fmt); - if (res < 0) { - ast_log(LOG_WARNING, "Failed to set audio device to mono\n"); - return -1; - } - fmt = desired = DEFAULT_SAMPLE_RATE; /* 8000 Hz desired */ - res = ioctl(fd, SNDCTL_DSP_SPEED, &fmt); - - if (res < 0) { - ast_log(LOG_WARNING, "Failed to set sample rate to %d\n", desired); - return -1; - } - if (fmt != desired) { - if (!(o->warned & WARN_speed)) { - ast_log(LOG_WARNING, - "Requested %d Hz, got %d Hz -- sound may be choppy\n", - desired, fmt); - o->warned |= WARN_speed; - } - } - /* - * on Freebsd, SETFRAGMENT does not work very well on some cards. - * Default to use 256 bytes, let the user override - */ - if (o->frags) { - fmt = o->frags; - res = ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &fmt); - if (res < 0) { - if (!(o->warned & WARN_frag)) { - ast_log(LOG_WARNING, - "Unable to set fragment size -- sound may be choppy\n"); - o->warned |= WARN_frag; - } - } - } - /* on some cards, we need SNDCTL_DSP_SETTRIGGER to start outputting */ - res = PCM_ENABLE_INPUT | PCM_ENABLE_OUTPUT; - res = ioctl(fd, SNDCTL_DSP_SETTRIGGER, &res); - /* it may fail if we are in half duplex, never mind */ - return 0; -} - -/* - * some of the standard methods supported by channels. - */ -static int oss_digit_begin(struct ast_channel *c, char digit) -{ - return 0; -} - -static int oss_digit_end(struct ast_channel *c, char digit, unsigned int duration) -{ - /* no better use for received digits than print them */ - ast_verbose(" << Console Received digit %c of duration %u ms >> \n", - digit, duration); - return 0; -} - -static int oss_text(struct ast_channel *c, const char *text) -{ - /* print received messages */ - ast_verbose(" << Console Received text %s >> \n", text); - return 0; -} - -/*! - * \brief handler for incoming calls. Either autoanswer, or start ringing - */ -static int oss_call(struct ast_channel *c, const char *dest, int timeout) -{ - struct chan_oss_pvt *o = ast_channel_tech_pvt(c); - struct ast_frame f = { AST_FRAME_CONTROL, }; - AST_DECLARE_APP_ARGS(args, - AST_APP_ARG(name); - AST_APP_ARG(flags); - ); - char *parse = ast_strdupa(dest); - - AST_NONSTANDARD_APP_ARGS(args, parse, '/'); - - ast_verbose(" << Call to device '%s' dnid '%s' rdnis '%s' on console from '%s' <%s> >>\n", - dest, - S_OR(ast_channel_dialed(c)->number.str, ""), - S_COR(ast_channel_redirecting(c)->from.number.valid, ast_channel_redirecting(c)->from.number.str, ""), - S_COR(ast_channel_caller(c)->id.name.valid, ast_channel_caller(c)->id.name.str, ""), - S_COR(ast_channel_caller(c)->id.number.valid, ast_channel_caller(c)->id.number.str, "")); - if (!ast_strlen_zero(args.flags) && strcasecmp(args.flags, "answer") == 0) { - f.subclass.integer = AST_CONTROL_ANSWER; - ast_queue_frame(c, &f); - } else if (!ast_strlen_zero(args.flags) && strcasecmp(args.flags, "noanswer") == 0) { - f.subclass.integer = AST_CONTROL_RINGING; - ast_queue_frame(c, &f); - ast_indicate(c, AST_CONTROL_RINGING); - } else if (o->autoanswer) { - ast_verbose(" << Auto-answered >> \n"); - f.subclass.integer = AST_CONTROL_ANSWER; - ast_queue_frame(c, &f); - o->hookstate = 1; - } else { - ast_verbose("<< Type 'answer' to answer, or use 'autoanswer' for future calls >> \n"); - f.subclass.integer = AST_CONTROL_RINGING; - ast_queue_frame(c, &f); - ast_indicate(c, AST_CONTROL_RINGING); - } - return 0; -} - -/*! - * \brief remote side answered the phone - */ -static int oss_answer(struct ast_channel *c) -{ - struct chan_oss_pvt *o = ast_channel_tech_pvt(c); - ast_verbose(" << Console call has been answered >> \n"); - ast_setstate(c, AST_STATE_UP); - o->hookstate = 1; - return 0; -} - -static int oss_hangup(struct ast_channel *c) -{ - struct chan_oss_pvt *o = ast_channel_tech_pvt(c); - - ast_channel_tech_pvt_set(c, NULL); - o->owner = NULL; - ast_verbose(" << Hangup on console >> \n"); - console_video_uninit(o->env); - ast_module_unref(ast_module_info->self); - if (o->hookstate) { - if (o->autoanswer || o->autohangup) { - /* Assume auto-hangup too */ - o->hookstate = 0; - setformat(o, O_CLOSE); - } - } - return 0; -} - -/*! \brief used for data coming from the network */ -static int oss_write(struct ast_channel *c, struct ast_frame *f) -{ - int src; - struct chan_oss_pvt *o = ast_channel_tech_pvt(c); - - /* - * we could receive a block which is not a multiple of our - * FRAME_SIZE, so buffer it locally and write to the device - * in FRAME_SIZE chunks. - * Keep the residue stored for future use. - */ - src = 0; /* read position into f->data */ - while (src < f->datalen) { - /* Compute spare room in the buffer */ - int l = sizeof(o->oss_write_buf) - o->oss_write_dst; - - if (f->datalen - src >= l) { /* enough to fill a frame */ - memcpy(o->oss_write_buf + o->oss_write_dst, f->data.ptr + src, l); - soundcard_writeframe(o, (short *) o->oss_write_buf); - src += l; - o->oss_write_dst = 0; - } else { /* copy residue */ - l = f->datalen - src; - memcpy(o->oss_write_buf + o->oss_write_dst, f->data.ptr + src, l); - src += l; /* but really, we are done */ - o->oss_write_dst += l; - } - } - return 0; -} - -static struct ast_frame *oss_read(struct ast_channel *c) -{ - int res; - struct chan_oss_pvt *o = ast_channel_tech_pvt(c); - struct ast_frame *f = &o->read_f; - - /* XXX can be simplified returning &ast_null_frame */ - /* prepare a NULL frame in case we don't have enough data to return */ - memset(f, '\0', sizeof(struct ast_frame)); - f->frametype = AST_FRAME_NULL; - f->src = oss_tech.type; - - res = read(o->sounddev, o->oss_read_buf + o->readpos, sizeof(o->oss_read_buf) - o->readpos); - if (res < 0) /* audio data not ready, return a NULL frame */ - return f; - - o->readpos += res; - if (o->readpos < sizeof(o->oss_read_buf)) /* not enough samples */ - return f; - - if (o->mute) - return f; - - o->readpos = AST_FRIENDLY_OFFSET; /* reset read pointer for next frame */ - if (ast_channel_state(c) != AST_STATE_UP) /* drop data if frame is not up */ - return f; - /* ok we can build and deliver the frame to the caller */ - f->frametype = AST_FRAME_VOICE; - f->subclass.format = ast_format_slin; - f->samples = FRAME_SIZE; - f->datalen = FRAME_SIZE * 2; - f->data.ptr = o->oss_read_buf + AST_FRIENDLY_OFFSET; - if (o->boost != BOOST_SCALE) { /* scale and clip values */ - int i, x; - int16_t *p = (int16_t *) f->data.ptr; - for (i = 0; i < f->samples; i++) { - x = (p[i] * o->boost) / BOOST_SCALE; - if (x > 32767) - x = 32767; - else if (x < -32768) - x = -32768; - p[i] = x; - } - } - - f->offset = AST_FRIENDLY_OFFSET; - return f; -} - -static int oss_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) -{ - struct chan_oss_pvt *o = ast_channel_tech_pvt(newchan); - o->owner = newchan; - return 0; -} - -static int oss_indicate(struct ast_channel *c, int cond, const void *data, size_t datalen) -{ - struct chan_oss_pvt *o = ast_channel_tech_pvt(c); - int res = 0; - - switch (cond) { - case AST_CONTROL_INCOMPLETE: - case AST_CONTROL_BUSY: - case AST_CONTROL_CONGESTION: - case AST_CONTROL_RINGING: - case AST_CONTROL_PVT_CAUSE_CODE: - case -1: - res = -1; - break; - case AST_CONTROL_PROGRESS: - case AST_CONTROL_PROCEEDING: - case AST_CONTROL_VIDUPDATE: - case AST_CONTROL_SRCUPDATE: - break; - case AST_CONTROL_HOLD: - ast_verbose(" << Console Has Been Placed on Hold >> \n"); - ast_moh_start(c, data, o->mohinterpret); - break; - case AST_CONTROL_UNHOLD: - ast_verbose(" << Console Has Been Retrieved from Hold >> \n"); - ast_moh_stop(c); - break; - default: - ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, ast_channel_name(c)); - return -1; - } - - return res; -} - -/*! - * \brief allocate a new channel. - */ -static struct ast_channel *oss_new(struct chan_oss_pvt *o, char *ext, char *ctx, int state, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor) -{ - struct ast_channel *c; - - c = ast_channel_alloc(1, state, o->cid_num, o->cid_name, "", ext, ctx, assignedids, requestor, 0, "Console/%s", o->device + 5); - if (c == NULL) - return NULL; - ast_channel_tech_set(c, &oss_tech); - if (o->sounddev < 0) - setformat(o, O_RDWR); - ast_channel_set_fd(c, 0, o->sounddev); /* -1 if device closed, override later */ - - ast_channel_set_readformat(c, ast_format_slin); - ast_channel_set_writeformat(c, ast_format_slin); - ast_channel_nativeformats_set(c, oss_tech.capabilities); - - /* if the console makes the call, add video to the offer */ - /* if (state == AST_STATE_RINGING) TODO XXX CONSOLE VIDEO IS DISABLED UNTIL IT GETS A MAINTAINER - c->nativeformats |= console_video_formats; */ - - ast_channel_tech_pvt_set(c, o); - - if (!ast_strlen_zero(o->language)) - ast_channel_language_set(c, o->language); - /* Don't use ast_set_callerid() here because it will - * generate a needless NewCallerID event */ - if (!ast_strlen_zero(o->cid_num)) { - ast_channel_caller(c)->ani.number.valid = 1; - ast_channel_caller(c)->ani.number.str = ast_strdup(o->cid_num); - } - if (!ast_strlen_zero(ext)) { - ast_channel_dialed(c)->number.str = ast_strdup(ext); - } - - o->owner = c; - ast_module_ref(ast_module_info->self); - ast_jb_configure(c, &global_jbconf); - ast_channel_unlock(c); - if (state != AST_STATE_DOWN) { - if (ast_pbx_start(c)) { - ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ast_channel_name(c)); - ast_hangup(c); - o->owner = c = NULL; - } - } - console_video_start(get_video_desc(c), c); /* XXX cleanup */ - - return c; -} - -static struct ast_channel *oss_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause) -{ - struct ast_channel *c; - struct chan_oss_pvt *o; - AST_DECLARE_APP_ARGS(args, - AST_APP_ARG(name); - AST_APP_ARG(flags); - ); - char *parse = ast_strdupa(data); - - AST_NONSTANDARD_APP_ARGS(args, parse, '/'); - o = find_desc(args.name); - - ast_log(LOG_WARNING, "oss_request ty <%s> data 0x%p <%s>\n", type, data, data); - if (o == NULL) { - ast_log(LOG_NOTICE, "Device %s not found\n", args.name); - /* XXX we could default to 'dsp' perhaps ? */ - return NULL; - } - if (ast_format_cap_iscompatible_format(cap, ast_format_slin) == AST_FORMAT_CMP_NOT_EQUAL) { - struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN); - ast_log(LOG_NOTICE, "Format %s unsupported\n", ast_format_cap_get_names(cap, &codec_buf)); - return NULL; - } - if (o->owner) { - ast_log(LOG_NOTICE, "Already have a call (chan %p) on the OSS channel\n", o->owner); - *cause = AST_CAUSE_BUSY; - return NULL; - } - c = oss_new(o, NULL, NULL, AST_STATE_DOWN, assignedids, requestor); - if (c == NULL) { - ast_log(LOG_WARNING, "Unable to create new OSS channel\n"); - return NULL; - } - return c; -} - -static void store_config_core(struct chan_oss_pvt *o, const char *var, const char *value); - -/*! Generic console command handler. Basically a wrapper for a subset - * of config file options which are also available from the CLI - */ -static char *console_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - struct chan_oss_pvt *o = find_desc(oss_active); - const char *var, *value; - switch (cmd) { - case CLI_INIT: - e->command = CONSOLE_VIDEO_CMDS; - e->usage = - "Usage: " CONSOLE_VIDEO_CMDS "...\n" - " Generic handler for console commands.\n"; - return NULL; - - case CLI_GENERATE: - return NULL; - } - - if (a->argc < e->args) - return CLI_SHOWUSAGE; - if (o == NULL) { - ast_log(LOG_WARNING, "Cannot find device %s (should not happen!)\n", - oss_active); - return CLI_FAILURE; - } - var = a->argv[e->args-1]; - value = a->argc > e->args ? a->argv[e->args] : NULL; - if (value) /* handle setting */ - store_config_core(o, var, value); - if (!console_video_cli(o->env, var, a->fd)) /* print video-related values */ - return CLI_SUCCESS; - /* handle other values */ - if (!strcasecmp(var, "device")) { - ast_cli(a->fd, "device is [%s]\n", o->device); - } - return CLI_SUCCESS; -} - -static char *console_autoanswer(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - struct chan_oss_pvt *o = find_desc(oss_active); - - switch (cmd) { - case CLI_INIT: - e->command = "console {set|show} autoanswer [on|off]"; - e->usage = - "Usage: console {set|show} 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 'oss.conf'.\n"; - return NULL; - - case CLI_GENERATE: - return NULL; - } - - if (a->argc == e->args - 1) { - ast_cli(a->fd, "Auto answer is %s.\n", o->autoanswer ? "on" : "off"); - return CLI_SUCCESS; - } - if (a->argc != e->args) - return CLI_SHOWUSAGE; - if (o == NULL) { - ast_log(LOG_WARNING, "Cannot find device %s (should not happen!)\n", - oss_active); - return CLI_FAILURE; - } - if (!strcasecmp(a->argv[e->args-1], "on")) - o->autoanswer = 1; - else if (!strcasecmp(a->argv[e->args - 1], "off")) - o->autoanswer = 0; - else - return CLI_SHOWUSAGE; - return CLI_SUCCESS; -} - -/*! \brief helper function for the answer key/cli command */ -static char *console_do_answer(int fd) -{ - struct ast_frame f = { AST_FRAME_CONTROL, { AST_CONTROL_ANSWER } }; - struct chan_oss_pvt *o = find_desc(oss_active); - if (!o->owner) { - if (fd > -1) - ast_cli(fd, "No one is calling us\n"); - return CLI_FAILURE; - } - o->hookstate = 1; - ast_queue_frame(o->owner, &f); - return CLI_SUCCESS; -} - -/*! - * \brief answer command from the console - */ -static char *console_answer(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - switch (cmd) { - case CLI_INIT: - e->command = "console answer"; - e->usage = - "Usage: console answer\n" - " Answers an incoming call on the console (OSS) channel.\n"; - return NULL; - - case CLI_GENERATE: - return NULL; /* no completion */ - } - if (a->argc != e->args) - return CLI_SHOWUSAGE; - return console_do_answer(a->fd); -} - -/*! - * \brief Console send text CLI command - * - * \note concatenate all arguments into a single string. argv is NULL-terminated - * so we can use it right away - */ -static char *console_sendtext(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - struct chan_oss_pvt *o = find_desc(oss_active); - char buf[TEXT_SIZE]; - - if (cmd == CLI_INIT) { - e->command = "console send text"; - e->usage = - "Usage: console send text \n" - " Sends a text message for display on the remote terminal.\n"; - return NULL; - } else if (cmd == CLI_GENERATE) - return NULL; - - if (a->argc < e->args + 1) - return CLI_SHOWUSAGE; - if (!o->owner) { - ast_cli(a->fd, "Not in a call\n"); - return CLI_FAILURE; - } - ast_join(buf, sizeof(buf) - 1, a->argv + e->args); - if (!ast_strlen_zero(buf)) { - struct ast_frame f = { 0, }; - int i = strlen(buf); - buf[i] = '\n'; - f.frametype = AST_FRAME_TEXT; - f.subclass.integer = 0; - f.data.ptr = buf; - f.datalen = i + 1; - ast_queue_frame(o->owner, &f); - } - return CLI_SUCCESS; -} - -static char *console_hangup(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - struct chan_oss_pvt *o = find_desc(oss_active); - - if (cmd == CLI_INIT) { - e->command = "console hangup"; - e->usage = - "Usage: console hangup\n" - " Hangs up any call currently placed on the console.\n"; - return NULL; - } else if (cmd == CLI_GENERATE) - return NULL; - - if (a->argc != e->args) - return CLI_SHOWUSAGE; - if (!o->owner && !o->hookstate) { /* XXX maybe only one ? */ - ast_cli(a->fd, "No call to hang up\n"); - return CLI_FAILURE; - } - o->hookstate = 0; - if (o->owner) - ast_queue_hangup_with_cause(o->owner, AST_CAUSE_NORMAL_CLEARING); - setformat(o, O_CLOSE); - return CLI_SUCCESS; -} - -static char *console_flash(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - struct ast_frame f = { AST_FRAME_CONTROL, { AST_CONTROL_FLASH } }; - struct chan_oss_pvt *o = find_desc(oss_active); - - if (cmd == CLI_INIT) { - e->command = "console flash"; - e->usage = - "Usage: console flash\n" - " Flashes the call currently placed on the console.\n"; - return NULL; - } else if (cmd == CLI_GENERATE) - return NULL; - - if (a->argc != e->args) - return CLI_SHOWUSAGE; - if (!o->owner) { /* XXX maybe !o->hookstate too ? */ - ast_cli(a->fd, "No call to flash\n"); - return CLI_FAILURE; - } - o->hookstate = 0; - if (o->owner) - ast_queue_frame(o->owner, &f); - return CLI_SUCCESS; -} - -static char *console_dial(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - char *s = NULL; - char *mye = NULL, *myc = NULL; - struct chan_oss_pvt *o = find_desc(oss_active); - - if (cmd == CLI_INIT) { - e->command = "console dial"; - e->usage = - "Usage: console dial [extension[@context]]\n" - " Dials a given extension (and context if specified)\n"; - return NULL; - } else if (cmd == CLI_GENERATE) - return NULL; - - if (a->argc > e->args + 1) - return CLI_SHOWUSAGE; - if (o->owner) { /* already in a call */ - int i; - struct ast_frame f = { AST_FRAME_DTMF, { 0 } }; - const char *digits; - - if (a->argc == e->args) { /* argument is mandatory here */ - ast_cli(a->fd, "Already in a call. You can only dial digits until you hangup.\n"); - return CLI_FAILURE; - } - digits = a->argv[e->args]; - /* send the string one char at a time */ - for (i = 0; i < strlen(digits); i++) { - f.subclass.integer = digits[i]; - ast_queue_frame(o->owner, &f); - } - return CLI_SUCCESS; - } - /* if we have an argument split it into extension and context */ - if (a->argc == e->args + 1) - s = ast_ext_ctx(a->argv[e->args], &mye, &myc); - /* supply default values if needed */ - if (mye == NULL) - mye = o->ext; - if (myc == NULL) - myc = o->ctx; - if (ast_exists_extension(NULL, myc, mye, 1, NULL)) { - o->hookstate = 1; - oss_new(o, mye, myc, AST_STATE_RINGING, NULL, NULL); - } else - ast_cli(a->fd, "No such extension '%s' in context '%s'\n", mye, myc); - if (s) - ast_free(s); - return CLI_SUCCESS; -} - -static char *console_mute(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - struct chan_oss_pvt *o = find_desc(oss_active); - const char *s; - int toggle = 0; - - if (cmd == CLI_INIT) { - e->command = "console {mute|unmute} [toggle]"; - e->usage = - "Usage: console {mute|unmute} [toggle]\n" - " Mute/unmute the microphone.\n"; - return NULL; - } else if (cmd == CLI_GENERATE) - return NULL; - - if (a->argc > e->args) - return CLI_SHOWUSAGE; - if (a->argc == e->args) { - if (strcasecmp(a->argv[e->args-1], "toggle")) - return CLI_SHOWUSAGE; - toggle = 1; - } - s = a->argv[e->args-2]; - if (!strcasecmp(s, "mute")) - o->mute = toggle ? !o->mute : 1; - else if (!strcasecmp(s, "unmute")) - o->mute = toggle ? !o->mute : 0; - else - return CLI_SHOWUSAGE; - ast_cli(a->fd, "Console mic is %s\n", o->mute ? "off" : "on"); - return CLI_SUCCESS; -} - -static char *console_transfer(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - struct chan_oss_pvt *o = find_desc(oss_active); - char *tmp, *ext, *ctx; - - switch (cmd) { - case CLI_INIT: - e->command = "console transfer"; - e->usage = - "Usage: console transfer [@context]\n" - " Transfers the currently connected call to the given extension (and\n" - " context if specified)\n"; - return NULL; - case CLI_GENERATE: - return NULL; - } - - if (a->argc != 3) - return CLI_SHOWUSAGE; - if (o == NULL) - return CLI_FAILURE; - if (o->owner == NULL || !ast_channel_is_bridged(o->owner)) { - ast_cli(a->fd, "There is no call to transfer\n"); - return CLI_SUCCESS; - } - - tmp = ast_ext_ctx(a->argv[2], &ext, &ctx); - if (ctx == NULL) { /* supply default context if needed */ - ctx = ast_strdupa(ast_channel_context(o->owner)); - } - if (ast_bridge_transfer_blind(1, o->owner, ext, ctx, NULL, NULL) != AST_BRIDGE_TRANSFER_SUCCESS) { - ast_log(LOG_WARNING, "Unable to transfer call from channel %s\n", ast_channel_name(o->owner)); - } - ast_free(tmp); - return CLI_SUCCESS; -} - -static char *console_active(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - switch (cmd) { - case CLI_INIT: - e->command = "console {set|show} active []"; - e->usage = - "Usage: console active [device]\n" - " If used without a parameter, displays which device is the current\n" - " console. If a device is specified, the console sound device is changed to\n" - " the device specified.\n"; - return NULL; - case CLI_GENERATE: - return NULL; - } - - if (a->argc == 3) - ast_cli(a->fd, "active console is [%s]\n", oss_active); - else if (a->argc != 4) - return CLI_SHOWUSAGE; - else { - struct chan_oss_pvt *o; - if (strcmp(a->argv[3], "show") == 0) { - for (o = oss_default.next; o; o = o->next) - ast_cli(a->fd, "device [%s] exists\n", o->name); - return CLI_SUCCESS; - } - o = find_desc(a->argv[3]); - if (o == NULL) - ast_cli(a->fd, "No device [%s] exists\n", a->argv[3]); - else - oss_active = o->name; - } - return CLI_SUCCESS; -} - -/*! - * \brief store the boost factor - */ -static void store_boost(struct chan_oss_pvt *o, const char *s) -{ - double boost = 0; - if (sscanf(s, "%30lf", &boost) != 1) { - ast_log(LOG_WARNING, "invalid boost <%s>\n", s); - return; - } - if (boost < -BOOST_MAX) { - ast_log(LOG_WARNING, "boost %s too small, using %d\n", s, -BOOST_MAX); - boost = -BOOST_MAX; - } else if (boost > BOOST_MAX) { - ast_log(LOG_WARNING, "boost %s too large, using %d\n", s, BOOST_MAX); - boost = BOOST_MAX; - } - boost = exp(log(10) * boost / 20) * BOOST_SCALE; - o->boost = boost; - ast_log(LOG_WARNING, "setting boost %s to %d\n", s, o->boost); -} - -static char *console_boost(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) -{ - struct chan_oss_pvt *o = find_desc(oss_active); - - switch (cmd) { - case CLI_INIT: - e->command = "console boost"; - e->usage = - "Usage: console boost [boost in dB]\n" - " Sets or display mic boost in dB\n"; - return NULL; - case CLI_GENERATE: - return NULL; - } - - if (a->argc == 2) - ast_cli(a->fd, "boost currently %5.1f\n", 20 * log10(((double) o->boost / (double) BOOST_SCALE))); - else if (a->argc == 3) - store_boost(o, a->argv[2]); - return CLI_SUCCESS; -} - -static struct ast_cli_entry cli_oss[] = { - AST_CLI_DEFINE(console_answer, "Answer an incoming console call"), - AST_CLI_DEFINE(console_hangup, "Hangup a call on the console"), - AST_CLI_DEFINE(console_flash, "Flash a call on the console"), - AST_CLI_DEFINE(console_dial, "Dial an extension on the console"), - AST_CLI_DEFINE(console_mute, "Disable/Enable mic input"), - AST_CLI_DEFINE(console_transfer, "Transfer a call to a different extension"), - AST_CLI_DEFINE(console_cmd, "Generic console command"), - AST_CLI_DEFINE(console_sendtext, "Send text to the remote device"), - AST_CLI_DEFINE(console_autoanswer, "Sets/displays autoanswer"), - AST_CLI_DEFINE(console_boost, "Sets/displays mic boost in dB"), - AST_CLI_DEFINE(console_active, "Sets/displays active console"), -}; - -/*! - * store the mixer argument from the config file, filtering possibly - * invalid or dangerous values (the string is used as argument for - * system("mixer %s") - */ -static void store_mixer(struct chan_oss_pvt *o, const char *s) -{ - int i; - - for (i = 0; i < strlen(s); i++) { - if (!isalnum(s[i]) && strchr(" \t-/", s[i]) == NULL) { - ast_log(LOG_WARNING, "Suspect char %c in mixer cmd, ignoring:\n\t%s\n", s[i], s); - return; - } - } - if (o->mixer_cmd) - ast_free(o->mixer_cmd); - o->mixer_cmd = ast_strdup(s); - ast_log(LOG_WARNING, "setting mixer %s\n", s); -} - -/*! - * store the callerid components - */ -static void store_callerid(struct chan_oss_pvt *o, const char *s) -{ - ast_callerid_split(s, o->cid_name, sizeof(o->cid_name), o->cid_num, sizeof(o->cid_num)); -} - -static void store_config_core(struct chan_oss_pvt *o, const char *var, const char *value) -{ - CV_START(var, value); - - /* handle jb conf */ - if (!ast_jb_read_conf(&global_jbconf, var, value)) - return; - - if (!console_video_config(&o->env, var, value)) - return; /* matched there */ - CV_BOOL("autoanswer", o->autoanswer); - CV_BOOL("autohangup", o->autohangup); - CV_BOOL("overridecontext", o->overridecontext); - CV_STR("device", o->device); - CV_UINT("frags", o->frags); - CV_UINT("debug", oss_debug); - CV_UINT("queuesize", o->queuesize); - CV_STR("context", o->ctx); - CV_STR("language", o->language); - CV_STR("mohinterpret", o->mohinterpret); - CV_STR("extension", o->ext); - CV_F("mixer", store_mixer(o, value)); - CV_F("callerid", store_callerid(o, value)) ; - CV_F("boost", store_boost(o, value)); - - CV_END; -} - -/*! - * grab fields from the config file, init the descriptor and open the device. - */ -static struct chan_oss_pvt *store_config(struct ast_config *cfg, char *ctg) -{ - struct ast_variable *v; - struct chan_oss_pvt *o; - - if (ctg == NULL) { - o = &oss_default; - ctg = "general"; - } else { - if (!(o = ast_calloc(1, sizeof(*o)))) - return NULL; - *o = oss_default; - /* "general" is also the default thing */ - if (strcmp(ctg, "general") == 0) { - o->name = ast_strdup("dsp"); - oss_active = o->name; - goto openit; - } - o->name = ast_strdup(ctg); - } - - strcpy(o->mohinterpret, "default"); - - o->lastopen = ast_tvnow(); /* don't leave it 0 or tvdiff may wrap */ - /* fill other fields from configuration */ - for (v = ast_variable_browse(cfg, ctg); v; v = v->next) { - store_config_core(o, v->name, v->value); - } - if (ast_strlen_zero(o->device)) - ast_copy_string(o->device, DEV_DSP, sizeof(o->device)); - if (o->mixer_cmd) { - char *cmd; - - if (ast_asprintf(&cmd, "mixer %s", o->mixer_cmd) >= 0) { - ast_log(LOG_WARNING, "running [%s]\n", cmd); - if (system(cmd) < 0) { - ast_log(LOG_WARNING, "system() failed: %s\n", strerror(errno)); - } - ast_free(cmd); - } - } - - /* if the config file requested to start the GUI, do it */ - if (get_gui_startup(o->env)) - console_video_start(o->env, NULL); - - if (o == &oss_default) /* we are done with the default */ - return NULL; - -openit: -#ifdef TRYOPEN - if (setformat(o, O_RDWR) < 0) { /* open device */ - ast_verb(1, "Device %s not detected\n", ctg); - ast_verb(1, "Turn off OSS support by adding " "'noload=chan_oss.so' in /etc/asterisk/modules.conf\n"); - goto error; - } - if (o->duplex != CHAN_OSS_DUPLEX_FULL) - ast_log(LOG_WARNING, "XXX I don't work right with non " "full-duplex sound cards XXX\n"); -#endif /* TRYOPEN */ - - /* link into list of devices */ - if (o != &oss_default) { - o->next = oss_default.next; - oss_default.next = o; - } - return o; - -#ifdef TRYOPEN -error: - if (o != &oss_default) - ast_free(o); - return NULL; -#endif -} - -static int unload_module(void) -{ - struct chan_oss_pvt *o, *next; - - ast_channel_unregister(&oss_tech); - ast_cli_unregister_multiple(cli_oss, ARRAY_LEN(cli_oss)); - - o = oss_default.next; - while (o) { - close(o->sounddev); - if (o->owner) - ast_softhangup(o->owner, AST_SOFTHANGUP_APPUNLOAD); - if (o->owner) - return -1; - next = o->next; - ast_free(o->name); - ast_free(o); - o = next; - } - ao2_cleanup(oss_tech.capabilities); - oss_tech.capabilities = NULL; - - return 0; -} - -/*! - * \brief Load the module - * - * Module loading including tests for configuration or dependencies. - * This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE, - * or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails - * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the - * configuration file or other non-critical problem return - * AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS. - */ -static int load_module(void) -{ - struct ast_config *cfg = NULL; - char *ctg = NULL; - struct ast_flags config_flags = { 0 }; - - /* Copy the default jb config over global_jbconf */ - memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf)); - - /* load config file */ - if (!(cfg = ast_config_load(config, config_flags))) { - ast_log(LOG_NOTICE, "Unable to load config %s\n", config); - return AST_MODULE_LOAD_DECLINE; - } else if (cfg == CONFIG_STATUS_FILEINVALID) { - ast_log(LOG_ERROR, "Config file %s is in an invalid format. Aborting.\n", config); - return AST_MODULE_LOAD_DECLINE; - } - - do { - store_config(cfg, ctg); - } while ( (ctg = ast_category_browse(cfg, ctg)) != NULL); - - ast_config_destroy(cfg); - - if (find_desc(oss_active) == NULL) { - ast_log(LOG_NOTICE, "Device %s not found\n", oss_active); - /* XXX we could default to 'dsp' perhaps ? */ - unload_module(); - return AST_MODULE_LOAD_DECLINE; - } - - if (!(oss_tech.capabilities = ast_format_cap_alloc(0))) { - return AST_MODULE_LOAD_DECLINE; - } - ast_format_cap_append(oss_tech.capabilities, ast_format_slin, 0); - - /* TODO XXX CONSOLE VIDEO IS DISABLE UNTIL IT HAS A MAINTAINER - * add console_video_formats to oss_tech.capabilities once this occurs. */ - - if (ast_channel_register(&oss_tech)) { - ast_log(LOG_ERROR, "Unable to register channel type 'OSS'\n"); - return AST_MODULE_LOAD_DECLINE; - } - - ast_cli_register_multiple(cli_oss, ARRAY_LEN(cli_oss)); - - return AST_MODULE_LOAD_SUCCESS; -} - -AST_MODULE_INFO_STANDARD_DEPRECATED(ASTERISK_GPL_KEY, "OSS Console Channel Driver"); diff --git a/configs/samples/oss.conf.sample b/configs/samples/oss.conf.sample deleted file mode 100644 index b0b3831ab6..0000000000 --- a/configs/samples/oss.conf.sample +++ /dev/null @@ -1,152 +0,0 @@ -; -; Automatically generated from ../channels/chan_oss.c -; - -[general] - ; General config options, with default values shown. - ; You should use one section per device, with [general] being used - ; for the first device and also as a template for other devices. - ; - ; All but 'debug' can go also in the device-specific sections. - ; - ; debug = 0x0 ; misc debug flags, default is 0 - - ; Set the device to use for I/O - ; device = /dev/dsp - - ; Optional mixer command to run upon startup (e.g. to set - ; volume levels, mutes, etc. - ; mixer = - - ; Software mic volume booster (or attenuator), useful for sound - ; cards or microphones with poor sensitivity. The volume level - ; is in dB, ranging from -20.0 to +20.0 - ; boost = n ; mic volume boost in dB - - ; Set the callerid for outgoing calls - ; callerid = John Doe <555-1234> - - ; autoanswer = no ; no autoanswer on call - ; autohangup = yes ; hangup when other party closes - ; extension = s ; default extension to call - ; context = default ; default context for outgoing calls - ; language = "" ; default language - - ; If you set overridecontext to 'yes', then the whole dial string - ; will be interpreted as an extension, which is extremely useful - ; to dial SIP, IAX and other extensions which use the '@' character. - ; The default is 'no' just for backward compatibility, but the - ; suggestion is to change it. - ; overridecontext = no ; if 'no', the last @ will start the context - ; if 'yes' the whole string is an extension. - - ; low level device parameters in case you have problems with the - ; device driver on your operating system. You should not touch these - ; unless you know what you are doing. - ; queuesize = 10 ; frames in device driver - ; frags = 8 ; argument to SETFRAGMENT - - ; ----------------------------- JITTER BUFFER CONFIGURATION -------------------------- - ; jbenable = yes ; Enables the use of a jitterbuffer on the receiving side of an - ; OSS channel. Defaults to "no". An enabled jitterbuffer will - ; be used only if the sending side can create and the receiving - ; side can not accept jitter. The OSS channel can't accept jitter, - ; thus an enabled jitterbuffer on the receive OSS side will always - ; be used if the sending side can create jitter. - - ; jbmaxsize = 200 ; Max length of the jitterbuffer in milliseconds. - - ; jbresyncthreshold = 1000 ; Jump in the frame timestamps over which the jitterbuffer is - ; resynchronized. Useful to improve the quality of the voice, with - ; big jumps in/broken timestamps, usually sent from exotic devices - ; and programs. Defaults to 1000. - - ; jbimpl = fixed ; Jitterbuffer implementation, used on the receiving side of an OSS - ; channel. Two implementations are currently available - "fixed" - ; (with size always equals to jbmax-size) and "adaptive" (with - ; variable size, actually the new jb of IAX2). Defaults to fixed. - - ; jbtargetextra = 40 ; This option only affects the jb when 'jbimpl = adaptive' is set. - ; The option represents the number of milliseconds by which the new - ; jitter buffer will pad its size. the default is 40, so without - ; modification, the new jitter buffer will set its size to the jitter - ; value plus 40 milliseconds. increasing this value may help if your - ; network normally has low jitter, but occasionally has spikes. - - ; jblog = no ; Enables jitterbuffer frame logging. Defaults to "no". - ; ---------------------------------------------------------------------------------- - -; below is an entry for a second console channel -; [card1] - ; device = /dev/dsp1 ; alternate device - -; Below are the settings to support video. You can include them -; in your general configuration as [general](+,video) -; The parameters are all available through the CLI as "console name value" -; Section names used here are only examples. - -[my_video](!) ; you can just include in your config - videodevice = /dev/video0 ; uses your V4L webcam as video source - videodevice = X11 ; X11 grabber. Dragging on the local display moves the origin. - videocodec = h263 ; also h261, h263p, h264, mpeg4, ... - - ; video_size is the geometry used by the encoder. - ; Depending on the codec your choice is restricted. - video_size = 352x288 ; the format WIDTHxHEIGHT is also ok - video_size = cif ; sqcif, qcif, cif, qvga, vga, ... - - ; You can also set the geometry used for the camera, local display and remote display. - ; The local window is on the right, the remote window is on the left. - ; Right clicking with the mouse on a video window increases the size, - ; center-clicking reduces the size. - camera_size = cif - remote_size = cif - local_size = qcif - - bitrate = 60000 ; rate told to ffmpeg. - fps = 5 ; frames per second from the source. - ; qmin = 3 ; quantizer value passed to the encoder. - -; The keypad is made of an image (in any format supported by SDL_image) -; and some configuration entries indicating the location and function of buttons. -; These entries can also be contained in the comment field of the image, -; which is a lot more convenient to manage. -; E.g. for jpeg you can write them with wrjpgcom (part of libjpeg). -; The format to define keys is -; region = x0 y0 x1 y1 h -; where is the event to be generated (a digit, pickup, hangup,...) -; is the shape of the region (currently 'rect' and 'circle' are -; supported, the latter is really an ellipse), x0 y0 x1 y1 are the -; coordinates of the base of the rectangle or main diameter of the ellipse, -; (they can be rotated) while h is the height of the rectangle or the other -; diameter of the ellipse. -; -[my_skin](!) - keypad = /tmp/keypad.jpg - region = 1 rect 19 18 67 18 28 - region = 2 rect 84 18 133 18 28 - region = 3 rect 152 18 201 18 28 - region = 4 rect 19 60 67 60 28 - region = 5 rect 84 60 133 60 28 - region = 6 rect 152 60 201 60 28 - region = 7 rect 19 103 67 103 28 - region = 8 rect 84 103 133 103 28 - region = 9 rect 152 103 201 103 28 - region = * rect 19 146 67 146 28 - region = 0 rect 84 146 133 146 28 - region = # rect 152 146 201 146 28 - region = pickup rect 229 15 267 15 40 - region = hangup rect 230 66 270 64 40 - region = mute circle 232 141 264 141 33 - region = sendvideo circle 235 185 266 185 33 - region = autoanswer rect 228 212 275 212 50 - -; another skin with entries for the keypad and a small font -; to write to the message boards in the skin. -[skin2](!) - keypad = /tmp/kpad2.jpg - keypad_font = /tmp/font.png - -; to add video support, uncomment this and remember to install -; the keypad and keypad_font files to the right place -; [general](+,my_video,skin2) diff --git a/configure b/configure index 735a8e98c7..4d1da0db02 100755 --- a/configure +++ b/configure @@ -999,10 +999,6 @@ PBX_PGSQL PGSQL_DIR PGSQL_INCLUDE PGSQL_LIB -PBX_OSS -OSS_DIR -OSS_INCLUDE -OSS_LIB PBX_OSPTK OSPTK_DIR OSPTK_INCLUDE @@ -1296,7 +1292,6 @@ BUILD_OS BUILD_VENDOR BUILD_CPU BUILD_PLATFORM -astcachedir astvarrundir astlogdir astspooldir @@ -1309,6 +1304,7 @@ astmoddir astlibdir astheaderdir astetcdir +astcachedir astsbindir EGREP GREP @@ -1349,6 +1345,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -1425,7 +1422,6 @@ with_openr2 with_opus with_opusfile with_osptk -with_oss with_postgres with_beanstalk with_pjproject @@ -1538,6 +1534,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1790,6 +1787,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1927,7 +1933,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -2080,6 +2086,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -2188,7 +2195,6 @@ Optional Packages: --with-opus=PATH use Opus files in PATH --with-opusfile=PATH use Opusfile files in PATH --with-osptk=PATH use OSP Toolkit files in PATH - --with-oss=PATH use Open Sound System files in PATH --with-postgres=PATH use PostgreSQL files in PATH --with-beanstalk=PATH use Beanstalk Job Queue files in PATH --with-pjproject=PATH use PJPROJECT files in PATH @@ -10848,6 +10854,7 @@ fi + MISDN_DESCRIP="mISDN user" MISDN_OPTION="misdn" PBX_MISDN=0 @@ -11232,38 +11239,6 @@ fi - OSS_DESCRIP="Open Sound System" - OSS_OPTION="oss" - PBX_OSS=0 - -# Check whether --with-oss was given. -if test "${with_oss+set}" = set; then : - withval=$with_oss; - case ${withval} in - n|no) - USE_OSS=no - # -1 is a magic value used by menuselect to know that the package - # was disabled, other than 'not found' - PBX_OSS=-1 - ;; - y|ye|yes) - ac_mandatory_list="${ac_mandatory_list} OSS" - ;; - *) - OSS_DIR="${withval}" - ac_mandatory_list="${ac_mandatory_list} OSS" - ;; - esac - -fi - - - - - - - - PGSQL_DESCRIP="PostgreSQL" PGSQL_OPTION="postgres" PBX_PGSQL=0 @@ -14688,7 +14663,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -14734,7 +14709,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -14758,7 +14733,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -14803,7 +14778,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -14827,7 +14802,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -16127,6 +16102,8 @@ main () if (*(data + i) != *(data3 + i)) return 14; close (fd); + free (data); + free (data3); return 0; } _ACEOF @@ -24215,216 +24192,6 @@ fi -# possible places for oss definitions - -if test "x${PBX_OSS}" != "x1" -a "${USE_OSS}" != "no"; then - pbxlibdir="" - # if --with-OSS=DIR has been specified, use it. - if test "x${OSS_DIR}" != "x"; then - if test -d ${OSS_DIR}/lib; then - pbxlibdir="-L${OSS_DIR}/lib" - else - pbxlibdir="-L${OSS_DIR}" - fi - fi - - # empty lib, assume only headers - AST_OSS_FOUND=yes - - - # now check for the header. - if test "${AST_OSS_FOUND}" = "yes"; then - OSS_LIB="${pbxlibdir} -lossaudio " - # if --with-OSS=DIR has been specified, use it. - if test "x${OSS_DIR}" != "x"; then - OSS_INCLUDE="-I${OSS_DIR}/include" - fi - OSS_INCLUDE="${OSS_INCLUDE} " - - # check for the header - ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}" - CPPFLAGS="${CPPFLAGS} ${OSS_INCLUDE}" - ac_fn_c_check_header_mongrel "$LINENO" "linux/soundcard.h" "ac_cv_header_linux_soundcard_h" "$ac_includes_default" -if test "x$ac_cv_header_linux_soundcard_h" = xyes; then : - OSS_HEADER_FOUND=1 -else - OSS_HEADER_FOUND=0 -fi - - - CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}" - - if test "x${OSS_HEADER_FOUND}" = "x0" ; then - OSS_LIB="" - OSS_INCLUDE="" - else - - # only checking headers -> no library - OSS_LIB="" - - PBX_OSS=1 - cat >>confdefs.h <<_ACEOF -#define HAVE_OSS 1 -_ACEOF - - fi - fi -fi - - - -if test "x${PBX_OSS}" != "x1" -a "${USE_OSS}" != "no"; then - pbxlibdir="" - # if --with-OSS=DIR has been specified, use it. - if test "x${OSS_DIR}" != "x"; then - if test -d ${OSS_DIR}/lib; then - pbxlibdir="-L${OSS_DIR}/lib" - else - pbxlibdir="-L${OSS_DIR}" - fi - fi - - # empty lib, assume only headers - AST_OSS_FOUND=yes - - - # now check for the header. - if test "${AST_OSS_FOUND}" = "yes"; then - OSS_LIB="${pbxlibdir} -lossaudio " - # if --with-OSS=DIR has been specified, use it. - if test "x${OSS_DIR}" != "x"; then - OSS_INCLUDE="-I${OSS_DIR}/include" - fi - OSS_INCLUDE="${OSS_INCLUDE} " - - # check for the header - ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}" - CPPFLAGS="${CPPFLAGS} ${OSS_INCLUDE}" - ac_fn_c_check_header_mongrel "$LINENO" "sys/soundcard.h" "ac_cv_header_sys_soundcard_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_soundcard_h" = xyes; then : - OSS_HEADER_FOUND=1 -else - OSS_HEADER_FOUND=0 -fi - - - CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}" - - if test "x${OSS_HEADER_FOUND}" = "x0" ; then - OSS_LIB="" - OSS_INCLUDE="" - else - - # only checking headers -> no library - OSS_LIB="" - - PBX_OSS=1 - cat >>confdefs.h <<_ACEOF -#define HAVE_OSS 1 -_ACEOF - - fi - fi -fi - - - -if test "x${PBX_OSS}" != "x1" -a "${USE_OSS}" != "no"; then - pbxlibdir="" - # if --with-OSS=DIR has been specified, use it. - if test "x${OSS_DIR}" != "x"; then - if test -d ${OSS_DIR}/lib; then - pbxlibdir="-L${OSS_DIR}/lib" - else - pbxlibdir="-L${OSS_DIR}" - fi - fi - - ast_ext_lib_check_save_CFLAGS="${CFLAGS}" - CFLAGS="${CFLAGS} " - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oss_ioctl_mixer in -lossaudio" >&5 -$as_echo_n "checking for oss_ioctl_mixer in -lossaudio... " >&6; } -if ${ac_cv_lib_ossaudio_oss_ioctl_mixer+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lossaudio ${pbxlibdir} $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char oss_ioctl_mixer (); -int -main () -{ -return oss_ioctl_mixer (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ossaudio_oss_ioctl_mixer=yes -else - ac_cv_lib_ossaudio_oss_ioctl_mixer=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ossaudio_oss_ioctl_mixer" >&5 -$as_echo "$ac_cv_lib_ossaudio_oss_ioctl_mixer" >&6; } -if test "x$ac_cv_lib_ossaudio_oss_ioctl_mixer" = xyes; then : - AST_OSS_FOUND=yes -else - AST_OSS_FOUND=no -fi - - CFLAGS="${ast_ext_lib_check_save_CFLAGS}" - - - # now check for the header. - if test "${AST_OSS_FOUND}" = "yes"; then - OSS_LIB="${pbxlibdir} -lossaudio " - # if --with-OSS=DIR has been specified, use it. - if test "x${OSS_DIR}" != "x"; then - OSS_INCLUDE="-I${OSS_DIR}/include" - fi - OSS_INCLUDE="${OSS_INCLUDE} " - - # check for the header - ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}" - CPPFLAGS="${CPPFLAGS} ${OSS_INCLUDE}" - ac_fn_c_check_header_mongrel "$LINENO" "soundcard.h" "ac_cv_header_soundcard_h" "$ac_includes_default" -if test "x$ac_cv_header_soundcard_h" = xyes; then : - OSS_HEADER_FOUND=1 -else - OSS_HEADER_FOUND=0 -fi - - - CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}" - - if test "x${OSS_HEADER_FOUND}" = "x0" ; then - OSS_LIB="" - OSS_INCLUDE="" - else - - PBX_OSS=1 - cat >>confdefs.h <<_ACEOF -#define HAVE_OSS 1 -_ACEOF - - fi - fi -fi - - - PG_CONFIG=No if test "${USE_PGSQL}" != "no"; then if test "x${PGSQL_DIR}" != "x"; then diff --git a/configure.ac b/configure.ac index 2260fe6326..02f9f9c87e 100644 --- a/configure.ac +++ b/configure.ac @@ -524,7 +524,6 @@ AST_EXT_LIB_SETUP([OPENR2], [MFR2], [openr2]) AST_EXT_LIB_SETUP([OPUS], [Opus], [opus]) AST_EXT_LIB_SETUP([OPUSFILE], [Opusfile], [opusfile]) AST_EXT_LIB_SETUP([OSPTK], [OSP Toolkit], [osptk]) -AST_EXT_LIB_SETUP([OSS], [Open Sound System], [oss]) AST_EXT_LIB_SETUP([PGSQL], [PostgreSQL], [postgres]) AST_EXT_LIB_SETUP([BEANSTALK], [Beanstalk Job Queue], [beanstalk]) @@ -2344,11 +2343,6 @@ AST_EXT_LIB_CHECK([BLUETOOTH], [bluetooth], [ba2str], [bluetooth/bluetooth.h]) AST_EXT_LIB_CHECK([BEANSTALK], [beanstalk], [bs_version], [beanstalk.h]) -# possible places for oss definitions -AST_EXT_LIB_CHECK([OSS], [ossaudio], [], [linux/soundcard.h]) -AST_EXT_LIB_CHECK([OSS], [ossaudio], [], [sys/soundcard.h]) -AST_EXT_LIB_CHECK([OSS], [ossaudio], [oss_ioctl_mixer], [soundcard.h]) - PG_CONFIG=No if test "${USE_PGSQL}" != "no"; then if test "x${PGSQL_DIR}" != "x"; then diff --git a/doc/UPGRADE-staging/chan_oss_removal.txt b/doc/UPGRADE-staging/chan_oss_removal.txt new file mode 100644 index 0000000000..062f64b81f --- /dev/null +++ b/doc/UPGRADE-staging/chan_oss_removal.txt @@ -0,0 +1,6 @@ +Subject: chan_oss +Master-Only: True + +This module was deprecated in Asterisk 16 +and is now being removed in accordance with +the Asterisk Module Deprecation policy. diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index 2c770d1433..c8225e2311 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -603,9 +603,6 @@ /* Define this to indicate the ${OSPTK_DESCRIP} library */ #undef HAVE_OSPTK -/* Define to 1 if you have the Open Sound System library. */ -#undef HAVE_OSS - /* Define to 1 if your system defines the file flag O_EVTONLY in fcntl.h */ #undef HAVE_O_EVTONLY diff --git a/makeopts.in b/makeopts.in index 27a5bdc15b..01c0da0244 100644 --- a/makeopts.in +++ b/makeopts.in @@ -227,11 +227,6 @@ OPUSFILE_LIB=@OPUSFILE_LIB@ OSPTK_INCLUDE=@OSPTK_INCLUDE@ OSPTK_LIB=@OSPTK_LIB@ -# ossaudio can optionally use ffmpeg, x11, sdl and sdl_image. -# Because sdl_image in turn depends on sdl, we don't duplicate the include -OSS_INCLUDE=@OSS_INCLUDE@ @FFMPEG_INCLUDE@ @SDL_INCLUDE@ @X11_INCLUDE@ -OSS_LIB=@OSS_LIB@ @FFMPEG_LIB@ @SDL_LIB@ @SDL_IMAGE_LIB@ @X11_LIB@ - PGSQL_INCLUDE=@PGSQL_INCLUDE@ PGSQL_LIB=@PGSQL_LIB@ diff --git a/menuselect/configure b/menuselect/configure index 1d15c1c138..9986b4f989 100755 --- a/menuselect/configure +++ b/menuselect/configure @@ -696,6 +696,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -777,6 +778,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' @@ -1029,6 +1031,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1166,7 +1177,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1319,6 +1330,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include]