Пример #1
0
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(&currentReceiveTime, 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(&currentReceiveTime, NULL);
            totalPacketsReceived++;

            if (LOG_SAMPLE_DELAY) {
                // write time difference (in microseconds) between packet receipts to file
                double timeDiff = diffclock(&previousReceiveTime, &currentReceiveTime);
                logFile << timeDiff << std::endl;
            }
            
            double tDiff = diffclock(&previousReceiveTime, &currentReceiveTime);
            //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);
}