1 #include "LibCyberRadio/NDR651/Packetizer.h" 8 Packetizer::Packetizer(
const std::string &txInterfaceName,
unsigned short txUdpPort,
unsigned int ducRateIndex,
bool debug) :
9 Debuggable(debug,
"Packetizer"),
10 txInterfaceName(txInterfaceName),
12 samplesPerFrame(1024),
13 sampleRate(calculateSampleRate(ducRateIndex)),
15 fracTimestampIncrement(2048)
23 this->txVec[1].iov_base = NULL;
24 this->txVec[1].iov_len = 0;
32 Packetizer::~Packetizer()
34 if (this->txSocket >= 0)
36 close(this->txSocket);
40 if (this->txVec[0].iov_base != NULL)
42 delete [] (
char *)(this->txVec[0].iov_base);
44 if (this->txVec[2].iov_base != NULL)
46 delete [] (
char *)(this->txVec[2].iov_base);
49 this->debug(
"Exiting Packetizer\n");
55 void Packetizer::sendFrame(
short * samples)
57 if (this->txSocket >= 0)
60 this->txVec[1].iov_base = (
char *)(samples);
61 this->txVec[1].iov_len = 4*(this->samplesPerFrame);
62 int bytesSent = writev(this->txSocket, this->txVec, 3);
63 this->incrementVitaHeader();
67 void Packetizer::setSamplesPerFrame(
unsigned int samplesPerFrame){
68 this->samplesPerFrame = samplesPerFrame;
69 this->setVitaHeader(this->txUdpPort);
73 void Packetizer::start()
75 this->debug(
"Starting the Packetizer\n");
76 this->initBroadcastTxSocket(txInterfaceName, txUdpPort);
77 this->setVitaHeader(txUdpPort);
80 int Packetizer::getSocketFd()
82 return this->txSocket;
86 void Packetizer::setVitaHeader(
unsigned short streamId)
89 this->fracTimestampIncrement = ((
unsigned long long)(DAC_RATE) / (this->sampleRate * 2)) * (this->samplesPerFrame*2);
95 hdr->
frameSize = this->samplesPerFrame+10;
111 void Packetizer::incrementVitaHeader()
117 if ((hdr->
timeFracSecLSB + this->fracTimestampIncrement) >= DAC_RATE)
124 void Packetizer::initBroadcastTxSocket(
const std::string &txInterfaceName,
unsigned short port)
130 int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
134 throw std::runtime_error(
"Could not create socket");
139 rv = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (
const void *)&optval,
sizeof(
int) );
143 throw std::runtime_error(
"Could not set broadcast sockopt");
148 struct ifaddrs *ifap, *ifa;
149 struct sockaddr_in *sa;
151 std::string retString;
153 for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
154 if ( strcmp(ifa->ifa_name,txInterfaceName.c_str())==0 ){
155 if (ifa->ifa_addr->sa_family==AF_INET) {
156 sa = (
struct sockaddr_in *) ifa->ifa_ifu.ifu_broadaddr;
157 sa->sin_port = htons(port);
158 addr = inet_ntoa(sa->sin_addr);
166 rv = connect(sockfd, (
struct sockaddr *)sa,
sizeof(sockaddr_in));
170 throw std::runtime_error(
"Could not call connect on the UDP socket");
174 this->txSocket = sockfd;
178 unsigned long long Packetizer::calculateSampleRate(
unsigned int ducRateIndex)
180 switch(ducRateIndex) {
Defines functionality for LibCyberRadio applications.
uint32_t frameEnd
Frame end word (ASCII string "VEND")
VITA 49 frame trailer information.