Asterisk - The Open Source Telephony Project GIT-master-a358458
Data Structures | Enumerations | Functions | Variables
func_volume.c File Reference

Technology independent volume control. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/audiohook.h"
#include "asterisk/app.h"
Include dependency graph for func_volume.c:

Go to the source code of this file.

Data Structures

struct  volume_information
 

Enumerations

enum  volume_flags { VOLUMEFLAG_CHANGE = (1 << 1) }
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static void destroy_callback (void *data)
 
static int load_module (void)
 
static int unload_module (void)
 
static int volume_callback (struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction)
 
static int volume_read (struct ast_channel *chan, const char *cmd, char *data, char *buffer, size_t buflen)
 
static int volume_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Technology independent volume control" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static const struct ast_datastore_info volume_datastore
 Static structure for datastore information. More...
 
static struct ast_custom_function volume_function
 
static const struct ast_app_option volume_opts [128] = { [ 'p' ] = { .flag = VOLUMEFLAG_CHANGE }, }
 

Detailed Description

Technology independent volume control.

Author
Joshua Colp jcolp.nosp@m.@dig.nosp@m.ium.c.nosp@m.om

Definition in file func_volume.c.

Enumeration Type Documentation

◆ volume_flags

Enumerator
VOLUMEFLAG_CHANGE 

Definition at line 91 of file func_volume.c.

91 {
92 VOLUMEFLAG_CHANGE = (1 << 1),
93};
@ VOLUMEFLAG_CHANGE
Definition: func_volume.c:92

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 298 of file func_volume.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 298 of file func_volume.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 298 of file func_volume.c.

◆ destroy_callback()

static void destroy_callback ( void *  data)
static

Definition at line 99 of file func_volume.c.

100{
101 struct volume_information *vi = data;
102
103 /* Destroy the audiohook, and destroy ourselves */
108 ast_free(vi);
109
110 return;
111}
#define ast_free(a)
Definition: astmm.h:180
#define ast_audiohook_lock(ah)
Lock an audiohook.
Definition: audiohook.h:313
int ast_audiohook_detach(struct ast_audiohook *audiohook)
Detach audiohook from channel.
Definition: audiohook.c:550
int ast_audiohook_destroy(struct ast_audiohook *audiohook)
Destroys an audiohook structure.
Definition: audiohook.c:124
#define ast_audiohook_unlock(ah)
Unlock an audiohook.
Definition: audiohook.h:318
struct ast_audiohook audiohook
Definition: func_volume.c:85

References ast_audiohook_destroy(), ast_audiohook_detach(), ast_audiohook_lock, ast_audiohook_unlock, ast_free, and volume_information::audiohook.

◆ load_module()

static int load_module ( void  )
static

Definition at line 293 of file func_volume.c.

294{
296}
static struct ast_custom_function volume_function
Definition: func_volume.c:282
#define ast_custom_function_register(acf)
Register a custom function.
Definition: pbx.h:1558

References ast_custom_function_register, and volume_function.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 288 of file func_volume.c.

289{
291}
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.

References ast_custom_function_unregister(), and volume_function.

◆ volume_callback()

static int volume_callback ( struct ast_audiohook audiohook,
struct ast_channel chan,
struct ast_frame frame,
enum ast_audiohook_direction  direction 
)
static

Definition at line 119 of file func_volume.c.

120{
121 struct ast_datastore *datastore = NULL;
122 struct volume_information *vi = NULL;
123 float *gain = NULL;
124
125 /* If the audiohook is stopping it means the channel is shutting down.... but we let the datastore destroy take care of it */
127 return 0;
128
129 /* Grab datastore which contains our gain information */
130 if (!(datastore = ast_channel_datastore_find(chan, &volume_datastore, NULL)))
131 return 0;
132
133 vi = datastore->data;
134
135 /* If this is DTMF then allow them to increase/decrease the gains */
137 if (frame->frametype == AST_FRAME_DTMF) {
138 /* Only use DTMF coming from the source... not going to it */
140 return 0;
141 if (frame->subclass.integer == '*') {
142 vi->tx_gain += 1;
143 vi->rx_gain += 1;
144 } else if (frame->subclass.integer == '#') {
145 vi->tx_gain -= 1;
146 vi->rx_gain -= 1;
147 }
148 }
149 }
150
151
152 if (frame->frametype == AST_FRAME_VOICE) {
153 /* Based on direction of frame grab the gain, and confirm it is applicable */
154 if (!(gain = (direction == AST_AUDIOHOOK_DIRECTION_READ) ? &vi->rx_gain : &vi->tx_gain) || !*gain)
155 return 0;
156 /* Apply gain to frame... easy as pi */
157 ast_frame_adjust_volume_float(frame, *gain);
158 }
159
160 return 0;
161}
@ AST_AUDIOHOOK_DIRECTION_READ
Definition: audiohook.h:49
@ AST_AUDIOHOOK_STATUS_DONE
Definition: audiohook.h:45
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
Definition: channel.c:2399
direction
static const struct ast_datastore_info volume_datastore
Static structure for datastore information.
Definition: func_volume.c:114
#define AST_FRAME_DTMF
int ast_frame_adjust_volume_float(struct ast_frame *f, float adjustment)
Adjusts the volume of the audio samples contained in a frame.
Definition: main/frame.c:812
@ AST_FRAME_VOICE
#define NULL
Definition: resample.c:96
enum ast_audiohook_status status
Definition: audiohook.h:108
Structure for a data store object.
Definition: datastore.h:64
void * data
Definition: datastore.h:66
struct ast_frame_subclass subclass
enum ast_frame_type frametype
#define ast_test_flag(p, flag)
Definition: utils.h:63

