[asterisk-commits] russell: branch russell/chan_console r49055 -
/team/russell/chan_console/chan...
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Fri Dec 29 05:58:01 MST 2006
Author: russell
Date: Fri Dec 29 06:58:01 2006
New Revision: 49055
URL: http://svn.digium.com/view/asterisk?view=rev&rev=49055
Log:
Shift a couple things around and add doxygen comments.
Modified:
team/russell/chan_console/channels/chan_console.c
Modified: team/russell/chan_console/channels/chan_console.c
URL: http://svn.digium.com/view/asterisk/team/russell/chan_console/channels/chan_console.c?view=diff&rev=49055&r1=49054&r2=49055
==============================================================================
--- team/russell/chan_console/channels/chan_console.c (original)
+++ team/russell/chan_console/channels/chan_console.c Fri Dec 29 06:58:01 2006
@@ -55,14 +55,30 @@
#include "ring10.h"
#include "answer.h"
+/*!
+ * \brief The sample rate to request from PortAudio
+ *
+ * \note 8000 is universal in Asterisk right now. Once it supports 16kHz,
+ * it should probably be made an option, with a default of 16kHz.
+ */
#define SAMPLE_RATE 8000
+/*!
+ * \brief The number of samples to read/write per callback
+ *
+ * 160 samples is the most common frame size in Asterisk, so this makes
+ * incoming frames and writing data out to the callback a 1 to 1 process
+ * for convenience. However, the code is still written to handle arbitrary
+ * frame sizes.
+ */
#define NUM_SAMPLES 160
+/*! \brief Mono Input */
#define INPUT_CHANNELS 1
+/*! \brief Mono Output */
#define OUTPUT_CHANNELS 1
#define CONFIG_FILE "console.conf"
-/*
+/*!
* Each sound is made of 'datalen' samples of sound, repeated as needed to
* generate 'samplen' samples of data, then followed by 'silencelen' samples
* of silence. The loop is repeated if 'repeat' is set.
@@ -85,24 +101,43 @@
};
static struct console_pvt {
+ /*! Current channel for this device */
struct ast_channel *owner;
+ /*! Current PortAudio stream for this device */
PaStream *stream;
+ /*! Name of the device */
const char *name;
+ /*! Default MOH class to listen to, if:
+ * - No MOH class set on the channel
+ * - Peer channel putting this device on hold did not suggest a class */
char mohinterpret[MAX_MUSICCLASS];
+ /*! A frame for preparing to queue on to the channel */
struct ast_frame fr;
+ /*! Buffer to hold outgoing audio with the standard offset */
char read_buf[NUM_SAMPLES * 2 + AST_FRIENDLY_OFFSET];
+ /*! Buffer to hold left over samples from frames */
char write_buf[NUM_SAMPLES * 2];
+ /*! The index for the next write into write_buf */
unsigned int write_dst;
+ /*! The current index into the sounds array */
int cur_sound;
+ /*! On-hook = 0, Off-hook = 1 */
unsigned int hookstate:1;
+ /*! Ignore context in the console dial CLI command */
unsigned int overridecontext:1;
+ /*! The PortAudio callback is being executed */
unsigned int incallback:1;
+ /*! Used by the PortAudio callback if it gets called but has to wait for
+ * the write function to get called to provide frames. */
ast_cond_t cond;
+ /*! Lock for this struct */
ast_mutex_t lock;
+ /*! List of frames to be written out to the device */
AST_LIST_HEAD_NOLOCK(, ast_frame) frames;
} pvt = {
.name = "default",
.lock = AST_MUTEX_INIT_VALUE,
+ .cur_sound = -1,
};
/*! Global jitterbuffer configuration - by default, jb is disabled */
@@ -113,9 +148,6 @@
.impl = ""
};
static struct ast_jb_conf global_jbconf;
-
-static int start_stream(void);
-static int stop_stream(void);
static struct ast_channel *console_request(const char *type, int format,
void *data, int *cause);
@@ -148,6 +180,47 @@
.fixup = console_fixup,
};
+static int console_callback(const void *input, void *output,
+ unsigned long frame_count, const PaStreamCallbackTimeInfo *time_info,
+ PaStreamCallbackFlags flags, void *userData);
+
+static int start_stream(void)
+{
+ PaError res;
+
+ res = Pa_OpenDefaultStream(&pvt.stream, INPUT_CHANNELS, OUTPUT_CHANNELS,
+ paInt16, SAMPLE_RATE, NUM_SAMPLES, console_callback, NULL);
+ if (res != paNoError) {
+ ast_log(LOG_WARNING, "Failed to open default audio device - (%d) %s\n",
+ res, Pa_GetErrorText(res));
+ return -1;
+ }
+
+ res = Pa_StartStream(pvt.stream);
+ if (res != paNoError) {
+ ast_log(LOG_WARNING, "Failed to start stream - (%d) %s\n",
+ res, Pa_GetErrorText(res));
+ return -1;
+ }
+
+ return 0;
+}
+
+/*!
+ * \note Called with pvt struct locked
+ */
+static int stop_stream(void)
+{
+ ast_mutex_lock(&pvt.lock);
+ Pa_AbortStream(pvt.stream);
+ Pa_CloseStream(pvt.stream);
+ pvt.stream = NULL;
+ ast_cond_signal(&pvt.cond);
+ ast_mutex_unlock(&pvt.lock);
+
+ return 0;
+}
+
/*!
* \note Called with the pvt struct locked
*/
@@ -186,8 +259,6 @@
{
int oldformat = format;
struct ast_channel *chan = NULL;
-
- ast_log(LOG_NOTICE, "console_request...\n");
format &= AST_FORMAT_SLINEAR;
if (!format) {
@@ -234,6 +305,7 @@
ast_verbose(" --- <(\"<) --- Hangup on Console --- (>\")> ---\n");
pvt.hookstate = 0;
+ pvt.cur_sound = -1;
c->tech_pvt = NULL;
pvt.owner = NULL;
@@ -259,6 +331,7 @@
ast_mutex_lock(&pvt.lock);
ast_setstate(c, AST_STATE_UP);
+ pvt.cur_sound = -1;
res = start_stream();
ast_mutex_unlock(&pvt.lock);
@@ -521,6 +594,7 @@
return CLI_FAILURE;
}
pvt.hookstate = 0;
+ pvt.cur_sound = -1;
if (pvt.owner)
ast_queue_hangup(pvt.owner);
@@ -572,42 +646,12 @@
NEW_CLI(cli_list_devices, "List available devices"),
};
-static int start_stream(void)
-{
- PaError res;
-
- res = Pa_OpenDefaultStream(&pvt.stream, INPUT_CHANNELS, OUTPUT_CHANNELS,
- paInt16, SAMPLE_RATE, NUM_SAMPLES, console_callback, NULL);
- if (res != paNoError) {
- ast_log(LOG_WARNING, "Failed to open default audio device - (%d) %s\n",
- res, Pa_GetErrorText(res));
- return -1;
- }
-
- res = Pa_StartStream(pvt.stream);
- if (res != paNoError) {
- ast_log(LOG_WARNING, "Failed to start stream - (%d) %s\n",
- res, Pa_GetErrorText(res));
- return -1;
- }
-
- return 0;
-}
-
/*!
- * \note Called with pvt struct locked
- */
-static int stop_stream(void)
-{
- ast_mutex_lock(&pvt.lock);
- Pa_AbortStream(pvt.stream);
- Pa_CloseStream(pvt.stream);
- ast_cond_signal(&pvt.cond);
- ast_mutex_unlock(&pvt.lock);
-
- return 0;
-}
-
+ * \brief Load the configuration
+ * \param reload if this was called due to a reload
+ * \retval 0 succcess
+ * \retval -1 failure
+ */
static int load_config(int reload)
{
struct ast_config *cfg;
More information about the asterisk-commits
mailing list