diff --git a/client.cpp b/client.cpp index d056fa9f..1fffe857 100644 --- a/client.cpp +++ b/client.cpp @@ -101,11 +101,11 @@ static int paStreamCallback( const void *inputBuffer, void *outputBuffer, -int initAudio() +PaStream* initAudio(PaError& err) { PaStreamParameters outputParameters; - PaStream *paStream; - PaError err; + PaStream *paStream = NULL; +// PaError err; printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); @@ -163,14 +163,14 @@ int initAudio() // Pa_Terminate(); // printf("Test finished.\n"); - - return err; + + return paStream; error: Pa_Terminate(); fprintf( stderr, "An error occured while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - return err; + return paStream; } @@ -187,7 +187,10 @@ int main (int argc, char *argv[]) stream = new Stream(); stream->setBufferLen(bufferMs); - initAudio(); + PaError paError; + PaStream* paStream = initAudio(paError); + stream->setLatency(1000*Pa_GetStreamInfo(paStream)->outputLatency); + std::thread playerThread(player); std::string cmd; diff --git a/stream.cpp b/stream.cpp index 0c4e32ff..46cbfb9a 100644 --- a/stream.cpp +++ b/stream.cpp @@ -5,7 +5,7 @@ using namespace std; -Stream::Stream() : sleep(0), median(0), shortMedian(0), lastUpdate(0) +Stream::Stream() : sleep(0), median(0), shortMedian(0), lastUpdate(0), latencyMs(0) { pBuffer = new DoubleBuffer(1000); pShortBuffer = new DoubleBuffer(200); @@ -36,6 +36,11 @@ void Stream::getSilentPlayerChunk(short* outputBuffer, unsigned long framesPerBu } +void Stream::setLatency(size_t latency) +{ + latencyMs = latency; +} + time_point_ms Stream::getNextPlayerChunk(short* outputBuffer, unsigned long framesPerBuffer, int correction) { @@ -134,7 +139,7 @@ void Stream::getPlayerChunk(short* outputBuffer, double outputBufferDacTime, uns // std::cerr << "Chunk " << i << ": " << chunks[i]->getAge() - bufferMs << "\n"; while (true)// (int i=0; i<(int)(round((float)sleep / (float)PLAYER_CHUNK_MS)) + 1; ++i) { - int age = Chunk::getAge(getNextPlayerChunk(outputBuffer, framesPerBuffer)) - bufferMs; + int age = Chunk::getAge(getNextPlayerChunk(outputBuffer, framesPerBuffer)) - bufferMs + latencyMs; age += 4*cardBuffer; if (age < msBuffer / 2) break; @@ -156,7 +161,7 @@ void Stream::getPlayerChunk(short* outputBuffer, double outputBufferDacTime, uns - int age = Chunk::getAge(getNextPlayerChunk(outputBuffer, framesPerBuffer, correction)) - bufferMs;// + outputBufferDacTime*1000; + int age = Chunk::getAge(getNextPlayerChunk(outputBuffer, framesPerBuffer, correction)) - bufferMs - latencyMs;// + outputBufferDacTime*1000; if (outputBufferDacTime < 1) @@ -165,7 +170,7 @@ void Stream::getPlayerChunk(short* outputBuffer, double outputBufferDacTime, uns // if (pCardBuffer->full()) // age += 4*cardBuffer; - cout << age << "\t" << framesPerBuffer << "\t" << msBuffer << "\t" << ticks << "\t" << cardBuffer << "\t" << outputBufferDacTime*1000 << "\n"; +// cout << age << "\t" << framesPerBuffer << "\t" << msBuffer << "\t" << ticks << "\t" << cardBuffer << "\t" << outputBufferDacTime*1000 << "\n"; if (sleep == 0) diff --git a/stream.h b/stream.h index a349405b..3e46e5ef 100644 --- a/stream.h +++ b/stream.h @@ -20,6 +20,7 @@ public: void addChunk(Chunk* chunk); void getPlayerChunk(short* outputBuffer, double outputBufferDacTime, unsigned long framesPerBuffer); void setBufferLen(size_t bufferLenMs); + void setLatency(size_t latency); private: time_point_ms getNextPlayerChunk(short* outputBuffer, unsigned long framesPerBuffer, int correction = 0); @@ -42,6 +43,7 @@ private: int shortMedian; time_t lastUpdate; int bufferMs; + int latencyMs; };