diff --git a/chunk.h b/chunk.h index 96c37422..6a08be87 100644 --- a/chunk.h +++ b/chunk.h @@ -11,7 +11,7 @@ #define PLAYER_CHUNK_MS (5) #define PLAYER_CHUNK_SIZE (SAMPLE_RATE*CHANNELS*SAMPLE_BIT/8*PLAYER_CHUNK_MS/1000) -#define FRAMES_PER_BUFFER (WIRE_CHUNK_SIZE/4) +#define FRAMES_PER_BUFFER (PLAYER_CHUNK_SIZE/(CHANNELS*SAMPLE_BIT/8)) int bufferMs; diff --git a/client.cpp b/client.cpp index ac2b8844..08558380 100644 --- a/client.cpp +++ b/client.cpp @@ -23,7 +23,7 @@ DoubleBuffer buffer(30000 / WIRE_CHUNK_MS); -std::deque chunks; +std::deque chunks; std::deque timeDiffs; std::mutex mtx; std::mutex mutex; @@ -54,7 +54,7 @@ void player() if (chunks.empty()) cv.wait(lck); mutex.lock(); - Chunk* chunk = chunks.front(); + PlayerChunk* chunk = chunks.front(); // std::cerr << "Chunks: " << chunks.size() << "\n"; chunks.pop_front(); mutex.unlock(); @@ -128,7 +128,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, void *userData ) { // std::cerr << "outputBufferDacTime: " << timeInfo->outputBufferDacTime*1000 << "\n"; - std::deque* chunks = (std::deque*)userData; + std::deque* chunks = (std::deque*)userData; short* out = (short*)outputBuffer; unsigned long i; @@ -138,7 +138,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, std::unique_lock lck(mtx); int age = 0; - Chunk* chunk = NULL; + PlayerChunk* chunk = NULL; while (1) { if (chunks->empty()) @@ -161,7 +161,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, } else if (/*!buffer.full() &&*/ (age < bufferMs - std::max(100, 2*WIRE_CHUNK_MS))) { - chunk = new Chunk(); + chunk = new PlayerChunk(); memset(&(chunk->payload[0]), 0, WIRE_CHUNK_SIZE); std::cerr << "age < bufferMs (" << age << " < " << bufferMs << "), playing silence\n"; usleep(10 * 1000); @@ -181,7 +181,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, buffer.clear(); if (bufferMs - median > WIRE_CHUNK_MS) { - chunk = new Chunk(); + chunk = new PlayerChunk(); memset(&(chunk->payload[0]), 0, WIRE_CHUNK_SIZE); sleepMs(bufferMs - median - WIRE_CHUNK_MS + 10); break; @@ -238,7 +238,7 @@ int initAudio() fprintf(stderr,"Error: No default output device.\n"); goto error; } - outputParameters.channelCount = 2; /* stereo output */ + outputParameters.channelCount = CHANNELS; /* stereo output */ outputParameters.sampleFormat = paInt16; /* 32 bit floating point output */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; @@ -307,14 +307,21 @@ int main (int argc, char *argv[]) subscriber.recv(&update); Chunk* chunk = new Chunk(); memcpy(chunk, update.data(), sizeof(Chunk)); - timeval now; - gettimeofday(&now, NULL); + for (size_t n=0; npayload[0]), &chunk->payload[n*PLAYER_CHUNK_SIZE], PLAYER_CHUNK_SIZE); + mutex.lock(); + chunks.push_back(playerChunk); + mutex.unlock(); + cv.notify_all(); + } + +// timeval now; +// gettimeofday(&now, NULL); // std::cerr << "New chunk: " << chunkTime(*chunk) << "\t" << timeToStr(now) << "\t" << getAge(*chunk) << "\n"; - mutex.lock(); - chunks.push_back(chunk); - mutex.unlock(); - cv.notify_all(); } return 0; } diff --git a/timeUtils.h b/timeUtils.h index 94fa03f7..800028b8 100644 --- a/timeUtils.h +++ b/timeUtils.h @@ -16,7 +16,8 @@ std::string timeToStr(const timeval& timestamp) } -std::string chunkTime(const Chunk& chunk) +template +std::string chunkTime(const T& chunk) { timeval ts; ts.tv_sec = chunk.tv_sec; @@ -32,7 +33,8 @@ int diff_ms(const timeval& t1, const timeval& t2) } -int getAge(const Chunk& chunk) +template +int getAge(const T& chunk) { timeval now; gettimeofday(&now, NULL);