Asterisk - The Open Source Telephony Project GIT-master-8f1982c
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Data Structures | Functions | Variables
func_scramble.c File Reference

Frequency inverter. 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 <stdio.h>
#include <string.h>
Include dependency graph for func_scramble.c:

Go to the source code of this file.

Data Structures

struct  scramble_information
 

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 void freq_invert (short *amp, int samples)
 
static int load_module (void)
 
static int remove_scrambler (struct ast_channel *chan)
 
static int scramble_callback (struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction)
 
static int scramble_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Frequency inverting voice scrambler" , .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 scramble_datastore
 Static structure for datastore information. More...
 
static struct ast_custom_function scramble_function
 

Detailed Description

Frequency inverter.

Author
Naveen Albert aster.nosp@m.isk@.nosp@m.phrea.nosp@m.knet.nosp@m..org

Definition in file func_scramble.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 240 of file func_scramble.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 240 of file func_scramble.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 240 of file func_scramble.c.

◆ destroy_callback()

static void destroy_callback ( void *  data)
static

Definition at line 81 of file func_scramble.c.

82{
83 struct scramble_information *ni = data;
84
85 /* Destroy the audiohook, and destroy ourselves */
90 ast_free(ni);
91
92 return;
93}
#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:578
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_scramble.c:75

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

◆ freq_invert()

static void freq_invert ( short *  amp,
int  samples 
)
inlinestatic

Definition at line 102 of file func_scramble.c.

103{
104 int i;
105 /* invert every other sample by 1 */
106 for (i = 0; i < samples; i += 2) {
107 amp[i] = -amp[i];
108 }
109}

Referenced by scramble_callback().

◆ load_module()

static int load_module ( void  )
static

Definition at line 235 of file func_scramble.c.

236{
238}
static struct ast_custom_function scramble_function
#define ast_custom_function_register(acf)
Register a custom function.
Definition: pbx.h:1559

References ast_custom_function_register, and scramble_function.

◆ remove_scrambler()

static int remove_scrambler ( struct ast_channel chan)
static

Definition at line 139 of file func_scramble.c.

140{
141 struct ast_datastore *datastore = NULL;
142 struct scramble_information *data;
143 SCOPED_CHANNELLOCK(chan_lock, chan);
144
146 if (!datastore) {
147 ast_log(AST_LOG_WARNING, "Cannot remove SCRAMBLE from %s: SCRAMBLE not currently enabled\n",
148 ast_channel_name(chan));
149 return -1;
150 }
151 data = datastore->data;
152
153 if (ast_audiohook_remove(chan, &data->audiohook)) {
154 ast_log(AST_LOG_WARNING, "Failed to remove SCRAMBLE audiohook from channel %s\n", ast_channel_name(chan));
155 return -1;
156 }
157
158 if (ast_channel_datastore_remove(chan, datastore)) {
159 ast_log(AST_LOG_WARNING, "Failed to remove SCRAMBLE datastore from channel %s\n",
160 ast_channel_name(chan));
161 return -1;
162 }
163 ast_datastore_free(datastore);
164
165 return 0;
166}
#define ast_log
Definition: astobj2.c:42
int ast_audiohook_remove(struct ast_channel *chan, struct ast_audiohook *audiohook)
Remove an audiohook from a specified channel.
Definition: audiohook.c:749
const char * ast_channel_name(const struct ast_channel *chan)
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
Definition: channel.c:2363
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:2368
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
static const struct ast_datastore_info scramble_datastore
Static structure for datastore information.
Definition: func_scramble.c:96
#define AST_LOG_WARNING
#define SCOPED_CHANNELLOCK(varname, chan)
scoped lock specialization for channels.
Definition: lock.h:626
#define NULL
Definition: resample.c:96
Structure for a data store object.
Definition: datastore.h:64
void * data
Definition: datastore.h:66

References ast_audiohook_remove(), ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_channel_name(), ast_datastore_free(), ast_log, AST_LOG_WARNING, scramble_information::audiohook, ast_datastore::data, NULL, SCOPED_CHANNELLOCK, and scramble_datastore.

Referenced by scramble_write().

◆ scramble_callback()

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

Definition at line 111 of file func_scramble.c.

