git-svn-id: svn://elaine/murooma/trunk@171 d8a302eb-03bc-478d-80e4-98257eca68ef
This commit is contained in:
(no author) 2014-08-10 11:06:06 +00:00
parent ef4a6d6942
commit 08fa827fb8
3 changed files with 21 additions and 11 deletions

View file

@ -101,11 +101,11 @@ static int paStreamCallback( const void *inputBuffer, void *outputBuffer,
int initAudio() PaStream* initAudio(PaError& err)
{ {
PaStreamParameters outputParameters; PaStreamParameters outputParameters;
PaStream *paStream; PaStream *paStream = NULL;
PaError err; // PaError err;
printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER);
@ -163,14 +163,14 @@ int initAudio()
// Pa_Terminate(); // Pa_Terminate();
// printf("Test finished.\n"); // printf("Test finished.\n");
return err; return paStream;
error: error:
Pa_Terminate(); Pa_Terminate();
fprintf( stderr, "An error occured while using the portaudio stream\n" ); fprintf( stderr, "An error occured while using the portaudio stream\n" );
fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error number: %d\n", err );
fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( 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 = new Stream();
stream->setBufferLen(bufferMs); stream->setBufferLen(bufferMs);
initAudio(); PaError paError;
PaStream* paStream = initAudio(paError);
stream->setLatency(1000*Pa_GetStreamInfo(paStream)->outputLatency);
std::thread playerThread(player); std::thread playerThread(player);
std::string cmd; std::string cmd;

View file

@ -5,7 +5,7 @@
using namespace std; 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<int>(1000); pBuffer = new DoubleBuffer<int>(1000);
pShortBuffer = new DoubleBuffer<int>(200); pShortBuffer = new DoubleBuffer<int>(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) 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"; // 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) 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; age += 4*cardBuffer;
if (age < msBuffer / 2) if (age < msBuffer / 2)
break; 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) if (outputBufferDacTime < 1)
@ -165,7 +170,7 @@ void Stream::getPlayerChunk(short* outputBuffer, double outputBufferDacTime, uns
// if (pCardBuffer->full()) // if (pCardBuffer->full())
// age += 4*cardBuffer; // 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) if (sleep == 0)

View file

@ -20,6 +20,7 @@ public:
void addChunk(Chunk* chunk); void addChunk(Chunk* chunk);
void getPlayerChunk(short* outputBuffer, double outputBufferDacTime, unsigned long framesPerBuffer); void getPlayerChunk(short* outputBuffer, double outputBufferDacTime, unsigned long framesPerBuffer);
void setBufferLen(size_t bufferLenMs); void setBufferLen(size_t bufferLenMs);
void setLatency(size_t latency);
private: private:
time_point_ms getNextPlayerChunk(short* outputBuffer, unsigned long framesPerBuffer, int correction = 0); time_point_ms getNextPlayerChunk(short* outputBuffer, unsigned long framesPerBuffer, int correction = 0);
@ -42,6 +43,7 @@ private:
int shortMedian; int shortMedian;
time_t lastUpdate; time_t lastUpdate;
int bufferMs; int bufferMs;
int latencyMs;
}; };