Asterisk - The Open Source Telephony Project  18.5.0
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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .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 239 of file func_scramble.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 239 of file func_scramble.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 239 of file func_scramble.c.

◆ destroy_callback()

static void destroy_callback ( void *  data)
static

Definition at line 77 of file func_scramble.c.

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

78 {
79  struct scramble_information *ni = data;
80 
81  /* Destroy the audiohook, and destroy ourselves */
86  ast_free(ni);
87 
88  return;
89 }
int ast_audiohook_destroy(struct ast_audiohook *audiohook)
Destroys an audiohook structure.
Definition: audiohook.c:133
#define ast_audiohook_unlock(ah)
Unlock an audiohook.
Definition: audiohook.h:300
int ast_audiohook_detach(struct ast_audiohook *audiohook)
Detach audiohook from channel.
Definition: audiohook.c:579
#define ast_free(a)
Definition: astmm.h:182
struct ast_audiohook audiohook
Definition: func_scramble.c:71
#define ast_audiohook_lock(ah)
Lock an audiohook.
Definition: audiohook.h:295

◆ freq_invert()

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

Definition at line 99 of file func_scramble.c.

Referenced by scramble_callback().

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

◆ load_module()

static int load_module ( void  )
static

Definition at line 234 of file func_scramble.c.

References ast_custom_function_register.

235 {
237 }
static struct ast_custom_function scramble_function
#define ast_custom_function_register(acf)
Register a custom function.
Definition: pbx.h:1508

◆ remove_scrambler()

static int remove_scrambler ( struct ast_channel chan)
static

Definition at line 131 of file func_scramble.c.

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, and SCOPED_CHANNELLOCK.

Referenced by scramble_write().

132 {
133  struct ast_datastore *datastore = NULL;
134  struct scramble_information *data;
135  SCOPED_CHANNELLOCK(chan_lock, chan);
136 
138  if (!datastore) {
139  ast_log(AST_LOG_WARNING, "Cannot remove SCRAMBLE from %s: SCRAMBLE not currently enabled\n",
140  ast_channel_name(chan));
141  return -1;
142  }
143  data = datastore->data;
144 
145  if (ast_audiohook_remove(chan, &data->audiohook)) {
146  ast_log(AST_LOG_WARNING, "Failed to remove SCRAMBLE audiohook from channel %s\n", ast_channel_name(chan));
147  return -1;
148  }
149 
150  if (ast_channel_datastore_remove(chan, datastore)) {
151  ast_log(AST_LOG_WARNING, "Failed to remove SCRAMBLE datastore from channel %s\n",
152  ast_channel_name(chan));
153  return -1;
154  }
155  ast_datastore_free(datastore);
156 
157  return 0;
158 }
static const struct ast_datastore_info scramble_datastore
Static structure for datastore information.
Definition: func_scramble.c:92
int ast_audiohook_remove(struct ast_channel *chan, struct ast_audiohook *audiohook)
Remove an audiohook from a specified channel.
Definition: audiohook.c:764
#define AST_LOG_WARNING
Definition: logger.h:279
Structure for a data store object.
Definition: datastore.h:68
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:2404
#define NULL
Definition: resample.c:96
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
#define ast_log
Definition: astobj2.c:42
#define SCOPED_CHANNELLOCK(varname, chan)
scoped lock specialization for channels.
Definition: lock.h:617
struct ast_audiohook audiohook
Definition: func_scramble.c:71
void * data
Definition: datastore.h:70
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:2399

◆ 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 107 of file func_scramble.c.

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

Referenced by scramble_write().

108 {
109  struct ast_datastore *datastore = NULL;
110  struct scramble_information *ni = NULL;
111 
112  /* If the audiohook is stopping it means the channel is shutting down.... but we let the datastore destroy take care of it */
113  if (audiohook->status == AST_AUDIOHOOK_STATUS_DONE)
114  return 0;
115 
116  /* Grab datastore which contains our gain information */
117  if (!(datastore = ast_channel_datastore_find(chan, &scramble_datastore, NULL)))
118  return 0;
119 
120  if (frame->frametype == AST_FRAME_VOICE) { /* only invert voice frequencies */
121  /* Based on direction of frame, and confirm it is applicable */
122  if (!(direction == AST_AUDIOHOOK_DIRECTION_READ ? &ni->rx : &ni->tx))
123  return 0;
124  /* Scramble the sample now */
125  freq_invert(frame->data.ptr, frame->samples);
126  }
127  return 0;
128 }
static const struct ast_datastore_info scramble_datastore
Static structure for datastore information.
Definition: func_scramble.c:92
unsigned short int rx
Definition: func_scramble.c:73
Structure for a data store object.
Definition: datastore.h:68
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:2404
#define NULL
Definition: resample.c:96
unsigned short int tx
Definition: func_scramble.c:72
static void freq_invert(short *amp, int samples)
Definition: func_scramble.c:99
enum ast_audiohook_status status
Definition: audiohook.h:107
union ast_frame::@263 data
enum ast_frame_type frametype
direction

