mirror of https://github.com/LX3JL/xlxd.git
Merge 9581d729a7 into b3360b66e2
commit
1fbe437b2b
@ -0,0 +1,242 @@
|
|||||||
|
//
|
||||||
|
// ccodec2interface.cpp
|
||||||
|
// ambed
|
||||||
|
//
|
||||||
|
// Created by Antony Chazapis (SV9OAN) on 26/12/2018.
|
||||||
|
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This file is part of ambed.
|
||||||
|
//
|
||||||
|
// xlxd is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// xlxd 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include "ctimepoint.h"
|
||||||
|
#include "cambepacket.h"
|
||||||
|
#include "cvoicepacket.h"
|
||||||
|
#include "ccodec2interface.h"
|
||||||
|
#include "cvocodecchannel.h"
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// constructor
|
||||||
|
|
||||||
|
CCodec2Interface::CCodec2Interface()
|
||||||
|
: CVocodecInterface()
|
||||||
|
{}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// destructor
|
||||||
|
|
||||||
|
CCodec2Interface::~CCodec2Interface()
|
||||||
|
{
|
||||||
|
codec2_destroy(codec2_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// initialization
|
||||||
|
|
||||||
|
bool CCodec2Interface::Init(void)
|
||||||
|
{
|
||||||
|
bool ok = true;
|
||||||
|
|
||||||
|
// create codec state
|
||||||
|
codec2_state = codec2_create(CODEC2_MODE_3200);
|
||||||
|
if (codec2_state == NULL)
|
||||||
|
{
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// base class
|
||||||
|
if ( ok )
|
||||||
|
{
|
||||||
|
ok &= CVocodecInterface::Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
// done
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// task
|
||||||
|
|
||||||
|
void CCodec2Interface::Task(void)
|
||||||
|
{
|
||||||
|
CPacketQueue *Queue;
|
||||||
|
CVocodecChannel *Channel;
|
||||||
|
CAmbePacket AmbePacket;
|
||||||
|
CVoicePacket VoicePacket;
|
||||||
|
bool done;
|
||||||
|
|
||||||
|
// process the streams (channels) incoming queue
|
||||||
|
do
|
||||||
|
{
|
||||||
|
done = true;
|
||||||
|
for ( int i = 0; i < GetNbChannels(); i++ )
|
||||||
|
{
|
||||||
|
// get active outgoing channel for interface channel
|
||||||
|
Channel = GetChannelWithChannelOut(i);
|
||||||
|
|
||||||
|
// any packet in voice queue 1 ?
|
||||||
|
if ( Channel != NULL && Channel->IsInterfaceOut1(this) )
|
||||||
|
{
|
||||||
|
CVoicePacket *Packet = NULL;
|
||||||
|
|
||||||
|
Queue = Channel->GetVoiceQueue1();
|
||||||
|
if ( !Queue->empty() )
|
||||||
|
{
|
||||||
|
// get packet
|
||||||
|
Packet = (CVoicePacket *)Queue->front();
|
||||||
|
Queue->pop();
|
||||||
|
}
|
||||||
|
Channel->ReleaseVoiceQueue1();
|
||||||
|
|
||||||
|
if ( Packet != NULL )
|
||||||
|
{
|
||||||
|
// this is second step of transcoding
|
||||||
|
// we just received from a decoded speech packet
|
||||||
|
// encode and cpush back to relevant channel outcoming queue
|
||||||
|
EncodeVoicePacket(Packet, &AmbePacket);
|
||||||
|
AmbePacket.SetPid(Packet->GetPid());
|
||||||
|
delete Packet;
|
||||||
|
|
||||||
|
CAmbePacket *clone = new CAmbePacket(AmbePacket);
|
||||||
|
|
||||||
|
Queue = Channel->GetPacketQueueOut1();
|
||||||
|
Queue->push(clone);
|
||||||
|
Channel->ReleasePacketQueueOut1();
|
||||||
|
|
||||||
|
// done
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// any packet in voice queue 1 ?
|
||||||
|
if ( Channel != NULL && Channel->IsInterfaceOut2(this) )
|
||||||
|
{
|
||||||
|
CVoicePacket *Packet = NULL;
|
||||||
|
|
||||||
|
Queue = Channel->GetVoiceQueue2();
|
||||||
|
if ( !Queue->empty() )
|
||||||
|
{
|
||||||
|
// get packet
|
||||||
|
Packet = (CVoicePacket *)Queue->front();
|
||||||
|
Queue->pop();
|
||||||
|
}
|
||||||
|
Channel->ReleaseVoiceQueue2();
|
||||||
|
|
||||||
|
if ( Packet != NULL )
|
||||||
|
{
|
||||||
|
// this is second step of transcoding
|
||||||
|
// we just received from a decoded speech packet
|
||||||
|
// encode and cpush back to relevant channel outcoming queue
|
||||||
|
EncodeVoicePacket(Packet, &AmbePacket);
|
||||||
|
AmbePacket.SetPid(Packet->GetPid());
|
||||||
|
delete Packet;
|
||||||
|
|
||||||
|
CAmbePacket *clone = new CAmbePacket(AmbePacket);
|
||||||
|
|
||||||
|
Queue = Channel->GetPacketQueueOut2();
|
||||||
|
Queue->push(clone);
|
||||||
|
Channel->ReleasePacketQueueOut2();
|
||||||
|
|
||||||
|
// done
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get active incoming channel for interface channel
|
||||||
|
Channel = GetChannelWithChannelIn(i);
|
||||||
|
|
||||||
|
// any packet in ambe queue for us ?
|
||||||
|
if ( Channel != NULL && Channel->IsInterfaceIn(this) )
|
||||||
|
{
|
||||||
|
CAmbePacket *Packet = NULL;
|
||||||
|
|
||||||
|
Queue = Channel->GetPacketQueueIn();
|
||||||
|
if ( !Queue->empty() )
|
||||||
|
{
|
||||||
|
// get packet
|
||||||
|
Packet = (CAmbePacket *)Queue->front();
|
||||||
|
Queue->pop();
|
||||||
|
}
|
||||||
|
Channel->ReleasePacketQueueIn();
|
||||||
|
|
||||||
|
if ( Packet != NULL )
|
||||||
|
{
|
||||||
|
// this is first step of transcoding
|
||||||
|
// a fresh new packet to be transcoded is showing up
|
||||||
|
// decode and copy the result into both voice queues
|
||||||
|
DecodeAmbePacket(Packet, &VoicePacket);
|
||||||
|
VoicePacket.SetPid(Packet->GetPid());
|
||||||
|
delete Packet;
|
||||||
|
|
||||||
|
CVoicePacket *clone1 = new CVoicePacket(VoicePacket);
|
||||||
|
clone1->ApplyGain(Channel->GetSpeechGain());
|
||||||
|
CVoicePacket *clone2 = new CVoicePacket(*clone1);
|
||||||
|
|
||||||
|
Queue = Channel->GetVoiceQueue1();
|
||||||
|
Queue->push(clone1);
|
||||||
|
Channel->ReleaseVoiceQueue1();
|
||||||
|
|
||||||
|
Queue = Channel->GetVoiceQueue2();
|
||||||
|
Queue->push(clone2);
|
||||||
|
Channel->ReleaseVoiceQueue2();
|
||||||
|
|
||||||
|
// done
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (!done);
|
||||||
|
|
||||||
|
// and wait a bit
|
||||||
|
CTimePoint::TaskSleepFor(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// decoder helper
|
||||||
|
|
||||||
|
void CCodec2Interface::DecodeAmbePacket(CAmbePacket *PacketIn, CVoicePacket *PacketOut)
|
||||||
|
{
|
||||||
|
short voice[160];
|
||||||
|
|
||||||
|
codec2_decode(codec2_state, voice, (unsigned char *)PacketIn->GetAmbe());
|
||||||
|
for ( int i = 0; i < 160; i++ )
|
||||||
|
{
|
||||||
|
voice[i] = MAKEWORD(HIBYTE(voice[i]), LOBYTE(voice[i]));
|
||||||
|
}
|
||||||
|
PacketOut->SetVoice((uint8 *)voice, 160 * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// encoder helpers
|
||||||
|
|
||||||
|
void CCodec2Interface::EncodeVoicePacket(CVoicePacket *PacketIn, CAmbePacket *PacketOut)
|
||||||
|
{
|
||||||
|
unsigned char ambe[AMBE_SIZE];
|
||||||
|
short voice[160];
|
||||||
|
|
||||||
|
::memcpy(voice, (short *)PacketIn->GetVoice(), 160 * 2);
|
||||||
|
for ( int i = 0; i < 160; i++ )
|
||||||
|
{
|
||||||
|
voice[i] = MAKEWORD(HIBYTE(voice[i]), LOBYTE(voice[i]));
|
||||||
|
}
|
||||||
|
codec2_encode(codec2_state, ambe, voice);
|
||||||
|
ambe[8] = 0x00;
|
||||||
|
PacketOut->SetCodec(CODEC_CODEC2);
|
||||||
|
PacketOut->SetAmbe((uint8 *)ambe);
|
||||||
|
}
|
||||||
@ -0,0 +1,68 @@
|
|||||||
|
//
|
||||||
|
// ccodec2interface.h
|
||||||
|
// ambed
|
||||||
|
//
|
||||||
|
// Created by Antony Chazapis (SV9OAN) on 26/12/2018.
|
||||||
|
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This file is part of ambed.
|
||||||
|
//
|
||||||
|
// xlxd is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// xlxd 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef ccodec2interface_h
|
||||||
|
#define ccodec2interface_h
|
||||||
|
|
||||||
|
#include "cvocodecinterface.h"
|
||||||
|
#include <codec2/codec2.h>
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// class
|
||||||
|
|
||||||
|
class CCodec2Interface : public CVocodecInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// constructors
|
||||||
|
CCodec2Interface();
|
||||||
|
|
||||||
|
// destructor
|
||||||
|
virtual ~CCodec2Interface();
|
||||||
|
|
||||||
|
// initialization
|
||||||
|
bool Init(void);
|
||||||
|
|
||||||
|
// get
|
||||||
|
const char *GetName(void) const { return "Codec 2"; }
|
||||||
|
|
||||||
|
// manage channels
|
||||||
|
int GetNbChannels(void) const { return 1; }
|
||||||
|
uint8 GetChannelCodec(int) const { return CODEC_CODEC2; }
|
||||||
|
|
||||||
|
// task
|
||||||
|
void Task(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// decoder helper
|
||||||
|
void DecodeAmbePacket(CAmbePacket *, CVoicePacket *);
|
||||||
|
|
||||||
|
// encoder helpers
|
||||||
|
void EncodeVoicePacket(CVoicePacket *, CAmbePacket *);
|
||||||
|
|
||||||
|
// data
|
||||||
|
struct CODEC2 *codec2_state;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif /* ccodec2interface_h */
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
//
|
||||||
|
// cdextraopenclient.cpp
|
||||||
|
// xlxd
|
||||||
|
//
|
||||||
|
// Created by Antony Chazapis (SV9OAN) on 19/12/2018.
|
||||||
|
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This file is part of xlxd.
|
||||||
|
//
|
||||||
|
// xlxd is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// xlxd 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include "cdextraopenclient.h"
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// constructors
|
||||||
|
|
||||||
|
CDextraOpenClient::CDextraOpenClient()
|
||||||
|
: CDextraClient()
|
||||||
|
{}
|
||||||
|
|
||||||
|
CDextraOpenClient::CDextraOpenClient(const CCallsign &callsign, const CIp &ip, char reflectorModule, int protRev)
|
||||||
|
: CDextraClient(callsign, ip, reflectorModule, protRev)
|
||||||
|
{}
|
||||||
|
|
||||||
|
CDextraOpenClient::CDextraOpenClient(const CDextraClient &client)
|
||||||
|
: CDextraClient(client)
|
||||||
|
{}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
//
|
||||||
|
// cdextraopenclient.h
|
||||||
|
// xlxd
|
||||||
|
//
|
||||||
|
// Created by Antony Chazapis (SV9OAN) on 19/12/2018.
|
||||||
|
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This file is part of xlxd.
|
||||||
|
//
|
||||||
|
// xlxd is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// xlxd 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef cdextraopenclient_h
|
||||||
|
#define cdextraopenclient_h
|
||||||
|
|
||||||
|
#include "cdextraclient.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// define
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// class
|
||||||
|
|
||||||
|
class CDextraOpenClient : public CDextraClient
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// constructors
|
||||||
|
CDextraOpenClient();
|
||||||
|
CDextraOpenClient(const CCallsign &, const CIp &, char = ' ', int = 0);
|
||||||
|
CDextraOpenClient(const CDextraClient &);
|
||||||
|
|
||||||
|
// destructor
|
||||||
|
virtual ~CDextraOpenClient() {};
|
||||||
|
|
||||||
|
// identity
|
||||||
|
int GetProtocol(void) const { return PROTOCOL_DEXTRA_OPEN; }
|
||||||
|
const char *GetProtocolName(void) const { return "DExtra Open"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif /* cdextraopenclient_h */
|
||||||
@ -0,0 +1,98 @@
|
|||||||
|
//
|
||||||
|
// cdextraopenprotocol.cpp
|
||||||
|
// xlxd
|
||||||
|
//
|
||||||
|
// Created by Antony Chazapis (SV9OAN) on 19/12/2018.
|
||||||
|
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This file is part of xlxd.
|
||||||
|
//
|
||||||
|
// xlxd is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// xlxd 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include "cdextraopenprotocol.h"
|
||||||
|
#include "cdextraopenclient.h"
|
||||||
|
#include "creflector.h"
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// operation
|
||||||
|
|
||||||
|
bool CDextraOpenProtocol::Init(void)
|
||||||
|
{
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
// base class
|
||||||
|
ok = CProtocol::Init();
|
||||||
|
|
||||||
|
// update the reflector callsign
|
||||||
|
m_ReflectorCallsign.PatchCallsign(0, (const uint8 *)"ORF", 3);
|
||||||
|
|
||||||
|
// create our socket
|
||||||
|
ok &= m_Socket.Open(DEXTRA_OPEN_PORT);
|
||||||
|
if ( !ok )
|
||||||
|
{
|
||||||
|
std::cout << "Error opening socket on port UDP" << DEXTRA_OPEN_PORT << " on ip " << g_Reflector.GetListenIp() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update time
|
||||||
|
m_LastKeepaliveTime.Now();
|
||||||
|
|
||||||
|
// done
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// create client
|
||||||
|
|
||||||
|
CClient *CDextraOpenProtocol::CreateClient(const CCallsign &callsign, const CIp &ip, char reflectormodule, int revision) const
|
||||||
|
{
|
||||||
|
CClient *client = new CDextraOpenClient(callsign, ip, reflectormodule, revision);
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// packet encoding helpers
|
||||||
|
|
||||||
|
bool CDextraOpenProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Packet, CBuffer *Buffer) const
|
||||||
|
{
|
||||||
|
uint8 tag[] = { 'D','S','V','T',0x10,0x00,0x00,0x00,0x20,0x00,0x01,0x02 };
|
||||||
|
struct dstar_header DstarHeader;
|
||||||
|
|
||||||
|
Packet.ConvertToDstarStruct(&DstarHeader, CODEC_CODEC2);
|
||||||
|
|
||||||
|
Buffer->Set(tag, sizeof(tag));
|
||||||
|
Buffer->Append(Packet.GetStreamId());
|
||||||
|
Buffer->Append((uint8)0x80);
|
||||||
|
Buffer->Append((uint8 *)&DstarHeader, sizeof(struct dstar_header));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CDextraOpenProtocol::EncodeDvFramePacket(const CDvFramePacket &Packet, CBuffer *Buffer) const
|
||||||
|
{
|
||||||
|
uint8 tag[] = { 'D','S','V','T',0x20,0x00,0x00,0x00,0x20,0x00,0x01,0x02 };
|
||||||
|
|
||||||
|
Buffer->Set(tag, sizeof(tag));
|
||||||
|
Buffer->Append(Packet.GetStreamId());
|
||||||
|
Buffer->Append((uint8)(Packet.GetPacketId() % 21));
|
||||||
|
Buffer->Append((uint8 *)Packet.GetCodec2(), AMBE_SIZE);
|
||||||
|
Buffer->Append((uint8 *)Packet.GetDvData(), DVDATA_SIZE);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,82 @@
|
|||||||
|
//
|
||||||
|
// cdextraopenprotocol.h
|
||||||
|
// xlxd
|
||||||
|
//
|
||||||
|
// Created by Antony Chazapis (SV9OAN) on 19/12/2018.
|
||||||
|
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This file is part of xlxd.
|
||||||
|
//
|
||||||
|
// xlxd is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// xlxd 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef cdextraopenprotocol_h
|
||||||
|
#define cdextraopenprotocol_h
|
||||||
|
|
||||||
|
#include "cdextraprotocol.h"
|
||||||
|
#include "cdvheaderpacket.h"
|
||||||
|
#include "cdvframepacket.h"
|
||||||
|
#include "cclient.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// With the D-STAR vocoder extension by SV9OAN, voice in D-STAR streams can be encoded
|
||||||
|
// with either AMBE or Codec 2. Although the extension is backwards compatible and
|
||||||
|
// implementations can use the same reflector connections as AMBE-only clients,
|
||||||
|
// it should be avoided, to save the user confusion and establish interoperability.
|
||||||
|
|
||||||
|
// By implementing another DExtra listener on a different port (30201 instead of 30001),
|
||||||
|
// xlxd can be used to bridge between the two formats. The new port is to be used by
|
||||||
|
// reflectors using the "ORF" prefix (Open ReFlector).
|
||||||
|
|
||||||
|
// Any client connected to an ORF reflector will receive streams encoded with Codec 2.
|
||||||
|
// All other D-STAR protocol handlers will still send out data encoded with AMBE.
|
||||||
|
// Note that the protocol/port only affects data transmitted by the reflector.
|
||||||
|
// The stream vocoder is recognized by all protocol handlers, so a client can still
|
||||||
|
// transmit data using any vocoder on any port. The rationale behind this is that
|
||||||
|
// DExtra links may be used by repeaters or other reflectors, so it is not really
|
||||||
|
// possible to know what their clients support. So, nothing will change when linking
|
||||||
|
// a repeater to an XRF reflector, but will do when linking to an ORF one.
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// class
|
||||||
|
|
||||||
|
class CDextraOpenProtocol : public CDextraProtocol
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
CDextraOpenProtocol() {};
|
||||||
|
|
||||||
|
// destructor
|
||||||
|
virtual ~CDextraOpenProtocol() {};
|
||||||
|
|
||||||
|
// initialization
|
||||||
|
bool Init(void);
|
||||||
|
|
||||||
|
// identity
|
||||||
|
int GetProtocol(void) const { return PROTOCOL_DEXTRA_OPEN; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// create client
|
||||||
|
CClient *CreateClient(const CCallsign &, const CIp &, char, int) const;
|
||||||
|
|
||||||
|
// packet encoding helpers
|
||||||
|
bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const;
|
||||||
|
bool EncodeDvFramePacket(const CDvFramePacket &, CBuffer *) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif /* cdextraopenprotocol_h */
|
||||||
Loading…
Reference in new issue