You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.6 KiB
144 lines
4.6 KiB
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Digital Voice Modem - Bridge
|
|
* GPLv2 Open Source. Use is subject to license terms.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
*/
|
|
/**
|
|
* @file mdc_encode.h
|
|
* @ingroup bridge
|
|
* @file mdc_encode.c
|
|
* @ingroup bridge
|
|
*/
|
|
/*-
|
|
* mdc_encode.h
|
|
* header for mdc_encode.c
|
|
*
|
|
* 9 October 2010 - typedefs for easier porting
|
|
*
|
|
* Author: Matthew Kaufman (matthew@eeph.com)
|
|
*
|
|
* Copyright (c) 2005 Matthew Kaufman All rights reserved.
|
|
*
|
|
* This file is part of Matthew Kaufman's MDC Encoder/Decoder Library
|
|
*
|
|
* The MDC Encoder/Decoder Library is free software; you can
|
|
* redistribute it and/or modify it under the terms of version 2 of
|
|
* the GNU General Public License as published by the Free Software
|
|
* Foundation.
|
|
*
|
|
* If you cannot comply with the terms of this license, contact
|
|
* the author for alternative license arrangements or do not use
|
|
* or redistribute this software.
|
|
*
|
|
* The MDC Encoder/Decoder Library 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 General Public License
|
|
* along with this software; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
|
* USA.
|
|
*
|
|
* or see http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
-*/
|
|
#if !defined(__MDC_ENCODE_H__)
|
|
#define __MDC_ENCODE_H__
|
|
|
|
#include "mdc/mdc_types.h"
|
|
|
|
//#define FILL_FINAL // fills the end of the last block with zeros, rather than returning fewer samples than requested
|
|
//#define MDC_ENCODE_FULL_AMPLITUDE // encode at 100% amplitude (default is 68% amplitude for recommended deviation)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Structure Declaration
|
|
// ---------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @brief
|
|
*/
|
|
typedef struct {
|
|
mdc_int_t loaded;
|
|
mdc_int_t bpos;
|
|
mdc_int_t ipos;
|
|
mdc_int_t preamble_set;
|
|
mdc_int_t preamble_count;
|
|
mdc_u32_t thu;
|
|
mdc_u32_t tthu;
|
|
mdc_u32_t incru;
|
|
mdc_u32_t incru18;
|
|
mdc_int_t state;
|
|
mdc_int_t lb;
|
|
mdc_int_t xorb;
|
|
mdc_u8_t data[14 + 14 + 5 + 7];
|
|
} mdc_encoder_t;
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Global Functions
|
|
// ---------------------------------------------------------------------------
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Create a new mdc_encoder object.
|
|
* @param sampleRate The sampling rate in Hz.
|
|
* @returns mdc_encoder_t* An mdc_encoder object or null if failure.
|
|
*/
|
|
mdc_encoder_t* mdc_encoder_new(int sampleRate);
|
|
|
|
/**
|
|
* @brief
|
|
* @param[in] encoder Instance of mdc_encoder object.
|
|
* @param preambleLength length of additional preamble (in bytes) - preamble time is 6.66 msec * preambleLength.
|
|
* @returns int -1 for error, 0 otherwise
|
|
*/
|
|
int mdc_encoder_set_preamble(mdc_encoder_t* encoder, int preambleLength);
|
|
|
|
/**
|
|
* @brief Set up a normal-length MDC packet for transmission.
|
|
* @param[in] encoder Instance of mdc_encoder object.
|
|
* @param op MDC Opcode.
|
|
* @param arg MDC Argument.
|
|
* @param unitID Unit ID.
|
|
* @returns int -1 for error, 0 otherwise
|
|
*/
|
|
int mdc_encoder_set_packet(mdc_encoder_t* encoder, mdc_u8_t op, mdc_u8_t arg, mdc_u16_t unitID);
|
|
|
|
/**
|
|
* @brief Set up a double-length MDC packet for transmission.
|
|
* @param[in] encoder Instance of mdc_encoder object.
|
|
* @param op MDC Opcode.
|
|
* @param arg MDC Argument.
|
|
* @param unitID Unit ID.
|
|
* @param extra0 1st extra byte.
|
|
* @param extra1 2nd extra byte.
|
|
* @param extra2 3rd extra byte.
|
|
* @param extra3 4th extra byte.
|
|
* @returns int -1 for error, 0 otherwise
|
|
*/
|
|
int mdc_encoder_set_double_packet(mdc_encoder_t* encoder, mdc_u8_t op, mdc_u8_t arg,
|
|
mdc_u16_t unitID, mdc_u8_t extra0, mdc_u8_t extra1, mdc_u8_t extra2, mdc_u8_t extra3);
|
|
|
|
/**
|
|
* @brief Get generated output audio samples from encoder.
|
|
* @param[out] buffer Sample buffer to write into.
|
|
* @param[out] bufferSize The size (in samples) of the sample buffer.
|
|
* @returns int -1 for error, otherwise returns the number of samples written
|
|
* into the buffer (will be equal to bufferSize unless the end has
|
|
* been reached, in which case the last block may be less than
|
|
* bufferSize and all subsequent calls will return zero, until
|
|
* a new packet is loaded for transmission
|
|
*/
|
|
int mdc_encoder_get_samples(mdc_encoder_t* encoder, mdc_sample_t* buffer, int bufferSize);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // __MDC_ENCODE_H__
|