libnrsc5 76b0842
NRSC-5 digital radio via the RTL-SDR
Loading...
Searching...
No Matches
nrsc5.h
Go to the documentation of this file.
1#ifndef NRSC5_H_
2#define NRSC5_H_
3
19#include <stdint.h>
20#include <stdlib.h>
21#include <stdio.h>
22#include <time.h>
23
24/*
25 * Definitions.
26 */
27#define NRSC5_SCAN_BEGIN 87.9e6
28#define NRSC5_SCAN_END 107.9e6
29#define NRSC5_SCAN_SKIP 0.2e6
30
31#define NRSC5_MIME_PRIMARY_IMAGE 0xBE4B7536
32#define NRSC5_MIME_STATION_LOGO 0xD9C72536
33#define NRSC5_MIME_NAVTEQ 0x2D42AC3E
34#define NRSC5_MIME_HERE_TPEG 0x82F03DFC
35#define NRSC5_MIME_HERE_IMAGE 0xB7F03DFC
36#define NRSC5_MIME_HD_TMC 0xEECB55B6
37#define NRSC5_MIME_HDC 0x4DC66C5A
38#define NRSC5_MIME_TEXT 0xBB492AAC
39#define NRSC5_MIME_JPEG 0x1E653E9C
40#define NRSC5_MIME_PNG 0x4F328CA0
41#define NRSC5_MIME_TTN_TPEG_1 0xB39EBEB2
42#define NRSC5_MIME_TTN_TPEG_2 0x4EB03469
43#define NRSC5_MIME_TTN_TPEG_3 0x52103469
44#define NRSC5_MIME_TTN_STM_TRAFFIC 0xFF8422D7
45#define NRSC5_MIME_TTN_STM_WEATHER 0xEF042E96
46#define NRSC5_MIME_UNKNOWN_00000000 0x00000000
47#define NRSC5_MIME_UNKNOWN_1C7D0E29 0x1C7D0E29
48#define NRSC5_MIME_UNKNOWN_B81FFAA8 0xB81FFAA8
49#define NRSC5_MIME_UNKNOWN_FFFFFFFF 0xFFFFFFFF
50
51#define NRSC5_AUDIO_FRAME_SAMPLES 2048
53#define NRSC5_SAMPLE_RATE_CU8 1488375
54#define NRSC5_SAMPLE_RATE_CS16_FM 744187.5
55#define NRSC5_SAMPLE_RATE_CS16_AM 46511.71875
56#define NRSC5_SAMPLE_RATE_AUDIO 44100
58#ifdef NRSC5_EXPORTS
59#ifdef __MINGW32__
60#define NRSC5_API __declspec(dllexport)
61#else
62#define NRSC5_API
63#endif
64#else
65#define NRSC5_API
66#endif
67
68enum
69{
70 NRSC5_MODE_FM,
71 NRSC5_MODE_AM
72};
73
74/*
75 * Data types.
76 */
77enum
78{
79 NRSC5_SIG_COMPONENT_AUDIO,
80 NRSC5_SIG_COMPONENT_DATA
81};
82
83enum
84{
85 NRSC5_AAS_TYPE_STREAM = 0,
86 NRSC5_AAS_TYPE_PACKET = 1,
87 NRSC5_AAS_TYPE_LOT = 3
88};
89
97{
99 uint8_t type;
100 uint8_t id;
101 union
102 {
105 struct {
106 uint16_t port;
109 uint8_t type;
110 uint32_t mime;
114 struct {
115 uint8_t port;
116 uint8_t type;
117 uint32_t mime;
119 };
120};
125
126enum
127{
128 NRSC5_SIG_SERVICE_AUDIO,
129 NRSC5_SIG_SERVICE_DATA
130};
131
159
160enum
161{
162 NRSC5_EVENT_LOST_DEVICE,
163 NRSC5_EVENT_IQ,
164 NRSC5_EVENT_SYNC,
165 NRSC5_EVENT_LOST_SYNC,
166 NRSC5_EVENT_MER,
167 NRSC5_EVENT_BER,
168 NRSC5_EVENT_HDC,
169 NRSC5_EVENT_AUDIO,
170 NRSC5_EVENT_ID3,
171 NRSC5_EVENT_SIG,
172 NRSC5_EVENT_LOT,
173 NRSC5_EVENT_SIS,
174 NRSC5_EVENT_STREAM,
175 NRSC5_EVENT_PACKET,
176 NRSC5_EVENT_AUDIO_SERVICE,
177 NRSC5_EVENT_STATION_ID,
178 NRSC5_EVENT_STATION_NAME,
179 NRSC5_EVENT_STATION_SLOGAN,
180 NRSC5_EVENT_STATION_MESSAGE,
181 NRSC5_EVENT_STATION_LOCATION,
182 NRSC5_EVENT_AUDIO_SERVICE_DESCRIPTOR,
183 NRSC5_EVENT_DATA_SERVICE_DESCRIPTOR,
184 NRSC5_EVENT_EMERGENCY_ALERT,
185 NRSC5_EVENT_HERE_IMAGE,
186 NRSC5_EVENT_LOT_HEADER,
187 NRSC5_EVENT_LOT_FRAGMENT,
188 NRSC5_EVENT_AGC
189};
190
191enum
192{
193 NRSC5_ACCESS_PUBLIC,
194 NRSC5_ACCESS_RESTRICTED
195};
196
197enum
198{
199 NRSC5_PROGRAM_TYPE_UNDEFINED = 0,
200 NRSC5_PROGRAM_TYPE_NEWS = 1,
201 NRSC5_PROGRAM_TYPE_INFORMATION = 2,
202 NRSC5_PROGRAM_TYPE_SPORTS = 3,
203 NRSC5_PROGRAM_TYPE_TALK = 4,
204 NRSC5_PROGRAM_TYPE_ROCK = 5,
205 NRSC5_PROGRAM_TYPE_CLASSIC_ROCK = 6,
206 NRSC5_PROGRAM_TYPE_ADULT_HITS = 7,
207 NRSC5_PROGRAM_TYPE_SOFT_ROCK = 8,
208 NRSC5_PROGRAM_TYPE_TOP_40 = 9,
209 NRSC5_PROGRAM_TYPE_COUNTRY = 10,
210 NRSC5_PROGRAM_TYPE_OLDIES = 11,
211 NRSC5_PROGRAM_TYPE_SOFT = 12,
212 NRSC5_PROGRAM_TYPE_NOSTALGIA = 13,
213 NRSC5_PROGRAM_TYPE_JAZZ = 14,
214 NRSC5_PROGRAM_TYPE_CLASSICAL = 15,
215 NRSC5_PROGRAM_TYPE_RHYTHM_AND_BLUES = 16,
216 NRSC5_PROGRAM_TYPE_SOFT_RHYTHM_AND_BLUES = 17,
217 NRSC5_PROGRAM_TYPE_FOREIGN_LANGUAGE = 18,
218 NRSC5_PROGRAM_TYPE_RELIGIOUS_MUSIC = 19,
219 NRSC5_PROGRAM_TYPE_RELIGIOUS_TALK = 20,
220 NRSC5_PROGRAM_TYPE_PERSONALITY = 21,
221 NRSC5_PROGRAM_TYPE_PUBLIC = 22,
222 NRSC5_PROGRAM_TYPE_COLLEGE = 23,
223 NRSC5_PROGRAM_TYPE_SPANISH_TALK = 24,
224 NRSC5_PROGRAM_TYPE_SPANISH_MUSIC = 25,
225 NRSC5_PROGRAM_TYPE_HIP_HOP = 26,
226 NRSC5_PROGRAM_TYPE_WEATHER = 29,
227 NRSC5_PROGRAM_TYPE_EMERGENCY_TEST = 30,
228 NRSC5_PROGRAM_TYPE_EMERGENCY = 31,
229 NRSC5_PROGRAM_TYPE_TRAFFIC = 65,
230 NRSC5_PROGRAM_TYPE_SPECIAL_READING_SERVICES = 76
231};
232
233enum
234{
235 NRSC5_BLEND_DISABLE,
236 NRSC5_BLEND_SELECT,
237 NRSC5_BLEND_ENABLE
238};
239
240enum
241{
242 NRSC5_LOCATION_FORMAT_SAME,
243 NRSC5_LOCATION_FORMAT_FIPS,
244 NRSC5_LOCATION_FORMAT_ZIP
245};
246
247enum
248{
249 NRSC5_ALERT_CATEGORY_NON_SPECIFIC = 1,
250 NRSC5_ALERT_CATEGORY_GEOPHYSICAL = 2,
251 NRSC5_ALERT_CATEGORY_WEATHER = 3,
252 NRSC5_ALERT_CATEGORY_SAFETY = 4,
253 NRSC5_ALERT_CATEGORY_SECURITY = 5,
254 NRSC5_ALERT_CATEGORY_RESCUE = 6,
255 NRSC5_ALERT_CATEGORY_FIRE = 7,
256 NRSC5_ALERT_CATEGORY_HEALTH = 8,
257 NRSC5_ALERT_CATEGORY_ENVIRONMENTAL = 9,
258 NRSC5_ALERT_CATEGORY_TRANSPORTATION = 10,
259 NRSC5_ALERT_CATEGORY_UTILITIES = 11,
260 NRSC5_ALERT_CATEGORY_HAZMAT = 12,
261 NRSC5_ALERT_CATEGORY_TEST = 30
262};
263
264enum
265{
266 NRSC5_HERE_IMAGE_TRAFFIC = 8,
267 NRSC5_HERE_IMAGE_WEATHER = 13
268};
269
281{
283 unsigned int program;
284 unsigned int access;
285 unsigned int type;
286 unsigned int sound_exp;
287};
292
293enum
294{
295 NRSC5_SERVICE_DATA_TYPE_NON_SPECIFIC = 0,
296 NRSC5_SERVICE_DATA_TYPE_NEWS = 1,
297 NRSC5_SERVICE_DATA_TYPE_SPORTS = 3,
298 NRSC5_SERVICE_DATA_TYPE_WEATHER = 29,
299 NRSC5_SERVICE_DATA_TYPE_EMERGENCY = 31,
300 NRSC5_SERVICE_DATA_TYPE_TRAFFIC = 65,
301 NRSC5_SERVICE_DATA_TYPE_IMAGE_MAPS = 66,
302 NRSC5_SERVICE_DATA_TYPE_TEXT = 80,
303 NRSC5_SERVICE_DATA_TYPE_ADVERTISING = 256,
304 NRSC5_SERVICE_DATA_TYPE_FINANCIAL = 257,
305 NRSC5_SERVICE_DATA_TYPE_STOCK_TICKER = 258,
306 NRSC5_SERVICE_DATA_TYPE_NAVIGATION = 259,
307 NRSC5_SERVICE_DATA_TYPE_ELECTRONIC_PROGRAM_GUIDE = 260,
308 NRSC5_SERVICE_DATA_TYPE_AUDIO = 261,
309 NRSC5_SERVICE_DATA_TYPE_PRIVATE_DATA_NETWORK = 262,
310 NRSC5_SERVICE_DATA_TYPE_SERVICE_MAINTENANCE = 263,
311 NRSC5_SERVICE_DATA_TYPE_HD_RADIO_SYSTEM_SERVICES = 264,
312 NRSC5_SERVICE_DATA_TYPE_AUDIO_RELATED_DATA = 265,
313 NRSC5_SERVICE_DATA_TYPE_RESERVED_FOR_SPECIAL_TESTS = 511
314};
315
324{
326 unsigned int access;
327 unsigned int type;
328 uint32_t mime_type;
329};
334
350
351enum
352{
353 NRSC5_PKT_FLAGS_NONE = 0,
354 NRSC5_PKT_FLAGS_CRC_ERROR = 1 << 0,
355};
356
364{
395 unsigned int event;
396 union
397 {
398 struct {
399 const void *data;
400 size_t count;
401 } iq;
402 struct {
404 int psmi;
405 } sync;
406 struct {
407 float cber;
408 } ber;
409 struct {
410 float lower;
411 float upper;
412 } mer;
413 struct {
414 unsigned int program;
415 const uint8_t *data;
416 size_t count;
417 unsigned int flags;
418 } hdc;
419 struct {
420 unsigned int program;
421 const int16_t *data;
422 size_t count;
423 } audio;
424 struct {
425 unsigned int program;
426 const char *title;
427 const char *artist;
428 const char *album;
429 const char *genre;
430 struct {
431 const char *owner;
432 const char *id;
433 } ufid;
434 struct {
435 uint32_t mime;
436 int param;
437 int lot;
438 } xhdr;
439 nrsc5_id3_comment_t *comments;
440 } id3;
441 struct {
442 uint16_t port;
443 uint16_t seq;
444 unsigned int size;
445 uint32_t mime;
446 const uint8_t *data;
449 } stream;
450 struct {
451 uint16_t port;
452 uint16_t seq;
453 unsigned int size;
454 uint32_t mime;
455 const uint8_t *data;
458 } packet;
459 struct {
460 uint16_t port;
461 unsigned int lot;
462 unsigned int size;
463 uint32_t mime;
464 const char *name;
465 const uint8_t *data;
466 struct tm *expiry_utc;
469 } lot;
470 struct {
471 unsigned int lot;
472 unsigned int seq;
473 unsigned int repeat;
474 unsigned int size;
475 unsigned int bytes_so_far;
477 const uint8_t *data;
478 nrsc5_sig_service_t *service;
479 nrsc5_sig_component_t *component;
480 } lot_fragment;
481 struct {
482 unsigned int program;
483 unsigned int access;
484 unsigned int type;
485 unsigned int codec_mode;
486 unsigned int blend_control;
488 unsigned int common_delay;
489 unsigned int latency;
490 } audio_service;
491 struct {
492 nrsc5_sig_service_t *services;
493 } sig;
494 struct {
495 const char *country_code;
496 int fcc_facility_id;
497 const char *name;
498 const char *slogan;
499 const char *message;
500 const char *alert;
501 float latitude;
502 float longitude;
503 int altitude;
504 nrsc5_sis_asd_t *audio_services;
505 nrsc5_sis_dsd_t *data_services;
506 const uint8_t *alert_cnt;
507 int alert_cnt_length;
508 int alert_category1;
509 int alert_category2;
510 int alert_location_format;
511 int alert_num_locations;
512 const int *alert_locations;
513 } sis;
514 struct {
515 const char *country_code;
516 int fcc_facility_id;
517 } station_id;
518 struct {
519 const char *name;
520 } station_name;
521 struct {
522 const char *slogan;
523 } station_slogan;
524 struct {
525 const char *message;
526 } station_message;
527 struct {
528 float latitude;
529 float longitude;
530 int altitude;
531 } station_location;
532 struct {
533 unsigned int program;
534 unsigned int access;
535 unsigned int type;
536 unsigned int sound_exp;
537 } asd;
538 struct {
539 unsigned int access;
540 unsigned int type;
541 uint32_t mime_type;
542 } dsd;
543 struct {
544 const char *message;
545 const uint8_t *control_data;
546 int control_data_length;
547 int category1;
548 int category2;
549 int location_format;
550 int num_locations;
551 const int *locations;
552 } emergency_alert;
553 struct {
555 int seq;
556 int n1;
557 int n2;
558 struct tm *time_utc;
559 float latitude1;
561 float latitude2;
563 const char *name;
564 unsigned int size;
565 const uint8_t *data;
566 } here_image;
567 struct {
568 float gain_db;
569 float peak_dbfs;
571 } agc;
572 };
573};
578
585typedef void (*nrsc5_callback_t)(const nrsc5_event_t *evt, void *opaque);
586
592typedef struct nrsc5_t nrsc5_t;
593
594
595/* ============================================================================
596 * Public functions. All functions return void or an error code (0 == success).
597 */
598
603NRSC5_API void nrsc5_get_version(const char **version);
604
613NRSC5_API void nrsc5_service_data_type_name(unsigned int type, const char **name);
614
623NRSC5_API void nrsc5_program_type_name(unsigned int type, const char **name);
624
633 NRSC5_API void nrsc5_alert_category_name(unsigned int category, const char **name);
634
655NRSC5_API int nrsc5_open(nrsc5_t **st, int device_index);
656
664NRSC5_API int nrsc5_open_file(nrsc5_t **st, FILE *fp);
665
672NRSC5_API int nrsc5_open_pipe(nrsc5_t **st);
673
681NRSC5_API int nrsc5_open_rtltcp(nrsc5_t **st, int socket);
682
690NRSC5_API void nrsc5_close(nrsc5_t *st);
691
697NRSC5_API void nrsc5_start(nrsc5_t *st);
698
705NRSC5_API void nrsc5_stop(nrsc5_t *st);
706
714NRSC5_API int nrsc5_set_mode(nrsc5_t *st, int mode);
715
727NRSC5_API int nrsc5_set_bias_tee(nrsc5_t *st, int on);
728
737NRSC5_API int nrsc5_set_direct_sampling(nrsc5_t *st, int on);
738
747NRSC5_API int nrsc5_set_freq_correction(nrsc5_t *st, int ppm_error);
748
756NRSC5_API void nrsc5_get_frequency(nrsc5_t *st, float *freq);
757
769NRSC5_API int nrsc5_set_frequency(nrsc5_t *st, float freq);
770
778NRSC5_API void nrsc5_get_gain(nrsc5_t *st, float *gain);
779
788NRSC5_API int nrsc5_set_gain(nrsc5_t *st, float gain);
789
797NRSC5_API void nrsc5_set_auto_gain(nrsc5_t *st, int enabled);
798
807NRSC5_API void nrsc5_set_callback(nrsc5_t *st, nrsc5_callback_t callback, void *opaque);
808
819NRSC5_API int nrsc5_pipe_samples_cu8(nrsc5_t *st, const uint8_t *samples, unsigned int length);
820
831NRSC5_API int nrsc5_pipe_samples_cs16(nrsc5_t *st, const int16_t *samples, unsigned int length);
832
833#endif /* NRSC5_H_ */
NRSC5_API int nrsc5_open_rtltcp(nrsc5_t **st, int socket)
NRSC5_API int nrsc5_set_frequency(nrsc5_t *st, float freq)
NRSC5_API int nrsc5_set_mode(nrsc5_t *st, int mode)
struct nrsc5_t nrsc5_t
Definition nrsc5.h:592
NRSC5_API int nrsc5_set_freq_correction(nrsc5_t *st, int ppm_error)
NRSC5_API int nrsc5_pipe_samples_cu8(nrsc5_t *st, const uint8_t *samples, unsigned int length)
NRSC5_API int nrsc5_open_pipe(nrsc5_t **st)
NRSC5_API int nrsc5_pipe_samples_cs16(nrsc5_t *st, const int16_t *samples, unsigned int length)
NRSC5_API void nrsc5_alert_category_name(unsigned int category, const char **name)
NRSC5_API void nrsc5_get_version(const char **version)
NRSC5_API void nrsc5_program_type_name(unsigned int type, const char **name)
NRSC5_API void nrsc5_service_data_type_name(unsigned int type, const char **name)
NRSC5_API void nrsc5_close(nrsc5_t *st)
NRSC5_API int nrsc5_set_gain(nrsc5_t *st, float gain)
NRSC5_API void nrsc5_set_auto_gain(nrsc5_t *st, int enabled)
NRSC5_API int nrsc5_set_bias_tee(nrsc5_t *st, int on)
NRSC5_API void nrsc5_stop(nrsc5_t *st)
NRSC5_API int nrsc5_open(nrsc5_t **st, int device_index)
NRSC5_API void nrsc5_get_frequency(nrsc5_t *st, float *freq)
NRSC5_API int nrsc5_open_file(nrsc5_t **st, FILE *fp)
NRSC5_API void nrsc5_start(nrsc5_t *st)
void(* nrsc5_callback_t)(const nrsc5_event_t *evt, void *opaque)
Definition nrsc5.h:585
NRSC5_API void nrsc5_get_gain(nrsc5_t *st, float *gain)
NRSC5_API int nrsc5_set_direct_sampling(nrsc5_t *st, int on)
NRSC5_API void nrsc5_set_callback(nrsc5_t *st, nrsc5_callback_t callback, void *opaque)
Definition nrsc5.h:364
unsigned int blend_control
Definition nrsc5.h:486
int is_final
Definition nrsc5.h:570
unsigned int bytes_so_far
Definition nrsc5.h:475
float latitude2
Definition nrsc5.h:561
float latitude1
Definition nrsc5.h:559
unsigned int type
Definition nrsc5.h:484
int digital_audio_gain
Definition nrsc5.h:487
const char * name
Definition nrsc5.h:464
unsigned int codec_mode
Definition nrsc5.h:485
unsigned int lot
Definition nrsc5.h:461
struct tm * expiry_utc
Definition nrsc5.h:466
float gain_db
Definition nrsc5.h:568
unsigned int sound_exp
Definition nrsc5.h:536
unsigned int latency
Definition nrsc5.h:489
int n1
Definition nrsc5.h:556
float longitude2
Definition nrsc5.h:562
unsigned int size
Definition nrsc5.h:444
float freq_offset
Definition nrsc5.h:403
unsigned int event
Definition nrsc5.h:395
unsigned int seq
Definition nrsc5.h:472
int image_type
Definition nrsc5.h:554
uint16_t port
Definition nrsc5.h:442
unsigned int repeat
Definition nrsc5.h:473
uint32_t mime_type
Definition nrsc5.h:541
nrsc5_sig_service_t * service
Definition nrsc5.h:447
struct tm * time_utc
Definition nrsc5.h:558
int psmi
Definition nrsc5.h:404
int seq
Definition nrsc5.h:555
float peak_dbfs
Definition nrsc5.h:569
unsigned int access
Definition nrsc5.h:483
int is_duplicate
Definition nrsc5.h:476
int n2
Definition nrsc5.h:557
const uint8_t * data
Definition nrsc5.h:415
uint32_t mime
Definition nrsc5.h:435
unsigned int common_delay
Definition nrsc5.h:488
float longitude1
Definition nrsc5.h:560
unsigned int program
Definition nrsc5.h:414
nrsc5_sig_component_t * component
Definition nrsc5.h:448
Definition nrsc5.h:340
struct nrsc5_id3_comment_t * next
Definition nrsc5.h:341
char * full_text
Definition nrsc5.h:344
char * lang
Definition nrsc5.h:342
char * short_content_desc
Definition nrsc5.h:343
Definition nrsc5.h:97
uint32_t mime
Definition nrsc5.h:110
struct nrsc5_sig_component_t::@13::@15 data
uint16_t service_data_type
Definition nrsc5.h:108
uint8_t type
Definition nrsc5.h:99
struct nrsc5_sig_component_t::@13::@16 audio
uint8_t id
Definition nrsc5.h:100
struct nrsc5_sig_component_t * next
Definition nrsc5.h:98
uint16_t port
Definition nrsc5.h:106
uint8_t port
Definition nrsc5.h:115
Definition nrsc5.h:147
nrsc5_sig_component_t * audio_component
Definition nrsc5.h:153
nrsc5_sig_component_t * components
Definition nrsc5.h:152
struct nrsc5_sig_service_t * next
Definition nrsc5.h:148
uint8_t type
Definition nrsc5.h:149
uint16_t number
Definition nrsc5.h:150
const char * name
Definition nrsc5.h:151
Definition nrsc5.h:281
unsigned int program
Definition nrsc5.h:283
unsigned int sound_exp
Definition nrsc5.h:286
struct nrsc5_sis_asd_t * next
Definition nrsc5.h:282
unsigned int access
Definition nrsc5.h:284
unsigned int type
Definition nrsc5.h:285
Definition nrsc5.h:324
struct nrsc5_sis_dsd_t * next
Definition nrsc5.h:325
unsigned int type
Definition nrsc5.h:327
uint32_t mime_type
Definition nrsc5.h:328
unsigned int access
Definition nrsc5.h:326