References AST_AUDIOHOOK_DIRECTION_READ, AST_AUDIOHOOK_STATUS_DONE, ast_channel_datastore_find(), ast_frame_adjust_volume_float(), AST_FRAME_DTMF, AST_FRAME_VOICE, ast_test_flag, volume_information::audiohook, ast_datastore::data, ast_frame::frametype, ast_frame_subclass::integer, NULL, volume_information::rx_gain, ast_audiohook::status, ast_frame::subclass, volume_information::tx_gain, volume_datastore, and VOLUMEFLAG_CHANGE.

Referenced by volume_write().

◆ volume_read()

static int volume_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buffer,
size_t  buflen 
)
static

Definition at line 237 of file func_volume.c.

238{
239 struct ast_datastore *datastore = NULL;
240 struct volume_information *vi = NULL;
241
242 /* Separate options from argument */
243
247 );
248
249 if (!chan) {
250 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
251 return -1;
252 }
253
255
256 ast_channel_lock(chan);
257 if (!(datastore = ast_channel_datastore_find(chan, &volume_datastore, NULL))) {
258 ast_channel_unlock(chan);
259 return -1; /* no active audiohook, nothing to read */
260 } else {
261 ast_channel_unlock(chan);
262 vi = datastore->data;
263 }
264
265 /* Obtain current gain using volume information structure */
266 if (ast_strlen_zero(args.direction)) {
267 ast_log(LOG_ERROR, "Direction must be specified for VOLUME function\n");
268 return -1;
269 }
270
271 if (!strcasecmp(args.direction, "tx")) {
272 snprintf(buffer, buflen, "%f", vi->tx_gain);
273 } else if (!strcasecmp(args.direction, "rx")) {
274 snprintf(buffer, buflen, "%f", vi->rx_gain);
275 } else {
276 ast_log(LOG_ERROR, "Direction must be either RX or TX\n");
277 }
278
279 return 0;
280}
#define ast_log
Definition: astobj2.c:42
#define ast_channel_lock(chan)
Definition: channel.h:2922
#define ast_channel_unlock(chan)
Definition: channel.h:2923
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
#define LOG_ERROR
#define LOG_WARNING
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
const char * args
static struct test_options options

References args, AST_APP_ARG, ast_channel_datastore_find(), ast_channel_lock, ast_channel_unlock, AST_DECLARE_APP_ARGS, ast_log, AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_datastore::data, LOG_ERROR, LOG_WARNING, NULL, options, volume_information::rx_gain, volume_information::tx_gain, and volume_datastore.

◆ volume_write()

static int volume_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
)
static

Definition at line 163 of file func_volume.c.

