aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2015-11-03 04:12:36 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2015-11-03 05:27:16 +0100
commit071bc6aae2bd7675468229ed4c4998f093e65eaf (patch)
tree6404b8fa5bf3d7b0762cc11a7bea59231b889afc
parentee65e0cb2d745dd30cf13b00fe6662b1d2d53130 (diff)
downloadapplause2-071bc6aae2bd7675468229ed4c4998f093e65eaf.tar.gz
ring buffer size is configurable now via ./applause command-line parameter in milliseconds
* default buffer size: 100ms
-rw-r--r--applause.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/applause.c b/applause.c
index e8433f4..6b71bb1 100644
--- a/applause.c
+++ b/applause.c
@@ -23,7 +23,7 @@
static jack_port_t *output_port;
static jack_client_t *client = NULL;
-#define BUFFER_SIZE (44100*60) /* 1m samples */
+#define DEFAULT_BUFFER_SIZE 100 /* milliseconds */
static jack_ringbuffer_t *buffer = NULL;
static int buffer_sem;
static sig_atomic_t buffer_xrun = 0;
@@ -33,11 +33,25 @@ svsem_init(size_t value)
{
int id;
- id = semget(IPC_PRIVATE, 1, IPC_CREAT);
+ /*
+ * This is not in sem.h but required since
+ * sizeof(int) could be unequal sizeof(void*)
+ */
+ union semun {
+ int val; /* Value for SETVAL */
+ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
+ unsigned short *array; /* Array for GETALL, SETALL */
+ struct seminfo *__buf; /* Buffer for IPC_INFO
+ (Linux-specific) */
+ } arg = {
+ .val = value
+ };
+
+ id = semget(IPC_PRIVATE, 1, IPC_CREAT | 0777);
if (id < 0)
return -1;
- if (semctl(id, 0, SETVAL, (int)value) < 0)
+ if (semctl(id, 0, SETVAL, arg) < 0)
return -1;
return id;
@@ -111,8 +125,9 @@ jack_shutdown(void *arg)
}
static int
-init_audio(void)
+init_audio(int buffer_size)
{
+ size_t buffer_samples;
const char **ports;
const char *client_name = "applause";
const char *server_name = NULL;
@@ -156,7 +171,6 @@ init_audio(void)
output_port = jack_port_register (client, "output",
JACK_DEFAULT_AUDIO_TYPE,
JackPortIsOutput, 0);
-
if (output_port == NULL) {
fprintf(stderr, "no more JACK ports available\n");
return 1;
@@ -168,16 +182,17 @@ init_audio(void)
* since it represents the available bytes in the ring
* buffer.
*/
+ buffer_samples = jack_get_sample_rate(client)*buffer_size/1000;
buffer = jack_ringbuffer_create(sizeof(jack_default_audio_sample_t)*
- BUFFER_SIZE);
+ buffer_samples);
if (!buffer) {
fprintf(stderr, "cannot create ringbuffer\n");
return 1;
}
- buffer_sem = svsem_init(BUFFER_SIZE);
+ buffer_sem = svsem_init(buffer_samples);
if (buffer_sem < 0) {
- fprintf(stderr, "error initializing ring buffer\n");
+ fprintf(stderr, "error initializing semaphore\n");
return 1;
}
@@ -295,6 +310,8 @@ l_Stream_play(lua_State *L)
int
main(int argc, char **argv)
{
+ int buffer_size = DEFAULT_BUFFER_SIZE;
+
static const luaL_Reg stream_methods[] = {
{"play", l_Stream_play},
{NULL, NULL}
@@ -302,6 +319,12 @@ main(int argc, char **argv)
lua_State *L;
+ /*
+ * FIXME: Support --help
+ */
+ if (argc > 1)
+ buffer_size = atoi(argv[1]);
+
L = luaL_newstate();
if (!L) {
fprintf(stderr, "Error creating Lua state.\n");
@@ -317,7 +340,7 @@ main(int argc, char **argv)
exit(EXIT_FAILURE);
}
- init_audio();
+ init_audio(buffer_size);
/*
* Register C functions in the `Stream` class