/*
* This file is part of DisOrder.
- * Copyright (C) 2007 Richard Kettlewell
+ * Copyright (C) 2007, 2008 Richard Kettlewell
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "client.h"
#include "playrtp.h"
#include "inputline.h"
+#include "version.h"
#define readahead linux_headers_are_borked
/** @brief Control socket or NULL */
const char *control_socket;
+/** @brief Buffer for debugging dump
+ *
+ * The debug dump is enabled by the @c --dump option. It records the last 20s
+ * of audio to the specified file (which will be about 3.5Mbytes). The file is
+ * written as as ring buffer, so the start point will progress through it.
+ *
+ * Use clients/dump2wav to convert this to a WAV file, which can then be loaded
+ * into (e.g.) Audacity for further inspection.
+ *
+ * All three backends (ALSA, OSS, Core Audio) now support this option.
+ *
+ * The idea is to allow the user a few seconds to react to an audible artefact.
+ */
int16_t *dump_buffer;
+
+/** @brief Current index within debugging dump */
size_t dump_index;
-size_t dump_size = 44100 * 2 * 20; /* 20s */
+
+/** @brief Size of debugging dump in samples */
+size_t dump_size = 44100/*Hz*/ * 2/*channels*/ * 20/*seconds*/;
static const struct option options[] = {
{ "help", no_argument, 0, 'h' },
for(;;) {
/* Get the next packet */
pthread_mutex_lock(&receive_lock);
- while(!received_packets)
+ while(!received_packets) {
pthread_cond_wait(&receive_cond, &receive_lock);
+ }
p = received_packets;
received_packets = p->next;
if(!received_packets)
* out of order then we guarantee dropouts. But for now... */
if(nsamples >= maxbuffer) {
pthread_mutex_lock(&lock);
- while(nsamples >= maxbuffer)
+ while(nsamples >= maxbuffer) {
pthread_cond_wait(&cond, &lock);
+ }
pthread_mutex_unlock(&lock);
}
/* Add the packet to the receive queue */
while(nsamples)
drop_first_packet();
info("Buffering...");
- while(nsamples < readahead)
+ while(nsamples < readahead) {
pthread_cond_wait(&cond, &lock);
+ }
next_timestamp = pheap_first(&packets)->timestamp;
active = 1;
}
exit(0);
}
-/* display version number and terminate */
-static void version(void) {
- xprintf("disorder-playrtp version %s\n", disorder_version_string);
- xfclose(stdout);
- exit(0);
-}
-
int main(int argc, char **argv) {
int n, err;
struct addrinfo *res;
while((n = getopt_long(argc, argv, "hVdD:m:b:x:L:R:M:aocC:r", options, 0)) >= 0) {
switch(n) {
case 'h': help();
- case 'V': version();
+ case 'V': version("disorder-playrtp");
case 'd': debugging = 1; break;
case 'D': device = optarg; break;
case 'm': minbuffer = 2 * atol(optarg); break;