1 /* 2 * Copyright (C) 2010 DSD Author 3 * GPG Key ID: 0x3F1D7FD0 (74EF 430D F7F2 0A48 FCE6 F630 FAA2 635D 3F1D 7FD0) 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include "config.h" 19 #include <stdio.h> 20 #include <stdlib.h> 21 #include <signal.h> 22 #include <string.h> 23 #define __USE_XOPEN 24 #include <time.h> 25 #include <sys/time.h> 26 #include <sys/types.h> 27 #include <sys/stat.h> 28 #include <sys/ioctl.h> 29 #include <fcntl.h> 30 #include <unistd.h> 31 #ifdef SOLARIS 32 #include <sys/audioio.h> 33 #endif 34 #ifdef BSD 35 #include <sys/soundcard.h> 36 #endif 37 #include <math.h> 38 #include <mbelib.h> 39 40 /* 41 * global variables 42 */ 43 extern int exitflag; 44 45 46 typedef struct 47 { 48 int onesymbol; 49 char mbe_in_file[1024]; 50 FILE *mbe_in_f; 51 int errorbars; 52 int datascope; 53 int symboltiming; 54 int verbose; 55 int p25enc; 56 int p25lc; 57 int p25status; 58 int p25tg; 59 int scoperate; 60 char audio_in_dev[1024]; 61 int audio_in_fd; 62 char audio_out_dev[1024]; 63 int audio_out_fd; 64 int split; 65 int playoffset; 66 char mbe_out_dir[1024]; 67 char mbe_out_file[1024]; 68 FILE *mbe_out_f; 69 float audio_gain; 70 int audio_out; 71 char wav_out_file[1024]; 72 FILE *wav_out_f; 73 int wav_out_fd; 74 int serial_baud; 75 char serial_dev[1024]; 76 int serial_fd; 77 int resume; 78 int frame_dstar; 79 int frame_x2tdma; 80 int frame_p25p1; 81 int frame_nxdn48; 82 int frame_nxdn96; 83 int frame_dmr; 84 int frame_provoice; 85 int mod_c4fm; 86 int mod_qpsk; 87 int mod_gfsk; 88 int uvquality; 89 int inverted_x2tdma; 90 int inverted_dmr; 91 int mod_threshold; 92 int ssize; 93 int msize; 94 int playfiles; 95 int delay; 96 } dsd_opts; 97 98 typedef struct 99 { 100 int *dibit_buf; 101 int *dibit_buf_p; 102 int repeat; 103 short *audio_out_buf; 104 short *audio_out_buf_p; 105 float *audio_out_float_buf; 106 float *audio_out_float_buf_p; 107 float audio_out_temp_buf[160]; 108 float *audio_out_temp_buf_p; 109 int audio_out_idx; 110 int audio_out_idx2; 111 int wav_out_bytes; 112 int center; 113 int jitter; 114 int synctype; 115 int min; 116 int max; 117 int lmid; 118 int umid; 119 int minref; 120 int maxref; 121 int lastsample; 122 int sbuf[128]; 123 int sidx; 124 int maxbuf[1024]; 125 int minbuf[1024]; 126 int midx; 127 char err_str[64]; 128 char fsubtype[16]; 129 char ftype[16]; 130 int symbolcnt; 131 int rf_mod; 132 int numflips; 133 int lastsynctype; 134 int lastp25type; 135 int offset; 136 int carrier; 137 char tg[25][16]; 138 int tgcount; 139 int lasttg; 140 int lastsrc; 141 int nac; 142 int errs; 143 int errs2; 144 int mbe_file_type; 145 int optind; 146 int numtdulc; 147 int firstframe; 148 char slot0light[8]; 149 char slot1light[8]; 150 float aout_gain; 151 float aout_max_buf[200]; 152 float *aout_max_buf_p; 153 int aout_max_buf_idx; 154 int samplesPerSymbol; 155 int symbolCenter; 156 char algid[9]; 157 char keyid[17]; 158 int currentslot; 159 mbe_parms *cur_mp; 160 mbe_parms *prev_mp; 161 mbe_parms *prev_mp_enhanced; 162 int p25kid; 163 } dsd_state; 164 165 /* 166 * Frame sync patterns 167 */ 168 #define INV_P25P1_SYNC "333331331133111131311111" 169 #define P25P1_SYNC "111113113311333313133333" 170 171 #define X2TDMA_BS_VOICE_SYNC "113131333331313331113311" 172 #define X2TDMA_BS_DATA_SYNC "331313111113131113331133" 173 #define X2TDMA_MS_DATA_SYNC "313113333111111133333313" 174 #define X2TDMA_MS_VOICE_SYNC "131331111333333311111131" 175 176 #define DSTAR_SYNC "313131313133131113313111" 177 #define INV_DSTAR_SYNC "131313131311313331131333" 178 179 #define NXDN_MS_DATA_SYNC "313133113131111333" 180 #define INV_NXDN_MS_DATA_SYNC "131311331313333111" 181 #define NXDN_MS_VOICE_SYNC "313133113131113133" 182 #define INV_NXDN_MS_VOICE_SYNC "131311331313331311" 183 #define INV_NXDN_BS_DATA_SYNC "131311331313333131" 184 #define NXDN_BS_DATA_SYNC "313133113131111313" 185 #define INV_NXDN_BS_VOICE_SYNC "131311331313331331" 186 #define NXDN_BS_VOICE_SYNC "313133113131113113" 187 188 #define DMR_BS_DATA_SYNC "313333111331131131331131" 189 #define DMR_BS_VOICE_SYNC "131111333113313313113313" 190 #define DMR_MS_DATA_SYNC "311131133313133331131113" 191 #define DMR_MS_VOICE_SYNC "133313311131311113313331" 192 193 #define INV_PROVOICE_SYNC "31313111333133133311331133113311" 194 #define PROVOICE_SYNC "13131333111311311133113311331133" 195 #define INV_PROVOICE_EA_SYNC "13313133113113333311313133133311" 196 #define PROVOICE_EA_SYNC "31131311331331111133131311311133" 197 198 /* 199 * function prototypes 200 */ 201 void processDMRdata (dsd_opts * opts, dsd_state * state); 202 void processDMRvoice (dsd_opts * opts, dsd_state * state); 203 void processAudio (dsd_opts * opts, dsd_state * state); 204 void writeSynthesizedVoice (dsd_opts * opts, dsd_state * state); 205 void playSynthesizedVoice (dsd_opts * opts, dsd_state * state); 206 void openAudioOutDevice (dsd_opts * opts, int speed); 207 void openAudioInDevice (dsd_opts * opts); 208 int getDibit (dsd_opts * opts, dsd_state * state); 209 void skipDibit (dsd_opts * opts, dsd_state * state, int count); 210 void saveImbe4400Data (dsd_opts * opts, dsd_state * state, char *imbe_d); 211 void saveAmbe2450Data (dsd_opts * opts, dsd_state * state, char *ambe_d); 212 int readImbe4400Data (dsd_opts * opts, dsd_state * state, char *imbe_d); 213 int readAmbe2450Data (dsd_opts * opts, dsd_state * state, char *ambe_d); 214 void openMbeInFile (dsd_opts * opts, dsd_state * state); 215 void closeMbeOutFile (dsd_opts * opts, dsd_state * state); 216 void openMbeOutFile (dsd_opts * opts, dsd_state * state); 217 void openWavOutFile (dsd_opts * opts, dsd_state * state); 218 void closeWavOutFile (dsd_opts * opts, dsd_state * state); 219 void printFrameInfo (dsd_opts * opts, dsd_state * state); 220 void processFrame (dsd_opts * opts, dsd_state * state); 221 void printFrameSync (dsd_opts * opts, dsd_state * state, char *frametype, int offset, char *modulation); 222 int getFrameSync (dsd_opts * opts, dsd_state * state); 223 int comp (const void *a, const void *b); 224 void noCarrier (dsd_opts * opts, dsd_state * state); 225 void initOpts (dsd_opts * opts); 226 void initState (dsd_state * state); 227 void usage (); 228 void liveScanner (dsd_opts * opts, dsd_state * state); 229 void cleanupAndExit (dsd_opts * opts, dsd_state * state); 230 void sigfun (int sig); 231 int main (int argc, char **argv); 232 void playMbeFiles (dsd_opts * opts, dsd_state * state, int argc, char **argv); 233 void processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char ambe_fr[4][24], char imbe7100_fr[7][24]); 234 void openSerial (dsd_opts * opts, dsd_state * state); 235 void resumeScan (dsd_opts * opts, dsd_state * state); 236 int getSymbol (dsd_opts * opts, dsd_state * state, int have_sync); 237 void upsample (dsd_state * state, float invalue); 238 void processDSTAR (dsd_opts * opts, dsd_state * state); 239 void processNXDNVoice (dsd_opts * opts, dsd_state * state); 240 void processNXDNData (dsd_opts * opts, dsd_state * state); 241 void processP25lcw (dsd_opts * opts, dsd_state * state, char *lcformat, char *mfid, char *lcinfo); 242 void processHDU (dsd_opts * opts, dsd_state * state); 243 void processLDU1 (dsd_opts * opts, dsd_state * state); 244 void processLDU2 (dsd_opts * opts, dsd_state * state); 245 void processTDULC (dsd_opts * opts, dsd_state * state); 246 void processProVoice (dsd_opts * opts, dsd_state * state); 247 void processX2TDMAdata (dsd_opts * opts, dsd_state * state); 248 void processX2TDMAvoice (dsd_opts * opts, dsd_state * state); 249