diff --git a/src/common/p25/lc/TSBK.cpp b/src/common/p25/lc/TSBK.cpp
index 9192ab55..8596745a 100644
--- a/src/common/p25/lc/TSBK.cpp
+++ b/src/common/p25/lc/TSBK.cpp
@@ -100,6 +100,8 @@ TSBK::TSBK() :
m_response(P25_RSP_ACCEPT),
m_netId(P25_WACN_STD_DEFAULT),
m_sysId(P25_SID_STD_DEFAULT),
+ m_grpVchId(0U),
+ m_grpVchNo(0U),
m_emergency(false),
m_encrypted(false),
m_priority(4U),
diff --git a/src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp b/src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp
index 9693bcbc..b6949a93 100644
--- a/src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp
+++ b/src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp
@@ -42,7 +42,8 @@ using namespace p25;
///
/// Initializes a new instance of the IOSP_GRP_VCH class.
///
-IOSP_GRP_VCH::IOSP_GRP_VCH() : TSBK()
+IOSP_GRP_VCH::IOSP_GRP_VCH() : TSBK(),
+ m_forceChannelId(false)
{
m_lco = TSBK_IOSP_GRP_VCH;
}
@@ -93,7 +94,7 @@ void IOSP_GRP_VCH::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
(m_emergency ? 0x80U : 0x00U) + // Emergency Flag
(m_encrypted ? 0x40U : 0x00U) + // Encrypted Flag
(m_priority & 0x07U); // Priority
- if (m_grpVchId != 0U) {
+ if ((m_grpVchId != 0U) || m_forceChannelId) {
tsbkValue = (tsbkValue << 4) + m_grpVchId; // Channel ID
}
else {
diff --git a/src/common/p25/lc/tsbk/IOSP_GRP_VCH.h b/src/common/p25/lc/tsbk/IOSP_GRP_VCH.h
index 67a50996..7775b4cd 100644
--- a/src/common/p25/lc/tsbk/IOSP_GRP_VCH.h
+++ b/src/common/p25/lc/tsbk/IOSP_GRP_VCH.h
@@ -53,6 +53,10 @@ namespace p25
/// Returns a string that represents the current TSBK.
virtual std::string toString(bool isp = false) override;
+
+ public:
+ /// Flag forcing the use of the group voice channel ID regardless of value.
+ __PROPERTY(bool, forceChannelId, ForceChannelId);
};
} // namespace tsbk
} // namespace lc