112{
113 struct ast_datastore *datastore = NULL;
114 struct scramble_information *ni = NULL;
115
116 /* If the audiohook is stopping it means the channel is shutting down.... but we let the datastore destroy take care of it */
118 return 0;
119 }
120
121 /* Grab datastore which contains our gain information */
122 if (!(datastore = ast_channel_datastore_find(chan, &scramble_datastore, NULL))) {
123 return 0;
124 }
125
126 if (frame->frametype == AST_FRAME_VOICE) { /* only invert voice frequencies */
127 ni = datastore->data;
128 /* Based on direction of frame, and confirm it is applicable */
129 if (!(direction == AST_AUDIOHOOK_DIRECTION_READ ? ni->rx : ni->tx)) {
130 return 0;
131 }
132 /* Scramble the sample now */
133 freq_invert(frame->data.ptr, frame->samples);
134 }
135 return 0;
136}
@ AST_AUDIOHOOK_DIRECTION_READ
Definition: audiohook.h:49
@ AST_AUDIOHOOK_STATUS_DONE
Definition: audiohook.h:45
direction
static void freq_invert(short *amp, int samples)
@ AST_FRAME_VOICE
enum ast_audiohook_status status
Definition: audiohook.h:108
union ast_frame::@228 data
enum ast_frame_type frametype
unsigned short int tx
Definition: func_scramble.c:76
unsigned short int rx
Definition: func_scramble.c:77

References AST_AUDIOHOOK_DIRECTION_READ, AST_AUDIOHOOK_STATUS_DONE, ast_channel_datastore_find(), AST_FRAME_VOICE, scramble_information::audiohook, ast_datastore::data, ast_frame::data, ast_frame::frametype, freq_invert(), NULL, ast_frame::ptr, scramble_information::rx, ast_frame::samples, scramble_datastore, ast_audiohook::status, and scramble_information::tx.

Referenced by scramble_write().

◆ scramble_write()

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

Definition at line 168 of file func_scramble.c.

169{
170 char *parse;
171 struct ast_datastore *datastore = NULL;
172 struct scramble_information *ni = NULL;
173 int tx = 1, rx = 1;
174
177 );
178
179 if (!chan) {
180 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
181 return -1;
182 }
183
184 parse = ast_strdupa(value);
186
187 if (!strcasecmp(args.direction, "remove")) {
188 return remove_scrambler(chan);
189 }
190 if (!strcasecmp(args.direction, "tx")) {
191 tx = 1;
192 rx = 0;
193 } else if (!strcasecmp(args.direction, "rx")) {
194 rx = 0;
195 tx = 1;
196 } else if (strcasecmp(args.direction, "both")) {
197 ast_log(LOG_ERROR, "Direction must be either RX, TX, both, or remove\n");
198 return -1;
199 }
200 ast_channel_lock(chan);
201 if (!(datastore = ast_channel_datastore_find(chan, &scramble_datastore, NULL))) {
202 /* Allocate a new datastore to hold the reference to this audiohook information */
203 if (!(datastore = ast_datastore_alloc(&scramble_datastore, NULL))) {
204 return 0;
205 }
206 if (!(ni = ast_calloc(1, sizeof(*ni)))) {
207 ast_datastore_free(datastore);
208 return 0;
209 }
212 datastore->data = ni;
213 ast_channel_datastore_add(chan, datastore);
215 } else {
216 ni = datastore->data;
217 }
218 ni->tx = tx;
219 ni->rx = rx;
220 ast_channel_unlock(chan);
221
222 return 0;
223}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#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
int ast_audiohook_attach(struct ast_channel *chan, struct ast_audiohook *audiohook)
Attach audiohook to channel.
Definition: audiohook.c:512
@ 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:2354
#define ast_channel_lock(chan)
Definition: channel.h:2972
#define ast_channel_unlock(chan)
Definition: channel.h:2973
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:85
static int scramble_callback(struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction)
static int remove_scrambler(struct ast_channel *chan)
#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
ast_audiohook_manipulate_callback manipulate_callback
Definition: audiohook.h:118
int value
Definition: syslog.c:37
const char * args

References args, AST_APP_ARG, ast_audiohook_attach(), ast_audiohook_init(), AST_AUDIOHOOK_MANIPULATE_ALL_RATES, AST_AUDIOHOOK_TYPE_MANIPULATE, 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_STANDARD_APP_ARGS, ast_strdupa, scramble_information::audiohook, ast_datastore::data, LOG_ERROR, LOG_WARNING, ast_audiohook::manipulate_callback, NULL, remove_scrambler(), scramble_information::rx, scramble_callback(), scramble_datastore, scramble_information::tx, and value.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 230 of file func_scramble.c.

231{
233}
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.

References ast_custom_function_unregister(), and scramble_function.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Frequency inverting voice scrambler" , .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 240 of file func_scramble.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 240 of file func_scramble.c.

◆ scramble_datastore

const struct ast_datastore_info scramble_datastore
static
Initial value:
= {
.type = "scramble",
.destroy = destroy_callback
}
static void destroy_callback(void *data)
Definition: func_scramble.c:81

Static structure for datastore information.

Definition at line 96 of file func_scramble.c.

Referenced by remove_scrambler(), scramble_callback(), and scramble_write().

◆ scramble_function

struct ast_custom_function scramble_function
static
Initial value:
= {
.name = "SCRAMBLE",
.write = scramble_write,
}
static int scramble_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)

Definition at line 225 of file func_scramble.c.

Referenced by load_module(), and unload_module().