mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-23 00:35:53 +08:00
Akter the FM Network data standard.
This commit is contained in:
@@ -26,9 +26,9 @@
|
|||||||
|
|
||||||
#define SWAP_BYTES_16(a) (((a >> 8) & 0x00FFU) | ((a << 8) & 0xFF00U))
|
#define SWAP_BYTES_16(a) (((a >> 8) & 0x00FFU) | ((a << 8) & 0xFF00U))
|
||||||
|
|
||||||
const float DEEMPHASIS_GAIN_DB = 0.0F;
|
const float DEEMPHASIS_GAIN_DB = 8.0F; // Audio gain adjustment
|
||||||
const float PREEMPHASIS_GAIN_DB = 13.0F;
|
const float PREEMPHASIS_GAIN_DB = 0.0F; // Audio gain adjustment
|
||||||
const float FILTER_GAIN_DB = 0.0F;
|
const float FILTER_GAIN_DB = 2.0F; // Audio gain adjustment
|
||||||
const unsigned int FM_MASK = 0x00000FFFU;
|
const unsigned int FM_MASK = 0x00000FFFU;
|
||||||
|
|
||||||
CFMControl::CFMControl(CFMNetwork* network) :
|
CFMControl::CFMControl(CFMNetwork* network) :
|
||||||
@@ -79,17 +79,17 @@ bool CFMControl::writeModem(const unsigned char* data, unsigned int length)
|
|||||||
|
|
||||||
m_incomingRFAudio.addData(data + 1U, length - 1U);
|
m_incomingRFAudio.addData(data + 1U, length - 1U);
|
||||||
unsigned int bufferLength = m_incomingRFAudio.dataSize();
|
unsigned int bufferLength = m_incomingRFAudio.dataSize();
|
||||||
if (bufferLength > 252U)//168 samples 12-bit
|
if (bufferLength > 240U) //160 samples 12-bit
|
||||||
bufferLength = 252U;
|
bufferLength = 240U; //160 samples 12-bit
|
||||||
|
|
||||||
if (bufferLength >= 3U) {
|
if (bufferLength >= 3U) {
|
||||||
bufferLength = bufferLength - bufferLength % 3U; //round down to nearest multiple of 3
|
bufferLength = bufferLength - bufferLength % 3U; //round down to nearest multiple of 3
|
||||||
unsigned char bufferData[252U];
|
unsigned char bufferData[240U]; //160 samples 12-bit
|
||||||
m_incomingRFAudio.getData(bufferData, bufferLength);
|
m_incomingRFAudio.getData(bufferData, bufferLength);
|
||||||
|
|
||||||
unsigned int pack = 0U;
|
unsigned int pack = 0U;
|
||||||
unsigned char* packPointer = (unsigned char*)&pack;
|
unsigned char* packPointer = (unsigned char*)&pack;
|
||||||
float out[168U];
|
float out[160U]; //160 samples 12-bit
|
||||||
unsigned int nOut = 0U;
|
unsigned int nOut = 0U;
|
||||||
short unpackedSamples[2U];
|
short unpackedSamples[2U];
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ bool CFMControl::writeModem(const unsigned char* data, unsigned int length)
|
|||||||
packPointer[1U] = bufferData[i + 1U];
|
packPointer[1U] = bufferData[i + 1U];
|
||||||
packPointer[2U] = bufferData[i + 2U];
|
packPointer[2U] = bufferData[i + 2U];
|
||||||
unpackedSamples[1U] = short(int(pack & FM_MASK) - 2048);
|
unpackedSamples[1U] = short(int(pack & FM_MASK) - 2048);
|
||||||
unpackedSamples[0U] = short(int(pack >> 12) - 2048);
|
unpackedSamples[0U] = short(int(pack >> 12 & FM_MASK) - 2048); //
|
||||||
|
|
||||||
//process unpacked sample pair
|
//process unpacked sample pair
|
||||||
for (unsigned char j = 0U; j < 2U; j++) {
|
for (unsigned char j = 0U; j < 2U; j++) {
|
||||||
@@ -133,11 +133,11 @@ unsigned int CFMControl::readModem(unsigned char* data, unsigned int space)
|
|||||||
if (m_network == NULL)
|
if (m_network == NULL)
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
if (space > 252U)
|
if (space > 240U) //160 samples 12-bit
|
||||||
space = 252U;
|
space = 240U; //160 samples 12-bit
|
||||||
|
|
||||||
float netData[168U]; // Modem can handle up to 168 samples at a time
|
float netData[160U]; // Modem can handle up to 160 samples at a time
|
||||||
unsigned int length = m_network->read(netData, 168U);
|
unsigned int length = m_network->read(netData, 160U); //160 samples 12-bit
|
||||||
if (length == 0U)
|
if (length == 0U)
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
|
|||||||
@@ -117,14 +117,14 @@ bool CFMNetwork::writeData(float* data, unsigned int nSamples)
|
|||||||
|
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
for (long i = 0L; i < nSamples; i++) {
|
for (long i = 0L; i < nSamples; i++) {
|
||||||
unsigned short val = (unsigned short)((data[i] + 1.0F) * 32767.0F + 0.5F);
|
short val = ( short)((data[i] ) * 32767.0F); // Changing audio format from U16BE to S16LE
|
||||||
#else
|
#else
|
||||||
for (long i = 0L; i < src.output_frames_gen; i++) {
|
for (long i = 0L; i < src.output_frames_gen; i++) {
|
||||||
unsigned short val = (unsigned short)((src.data_out[i] + 1.0F) * 32767.0F + 0.5F);
|
short val = ( short)((src.data_out[i] ) * 32767.0F ); // Changing audio format from U16BE to S16LE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
buffer[length++] = (val >> 8) & 0xFFU;
|
buffer[length++] = (val >> 0) & 0xFFU; // changing from BE to LE
|
||||||
buffer[length++] = (val >> 0) & 0xFFU;
|
buffer[length++] = (val >> 8) & 0xFFU; // changing from BE to LE
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_debug)
|
if (m_debug)
|
||||||
@@ -164,11 +164,11 @@ void CFMNetwork::clock(unsigned int ms)
|
|||||||
if (length <= 0)
|
if (length <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if the data is for us
|
// Check if the data is for us // does not accept data from USRP
|
||||||
if (!CUDPSocket::match(addr, m_addr)) {
|
//if (!CUDPSocket::match(addr, m_addr)) {
|
||||||
LogMessage("FM packet received from an invalid source");
|
// LogMessage("FM packet received from an invalid source");
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
|
|
||||||
// Ignore incoming polls
|
// Ignore incoming polls
|
||||||
if (::memcmp(buffer, "FMP", 3U) == 0)
|
if (::memcmp(buffer, "FMP", 3U) == 0)
|
||||||
@@ -211,9 +211,9 @@ unsigned int CFMNetwork::read(float* data, unsigned int nSamples)
|
|||||||
float in[750U];
|
float in[750U];
|
||||||
|
|
||||||
for (unsigned int i = 0U; i < nSamples; i++) {
|
for (unsigned int i = 0U; i < nSamples; i++) {
|
||||||
unsigned short val = ((buffer[i * 2U + 0U] & 0xFFU) << 8) +
|
short val = ((buffer[i * 2U + 0U] & 0xFFU) << 0) + // Changing audio format from U16BE to S16LE
|
||||||
((buffer[i * 2U + 1U] & 0xFFU) << 0);
|
((buffer[i * 2U + 1U] & 0xFFU) << 8); // Changing audio format from U16BE to S16LE
|
||||||
in[i] = (float(val) - 32768.0F) / 32768.0F;
|
in[i] = (float(val) / 65536.0F); // Changing audio format from U16BE to S16LE
|
||||||
}
|
}
|
||||||
|
|
||||||
src.data_in = in;
|
src.data_in = in;
|
||||||
@@ -233,9 +233,9 @@ unsigned int CFMNetwork::read(float* data, unsigned int nSamples)
|
|||||||
} else {
|
} else {
|
||||||
#endif
|
#endif
|
||||||
for (unsigned int i = 0U; i < nSamples; i++) {
|
for (unsigned int i = 0U; i < nSamples; i++) {
|
||||||
unsigned short val = ((buffer[i * 2U + 0U] & 0xFFU) << 8) +
|
short val = ((buffer[i * 2U + 0U] & 0xFFU) << 0) + // Changing audio format from U16BE to S16LE
|
||||||
((buffer[i * 2U + 1U] & 0xFFU) << 0);
|
((buffer[i * 2U + 1U] & 0xFFU) << 8); // Changing audio format from U16BE to S16LE
|
||||||
data[i] = (float(val) - 32768.0F) / 32768.0F;
|
data[i] = (float(val) / 65536.0F); // Changing audio format from U16BE to S16LE
|
||||||
}
|
}
|
||||||
|
|
||||||
return nSamples;
|
return nSamples;
|
||||||
|
|||||||
Reference in New Issue
Block a user