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;
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);
@ -164,13 +164,13 @@ 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;

View file

@ -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<int>(1000);
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)
{
@ -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)

View file

@ -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;
};