◆ scramble_write()

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

Definition at line 160 of file func_scramble.c.

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, parse(), remove_scrambler(), scramble_information::rx, scramble_callback(), and scramble_information::tx.

161 {
162  char *parse;
163  struct ast_datastore *datastore = NULL;
164  struct scramble_information *ni = NULL;
165  int is_new = 0;
166 
169  );
170 
171  if (!chan) {
172  ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
173  return -1;
174  }
175 
176  parse = ast_strdupa(value);
177  AST_STANDARD_APP_ARGS(args, parse);
178 
179  ast_channel_lock(chan);
180  if (!(datastore = ast_channel_datastore_find(chan, &scramble_datastore, NULL))) {
181  ast_channel_unlock(chan);
182  /* Allocate a new datastore to hold the reference to this audiohook information */
183  if (!(datastore = ast_datastore_alloc(&scramble_datastore, NULL)))
184  return 0;
185  if (!(ni = ast_calloc(1, sizeof(*ni)))) {
186  ast_datastore_free(datastore);
187  return 0;
188  }
191  is_new = 1;
192  } else {
193  ast_channel_unlock(chan);
194  ni = datastore->data;
195  }
196 
197  if (!strcasecmp(args.direction, "tx")) {
198  ni->tx = 1;
199  ni->rx = 0;
200  } else if (!strcasecmp(args.direction, "rx")) {
201  ni->rx = 0;
202  ni->tx = 1;
203  } else if (!strcasecmp(args.direction, "both")) {
204  ni->rx = 1;
205  ni->tx = 1;
206  } else if (!strcasecmp(args.direction, "remove")) {
207  return remove_scrambler(chan);
208  } else {
209  ast_log(LOG_ERROR, "Direction must be either RX, TX or remove\n");
210  return -1;
211  }
212 
213  if (is_new) {
214  datastore->data = ni;
215  ast_channel_lock(chan);
216  ast_channel_datastore_add(chan, datastore);
217  ast_channel_unlock(chan);
218  ast_audiohook_attach(chan, &ni->audiohook);
219  }
220 
221  return 0;
222 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
static const struct ast_datastore_info scramble_datastore
Static structure for datastore information.
Definition: func_scramble.c:92
unsigned short int rx
Definition: func_scramble.c:73
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the &#39;standard&#39; argument separation process for an application.
#define LOG_WARNING
Definition: logger.h:274
int ast_audiohook_attach(struct ast_channel *chan, struct ast_audiohook *audiohook)
Attach audiohook to channel.
Definition: audiohook.c:501
Structure for a data store object.
Definition: datastore.h:68
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:2404
const char * args
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
ast_audiohook_manipulate_callback manipulate_callback
Definition: audiohook.h:117
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:108
#define ast_log
Definition: astobj2.c:42
unsigned short int tx
Definition: func_scramble.c:72
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
static int remove_scrambler(struct ast_channel *chan)
#define LOG_ERROR
Definition: logger.h:285
#define ast_channel_unlock(chan)
Definition: channel.h:2946
static void parse(struct mgcp_request *req)
Definition: chan_mgcp.c:1872
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
struct ast_audiohook audiohook
Definition: func_scramble.c:71
static int scramble_callback(struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction)
void * data
Definition: datastore.h:70
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:89
direction
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2390
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application&#39;s arguments.
#define AST_APP_ARG(name)
Define an application argument.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 229 of file func_scramble.c.

References ast_custom_function_unregister().

230 {
232 }
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
static struct ast_custom_function 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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
static

Definition at line 239 of file func_scramble.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 239 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:77

Static structure for datastore information.

Definition at line 92 of file func_scramble.c.

◆ 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 224 of file func_scramble.c.