~mdw
/
disorder
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
no drag + drop
[disorder]
/
server
/
speaker.c
diff --git
a/server/speaker.c
b/server/speaker.c
index
a8524b4
..
1d26c6c
100644
(file)
--- a/
server/speaker.c
+++ b/
server/speaker.c
@@
-1,6
+1,6
@@
/*
* This file is part of DisOrder
/*
* This file is part of DisOrder
- * Copyright (C) 2005-201
0
Richard Kettlewell
+ * Copyright (C) 2005-201
2
Richard Kettlewell
* Portions (C) 2007 Mark Wooding
*
* This program is free software: you can redistribute it and/or modify
* Portions (C) 2007 Mark Wooding
*
* This program is free software: you can redistribute it and/or modify
@@
-36,7
+36,7
@@
* assumed that the main server won't start outrageously many decoders.
*
* Audio is supplied from this buffer to the uaudio play callback. Playback is
* assumed that the main server won't start outrageously many decoders.
*
* Audio is supplied from this buffer to the uaudio play callback. Playback is
- * enabled when a track is to be played and disabled when
the
its last bytes
+ * enabled when a track is to be played and disabled when its last bytes
* have been returned by the callback; pause and resume is implemented the
* obvious way. If the callback finds itself required to play when there is no
* playing track it returns dead air.
* have been returned by the callback; pause and resume is implemented the
* obvious way. If the callback finds itself required to play when there is no
* playing track it returns dead air.
@@
-418,9
+418,13
@@
static int addfd(int fd, int events) {
static size_t speaker_callback(void *buffer,
size_t max_samples,
void attribute((unused)) *userdata) {
static size_t speaker_callback(void *buffer,
size_t max_samples,
void attribute((unused)) *userdata) {
-
const
size_t max_bytes = max_samples * uaudio_sample_size;
+ size_t max_bytes = max_samples * uaudio_sample_size;
size_t provided_samples = 0;
size_t provided_samples = 0;
+ /* Be sure to keep the amount of data in a buffer a whole number of frames:
+ * otherwise the playing threads can become stuck. */
+ max_bytes -= max_bytes % (uaudio_sample_size * uaudio_channels);
+
pthread_mutex_lock(&lock);
/* TODO perhaps we should immediately go silent if we've been asked to pause
* or cancel the playing track (maybe block in the cancel case and see what
pthread_mutex_lock(&lock);
/* TODO perhaps we should immediately go silent if we've been asked to pause
* or cancel the playing track (maybe block in the cancel case and see what
@@
-437,6
+441,8
@@
static size_t speaker_callback(void *buffer,
/* Limit to what we were asked for */
if(bytes > max_bytes)
bytes = max_bytes;
/* Limit to what we were asked for */
if(bytes > max_bytes)
bytes = max_bytes;
+ /* And truncate to a whole number of frames. */
+ bytes -= bytes % (uaudio_sample_size * uaudio_channels);
/* Provide it */
memcpy(buffer, playing->buffer + playing->start, bytes);
playing->start += bytes;
/* Provide it */
memcpy(buffer, playing->buffer + playing->start, bytes);
playing->start += bytes;
@@
-796,8
+802,8
@@
int main(int argc, char **argv) {
if(backend->configure)
backend->configure();
backend->start(speaker_callback, NULL);
if(backend->configure)
backend->configure();
backend->start(speaker_callback, NULL);
- /* create the socket directory */
- byte_xasprintf(&dir, "%s/
speaker
", config->home);
+ /* create the
private
socket directory */
+ byte_xasprintf(&dir, "%s/
private
", config->home);
unlink(dir); /* might be a leftover socket */
if(mkdir(dir, 0700) < 0 && errno != EEXIST)
disorder_fatal(errno, "error creating %s", dir);
unlink(dir); /* might be a leftover socket */
if(mkdir(dir, 0700) < 0 && errno != EEXIST)
disorder_fatal(errno, "error creating %s", dir);
@@
-805,7
+811,7
@@
int main(int argc, char **argv) {
listenfd = xsocket(PF_UNIX, SOCK_STREAM, 0);
memset(&addr, 0, sizeof addr);
addr.sun_family = AF_UNIX;
listenfd = xsocket(PF_UNIX, SOCK_STREAM, 0);
memset(&addr, 0, sizeof addr);
addr.sun_family = AF_UNIX;
- snprintf(addr.sun_path, sizeof addr.sun_path, "%s/
speaker/socket
",
+ snprintf(addr.sun_path, sizeof addr.sun_path, "%s/
private/speaker
",
config->home);
if(unlink(addr.sun_path) < 0 && errno != ENOENT)
disorder_error(errno, "removing %s", addr.sun_path);
config->home);
if(unlink(addr.sun_path) < 0 && errno != ENOENT)
disorder_error(errno, "removing %s", addr.sun_path);