mirror of
https://github.com/badaix/snapcast.git
synced 2025-05-21 13:06:15 +02:00
ChunkTemplate
git-svn-id: svn://elaine/murooma/trunk@45 d8a302eb-03bc-478d-80e4-98257eca68ef
This commit is contained in:
parent
7ef8fd3f4a
commit
8699eb8bc2
3 changed files with 27 additions and 19 deletions
20
chunk.h
20
chunk.h
|
@ -5,19 +5,27 @@
|
||||||
#define SAMPLE_BIT (16)
|
#define SAMPLE_BIT (16)
|
||||||
#define CHANNELS (2)
|
#define CHANNELS (2)
|
||||||
|
|
||||||
#define CHUNK_MS (40)
|
#define WIRE_CHUNK_MS (40)
|
||||||
//44100 / 20 = 2205
|
#define WIRE_CHUNK_SIZE (SAMPLE_RATE*CHANNELS*SAMPLE_BIT/8*WIRE_CHUNK_MS/1000)
|
||||||
#define CHUNK_SIZE (SAMPLE_RATE*CHANNELS*SAMPLE_BIT/8*CHUNK_MS/1000)
|
|
||||||
#define FRAMES_PER_BUFFER (CHUNK_SIZE/4)
|
#define PLAYER_CHUNK_MS (5)
|
||||||
|
#define PLAYER_CHUNK_SIZE (SAMPLE_RATE*CHANNELS*SAMPLE_BIT/8*PLAYER_CHUNK_MS/1000)
|
||||||
|
|
||||||
|
#define FRAMES_PER_BUFFER (WIRE_CHUNK_SIZE/4)
|
||||||
|
|
||||||
int bufferMs;
|
int bufferMs;
|
||||||
|
|
||||||
struct Chunk
|
template <size_t T>
|
||||||
|
struct ChunkT
|
||||||
{
|
{
|
||||||
int32_t tv_sec;
|
int32_t tv_sec;
|
||||||
int32_t tv_usec;
|
int32_t tv_usec;
|
||||||
char payload[CHUNK_SIZE];
|
char payload[T];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef ChunkT<WIRE_CHUNK_SIZE> Chunk;
|
||||||
|
typedef ChunkT<PLAYER_CHUNK_SIZE> PlayerChunk;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
22
client.cpp
22
client.cpp
|
@ -22,7 +22,7 @@
|
||||||
#include "timeUtils.h"
|
#include "timeUtils.h"
|
||||||
|
|
||||||
|
|
||||||
DoubleBuffer<int> buffer(30000 / CHUNK_MS);
|
DoubleBuffer<int> buffer(30000 / WIRE_CHUNK_MS);
|
||||||
std::deque<Chunk*> chunks;
|
std::deque<Chunk*> chunks;
|
||||||
std::deque<int> timeDiffs;
|
std::deque<int> timeDiffs;
|
||||||
std::mutex mtx;
|
std::mutex mtx;
|
||||||
|
@ -65,12 +65,12 @@ void player()
|
||||||
{
|
{
|
||||||
long now = getTickCount();
|
long now = getTickCount();
|
||||||
// std::cerr << "Before: " << now << "\n";
|
// std::cerr << "Before: " << now << "\n";
|
||||||
for (size_t n=0; n<CHUNK_SIZE; ++n)
|
for (size_t n=0; n<WIRE_CHUNK_SIZE; ++n)
|
||||||
std::cout << chunk->payload[n];// << std::flush;
|
std::cout << chunk->payload[n];// << std::flush;
|
||||||
std::cout << std::flush;
|
std::cout << std::flush;
|
||||||
long after = getTickCount();
|
long after = getTickCount();
|
||||||
// std::cerr << "After: " << after << " (" << after - now << ")\n";
|
// std::cerr << "After: " << after << " (" << after - now << ")\n";
|
||||||
if (after - now > CHUNK_MS / 2)
|
if (after - now > WIRE_CHUNK_MS / 2)
|
||||||
usleep(((after - now) / 2) * 1000);
|
usleep(((after - now) / 2) * 1000);
|
||||||
|
|
||||||
// int age = getAge(*chunk);
|
// int age = getAge(*chunk);
|
||||||
|
@ -152,24 +152,24 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer,
|
||||||
std::cerr << "age: " << getAge(*chunk) << "\t" << age << "\t" << median << "\t" << buffer.size() << "\t" << timeInfo->outputBufferDacTime*1000 << "\n";
|
std::cerr << "age: " << getAge(*chunk) << "\t" << age << "\t" << median << "\t" << buffer.size() << "\t" << timeInfo->outputBufferDacTime*1000 << "\n";
|
||||||
|
|
||||||
int maxDiff = 10;
|
int maxDiff = 10;
|
||||||
if (/*!buffer.full() &&*/ (age > bufferMs + std::max(100, 2*CHUNK_MS)))
|
if (/*!buffer.full() &&*/ (age > bufferMs + std::max(100, 2*WIRE_CHUNK_MS)))
|
||||||
{
|
{
|
||||||
chunks->pop_front();
|
chunks->pop_front();
|
||||||
delete chunk;
|
delete chunk;
|
||||||
std::cerr << "packe too old, dropping\n";
|
std::cerr << "packe too old, dropping\n";
|
||||||
usleep(100);
|
usleep(100);
|
||||||
}
|
}
|
||||||
else if (/*!buffer.full() &&*/ (age < bufferMs - std::max(100, 2*CHUNK_MS)))
|
else if (/*!buffer.full() &&*/ (age < bufferMs - std::max(100, 2*WIRE_CHUNK_MS)))
|
||||||
{
|
{
|
||||||
chunk = new Chunk();
|
chunk = new Chunk();
|
||||||
memset(&(chunk->payload[0]), 0, CHUNK_SIZE);
|
memset(&(chunk->payload[0]), 0, WIRE_CHUNK_SIZE);
|
||||||
std::cerr << "age < bufferMs (" << age << " < " << bufferMs << "), playing silence\n";
|
std::cerr << "age < bufferMs (" << age << " < " << bufferMs << "), playing silence\n";
|
||||||
usleep(10 * 1000);
|
usleep(10 * 1000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (buffer.full() && (median > bufferMs + maxDiff))
|
else if (buffer.full() && (median > bufferMs + maxDiff))
|
||||||
{
|
{
|
||||||
std::cerr << "median > bufferMs + CHUNK_MS (" << median << " > " << bufferMs + maxDiff << "), dropping chunk\n";
|
std::cerr << "median > bufferMs + WIRE_CHUNK_MS (" << median << " > " << bufferMs + maxDiff << "), dropping chunk\n";
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
chunks->pop_front();
|
chunks->pop_front();
|
||||||
delete chunk;
|
delete chunk;
|
||||||
|
@ -177,13 +177,13 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer,
|
||||||
}
|
}
|
||||||
else if (buffer.full() && (median + maxDiff < bufferMs))
|
else if (buffer.full() && (median + maxDiff < bufferMs))
|
||||||
{
|
{
|
||||||
std::cerr << "median + CHUNK_MS < bufferMs (" << median + maxDiff << " < " << bufferMs << "), playing silence\n";
|
std::cerr << "median + WIRE_CHUNK_MS < bufferMs (" << median + maxDiff << " < " << bufferMs << "), playing silence\n";
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
if (bufferMs - median > CHUNK_MS)
|
if (bufferMs - median > WIRE_CHUNK_MS)
|
||||||
{
|
{
|
||||||
chunk = new Chunk();
|
chunk = new Chunk();
|
||||||
memset(&(chunk->payload[0]), 0, CHUNK_SIZE);
|
memset(&(chunk->payload[0]), 0, WIRE_CHUNK_SIZE);
|
||||||
sleepMs(bufferMs - median - CHUNK_MS + 10);
|
sleepMs(bufferMs - median - WIRE_CHUNK_MS + 10);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -42,7 +42,7 @@ int main () {
|
||||||
{
|
{
|
||||||
// read(fd, &msg[0], size);
|
// read(fd, &msg[0], size);
|
||||||
chunk.payload[idx++] = c;
|
chunk.payload[idx++] = c;
|
||||||
if (idx == CHUNK_SIZE)
|
if (idx == WIRE_CHUNK_SIZE)
|
||||||
{
|
{
|
||||||
timeval now;
|
timeval now;
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
|
@ -62,7 +62,7 @@ int main () {
|
||||||
// snprintf ((char *) message.data(), size, "%05d %d", zipcode, c);
|
// snprintf ((char *) message.data(), size, "%05d %d", zipcode, c);
|
||||||
// message.data()[0] = c;
|
// message.data()[0] = c;
|
||||||
publisher.send(message);
|
publisher.send(message);
|
||||||
addMs(ts, CHUNK_MS);
|
addMs(ts, WIRE_CHUNK_MS);
|
||||||
idx = 0;
|
idx = 0;
|
||||||
// msg[0] = '0';
|
// msg[0] = '0';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue