Use function to get samples to be sent to fill audio buffers to a level. This replaces the function that only shows how much data is in the buffer. This way the function itself can control how much data will be sent.
101 lines
3.7 KiB
C
101 lines
3.7 KiB
C
#include "sound.h"
|
|
#ifdef HAVE_SDR
|
|
#include "sdr.h"
|
|
#endif
|
|
#include "wave.h"
|
|
#include "samplerate.h"
|
|
#include "jitter.h"
|
|
#include "loss.h"
|
|
#include "emphasis.h"
|
|
#include "display.h"
|
|
|
|
#define MAX_SENDER 16
|
|
|
|
/* 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,
|
|
};
|
|
|
|
/* common structure of each transmitter */
|
|
typedef struct sender {
|
|
struct sender *next;
|
|
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' */
|
|
|
|
/* system info */
|
|
int kanal; /* channel number */
|
|
double sendefrequenz; /* transmitter frequency */
|
|
double empfangsfrequenz; /* receiver frequency */
|
|
double ruffrequenz; /* special paging frequency used for B-Netz */
|
|
|
|
/* fm levels */
|
|
double max_deviation; /* max frequency deviation */
|
|
double max_modulation; /* max frequency modulated */
|
|
double dBm0_deviation; /* deviation of 1000 Hz reference tone at dBm0 */
|
|
double max_display; /* level of displaying wave form */
|
|
|
|
/* audio */
|
|
void *audio;
|
|
char audiodev[64]; /* audio device name (alsa or sdr) */
|
|
void *(*audio_open)(const char *, double *, double *, int, double, int, double, double);
|
|
int (*audio_start)(void *);
|
|
void (*audio_close)(void *);
|
|
int (*audio_write)(void *, sample_t **, int, enum paging_signal *, int *, int);
|
|
int (*audio_read)(void *, sample_t **, int, int);
|
|
int (*audio_get_tosend)(void *, int);
|
|
int samplerate;
|
|
samplerate_t srstate; /* sample rate conversion state */
|
|
double rx_gain; /* factor of level to apply on rx samples */
|
|
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 */
|
|
|
|
/* loopback test */
|
|
int loopback; /* 0 = off, 1 = internal, 2 = external */
|
|
|
|
/* record and playback */
|
|
const char *write_rx_wave; /* file name pointers */
|
|
const char *write_tx_wave;
|
|
const char *read_rx_wave;
|
|
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) */
|
|
|
|
/* audio buffer for audio to send to transmitter (also used as loopback buffer) */
|
|
jitter_t dejitter;
|
|
|
|
/* audio buffer for audio to send to caller (20ms = 160 samples @ 8000Hz) */
|
|
sample_t rxbuf[160];
|
|
int rxbuf_pos; /* current fill of buffer */
|
|
|
|
/* loss of carrier detection */
|
|
double loss_volume;
|
|
loss_t loss;
|
|
|
|
/* 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 */
|
|
|
|
/* display wave */
|
|
dispwav_t dispwav; /* display wave form */
|
|
} sender_t;
|
|
|
|
/* list of all senders */
|
|
extern sender_t *sender_head;
|
|
extern int cant_recover;
|
|
|
|
int sender_create(sender_t *sender, int kanal, double sendefrequenz, double empfangsfrequenz, const char *audiodev, 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, int loopback, double loss_volume, enum paging_signal paging_signal);
|
|
void sender_destroy(sender_t *sender);
|
|
void sender_set_fm(sender_t *sender, double max_deviation, double max_modulation, double dBm0_deviation, double max_display);
|
|
int sender_open_audio(void);
|
|
int sender_start_audio(void);
|
|
void process_sender_audio(sender_t *sender, int *quit, int latspl);
|
|
void sender_send(sender_t *sender, sample_t *samples, int count);
|
|
void sender_receive(sender_t *sender, sample_t *samples, int count);
|
|
void sender_paging(sender_t *sender, int on);
|
|
|