working again

git-svn-id: svn://elaine/murooma/trunk@68 d8a302eb-03bc-478d-80e4-98257eca68ef
This commit is contained in:
(no author) 2014-07-04 22:48:25 +00:00
parent 5c4412562a
commit 224ee53a5a
3 changed files with 70 additions and 14 deletions

View file

@ -181,11 +181,11 @@ int main (int argc, char *argv[])
zmq::message_t update;
subscriber.recv(&update);
timeval now;
gettimeofday(&now, NULL);
std::cerr << "New chunk: " << chunkTime(*chunk) << "\t" << timeToStr(now) << "\t" << getAge(*chunk) << "\n";
// timeval now;
// gettimeofday(&now, NULL);
// memcpy(chunk, update.data(), sizeof(Chunk));
chunk = (Chunk*)(update.data());
// std::cerr << "New chunk: " << chunkTime(*chunk) << "\t" << timeToStr(now) << "\t" << getAge(*chunk) << "\n";
stream->addChunk(chunk);
}
return 0;

View file

@ -15,7 +15,7 @@
class Stream
{
public:
Stream() : lastUpdate(0), skip(0), idx(0)
Stream() : median(0), shortMedian(0), lastUpdate(0), skip(0), idx(0)
{
pBuffer = new DoubleBuffer<int>(30000 / PLAYER_CHUNK_MS);
pShortBuffer = new DoubleBuffer<int>(5000 / PLAYER_CHUNK_MS);
@ -34,29 +34,35 @@ public:
std::vector<short> getChunk(double outputBufferDacTime, unsigned long framesPerBuffer)
{
Chunk* chunk = NULL;
while (1)
{
Chunk* chunk = NULL;
if (chunks.empty())
cv.wait(*pLock);
int age(0);
int chunkCount(0);
mutex.lock();
do
while (!chunks.empty())
{
chunk = chunks.front();
chunkCount = chunks.size();
int age = getAge(*chunk) + outputBufferDacTime*1000 - bufferMs;
if (age > WIRE_CHUNK_MS)
age = getAge(*chunk) + outputBufferDacTime*1000 - bufferMs;
if ((age > 500) || (shortMedian > 100) || (median > WIRE_CHUNK_MS))
{
std::cerr << "age > WIRE_CHUNK_MS\n";
chunks.pop_front();
std::cerr << "age > WIRE_CHUNK_MS (" << age << " ms)\n";
delete chunk;
chunk = NULL;
chunks.pop_front();
pBuffer->clear();
pShortBuffer->clear();
usleep(10);
shortMedian -= WIRE_CHUNK_MS;
median -= WIRE_CHUNK_MS;
}
else
break;
}
while (chunk == NULL);
chunkCount = chunks.size();
mutex.unlock();
if (chunk == NULL)
@ -65,6 +71,46 @@ public:
continue;
}
pBuffer->add(age);
pShortBuffer->add(age);
time_t now = time(NULL);
if (now != lastUpdate)
{
lastUpdate = now;
if (pBuffer->full())
median = pBuffer->median();
else
median = 0;
if (pShortBuffer->full())
shortMedian = pShortBuffer->median();
else
shortMedian = 0;
std::cerr << "Chunk: " << age << /*" \tidx: " << chunk->idx <<*/ "\t" << shortMedian << "\t" << median << "\t" << pBuffer->size() << "\t" << chunkCount << "\t" << outputBufferDacTime*1000 << "\n";
}
std::vector<short> v;
for (size_t n=chunk->idx; n<chunk->idx + PLAYER_CHUNK_SIZE; ++n)
{
v.push_back(chunk->payload[n]);
}
//std::cerr << "before: " << chunkTime(*chunk) << ", after: ";
addMs(*chunk, -PLAYER_CHUNK_MS);
//std::cerr << chunkTime(*chunk) << "\n";
chunk->idx += PLAYER_CHUNK_SIZE;
if (chunk->idx >= WIRE_CHUNK_SIZE)
{
//std::cerr << "Chunk played out, deleting\n";
chunks.pop_front();
delete chunk;
}
return v;
}
}
/*
std::cerr << "age: " << getAge(*chunk) << "\t" << age << "\t" << pBuffer->size() << "\t" << chunkCount << "\n";
pBuffer->add(age);
pShortBuffer->add(age);
@ -134,7 +180,7 @@ public:
return v;
// return chunk;
}
*/
private:
std::deque<Chunk*> chunks;
@ -145,6 +191,8 @@ private:
DoubleBuffer<int>* pBuffer;
DoubleBuffer<int>* pShortBuffer;
int median;
int shortMedian;
time_t lastUpdate;
int bufferMs;
int skip;

View file

@ -55,6 +55,14 @@ inline long getTickCount()
inline void addMs(timeval& tv, int ms)
{
if (ms < 0)
{
timeval t;
t.tv_sec = -ms / 1000;
t.tv_usec = (-ms % 1000) * 1000;
timersub(&tv, &t, &tv);
return;
}
tv.tv_usec += ms*1000;
tv.tv_sec += (tv.tv_usec / 1000000);
tv.tv_usec %= 1000000;