diff --git a/DMR2M17/ModeConv.cpp b/DMR2M17/ModeConv.cpp index f3d3841..b923e69 100644 --- a/DMR2M17/ModeConv.cpp +++ b/DMR2M17/ModeConv.cpp @@ -580,38 +580,59 @@ void CModeConv::putM17(unsigned char* data) { assert(data != NULL); - int16_t audio[160U]; - int16_t audio_adjusted[160U]; + int16_t audio[320U]; + int16_t audio_adjusted[320U]; uint8_t ambe[72U]; uint8_t codec2[8U]; uint8_t vch[10U]; + size_t s = 160; + ::memset(audio, 0, sizeof(audio)); ::memset(ambe, 0, sizeof(ambe)); ::memcpy(codec2, &data[36], 8); + + if((data[19] & 0x06U) == 0x04U){ //"3200 Voice"; + m_c2->codec2_set_mode(true); + s = 160; + } + else{ //"1600 V/D"; + m_c2->codec2_set_mode(false); + s = 320; + } + m_c2->codec2_decode(audio, codec2); - for(int i = 0; i < 160; ++i){ + + for(size_t i = 0; i < s; ++i){ m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; } //m_mbe->encode_2450(audio_adjusted, ambe); m_mbe->encode_dmr(audio_adjusted, ambe); - encode(ambe, vch, 0U); m_DMR.addData(&TAG_DATA, 1U); m_DMR.addData(ambe, 9U); m_dmrN += 1U; - ::memcpy(codec2, &data[44], 8); - m_c2->codec2_decode(audio, codec2); - for(int i = 0; i < 160; ++i){ - m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; + int16_t *p = audio_adjusted; + + if(s == 160){ + ::memcpy(codec2, &data[44], 8); + m_c2->codec2_decode(audio, codec2); + for(int i = 0; i < 160; ++i){ + m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; + } + } + else{ + p = &audio_adjusted[160U]; } //m_mbe->encode_2450(audio_adjusted, ambe); - m_mbe->encode_dmr(audio_adjusted, ambe); + m_mbe->encode_dmr(p, ambe); + encode(ambe, vch, 0U); m_DMR.addData(&TAG_DATA, 1U); m_DMR.addData(ambe, 9U); m_dmrN += 1U; + m_c2->codec2_set_mode(true); } unsigned int CModeConv::getDMR(unsigned char* data) diff --git a/M172DMR/ModeConv.cpp b/M172DMR/ModeConv.cpp index b9cde71..4ea07f6 100644 --- a/M172DMR/ModeConv.cpp +++ b/M172DMR/ModeConv.cpp @@ -580,17 +580,30 @@ void CModeConv::putM17(unsigned char* data) { assert(data != NULL); - int16_t audio[160U]; - int16_t audio_adjusted[160U]; + int16_t audio[320U]; + int16_t audio_adjusted[320U]; uint8_t ambe[72U]; uint8_t codec2[8U]; uint8_t vch[10U]; + size_t s = 160; + ::memset(audio, 0, sizeof(audio)); ::memset(ambe, 0, sizeof(ambe)); ::memcpy(codec2, &data[36], 8); + + if((data[19] & 0x06U) == 0x04U){ //"3200 Voice"; + m_c2->codec2_set_mode(true); + s = 160; + } + else{ //"1600 V/D"; + m_c2->codec2_set_mode(false); + s = 320; + } + m_c2->codec2_decode(audio, codec2); - for(int i = 0; i < 160; ++i){ + + for(size_t i = 0; i < s; ++i){ m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; } //m_mbe->encode_2450(audio_adjusted, ambe); @@ -600,18 +613,26 @@ void CModeConv::putM17(unsigned char* data) m_DMR.addData(ambe, 9U); m_dmrN += 1U; - ::memcpy(codec2, &data[44], 8); - m_c2->codec2_decode(audio, codec2); - for(int i = 0; i < 160; ++i){ - m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; + int16_t *p = audio_adjusted; + + if(s == 160){ + ::memcpy(codec2, &data[44], 8); + m_c2->codec2_decode(audio, codec2); + for(int i = 0; i < 160; ++i){ + m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; + } + } + else{ + p = &audio_adjusted[160U]; } //m_mbe->encode_2450(audio_adjusted, ambe); - m_mbe->encode_dmr(audio_adjusted, ambe); + m_mbe->encode_dmr(p, ambe); encode(ambe, vch, 0U); m_DMR.addData(&TAG_DATA, 1U); m_DMR.addData(ambe, 9U); m_dmrN += 1U; + m_c2->codec2_set_mode(true); } unsigned int CModeConv::getDMR(unsigned char* data) diff --git a/M172YSF/ModeConv.cpp b/M172YSF/ModeConv.cpp index a865216..de7f122 100644 --- a/M172YSF/ModeConv.cpp +++ b/M172YSF/ModeConv.cpp @@ -195,16 +195,27 @@ void CModeConv::putM17(unsigned char* data) { assert(data != NULL); - int16_t audio[160U]; - int16_t audio_adjusted[160U]; + int16_t audio[320U]; + int16_t audio_adjusted[320U]; uint8_t codec2[8U]; uint8_t vch[13U]; + size_t s = 160; ::memset(audio, 0, sizeof(audio)); ::memcpy(codec2, &data[36], 8); + + if((data[19] & 0x06U) == 0x04U){ //"3200 Voice"; + m_c2->codec2_set_mode(true); + s = 160; + } + else{ //"1600 V/D"; + m_c2->codec2_set_mode(false); + s = 320; + } + m_c2->codec2_decode(audio, codec2); - for(int i = 0; i < 160; ++i){ + for(size_t i = 0; i < s; ++i){ m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; } @@ -213,18 +224,26 @@ void CModeConv::putM17(unsigned char* data) m_YSF.addData(vch, 13U); m_ysfN += 1U; - ::memset(audio, 0, sizeof(audio)); - ::memcpy(codec2, &data[44], 8); - m_c2->codec2_decode(audio, codec2); + int16_t *p = audio_adjusted; - for(int i = 0; i < 160; ++i){ - m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; + if(s == 160){ + ::memset(audio, 0, sizeof(audio)); + ::memcpy(codec2, &data[44], 8); + m_c2->codec2_decode(audio, codec2); + + for(int i = 0; i < 160; ++i){ + m_m17Attenuate ? audio_adjusted[i] = audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; + } + } + else{ + p = &audio_adjusted[160U]; } - encodeYSF(audio_adjusted, vch); + encodeYSF(p, vch); m_YSF.addData(&TAG_DATA, 1U); m_YSF.addData(vch, 13U); m_ysfN += 1U; + m_c2->codec2_set_mode(true); } unsigned int CModeConv::getYSF(unsigned char* data) diff --git a/USRP2M17/ModeConv.cpp b/USRP2M17/ModeConv.cpp index d075013..6af6fdf 100644 --- a/USRP2M17/ModeConv.cpp +++ b/USRP2M17/ModeConv.cpp @@ -129,31 +129,50 @@ void CModeConv::putM17EOT() void CModeConv::putM17(uint8_t* data) { - int16_t audio[160U]; - int16_t audio_adjusted[160U]; + int16_t audio[320U]; + int16_t audio_adjusted[320U]; uint8_t codec2[8U]; + size_t s = 160; ::memset(audio, 0, sizeof(audio)); ::memcpy(codec2, &data[36], 8); + if((data[19] & 0x06U) == 0x04U){ //"3200 Voice"; + m_c2->codec2_set_mode(true); + s = 160; + } + else{ //"1600 V/D"; + m_c2->codec2_set_mode(false); + s = 320; + } + m_c2->codec2_decode(audio, codec2); - for(int i = 0; i < 160; ++i){ + for(size_t i = 0; i < s; ++i){ audio_adjusted[i] = m_m17Attenuate ? audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; } m_USRP.addData(&TAG_USRP_DATA, 1U); - m_USRP.addData(audio_adjusted, 160U); + m_USRP.addData(audio_adjusted, 160); m_usrpN += 1U; - ::memcpy(codec2, &data[44], 8); - m_c2->codec2_decode(audio, codec2); - for(int i = 0; i < 160; ++i){ - audio_adjusted[i] = m_m17Attenuate ? audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; + int16_t *p = audio_adjusted; + + if(s == 160){ + ::memcpy(codec2, &data[44], 8); + m_c2->codec2_decode(audio, codec2); + for(int i = 0; i < 160; ++i){ + audio_adjusted[i] = m_m17Attenuate ? audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; + } } + else{ + p = &audio_adjusted[160U]; + } + m_USRP.addData(&TAG_USRP_DATA, 1U); - m_USRP.addData(audio_adjusted, 160U); + m_USRP.addData(p, 160U); m_usrpN += 1U; + m_c2->codec2_set_mode(true); } uint32_t CModeConv::getUSRP(int16_t* data)