spandsp 0.0.6
bell_r2_mf.c File Reference
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include "floating_fudge.h"
#include "spandsp/telephony.h"
#include "spandsp/logging.h"
#include "spandsp/fast_convert.h"
#include "spandsp/queue.h"
#include "spandsp/dc_restore.h"
#include "spandsp/complex.h"
#include "spandsp/dds.h"
#include "spandsp/tone_detect.h"
#include "spandsp/tone_generate.h"
#include "spandsp/super_tone_rx.h"
#include "spandsp/dtmf.h"
#include "spandsp/bell_r2_mf.h"
#include "spandsp/private/logging.h"
#include "spandsp/private/queue.h"
#include "spandsp/private/tone_generate.h"
#include "spandsp/private/bell_r2_mf.h"

Classes

struct  mf_digit_tones_t

Macros

#define M_PI   3.14159265358979323846264338327
#define BELL_MF_THRESHOLD   3343803100.0f /* -30.5dBm0 [((120.0*32768.0/1.4142)*10^((-30.5 - DBM0_MAX_SINE_POWER)/20.0))^2 => 3343803100.0] */
#define BELL_MF_TWIST   3.981f /* 6dB [10^(6/10) => 3.981] */
#define BELL_MF_RELATIVE_PEAK   12.589f /* 11dB */
#define BELL_MF_SAMPLES_PER_BLOCK   120
#define R2_MF_THRESHOLD   1031766650.0f /* -36.5dBm0 [((133.0*32768.0/1.4142)*10^((-36.5 - DBM0_MAX_SINE_POWER)/20.0))^2 => 1031766650.0] */
#define R2_MF_TWIST   5.012f /* 7dB */
#define R2_MF_RELATIVE_PEAK   12.589f /* 11dB */
#define R2_MF_SAMPLES_PER_BLOCK   133

Functions

int bell_mf_tx (bell_mf_tx_state_t *s, int16_t amp[], int max_samples)
 Generate a buffer of Bell MF tones.
int bell_mf_tx_put (bell_mf_tx_state_t *s, const char *digits, int len)
 Put a string of digits in a Bell MF generator's input buffer.
bell_mf_tx_state_tbell_mf_tx_init (bell_mf_tx_state_t *s)
 Initialise a Bell MF generator context.
int bell_mf_tx_release (bell_mf_tx_state_t *s)
 Release a Bell MF generator context.
int bell_mf_tx_free (bell_mf_tx_state_t *s)
 Free a Bell MF generator context.
int r2_mf_tx (r2_mf_tx_state_t *s, int16_t amp[], int samples)
 Generate a block of R2 MF tones.
int r2_mf_tx_put (r2_mf_tx_state_t *s, char digit)
 Generate a block of R2 MF tones.
r2_mf_tx_state_tr2_mf_tx_init (r2_mf_tx_state_t *s, int fwd)
 Initialise an R2 MF tone generator context.
int r2_mf_tx_release (r2_mf_tx_state_t *s)
 Release an R2 MF tone generator context.
int r2_mf_tx_free (r2_mf_tx_state_t *s)
 Free an R2 MF tone generator context.
int bell_mf_rx (bell_mf_rx_state_t *s, const int16_t amp[], int samples)
 Process a block of received Bell MF audio samples.
size_t bell_mf_rx_get (bell_mf_rx_state_t *s, char *buf, int max)
 Get a string of digits from a Bell MF receiver's output buffer.
bell_mf_rx_state_tbell_mf_rx_init (bell_mf_rx_state_t *s, digits_rx_callback_t callback, void *user_data)
 Initialise a Bell MF receiver context.
int bell_mf_rx_release (bell_mf_rx_state_t *s)
 Release a Bell MF receiver context.
int bell_mf_rx_free (bell_mf_rx_state_t *s)
 Free a Bell MF receiver context.
int r2_mf_rx (r2_mf_rx_state_t *s, const int16_t amp[], int samples)
 Process a block of received R2 MF audio samples.
int r2_mf_rx_get (r2_mf_rx_state_t *s)
 Get the current digit from an R2 MF receiver.
r2_mf_rx_state_tr2_mf_rx_init (r2_mf_rx_state_t *s, int fwd, tone_report_func_t callback, void *user_data)
 Initialise an R2 MF receiver context.
int r2_mf_rx_release (r2_mf_rx_state_t *s)
 Release an R2 MF receiver context.
int r2_mf_rx_free (r2_mf_rx_state_t *s)
 Free an R2 MF receiver context.

