#include <alsa/asoundlib.h>
#include <assert.h>
#include <pthread.h>
+#include <arpa/inet.h>
#include "mem.h"
#include "log.h"
} else {
/* Success */
next_timestamp += frames_written * 2;
+ if(dump_buffer) {
+ snd_pcm_sframes_t count;
+ const int16_t *sp = s;
+
+ for(count = 0; count < frames_written * 2; ++count) {
+ dump_buffer[dump_index++] = (int16_t)ntohs(*sp++);
+ dump_index %= dump_size;
+ }
+ }
return 0;
}
}
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include <arpa/inet.h>
#include "mem.h"
#include "log.h"
if(nbyteswritten < playrtp_oss_bufsize)
error(0, "%s: short write (%d/%d)",
device, nbyteswritten, playrtp_oss_bufsize);
+ if(dump_buffer) {
+ int count;
+ const int16_t *sp = (const int16_t *)playrtp_oss_buffer;
+
+ for(count = 0; count < playrtp_oss_bufsize; count += sizeof(int16_t)) {
+ dump_buffer[dump_index++] = (int16_t)ntohs(*sp++);
+ dump_index %= dump_size;
+ }
+ }
playrtp_oss_bufused = 0;
return 0;
}
/** @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' },