X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/0cf685f6a9ce58259b542dc4102261205a53a6f4..70d2939adaa6ee884690256fccba884f6cc606b0:/server/speaker.c diff --git a/server/speaker.c b/server/speaker.c index a8524b4..a1b2d1d 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2005-2010 Richard Kettlewell + * Copyright (C) 2005-2012 Richard Kettlewell * 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 - * 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. @@ -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) { - const size_t max_bytes = max_samples * uaudio_sample_size; + size_t max_bytes = max_samples * uaudio_sample_size; 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 @@ -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; + /* 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; @@ -796,8 +802,8 @@ int main(int argc, char **argv) { 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); @@ -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; - 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); @@ -814,6 +820,8 @@ int main(int argc, char **argv) { disorder_fatal(errno, "error binding socket to %s", addr.sun_path); xlisten(listenfd, 128); nonblock(listenfd); + disorder_info("version "VERSION" process ID %lu", + (unsigned long)getpid()); disorder_info("listening on %s", addr.sun_path); memset(&sm, 0, sizeof sm); sm.type = SM_READY;