Variables

int bell_mf_gen_inited = 0
tone_gen_descriptor_t bell_mf_digit_tones [15]
int r2_mf_gen_inited = 0
tone_gen_descriptor_t r2_mf_fwd_digit_tones [15]
tone_gen_descriptor_t r2_mf_back_digit_tones [15]

Function Documentation

◆ bell_mf_rx()

int bell_mf_rx ( bell_mf_rx_state_t * s,
const int16_t amp[],
int samples )

Process a block of received Bell MF audio samples.

Process a block of received Bell MF audio samples.

Parameters
sThe Bell MF receiver context.
ampThe audio sample buffer.
samplesThe number of samples in the buffer.
Returns
The number of samples unprocessed.

References bell_mf_rx_state_s::current_digits, bell_mf_rx_state_s::current_sample, bell_mf_rx_state_s::digits, bell_mf_rx_state_s::digits_callback, bell_mf_rx_state_s::digits_callback_data, bell_mf_rx_state_s::hits, bell_mf_rx_state_s::lost_digits, MAX_BELL_MF_DIGITS, and bell_mf_rx_state_s::out.

◆ bell_mf_rx_free()

int bell_mf_rx_free ( bell_mf_rx_state_t * s)

Free a Bell MF receiver context.

Parameters
sThe Bell MF receiver context.
Returns
0 for OK, else -1.

◆ bell_mf_rx_get()

size_t bell_mf_rx_get ( bell_mf_rx_state_t * s,
char * buf,
int max )

Get a string of digits from a Bell MF receiver's output buffer.

Parameters
sThe Bell MF receiver context.
bufThe buffer for the received digits.
maxThe maximum number of digits to be returned,
Returns
The number of digits actually returned.

References bell_mf_rx_state_s::current_digits, and bell_mf_rx_state_s::digits.

◆ bell_mf_rx_init()

bell_mf_rx_state_t * bell_mf_rx_init ( bell_mf_rx_state_t * s,
digits_rx_callback_t callback,
void * user_data )

Initialise a Bell MF receiver context.

Parameters
sThe Bell MF receiver context.
callbackAn optional callback routine, used to report received digits. If no callback routine is set, digits may be collected, using the bell_mf_rx_get() function.
user_dataAn opaque pointer which is associated with the context, and supplied in callbacks.
Returns
A pointer to the Bell MF receiver context.

References bell_mf_rx_state_s::current_digits, bell_mf_rx_state_s::current_sample, bell_mf_rx_state_s::digits, bell_mf_rx_state_s::digits_callback, bell_mf_rx_state_s::digits_callback_data, bell_mf_rx_state_s::hits, bell_mf_rx_state_s::lost_digits, and bell_mf_rx_state_s::out.

◆ bell_mf_rx_release()

int bell_mf_rx_release ( bell_mf_rx_state_t * s)

Release a Bell MF receiver context.

Parameters
sThe Bell MF receiver context.
Returns
0 for OK, else -1.

◆ bell_mf_tx()

int bell_mf_tx ( bell_mf_tx_state_t * s,
int16_t amp[],
int max_samples )

Generate a buffer of Bell MF tones.

Parameters
sThe Bell MF generator context.
ampThe buffer for the generated signal.
max_samplesThe required number of generated samples.
Returns
The number of samples actually generated. This may be less than max_samples if the input buffer empties.

References queue_read_byte(), and bell_mf_tx_state_s::tones.

◆ bell_mf_tx_free()

int bell_mf_tx_free ( bell_mf_tx_state_t * s)

Free a Bell MF generator context.

Parameters
sThe Bell MF generator context.
Returns
0 for OK, else -1.

◆ bell_mf_tx_init()

bell_mf_tx_state_t * bell_mf_tx_init ( bell_mf_tx_state_t * s)

Initialise a Bell MF generator context.

Parameters
sThe Bell MF generator context.
Returns
A pointer to the Bell MF generator context.

References MAX_BELL_MF_DIGITS, queue_init(), QUEUE_READ_ATOMIC, QUEUE_WRITE_ATOMIC, and bell_mf_tx_state_s::tones.

◆ bell_mf_tx_put()

int bell_mf_tx_put ( bell_mf_tx_state_t * s,
const char * digits,
int len )

Put a string of digits in a Bell MF generator's input buffer.

