forked from wereHamster/yukon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wav.c
executable file
·66 lines (52 loc) · 1.58 KB
/
wav.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <alsa/asoundlib.h>
#include <yukon.h>
#include <arpa/inet.h>
struct wavHeader {
uint32_t chunkID;
uint32_t chunkSize;
uint32_t riffType;
} __attribute__((packed));
struct wavFormat {
uint32_t chunkID;
uint32_t chunkSize;
uint16_t compressionCode;
uint16_t numChannels;
uint32_t sampleRate;
uint32_t avgBytesPerSecond;
uint16_t blockAlign;
uint16_t significantBitsPerSample;
} __attribute__((packed));
struct wavData {
uint32_t chunkID;
uint32_t chunkSize;
} __attribute__((packed));
static unsigned int bps;
static char silence[48000 * 4 * 2 * 8];
void wavWriteHeader(int fd, struct seomPacket *packet)
{
uint32_t *sh = seomPacketPayload(packet);
unsigned int format = sh[0];
struct wavHeader header = { htonl(0x52494646), 0xffffffff, htonl(0x57415645) };
write(fd, &header, sizeof(struct wavHeader));
struct wavFormat fmt = { htonl(0x666D7420), 16, 1, 2, 48000, 48000 * format * 2, format * 2, format * 8 };
write(fd, &fmt, sizeof(struct wavFormat));
struct wavData chunk = { htonl(0x64617461), 0xffffffff };
write(fd, &chunk, sizeof(struct wavData));
bps = format;
}
static uint64_t streamStart;
static uint64_t dataSize;
void wavWriteData(int fd, struct seomPacket *packet)
{
if (streamStart == 0)
streamStart = packet->time;
int64_t delay = packet->time - streamStart - 1000000 * dataSize / (2 * bps) / 48000;
if (delay > 1000) {
uint64_t insert = delay * 48000 * 2 * bps / 1000000;
insert -= insert % (2 * bps);
write(fd, silence, insert);
dataSize += insert;
}
write(fd, seomPacketPayload(packet), packet->size);
dataSize += packet->size;
}