const dgram = require('dgram'); const client = dgram.createSocket({ type: 'udp4', reuseAddr: true }); const sdp = require('./sdp'); //config const addr = '10.10.1.100'; const danteMulticast = '239.255.220.221'; const aes67Multicast = '239.69.1.122'; const samplerate = 48000; const channels = 2; const encoding = 'L24'; const name = 'Dante Multicast Relay'; const sessID = Math.round(Date.now() / 1000); const sessVersion = sessID; const ptpMaster = '08-00-00-ff-fe-00-00-1f:0'; //rtp specific vars var seqNum = 0; client.on('listening', function() { client.addMembership(danteMulticast, addr); client.setMulticastInterface(addr); }); client.on('message', function(buffer, remote) { //read values from buffer var channelCount = buffer.readUInt8(0); var timestampSeconds = buffer.readUInt32BE(1); //bytes 6 and 7 seem to be always 0x00, maybe reserved bytes var timestampMedia = buffer.readUInt16BE(7); var pcmData = buffer.slice(9); //calculate media timestamp for rtp var timestampRTP = ((timestampSeconds * samplerate) + timestampMedia) & 0xffffffff; //create RTP header var rtpHeader = Buffer.alloc(12); rtpHeader.writeUInt16BE(0x8061, 0); rtpHeader.writeUInt16BE(seqNum, 2); rtpHeader.writeInt32BE(timestampRTP, 4); rtpHeader.writeUInt32BE(0xaf12af34, 8); //create and send RTP packet var rtpBuffer = Buffer.concat([rtpHeader, pcmData]); client.send(rtpBuffer, 5004, aes67Multicast); //increase seqnum seqNum = (seqNum + 1) % 65536; }); client.bind(4321); sdp.start(addr, aes67Multicast, samplerate, channels, encoding, name, sessID, sessVersion, ptpMaster);