Parameters
sThe Bell MF generator context.
digitsThe string of digits to be added.
lenThe length of the string of digits. If negative, the string is assumed to be a NULL terminated string.
Returns
The number of digits actually added. This may be less than the length of the digit string, if the buffer fills up.

References queue_free_space(), and queue_write().

◆ bell_mf_tx_release()

int bell_mf_tx_release ( bell_mf_tx_state_t * s)

Release a Bell MF generator context.

Parameters
sThe Bell MF generator context.
Returns
0 for OK, else -1.

◆ r2_mf_rx()

int r2_mf_rx ( r2_mf_rx_state_t * s,
const int16_t amp[],
int samples )

Process a block of received R2 MF audio samples.

Process a block of received R2 MF audio samples.

Parameters
sThe R2 MF receiver context.
ampThe audio sample buffer.
samplesThe number of samples in the buffer.
Returns
The number of samples unprocessed.

References r2_mf_rx_state_s::callback, r2_mf_rx_state_s::callback_data, r2_mf_rx_state_s::current_digit, r2_mf_rx_state_s::current_sample, and r2_mf_rx_state_s::out.

◆ r2_mf_rx_free()

int r2_mf_rx_free ( r2_mf_rx_state_t * s)

Free an R2 MF receiver context.

Parameters
sThe R2 MF receiver context.
Returns
0 for OK, else -1.

◆ r2_mf_rx_get()

int r2_mf_rx_get ( r2_mf_rx_state_t * s)

Get the current digit from an R2 MF receiver.

Parameters
sThe R2 MF receiver context.
Returns
The number digits being received.

References r2_mf_rx_state_s::current_digit.

◆ r2_mf_rx_init()

r2_mf_rx_state_t * r2_mf_rx_init ( r2_mf_rx_state_t * s,
int fwd,
tone_report_func_t callback,
void * user_data )

Initialise an R2 MF receiver context.

Parameters
sThe R2 MF receiver context.
fwdTRUE if the context is for forward signals. FALSE if the context is for backward signals.
callbackAn optional callback routine, used to report received digits. If no callback routine is set, digits may be collected, using the r2_mf_rx_get() function.
user_dataAn opaque pointer which is associated with the context, and supplied in callbacks.
Returns
A pointer to the R2 MF receiver context.

References r2_mf_rx_state_s::callback, r2_mf_rx_state_s::callback_data, r2_mf_rx_state_s::current_digit, r2_mf_rx_state_s::current_sample, r2_mf_rx_state_s::fwd, and r2_mf_rx_state_s::out.

◆ r2_mf_rx_release()

int r2_mf_rx_release ( r2_mf_rx_state_t * s)

Release an R2 MF receiver context.

Parameters
sThe R2 MF receiver context.
Returns
0 for OK, else -1.

◆ r2_mf_tx()

int r2_mf_tx ( r2_mf_tx_state_t * s,
int16_t amp[],
int samples )

Generate a block of R2 MF tones.

Parameters
sThe R2 MF generator context.
ampThe buffer for the generated signal.
samplesThe required number of generated samples.
Returns
The number of samples actually generated.

References r2_mf_tx_state_s::digit, and r2_mf_tx_state_s::tone.

◆ r2_mf_tx_free()

int r2_mf_tx_free ( r2_mf_tx_state_t * s)

Free an R2 MF tone generator context.

Parameters
sThe R2 MF tone generator context.
Returns
0 for OK, else -1.

◆ r2_mf_tx_init()

r2_mf_tx_state_t * r2_mf_tx_init ( r2_mf_tx_state_t * s,
int fwd )

Initialise an R2 MF tone generator context.

Parameters
sThe R2 MF generator context.
fwdTRUE if the context is for forward signals. FALSE if the context is for backward signals.
Returns
A pointer to the MFC/R2 generator context.

References r2_mf_tx_state_s::fwd, and tone_gen_descriptor_init().

◆ r2_mf_tx_put()

int r2_mf_tx_put ( r2_mf_tx_state_t * s,
char digit )

Generate a block of R2 MF tones.

Parameters
sThe R2 MF generator context.
digitThe digit to be generated.
Returns
0 for OK, or -1 for a bad request.

References r2_mf_tx_state_s::digit, r2_mf_tx_state_s::fwd, and r2_mf_tx_state_s::tone.

◆ r2_mf_tx_release()

int r2_mf_tx_release ( r2_mf_tx_state_t * s)

Release an R2 MF tone generator context.

Parameters
sThe R2 MF tone generator context.
Returns
0 for OK, else -1.