From 4d10ee7c82315f9933ad01433e9502d2f36b4621 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Sun, 14 May 2017 12:27:56 +0200 Subject: No "sdr" audio device option required anymore (when using SDR) --- src/amps/amps.c | 4 ++-- src/amps/amps.h | 2 +- src/amps/main.c | 23 ++++++++++++++++++----- src/anetz/anetz.c | 4 ++-- src/anetz/anetz.h | 2 +- src/anetz/main.c | 10 ++++++++-- src/bnetz/bnetz.c | 4 ++-- src/bnetz/bnetz.h | 2 +- src/bnetz/main.c | 12 +++++++++--- src/cnetz/cnetz.c | 4 ++-- src/cnetz/cnetz.h | 2 +- src/cnetz/main.c | 23 ++++++++++++++++++----- src/common/main.h | 1 + src/common/main_common.c | 37 ++++++++++++++++++++----------------- src/common/sender.c | 10 +++++----- src/common/sender.h | 2 +- src/nmt/main.c | 26 +++++++++++++++++++++----- src/nmt/nmt.c | 4 ++-- src/nmt/nmt.h | 2 +- 19 files changed, 116 insertions(+), 58 deletions(-) diff --git a/src/amps/amps.c b/src/amps/amps.c index fadedbc..c0f2709 100644 --- a/src/amps/amps.c +++ b/src/amps/amps.c @@ -377,7 +377,7 @@ static amps_t *search_pc(void) static void amps_go_idle(amps_t *amps); /* Create transceiver instance and link to a list. */ -int amps_create(int channel, enum amps_chan_type chan_type, 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, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int tolerant, int loopback) +int amps_create(int channel, enum amps_chan_type chan_type, 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, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int tolerant, int loopback) { sender_t *sender; amps_t *amps; @@ -443,7 +443,7 @@ int amps_create(int channel, enum amps_chan_type chan_type, const char *audiodev PDEBUG(DAMPS, DEBUG_DEBUG, "Creating 'AMPS' instance for channel = %d (sample rate %d).\n", channel, samplerate); /* init general part of transceiver */ - rc = sender_create(&s->sender, channel, amps_channel2freq(channel, 0), amps_channel2freq(channel, 1), audiodev, samplerate, rx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, loopback, 0, PAGING_SIGNAL_NONE); + rc = sender_create(&s->sender, channel, amps_channel2freq(channel, 0), amps_channel2freq(channel, 1), audiodev, use_sdr, samplerate, rx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, loopback, 0, PAGING_SIGNAL_NONE); if (rc < 0) { PDEBUG(DAMPS, DEBUG_ERROR, "Failed to init transceiver process!\n"); goto error; diff --git a/src/amps/amps.h b/src/amps/amps.h index 279f571..706982d 100644 --- a/src/amps/amps.h +++ b/src/amps/amps.h @@ -164,7 +164,7 @@ const char *amps_min12number(uint32_t min1); void amps_number2min(const char *number, uint32_t *min1, uint16_t *min2); const char *amps_min2number(uint32_t min1, uint16_t min2); const char *amps_scm(uint8_t scm); -int amps_create(int channel, enum amps_chan_type chan_type, 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, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int tolerant, int loopback); +int amps_create(int channel, enum amps_chan_type chan_type, 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, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int tolerant, int loopback); void amps_destroy(sender_t *sender); void amps_rx_signaling_tone(amps_t *amps, int tone, double quality); void amps_rx_sat(amps_t *amps, int tone, double quality); diff --git a/src/amps/main.c b/src/amps/main.c index 7f83602..9ab4051 100644 --- a/src/amps/main.c +++ b/src/amps/main.c @@ -260,14 +260,27 @@ int main(int argc, char *argv[]) print_help(argv[-skip_args]); return 0; } + if (use_sdr) { + /* set audiodev */ + for (i = 0; i < num_kanal; i++) + audiodev[i] = "sdr"; + num_audiodev = num_kanal; + /* set channel types for more than 1 channel */ + if (num_kanal > 1 && num_chan_type == 0) { + chan_type[0] = CHAN_TYPE_CC_PC; + for (i = 1; i < num_kanal; i++) + chan_type[i] = CHAN_TYPE_VC; + num_chan_type = num_kanal; + } + } if (num_kanal == 1 && num_audiodev == 0) - num_audiodev = 1; /* use defualt */ + num_audiodev = 1; /* use default */ if (num_kanal != num_audiodev) { fprintf(stderr, "You need to specify as many sound devices as you have channels.\n"); exit(0); } if (num_kanal == 1 && num_chan_type == 0) - num_chan_type = 1; /* use defualt */ + num_chan_type = 1; /* use default */ if (num_kanal != num_chan_type) { fprintf(stderr, "You need to specify as many channel types as you have channels.\n"); exit(0); @@ -315,7 +328,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "You did not define any VC (voice) channel. You will not be able to make any call.\n"); /* SDR always requires emphasis */ - if (!strcmp(audiodev[0], "sdr")) { + if (use_sdr) { do_pre_emphasis = 1; do_de_emphasis = 1; } @@ -333,7 +346,7 @@ int main(int argc, char *argv[]) polarity = 1; /* positive */ else if (!strcmp(flip_polarity, "yes")) polarity = -1; /* negative */ - else if (!strcmp(audiodev[0], "sdr")) + else if (use_sdr) polarity = 1; /* SDR is always positive */ else { fprintf(stderr, "You must define, if the the TX deviation polarity has to be flipped. (-F yes | no) See help.\n"); @@ -345,7 +358,7 @@ int main(int argc, char *argv[]) amps_si si; init_sysinfo(&si, ms_power, ms_power, dcc, sid >> 1, regh, regr, pureg, pdreg, locaid, regincr, bis); - rc = amps_create(kanal[i], chan_type[i], audiodev[i], samplerate, rx_gain, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, &si, sid, scc, polarity, tolerant, loopback); + rc = amps_create(kanal[i], chan_type[i], audiodev[i], use_sdr, samplerate, rx_gain, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, &si, sid, scc, polarity, tolerant, loopback); if (rc < 0) { fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n"); goto fail; diff --git a/src/anetz/anetz.c b/src/anetz/anetz.c index 094a75f..1362172 100644 --- a/src/anetz/anetz.c +++ b/src/anetz/anetz.c @@ -169,7 +169,7 @@ static void anetz_timeout(struct timer *timer); static void anetz_go_idle(anetz_t *anetz); /* Create transceiver instance and link to a list. */ -int anetz_create(int kanal, const char *audiodev, int samplerate, double rx_gain, double page_gain, int page_sequence, 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) +int anetz_create(int kanal, const char *audiodev, int use_sdr, int samplerate, double rx_gain, double page_gain, int page_sequence, 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) { anetz_t *anetz; int rc; @@ -188,7 +188,7 @@ int anetz_create(int kanal, const char *audiodev, int samplerate, double rx_gain PDEBUG(DANETZ, DEBUG_DEBUG, "Creating 'A-Netz' instance for 'Kanal' = %d (sample rate %d).\n", kanal, samplerate); /* init general part of transceiver */ - rc = sender_create(&anetz->sender, kanal, anetz_kanal2freq(kanal, 0), anetz_kanal2freq(kanal, 1), audiodev, samplerate, rx_gain, pre_emphasis, de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, loss_volume, PAGING_SIGNAL_NONE); + rc = sender_create(&anetz->sender, kanal, anetz_kanal2freq(kanal, 0), anetz_kanal2freq(kanal, 1), audiodev, use_sdr, samplerate, rx_gain, pre_emphasis, de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, loss_volume, PAGING_SIGNAL_NONE); if (rc < 0) { PDEBUG(DANETZ, DEBUG_ERROR, "Failed to init 'Sender' processing!\n"); goto error; diff --git a/src/anetz/anetz.h b/src/anetz/anetz.h index aee43ef..1aeda28 100644 --- a/src/anetz/anetz.h +++ b/src/anetz/anetz.h @@ -47,7 +47,7 @@ typedef struct anetz { double anetz_kanal2freq(int kanal, int unterband); int anetz_init(void); -int anetz_create(int kanal, const char *audiodev, int samplerate, double rx_gain, double page_gain, int page_sequence, 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); +int anetz_create(int kanal, const char *audiodev, int use_sdr, int samplerate, double rx_gain, double page_gain, int page_sequence, 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); void anetz_destroy(sender_t *sender); void anetz_loss_indication(anetz_t *anetz); void anetz_receive_tone(anetz_t *anetz, int bit); diff --git a/src/anetz/main.c b/src/anetz/main.c index 4ed63a5..80f4ffe 100644 --- a/src/anetz/main.c +++ b/src/anetz/main.c @@ -156,8 +156,14 @@ int main(int argc, char *argv[]) print_help(argv[-skip_args]); return 0; } + if (use_sdr) { + /* set audiodev */ + for (i = 0; i < num_kanal; i++) + audiodev[i] = "sdr"; + num_audiodev = num_kanal; + } if (num_kanal == 1 && num_audiodev == 0) - num_audiodev = 1; /* use defualt */ + num_audiodev = 1; /* use default */ if (num_kanal != num_audiodev) { fprintf(stderr, "You need to specify as many sound devices as you have channels.\n"); exit(0); @@ -171,7 +177,7 @@ int main(int argc, char *argv[]) /* create transceiver instance */ for (i = 0; i < num_kanal; i++) { - rc = anetz_create(kanal[i], audiodev[i], samplerate, rx_gain, page_gain, page_sequence, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, lossdetect / 100.0); + rc = anetz_create(kanal[i], audiodev[i], use_sdr, samplerate, rx_gain, page_gain, page_sequence, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, lossdetect / 100.0); if (rc < 0) { fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n"); goto fail; diff --git a/src/bnetz/bnetz.c b/src/bnetz/bnetz.c index 4930f4e..94e704e 100644 --- a/src/bnetz/bnetz.c +++ b/src/bnetz/bnetz.c @@ -142,7 +142,7 @@ static void bnetz_timeout(struct timer *timer); static void bnetz_go_idle(bnetz_t *bnetz); /* Create transceiver instance and link to a list. */ -int bnetz_create(int kanal, const char *audiodev, int samplerate, double rx_gain, int gfs, 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_factor, const char *paging) +int bnetz_create(int kanal, const char *audiodev, int use_sdr, int samplerate, double rx_gain, int gfs, 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_factor, const char *paging) { bnetz_t *bnetz; enum paging_signal paging_signal = PAGING_SIGNAL_NONE; @@ -203,7 +203,7 @@ error_paging: PDEBUG(DBNETZ, DEBUG_DEBUG, "Creating 'B-Netz' instance for 'Kanal' = %d 'Gruppenfreisignal' = %d (sample rate %d).\n", kanal, gfs, samplerate); /* init general part of transceiver */ - rc = sender_create(&bnetz->sender, kanal, bnetz_kanal2freq(kanal, 0), bnetz_kanal2freq(kanal, 1), audiodev, samplerate, rx_gain, pre_emphasis, de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, loss_factor, paging_signal); + rc = sender_create(&bnetz->sender, kanal, bnetz_kanal2freq(kanal, 0), bnetz_kanal2freq(kanal, 1), audiodev, use_sdr, samplerate, rx_gain, pre_emphasis, de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, loss_factor, paging_signal); if (rc < 0) { PDEBUG(DBNETZ, DEBUG_ERROR, "Failed to init transceiver process!\n"); goto error; diff --git a/src/bnetz/bnetz.h b/src/bnetz/bnetz.h index 176abfd..c9ff769 100644 --- a/src/bnetz/bnetz.h +++ b/src/bnetz/bnetz.h @@ -101,7 +101,7 @@ typedef struct bnetz { double bnetz_kanal2freq(int kanal, int unterband); int bnetz_init(void); -int bnetz_create(int kanal, const char *audiodev, int samplerate, double rx_gain, int gfs, 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_factor, const char *paging); +int bnetz_create(int kanal, const char *audiodev, int use_sdr, int samplerate, double rx_gain, int gfs, 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_factor, const char *paging); void bnetz_destroy(sender_t *sender); void bnetz_loss_indication(bnetz_t *bnetz); void bnetz_receive_tone(bnetz_t *bnetz, int bit); diff --git a/src/bnetz/main.c b/src/bnetz/main.c index c976dbe..6f93414 100644 --- a/src/bnetz/main.c +++ b/src/bnetz/main.c @@ -153,8 +153,14 @@ int main(int argc, char *argv[]) print_help(argv[-skip_args]); return 0; } + if (use_sdr) { + /* set audiodev */ + for (i = 0; i < num_kanal; i++) + audiodev[i] = "sdr"; + num_audiodev = num_kanal; + } if (num_kanal == 1 && num_audiodev == 0) - num_audiodev = 1; /* use defualt */ + num_audiodev = 1; /* use default */ if (num_kanal != num_audiodev) { fprintf(stderr, "You need to specify as many sound devices as you have channels.\n"); exit(0); @@ -168,14 +174,14 @@ int main(int argc, char *argv[]) bnetz_init(); /* SDR always requires emphasis */ - if (!strcmp(audiodev[0], "sdr")) { + if (use_sdr) { do_pre_emphasis = 1; do_de_emphasis = 1; } /* create transceiver instance */ for (i = 0; i < num_kanal; i++) { - rc = bnetz_create(kanal[i], audiodev[i], samplerate, rx_gain, gfs, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, (double)lossdetect / 100.0, paging); + rc = bnetz_create(kanal[i], audiodev[i], use_sdr, samplerate, rx_gain, gfs, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, (double)lossdetect / 100.0, paging); if (rc < 0) { fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n"); goto fail; diff --git a/src/cnetz/cnetz.c b/src/cnetz/cnetz.c index c17fde7..3da4466 100644 --- a/src/cnetz/cnetz.c +++ b/src/cnetz/cnetz.c @@ -216,7 +216,7 @@ int cnetz_init(void) static void cnetz_go_idle(cnetz_t *cnetz); /* Create transceiver instance and link to a list. */ -int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *audiodev, int samplerate, double rx_gain, int auth, int ms_power, int measure_speed, double clock_speed[2], int polarity, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, int loopback) +int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *audiodev, int use_sdr, int samplerate, double rx_gain, int auth, int ms_power, int measure_speed, double clock_speed[2], int polarity, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, int loopback) { sender_t *sender; cnetz_t *cnetz; @@ -275,7 +275,7 @@ int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *audiodev /* init general part of transceiver */ /* do not enable emphasis, since it is done by cnetz code, not by common sender code */ - rc = sender_create(&cnetz->sender, kanal, cnetz_kanal2freq(kanal, 0), cnetz_kanal2freq(kanal, 1), audiodev, samplerate, rx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, loopback, 0, PAGING_SIGNAL_NONE); + rc = sender_create(&cnetz->sender, kanal, cnetz_kanal2freq(kanal, 0), cnetz_kanal2freq(kanal, 1), audiodev, use_sdr, samplerate, rx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, loopback, 0, PAGING_SIGNAL_NONE); if (rc < 0) { PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to init transceiver process!\n"); goto error; diff --git a/src/cnetz/cnetz.h b/src/cnetz/cnetz.h index 2eb51a6..73e837b 100644 --- a/src/cnetz/cnetz.h +++ b/src/cnetz/cnetz.h @@ -127,7 +127,7 @@ int cnetz_channel_by_short_name(const char *short_name); const char *chan_type_short_name(enum cnetz_chan_type chan_type); const char *chan_type_long_name(enum cnetz_chan_type chan_type); int cnetz_init(void); -int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *audiodev, int samplerate, double rx_gain, int auth, int ms_power, int measure_speed, double clock_speed[2], int polarity, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, int loopback); +int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *audiodev, int use_sdr, int samplerate, double rx_gain, int auth, int ms_power, int measure_speed, double clock_speed[2], int polarity, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, int loopback); void cnetz_destroy(sender_t *sender); void cnetz_sync_frame(cnetz_t *cnetz, double sync, int ts); int cnetz_meldeaufruf(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest); diff --git a/src/cnetz/main.c b/src/cnetz/main.c index 1efa9b0..0d4ee87 100644 --- a/src/cnetz/main.c +++ b/src/cnetz/main.c @@ -201,14 +201,27 @@ int main(int argc, char *argv[]) printf("No channel (\"Kanal\") is specified, I suggest channel %d.\n\n", CNETZ_OGK_KANAL); mandatory = 1; } + if (use_sdr) { + /* set audiodev */ + for (i = 0; i < num_kanal; i++) + audiodev[i] = "sdr"; + num_audiodev = num_kanal; + /* set channel types for more than 1 channel */ + if (num_kanal > 1 && num_chan_type == 0) { + chan_type[0] = CHAN_TYPE_OGK; + for (i = 1; i < num_kanal; i++) + chan_type[i] = CHAN_TYPE_SPK; + num_chan_type = num_kanal; + } + } if (num_kanal == 1 && num_audiodev == 0) - num_audiodev = 1; /* use defualt */ + num_audiodev = 1; /* use default */ if (num_kanal != num_audiodev) { fprintf(stderr, "You need to specify as many sound devices as you have channels.\n"); exit(0); } if (num_kanal == 1 && num_chan_type == 0) - num_chan_type = 1; /* use defualt */ + num_chan_type = 1; /* use default */ if (num_kanal != num_chan_type) { fprintf(stderr, "You need to specify as many channel types as you have channels.\n"); exit(0); @@ -264,7 +277,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "You did not define any SpK (speech) channel. You will not be able to make any call.\n"); /* SDR always requires emphasis */ - if (!strcmp(audiodev[0], "sdr")) { + if (use_sdr) { do_pre_emphasis = 1; do_de_emphasis = 1; } @@ -283,12 +296,12 @@ int main(int argc, char *argv[]) polarity = 1; /* positive */ if (!strcmp(flip_polarity, "yes")) polarity = -1; /* negative */ - if (!strcmp(audiodev[0], "sdr") && polarity == 0) + if (use_sdr && polarity == 0) polarity = 1; /* SDR is always positive */ /* create transceiver instance */ for (i = 0; i < num_kanal; i++) { - rc = cnetz_create(kanal[i], chan_type[i], audiodev[i], samplerate, rx_gain, auth, ms_power, (i == 0) ? measure_speed : 0, clock_speed, polarity, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback); + rc = cnetz_create(kanal[i], chan_type[i], audiodev[i], use_sdr, samplerate, rx_gain, auth, ms_power, (i == 0) ? measure_speed : 0, clock_speed, polarity, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback); if (rc < 0) { fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n"); goto fail; diff --git a/src/common/main.h b/src/common/main.h index aa34cae..6f3f63d 100644 --- a/src/common/main.h +++ b/src/common/main.h @@ -3,6 +3,7 @@ extern int num_kanal; extern int kanal[]; extern int num_audiodev; extern const char *audiodev[]; +extern int use_sdr; extern const char *call_audiodev; extern int samplerate; extern int interval; diff --git a/src/common/main_common.c b/src/common/main_common.c index ae52456..4eaeaad 100644 --- a/src/common/main_common.c +++ b/src/common/main_common.c @@ -61,10 +61,13 @@ int rt_prio = 0; const char *write_rx_wave = NULL; const char *write_tx_wave = NULL; const char *read_rx_wave = NULL; +int use_sdr = 0; static const char *sdr_args = ""; static double sdr_bandwidth = 0.0; +#ifdef HAVE_SDR static int sdr_uhd = 0; static int sdr_soapy = 0; +#endif double sdr_rx_gain = 0, sdr_tx_gain = 0; const char *write_iq_rx_wave = NULL; const char *write_iq_tx_wave = NULL; @@ -85,9 +88,9 @@ void print_help_common(const char *arg0, const char *ext_usage) printf(" -k --kanal \n"); printf(" -k --channel \n"); printf(" Channel (German = Kanal) number of \"Sender\" (German = Transceiver)\n"); - printf(" -a --audio-device hw:, | sdr\n"); + printf(" -a --audio-device hw:,\n"); printf(" Sound card and device number (default = '%s')\n", audiodev[0]); - printf(" SDR device, if supported\n"); + printf(" Don't set it for SDR!\n"); printf(" -s --samplerate \n"); printf(" Sample rate of sound device (default = '%d')\n", samplerate); printf(" -i --interval 1..25\n"); @@ -358,11 +361,23 @@ void opt_switch_common(int c, char *arg0, int *skip_args) *skip_args += 2; break; case OPT_SDR_UHD: +#ifdef HAVE_SDR + use_sdr = 1; sdr_uhd = 1; +#else + fprintf(stderr, "UHD SDR support not compiled in!\n"); + exit(0); +#endif *skip_args += 1; break; case OPT_SDR_SOAPY: +#ifdef HAVE_SDR + use_sdr = 1; sdr_soapy = 1; +#else + fprintf(stderr, "SoapySDR support not compiled in!\n"); + exit(0); +#endif *skip_args += 1; break; case OPT_SDR_ARGS: @@ -461,24 +476,12 @@ void main_common(int *quit, int latency, int interval, void (*myhandler)(void), return; } -#ifdef HAVE_UHD - #ifdef HAVE_SOAPY - if ((sdr_uhd == 1 && sdr_soapy == 1) || (sdr_uhd == 0 && sdr_soapy == 0)) { - fprintf(stderr, "UHD and SoapySDR drivers are compiled in. You must choose which one you want: --sdr-uhd or --sdr-soapy\n"); +#ifdef HAVE_SDR + if ((sdr_uhd == 1 && sdr_soapy == 1)) { + fprintf(stderr, "You must choose which one you want: --sdr-uhd or --sdr-soapy\n"); return; } - #else - sdr_uhd = 1; - sdr_soapy = 0; - #endif -#else - #ifdef HAVE_SOAPY - sdr_uhd = 0; - sdr_soapy = 1; - #endif -#endif -#ifdef HAVE_SDR if (sdr_bandwidth == 0.0) sdr_bandwidth = samplerate; rc = sdr_init(sdr_uhd, sdr_soapy, sdr_args, sdr_rx_gain, sdr_tx_gain, sdr_bandwidth, write_iq_rx_wave, write_iq_tx_wave, read_iq_rx_wave, read_iq_tx_wave); diff --git a/src/common/sender.c b/src/common/sender.c index 8137cef..6d69e63 100644 --- a/src/common/sender.c +++ b/src/common/sender.c @@ -33,7 +33,7 @@ static sender_t **sender_tailp = &sender_head; int cant_recover = 0; /* Init transceiver instance and link to list of transceivers. */ -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) +int sender_create(sender_t *sender, int 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, int loopback, double loss_volume, enum paging_signal paging_signal) { sender_t *master, *slave; int rc = 0; @@ -54,7 +54,7 @@ int sender_create(sender_t *sender, int kanal, double sendefrequenz, double empf sender->read_rx_wave = read_rx_wave; /* no gain with SDR */ - if (!strcmp(audiodev, "sdr")) + if (use_sdr) sender->rx_gain = 1.0; PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Creating 'Sender' instance\n"); @@ -74,12 +74,12 @@ int sender_create(sender_t *sender, int kanal, double sendefrequenz, double empf break; } if (master) { - if (master->paging_signal != PAGING_SIGNAL_NONE && !!strcmp(master->audiodev, "sdr")) { + if (master->paging_signal != PAGING_SIGNAL_NONE && !use_sdr) { PDEBUG(DSENDER, DEBUG_ERROR, "Cannot share audio device with channel %d, because its second audio channel is used for paging signal! Use different audio device.\n", master->kanal); rc = -EBUSY; goto error; } - if (paging_signal != PAGING_SIGNAL_NONE && !!strcmp(audiodev, "sdr")) { + if (paging_signal != PAGING_SIGNAL_NONE && !use_sdr) { PDEBUG(DSENDER, DEBUG_ERROR, "Cannot share audio device with channel %d, because we need a second audio channel for paging signal! Use different audio device.\n", master->kanal); rc = -EBUSY; goto error; @@ -95,7 +95,7 @@ int sender_create(sender_t *sender, int kanal, double sendefrequenz, double empf } else { /* link audio device */ #ifdef HAVE_SDR - if (!strcmp(audiodev, "sdr")) { + if (use_sdr) { sender->audio_open = sdr_open; sender->audio_start = sdr_start; sender->audio_close = sdr_close; diff --git a/src/common/sender.h b/src/common/sender.h index b371591..0907daf 100644 --- a/src/common/sender.h +++ b/src/common/sender.h @@ -88,7 +88,7 @@ typedef struct sender { 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); +int sender_create(sender_t *sender, int 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, 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); diff --git a/src/nmt/main.c b/src/nmt/main.c index 89e07c4..0c3df64 100644 --- a/src/nmt/main.c +++ b/src/nmt/main.c @@ -285,14 +285,30 @@ int main(int argc, char *argv[]) printf("No channel (\"Kanal\") is specified, I suggest channel 1 (-k 1).\n\n"); mandatory = 1; } + if (use_sdr) { + /* set audiodev */ + for (i = 0; i < num_kanal; i++) + audiodev[i] = "sdr"; + num_audiodev = num_kanal; + /* set chan_type */ + if (num_chan_type == 0) { + for (i = 0; i < num_kanal; i++) + chan_type[i] = CHAN_TYPE_CC_TC; + num_chan_type = num_kanal; + } + /* set supervisory signal */ + for (i = 0; i < num_kanal; i++) + supervisory[i] = 0; + num_supervisory = num_kanal; + } if (num_kanal == 1 && num_audiodev == 0) - num_audiodev = 1; /* use defualt */ + num_audiodev = 1; /* use default */ if (num_kanal != num_audiodev) { fprintf(stderr, "You need to specify as many sound devices as you have channels.\n"); exit(0); } if (num_kanal == 1 && num_chan_type == 0) - num_chan_type = 1; /* use defualt */ + num_chan_type = 1; /* use default */ if (num_kanal != num_chan_type) { fprintf(stderr, "You need to specify as many channel types as you have channels.\n"); exit(0); @@ -321,7 +337,7 @@ int main(int argc, char *argv[]) } if (!traffic_area[0]) { - printf("No traffic area is specified, I suggest to use Sweden (-y SE,1) and set the phone's roaming to 'SE' also.\n\n"); + printf("No traffic area is specified, I suggest to use Sweden (-Y SE,1) and set the phone's roaming to 'SE' also.\n\n"); mandatory = 1; } @@ -356,14 +372,14 @@ int main(int argc, char *argv[]) dsp_init(); /* SDR always requires emphasis */ - if (!strcmp(audiodev[0], "sdr")) { + if (use_sdr) { do_pre_emphasis = 1; do_de_emphasis = 1; } /* create transceiver instance */ for (i = 0; i < num_kanal; i++) { - rc = nmt_create(kanal[i], (loopback) ? CHAN_TYPE_TEST : chan_type[i], audiodev[i], samplerate, rx_gain, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, ms_power, nmt_digits2value(traffic_area, 2), area_no, compandor, supervisory[i], smsc_number, send_callerid, loopback); + rc = nmt_create(kanal[i], (loopback) ? CHAN_TYPE_TEST : chan_type[i], audiodev[i], use_sdr, samplerate, rx_gain, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, ms_power, nmt_digits2value(traffic_area, 2), area_no, compandor, supervisory[i], smsc_number, send_callerid, loopback); if (rc < 0) { fprintf(stderr, "Failed to create transceiver instance. Quitting!\n"); goto fail; diff --git a/src/nmt/nmt.c b/src/nmt/nmt.c index 71160b9..b7a5f74 100644 --- a/src/nmt/nmt.c +++ b/src/nmt/nmt.c @@ -300,7 +300,7 @@ uint8_t nmt_country_by_short_name(const char *short_name) static void nmt_timeout(struct timer *timer); /* Create transceiver instance and link to a list. */ -int nmt_create(int channel, enum nmt_chan_type chan_type, 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, uint8_t ms_power, uint8_t traffic_area, uint8_t area_no, int compandor, int supervisory, const char *smsc_number, int send_callerid, int loopback) +int nmt_create(int channel, enum nmt_chan_type chan_type, 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, uint8_t ms_power, uint8_t traffic_area, uint8_t area_no, int compandor, int supervisory, const char *smsc_number, int send_callerid, int loopback) { nmt_t *nmt; int rc; @@ -331,7 +331,7 @@ int nmt_create(int channel, enum nmt_chan_type chan_type, const char *audiodev, PDEBUG(DNMT, DEBUG_DEBUG, "Creating 'NMT' instance for channel = %d (sample rate %d).\n", channel, samplerate); /* init general part of transceiver */ - rc = sender_create(&nmt->sender, channel, nmt_channel2freq(channel, 0), nmt_channel2freq(channel, 1), audiodev, samplerate, rx_gain, pre_emphasis, de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, 0, PAGING_SIGNAL_NONE); + rc = sender_create(&nmt->sender, channel, nmt_channel2freq(channel, 0), nmt_channel2freq(channel, 1), audiodev, use_sdr, samplerate, rx_gain, pre_emphasis, de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, loopback, 0, PAGING_SIGNAL_NONE); if (rc < 0) { PDEBUG(DNMT, DEBUG_ERROR, "Failed to init transceiver process!\n"); goto error; diff --git a/src/nmt/nmt.h b/src/nmt/nmt.h index 404eadf..84a7fd2 100644 --- a/src/nmt/nmt.h +++ b/src/nmt/nmt.h @@ -144,7 +144,7 @@ const char *chan_type_long_name(enum nmt_chan_type chan_type); double nmt_channel2freq(int channel, int uplink); void nmt_country_list(void); uint8_t nmt_country_by_short_name(const char *short_name); -int nmt_create(int channel, enum nmt_chan_type chan_type, 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, uint8_t ms_power, uint8_t traffic_area, uint8_t area_no, int compandor, int supervisory, const char *smsc_number, int send_callerid, int loopback); +int nmt_create(int channel, enum nmt_chan_type chan_type, 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, uint8_t ms_power, uint8_t traffic_area, uint8_t area_no, int compandor, int supervisory, const char *smsc_number, int send_callerid, int loopback); void nmt_check_channels(void); void nmt_destroy(sender_t *sender); void nmt_go_idle(nmt_t *nmt); -- cgit v1.2.3