164{
165 struct ast_datastore *datastore = NULL;
166 struct volume_information *vi = NULL;
167 int is_new = 0;
168
169 /* Separate options from argument */
170
174 );
175
176 if (!chan) {
177 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
178 return -1;
179 }
180
182
183 ast_channel_lock(chan);
184 if (!(datastore = ast_channel_datastore_find(chan, &volume_datastore, NULL))) {
185 ast_channel_unlock(chan);
186 /* Allocate a new datastore to hold the reference to this volume and audiohook information */
187 if (!(datastore = ast_datastore_alloc(&volume_datastore, NULL)))
188 return 0;
189 if (!(vi = ast_calloc(1, sizeof(*vi)))) {
190 ast_datastore_free(datastore);
191 return 0;
192 }
196 is_new = 1;
197 } else {
198 ast_channel_unlock(chan);
199 vi = datastore->data;
200 }
201
202 /* Adjust gain on volume information structure */
203 if (ast_strlen_zero(args.direction)) {
204 ast_log(LOG_ERROR, "Direction must be specified for VOLUME function\n");
205 return -1;
206 }
207
208 if (!strcasecmp(args.direction, "tx")) {
209 vi->tx_gain = atof(value);
210 } else if (!strcasecmp(args.direction, "rx")) {
211 vi->rx_gain = atof(value);
212 } else {
213 ast_log(LOG_ERROR, "Direction must be either RX or TX\n");
214 }
215
216 if (is_new) {
217 datastore->data = vi;
218 ast_channel_lock(chan);
219 ast_channel_datastore_add(chan, datastore);
220 ast_channel_unlock(chan);
222 }
223
224 /* Add Option data to struct */
225
226 if (!ast_strlen_zero(args.options)) {
227 struct ast_flags flags = { 0 };
229 vi->flags = flags.flags;
230 } else {
231 vi->flags = 0;
232 }
233
234 return 0;
235}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
@ AST_AUDIOHOOK_MANIPULATE_ALL_RATES
Definition: audiohook.h:75
int ast_audiohook_init(struct ast_audiohook *audiohook, enum ast_audiohook_type type, const char *source, enum ast_audiohook_init_flags flags)
Initialize an audiohook structure.
Definition: audiohook.c:100
@ AST_AUDIOHOOK_WANTS_DTMF
Definition: audiohook.h:58
int ast_audiohook_attach(struct ast_channel *chan, struct ast_audiohook *audiohook)
Attach audiohook to channel.
Definition: audiohook.c:484
@ AST_AUDIOHOOK_TYPE_MANIPULATE
Definition: audiohook.h:38
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2385
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:85
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
static const struct ast_app_option volume_opts[128]
Definition: func_volume.c:97
static int volume_callback(struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction)
Definition: func_volume.c:119
int ast_app_parse_options(const struct ast_app_option *options, struct ast_flags *flags, char **args, char *optstr)
Parses a string containing application options and sets flags/arguments.
Definition: main/app.c:3056
ast_audiohook_manipulate_callback manipulate_callback
Definition: audiohook.h:118
Structure used to handle boolean flags.
Definition: utils.h:199
unsigned int flags
Definition: utils.h:200
unsigned int flags
Definition: func_volume.c:88
int value
Definition: syslog.c:37
#define ast_set_flag(p, flag)
Definition: utils.h:70

References args, AST_APP_ARG, ast_app_parse_options(), ast_audiohook_attach(), ast_audiohook_init(), AST_AUDIOHOOK_MANIPULATE_ALL_RATES, AST_AUDIOHOOK_TYPE_MANIPULATE, AST_AUDIOHOOK_WANTS_DTMF, ast_calloc, ast_channel_datastore_add(), ast_channel_datastore_find(), ast_channel_lock, ast_channel_unlock, ast_datastore_alloc, ast_datastore_free(), AST_DECLARE_APP_ARGS, ast_log, ast_set_flag, AST_STANDARD_APP_ARGS, ast_strlen_zero(), volume_information::audiohook, ast_datastore::data, volume_information::flags, ast_flags::flags, LOG_ERROR, LOG_WARNING, ast_audiohook::manipulate_callback, NULL, options, volume_information::rx_gain, volume_information::tx_gain, value, volume_callback(), volume_datastore, and volume_opts.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Technology independent volume control" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
static

Definition at line 298 of file func_volume.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 298 of file func_volume.c.

◆ volume_datastore

const struct ast_datastore_info volume_datastore
static
Initial value:
= {
.type = "volume",
.destroy = destroy_callback
}
static void destroy_callback(void *data)
Definition: func_volume.c:99

Static structure for datastore information.

Definition at line 114 of file func_volume.c.

Referenced by volume_callback(), volume_read(), and volume_write().

◆ volume_function

struct ast_custom_function volume_function
static
Initial value:
= {
.name = "VOLUME",
.write = volume_write,
.read = volume_read,
}
static int volume_read(struct ast_channel *chan, const char *cmd, char *data, char *buffer, size_t buflen)
Definition: func_volume.c:237
static int volume_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
Definition: func_volume.c:163

Definition at line 282 of file func_volume.c.

Referenced by load_module(), and unload_module().

◆ volume_opts

const struct ast_app_option volume_opts[128] = { [ 'p' ] = { .flag = VOLUMEFLAG_CHANGE }, }
static

Definition at line 97 of file func_volume.c.

Referenced by volume_write().