sdrangel/libfreedv/freedv_api_internal.h

155 wiersze
6.6 KiB
C++

/*---------------------------------------------------------------------------*\
FILE........: freedv_api_internal.h
AUTHOR......: David Rowe
DATE CREATED: August 2014
This declares the structure freedv. A pointer to this structure is
returned by the FreeDV API freedv_open() function. The pointer is used
by the other FreeDV API functions declared in freedv_api.h. This
structure is intended to be internal to the FreeDV API. The public
functions are declared in freedv_api.h. Changes to this structure
are expected. Changes (except additions) to freedv_api.h are
discouraged.
\*---------------------------------------------------------------------------*/
/*
Copyright (C) 2014 David Rowe
All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License version 2.1, as
published by the Free Software Foundation. This program is
distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __FREEDV_API_INTERNAL__
#define __FREEDV_API_INTERNAL__
#include "codec2/varicode.h"
#include "fsk.h"
#include "fmfsk.h"
#include "codec2_cohpsk.h"
#include "codec2_fdmdv.h"
namespace FreeDV
{
struct freedv {
int mode;
/* states for various modems we support */
struct CODEC2 *codec2;
struct FDMDV *fdmdv;
struct COHPSK *cohpsk;
struct FSK *fsk;
struct FMFSK *fmfsk;
struct OFDM *ofdm;
struct LDPC *ldpc;
struct MODEM_STATS stats;
struct freedv_vhf_deframer * deframer; // Extracts frames from VHF stream
struct quisk_cfFilter * ptFilter7500to8000; // Filters to change to/from 7500 and 8000 sps for 700 .... 700C
struct quisk_cfFilter * ptFilter8000to7500;
int n_speech_samples; // number of speech samples we need for each freedv_tx() call
// num of speech samples output by freedv_rx() call
int n_nom_modem_samples; // size of tx and most rx modem sample buffers
int n_max_modem_samples; // make your rx modem sample buffers this big
int n_nat_modem_samples; // tx modem sample block length as used by the modem before interpolation to output
// usually the same as n_nom_modem_samples, except for 700..700C
int modem_sample_rate; // Caller is responsible for meeting this
int modem_symbol_rate; // Useful for ext_vco operation on 2400A and 800XA
int clip; // non-zero for cohpsk modem output clipping for low PAPR
unsigned char *packed_codec_bits;
unsigned char *packed_codec_bits_tx; // for 700D we separate packed bits to maintain state due to interleaving
int nbyte_packed_codec_bits; // keep track of size of above arrays in 700D
int *codec_bits;
int *tx_bits;
int *fdmdv_bits;
int *rx_bits;
int n_codec_bits; // number of codec bits in a frame
int tx_sync_bit;
int smooth_symbols;
int frames;
/* test frame states -------------------------------------------------------------------------*/
int *ptest_bits_coh;
int *ptest_bits_coh_end;
int test_frames; // set this baby for 1 to tx/rx test frames to look at bit error stats
int test_frames_diversity; // 1 -> used combined carriers for error counting on 700 waveforms
int test_frame_sync_state;
int test_frame_sync_state_upper; // when test_frames_diveristy==0 we need extra states for upper carriers
int test_frame_count;
int total_bits;
int total_bit_errors;
int total_bits_coded;
int total_bit_errors_coded;
int sz_error_pattern;
/* optional user defined function to pass error pattern when a test frame is received */
void *error_pattern_callback_state;
void (*freedv_put_error_pattern)(void *error_pattern_callback_state, short error_pattern[], int sz_error_pattern);
/* Misc ---------------------------------------------------------------------------------------------*/
int sync;
int evenframe;
float snr_est;
float snr_squelch_thresh;
int squelch_en;
int nin;
int verbose;
int ext_vco; /* 2400A/800XA use external VCO flag */
/* Varicode txt channel states ----------------------------------------------------------------------*/
struct VARICODE_DEC varicode_dec_states;
short tx_varicode_bits[VARICODE_MAX_BITS];
int nvaricode_bits;
int varicode_bit_index;
/* interleaved LDPC OFDM states ---------------------------------------------------------------------*/
int interleave_frames; // number of OFDM modem frames in interleaver, e.g. 1,2,4,8,16
COMP *codeword_symbols;
float *codeword_amps;
int modem_frame_count_tx; // modem frame counter for tx side
int modem_frame_count_rx; // modem frame counter for rx side
COMP *mod_out; // output buffer of intereaved frames
/* user defined function ptrs to produce and consume ASCII
characters using aux txt channel */
char (*freedv_get_next_tx_char)(void *callback_state);
void (*freedv_put_next_rx_char)(void *callback_state, char c);
void *callback_state;
/* user defined functions to produce and consume protocol bits */
/* Protocol bits are packed MSB-first */
void (*freedv_put_next_proto)(void *callback_state, char *proto_bits_packed);
void (*freedv_get_next_proto)(void *callback_state, char *proto_bits_packed);
void *proto_callback_state;
int n_protocol_bits;
};
} // FreeDV
#endif