void *receiveAudioViaUDP(void *args) { AudioRecThreadStruct *threadArgs = (AudioRecThreadStruct *) args; AudioData *sharedAudioData = threadArgs->sharedAudioData; int16_t *receivedData = new int16_t[PACKET_LENGTH_SAMPLES]; ssize_t receivedBytes; // Init Jitter timer values timeval previousReceiveTime, currentReceiveTime = {}; gettimeofday(&previousReceiveTime, NULL); gettimeofday(¤tReceiveTime, NULL); int totalPacketsReceived = 0; stdev.reset(); if (LOG_SAMPLE_DELAY) { char *directory = new char[50]; char *filename = new char[50]; sprintf(directory, "%s/Desktop/echo_tests", getenv("HOME")); mkdir(directory, S_IRWXU | S_IRWXG | S_IRWXO); sprintf(filename, "%s/%ld.csv", directory, previousReceiveTime.tv_sec); logFile.open(filename, std::ios::out); delete[] directory; delete[] filename; } while (!stopAudioReceiveThread) { if (sharedAudioData->audioSocket->receive((void *)receivedData, &receivedBytes)) { gettimeofday(¤tReceiveTime, NULL); totalPacketsReceived++; if (LOG_SAMPLE_DELAY) { // write time difference (in microseconds) between packet receipts to file double timeDiff = diffclock(&previousReceiveTime, ¤tReceiveTime); logFile << timeDiff << std::endl; } double tDiff = diffclock(&previousReceiveTime, ¤tReceiveTime); //printf("tDiff %4.1f\n", tDiff); // Discard first few received packets for computing jitter (often they pile up on start) if (totalPacketsReceived > 3) stdev.addValue(tDiff); if (stdev.getSamples() > 500) { sharedAudioData->measuredJitter = stdev.getStDev(); //printf("Avg: %4.2f, Stdev: %4.2f\n", stdev.getAverage(), sharedAudioData->measuredJitter); stdev.reset(); } AudioRingBuffer *ringBuffer = sharedAudioData->ringBuffer; if (!ringBuffer->isStarted()) { packetsReceivedThisPlayback++; } else { //printf("Audio packet received at %6.0f\n", usecTimestampNow()/1000); } if (packetsReceivedThisPlayback == 1) gettimeofday(&firstPlaybackTimer, NULL); ringBuffer->parseData(receivedData, PACKET_LENGTH_BYTES); previousReceiveTime = currentReceiveTime; } } pthread_exit(0); }