2018-01-21 09:43:45 +00:00
|
|
|
#ifdef HAVE_ALSA
|
2017-11-17 11:16:39 +00:00
|
|
|
#include "../libsound/sound.h"
|
2018-01-21 09:43:45 +00:00
|
|
|
#endif
|
2017-01-04 13:21:49 +00:00
|
|
|
#ifdef HAVE_SDR
|
2017-11-17 21:51:18 +00:00
|
|
|
#include "../libsdr/sdr.h"
|
2017-01-04 13:21:49 +00:00
|
|
|
#endif
|
2017-11-15 17:56:39 +00:00
|
|
|
#include "../libwave/wave.h"
|
2017-11-13 18:34:05 +00:00
|
|
|
#include "../libsamplerate/samplerate.h"
|
2017-11-15 19:21:57 +00:00
|
|
|
#include "../libjitter/jitter.h"
|
2017-11-16 17:16:53 +00:00
|
|
|
#include "../libemphasis/emphasis.h"
|
2017-11-18 07:49:13 +00:00
|
|
|
#include "../libdisplay/display.h"
|
2016-03-01 17:40:38 +00:00
|
|
|
|
2016-04-25 18:20:54 +00:00
|
|
|
#define MAX_SENDER 16
|
|
|
|
|
2017-01-07 09:33:13 +00:00
|
|
|
/* how to send a 'paging' signal (trigger transmitter) */
|
|
|
|
enum paging_signal {
|
|
|
|
PAGING_SIGNAL_NONE = 0,
|
|
|
|
PAGING_SIGNAL_TONE,
|
|
|
|
PAGING_SIGNAL_NOTONE,
|
|
|
|
PAGING_SIGNAL_POSITIVE,
|
|
|
|
PAGING_SIGNAL_NEGATIVE,
|
2016-10-03 12:46:25 +00:00
|
|
|
};
|
|
|
|
|
2016-03-01 17:40:38 +00:00
|
|
|
/* common structure of each transmitter */
|
|
|
|
typedef struct sender {
|
|
|
|
struct sender *next;
|
2017-01-03 11:31:59 +00:00
|
|
|
struct sender *slave; /* points to 'slave' that uses next channel of audio device */
|
|
|
|
struct sender *master; /* if set, the audio device is owned by 'master' */
|
2016-03-01 17:40:38 +00:00
|
|
|
|
|
|
|
/* system info */
|
2019-07-20 16:11:17 +00:00
|
|
|
const char *kanal; /* channel number */
|
2017-01-04 13:14:02 +00:00
|
|
|
double sendefrequenz; /* transmitter frequency */
|
|
|
|
double empfangsfrequenz; /* receiver frequency */
|
2017-01-07 09:33:13 +00:00
|
|
|
double ruffrequenz; /* special paging frequency used for B-Netz */
|
2017-01-29 06:25:12 +00:00
|
|
|
|
2019-12-05 16:24:30 +00:00
|
|
|
/* FM/AM levels */
|
|
|
|
int am; /* use AM instead of FM */
|
|
|
|
double max_deviation; /* max frequency deviation / level */
|
2017-01-29 06:25:12 +00:00
|
|
|
double max_modulation; /* max frequency modulated */
|
2019-12-05 16:24:30 +00:00
|
|
|
double speech_deviation; /* deviation / level of 1000 Hz reference tone at speech level */
|
|
|
|
double modulation_index; /* AM modulation index */
|
2017-01-29 06:25:12 +00:00
|
|
|
double max_display; /* level of displaying wave form */
|
2016-03-01 17:40:38 +00:00
|
|
|
|
2017-01-04 13:14:02 +00:00
|
|
|
/* audio */
|
|
|
|
void *audio;
|
|
|
|
char audiodev[64]; /* audio device name (alsa or sdr) */
|
2019-12-05 16:24:30 +00:00
|
|
|
void *(*audio_open)(const char *, double *, double *, int *, int, double, int, int, double, double, double);
|
2017-02-25 06:09:53 +00:00
|
|
|
int (*audio_start)(void *);
|
2017-01-04 13:14:02 +00:00
|
|
|
void (*audio_close)(void *);
|
2017-08-19 10:27:05 +00:00
|
|
|
int (*audio_write)(void *, sample_t **, uint8_t **, int, enum paging_signal *, int *, int);
|
2017-10-09 18:49:14 +00:00
|
|
|
int (*audio_read)(void *, sample_t **, int, int, double *);
|
2017-03-04 05:35:38 +00:00
|
|
|
int (*audio_get_tosend)(void *, int);
|
2016-03-01 17:40:38 +00:00
|
|
|
int samplerate;
|
|
|
|
samplerate_t srstate; /* sample rate conversion state */
|
2016-05-06 05:00:27 +00:00
|
|
|
double rx_gain; /* factor of level to apply on rx samples */
|
2016-04-23 16:50:11 +00:00
|
|
|
int pre_emphasis; /* use pre_emhasis, done by sender */
|
|
|
|
int de_emphasis; /* use de_emhasis, done by sender */
|
|
|
|
emphasis_t estate; /* pre and de emphasis */
|
2016-03-01 17:40:38 +00:00
|
|
|
|
|
|
|
/* loopback test */
|
|
|
|
int loopback; /* 0 = off, 1 = internal, 2 = external */
|
|
|
|
|
2016-03-25 12:58:16 +00:00
|
|
|
/* record and playback */
|
2017-01-13 06:31:15 +00:00
|
|
|
const char *write_rx_wave; /* file name pointers */
|
|
|
|
const char *write_tx_wave;
|
|
|
|
const char *read_rx_wave;
|
2017-07-09 17:17:37 +00:00
|
|
|
const char *read_tx_wave;
|
2016-11-27 05:47:06 +00:00
|
|
|
wave_rec_t wave_rx_rec; /* wave recording (from rx) */
|
|
|
|
wave_rec_t wave_tx_rec; /* wave recording (from tx) */
|
|
|
|
wave_play_t wave_rx_play; /* wave playback (as rx) */
|
2017-07-09 17:17:37 +00:00
|
|
|
wave_play_t wave_tx_play; /* wave playback (as tx) */
|
2016-03-25 12:58:16 +00:00
|
|
|
|
2016-03-01 17:40:38 +00:00
|
|
|
/* audio buffer for audio to send to transmitter (also used as loopback buffer) */
|
2017-01-04 13:14:02 +00:00
|
|
|
jitter_t dejitter;
|
2016-03-01 17:40:38 +00:00
|
|
|
|
|
|
|
/* audio buffer for audio to send to caller (20ms = 160 samples @ 8000Hz) */
|
2017-01-27 15:57:34 +00:00
|
|
|
sample_t rxbuf[160];
|
2016-03-01 17:40:38 +00:00
|
|
|
int rxbuf_pos; /* current fill of buffer */
|
|
|
|
|
2017-01-07 09:33:13 +00:00
|
|
|
/* paging tone */
|
|
|
|
enum paging_signal paging_signal; /* if paging signal is used and how it is performed */
|
|
|
|
int paging_on; /* 1 or 0 for on or off */
|
2016-06-17 05:28:45 +00:00
|
|
|
|
|
|
|
/* display wave */
|
|
|
|
dispwav_t dispwav; /* display wave form */
|
2017-09-25 16:46:50 +00:00
|
|
|
|
|
|
|
/* display measurements */
|
|
|
|
dispmeas_t dispmeas; /* display measurements */
|
2016-03-01 17:40:38 +00:00
|
|
|
} sender_t;
|
|
|
|
|
|
|
|
extern sender_t *sender_head;
|
2016-02-16 17:56:55 +00:00
|
|
|
extern int cant_recover;
|
2020-06-28 15:53:23 +00:00
|
|
|
extern int check_channel;
|
2016-03-01 17:40:38 +00:00
|
|
|
|
2019-07-20 16:11:17 +00:00
|
|
|
int sender_create(sender_t *sender, const char *kanal, double sendefrequenz, double empfangsfrequenz, const char *audiodev, int use_sdr, int samplerate, double rx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback, enum paging_signal paging_signal);
|
2016-03-01 17:40:38 +00:00
|
|
|
void sender_destroy(sender_t *sender);
|
2019-12-05 07:33:08 +00:00
|
|
|
void sender_set_fm(sender_t *sender, double max_deviation, double max_modulation, double speech_deviation, double max_display);
|
2019-12-05 16:24:30 +00:00
|
|
|
void sender_set_am(sender_t *sender, double max_modulation, double speech_deviation, double max_display, double modulation_index);
|
2017-08-30 15:42:49 +00:00
|
|
|
int sender_open_audio(int latspl);
|
2017-02-25 06:09:53 +00:00
|
|
|
int sender_start_audio(void);
|
2016-06-17 05:28:45 +00:00
|
|
|
void process_sender_audio(sender_t *sender, int *quit, int latspl);
|
2017-08-19 10:27:05 +00:00
|
|
|
void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int count);
|
2017-10-09 18:49:14 +00:00
|
|
|
void sender_receive(sender_t *sender, sample_t *samples, int count, double rf_level_db);
|
2017-01-07 09:33:13 +00:00
|
|
|
void sender_paging(sender_t *sender, int on);
|
2017-09-25 16:46:50 +00:00
|
|
|
sender_t *get_sender_by_empfangsfrequenz(double freq);
|
2016-03-01 17:40:38 +00:00
|
|
|
|