mirror of
https://github.com/badaix/snapcast.git
synced 2025-07-22 02:47:50 +02:00
working again
git-svn-id: svn://elaine/murooma/trunk@68 d8a302eb-03bc-478d-80e4-98257eca68ef
This commit is contained in:
parent
5c4412562a
commit
224ee53a5a
3 changed files with 70 additions and 14 deletions
|
@ -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;
|
||||
|
|
68
stream.h
68
stream.h
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue