From 28d97441e7c88441c4fbc77458932af7fd61a59c Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 21 Nov 2004 18:15:33 +0000 Subject: * new tool pacmd * fix pacat/paplay/pactl for new API version * fix memory leak in pa_ioline git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@304 fefdeb5f-60dc-0310-8127-8f9354f1896f --- polyp/Makefile.am | 13 +++- polyp/ioline.c | 9 +++ polyp/pacat.c | 2 +- polyp/pacmd.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ polyp/pactl.c | 2 +- polyp/paplay.c | 2 +- polyp/util.c | 9 +++ polyp/util.h | 2 + 8 files changed, 218 insertions(+), 4 deletions(-) create mode 100644 polyp/pacmd.c (limited to 'polyp') diff --git a/polyp/Makefile.am b/polyp/Makefile.am index 6d9962d5..2570f7f0 100644 --- a/polyp/Makefile.am +++ b/polyp/Makefile.am @@ -34,8 +34,15 @@ AM_LIBADD=$(PTHREAD_LIBS) -lm AM_LDADD=$(PTHREAD_LIBS) -lm EXTRA_DIST = default.pa.in daemon.conf.in client.conf.in depmod.py esdcompat.sh.in module-defs.h.m4 -bin_PROGRAMS = polypaudio pacat pactl paplay +bin_PROGRAMS = \ + polypaudio \ + pacat \ + pactl \ + paplay \ + pacmd + bin_SCRIPTS = esdcompat.sh + noinst_PROGRAMS = \ mainloop-test \ pacat-simple \ @@ -505,6 +512,10 @@ mcalign_test_SOURCES = mcalign-test.c util.c util.h xmalloc.c xmalloc.h log.c lo mcalign_test_CFLAGS = $(AM_CFLAGS) mcalign_test_LDADD = $(AM_LDADD) +pacmd_SOURCES = pacmd.c util.c util.h xmalloc.c xmalloc.h log.c log.h pid.c pid.h +pacmd_CFLAGS = $(AM_CFLAGS) +pacmd_LDADD = $(AM_LDADD) + cpulimit_test_SOURCES = cpulimit-test.c cpulimit.c util.c log.c cpulimit.h util.h log.h cpulimit_test_CFLAGS = $(AM_CFLAGS) cpulimit_test_LDADD = $(AM_LDADD) libpolyp-mainloop-@PA_MAJORMINOR@.la diff --git a/polyp/ioline.c b/polyp/ioline.c index 059591b8..f52af2db 100644 --- a/polyp/ioline.c +++ b/polyp/ioline.c @@ -89,6 +89,10 @@ static void ioline_free(struct pa_ioline *l) { if (l->io) pa_iochannel_free(l->io); + + if (l->defer_event) + l->mainloop->defer_free(l->defer_event); + pa_xfree(l->wbuf); pa_xfree(l->rbuf); pa_xfree(l); @@ -116,6 +120,11 @@ void pa_ioline_close(struct pa_ioline *l) { pa_iochannel_free(l->io); l->io = NULL; } + + if (l->defer_event) { + l->mainloop->defer_free(l->defer_event); + l->defer_event = NULL; + } } void pa_ioline_puts(struct pa_ioline *l, const char *c) { diff --git a/polyp/pacat.c b/polyp/pacat.c index e5e0b7ca..8c3ee0ba 100644 --- a/polyp/pacat.c +++ b/polyp/pacat.c @@ -38,7 +38,7 @@ #include #include -#if PA_API_VERSION != 6 +#if PA_API_VERSION != 7 #error Invalid Polypaudio API version #endif diff --git a/polyp/pacmd.c b/polyp/pacmd.c new file mode 100644 index 00000000..741059ce --- /dev/null +++ b/polyp/pacmd.c @@ -0,0 +1,183 @@ +/* $Id$ */ + +/*** + This file is part of polypaudio. + + polypaudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + polypaudio is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with polypaudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "util.h" +#include "log.h" +#include "pid.h" + +int main() { + pid_t pid ; + int fd = -1; + int ret = 1, i; + struct sockaddr_un sa; + char ibuf[256], obuf[256]; + size_t ibuf_index, ibuf_length, obuf_index, obuf_length; + fd_set ifds, ofds; + + if (pa_pid_file_check_running(&pid) < 0) { + pa_log(__FILE__": no Polypaudio daemon running\n"); + goto fail; + } + + if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { + pa_log(__FILE__": socket(PF_UNIX, SOCK_STREAM, 0): %s\n", strerror(errno)); + goto fail; + } + + memset(&sa, 0, sizeof(sa)); + sa.sun_family = AF_UNIX; + pa_runtime_path("cli", sa.sun_path, sizeof(sa.sun_path)); + + for (i = 0; i < 5; i++) { + int r; + + if ((r = connect(fd, (struct sockaddr*) &sa, sizeof(sa))) < 0 && (errno != ECONNREFUSED && errno != ENOENT)) { + pa_log(__FILE__": connect() failed: %s\n", strerror(errno)); + goto fail; + } + + if (r >= 0) + break; + + if (pa_pid_file_kill(SIGUSR2, NULL) < 0) { + pa_log(__FILE__": failed to kill Polypaudio daemon.\n"); + goto fail; + } + + pa_msleep(10); + } + + if (i >= 5) { + pa_log(__FILE__": daemon to responding.\n"); + goto fail; + } + + ibuf_index = ibuf_length = obuf_index = obuf_length = 0; + + + FD_ZERO(&ifds); + FD_SET(0, &ifds); + FD_SET(fd, &ifds); + + FD_ZERO(&ofds); + + for (;;) { + if (select(FD_SETSIZE, &ifds, &ofds, NULL, NULL) < 0) { + pa_log(__FILE__": select() failed: %s\n", strerror(errno)); + goto fail; + } + + if (FD_ISSET(0, &ifds)) { + ssize_t r; + assert(!ibuf_length); + + if ((r = read(0, ibuf, sizeof(ibuf))) <= 0) { + if (r == 0) + break; + + pa_log(__FILE__": read() failed: %s\n", strerror(errno)); + goto fail; + } + + ibuf_length = (size_t) r; + ibuf_index = 0; + } + + if (FD_ISSET(fd, &ifds)) { + ssize_t r; + assert(!obuf_length); + + if ((r = read(fd, obuf, sizeof(obuf))) <= 0) { + if (r == 0) + break; + + pa_log(__FILE__": read() failed: %s\n", strerror(errno)); + goto fail; + } + + obuf_length = (size_t) r; + obuf_index = 0; + } + + if (FD_ISSET(1, &ofds)) { + ssize_t r; + assert(obuf_length); + + if ((r = write(1, obuf + obuf_index, obuf_length)) < 0) { + pa_log(__FILE__": write() failed: %s\n", strerror(errno)); + goto fail; + } + + obuf_length -= (size_t) r; + obuf_index += obuf_index; + + } + + if (FD_ISSET(fd, &ofds)) { + ssize_t r; + assert(ibuf_length); + + if ((r = write(fd, ibuf + ibuf_index, ibuf_length)) < 0) { + pa_log(__FILE__": write() failed: %s\n", strerror(errno)); + goto fail; + } + + ibuf_length -= (size_t) r; + ibuf_index += obuf_index; + + } + + FD_ZERO(&ifds); + FD_ZERO(&ofds); + + if (obuf_length <= 0) + FD_SET(fd, &ifds); + else + FD_SET(1, &ofds); + + if (ibuf_length <= 0) + FD_SET(0, &ifds); + else + FD_SET(fd, &ofds); + } + + + ret = 0; + +fail: + if (fd >= 0) + close(fd); + + return ret; +} diff --git a/polyp/pactl.c b/polyp/pactl.c index d73f703c..6300b656 100644 --- a/polyp/pactl.c +++ b/polyp/pactl.c @@ -41,7 +41,7 @@ #include #include -#if PA_API_VERSION != 6 +#if PA_API_VERSION != 7 #error Invalid Polypaudio API version #endif diff --git a/polyp/paplay.c b/polyp/paplay.c index 418d40b3..0faa0ff2 100644 --- a/polyp/paplay.c +++ b/polyp/paplay.c @@ -40,7 +40,7 @@ #include #include -#if PA_API_VERSION != 6 +#if PA_API_VERSION != 7 #error Invalid Polypaudio API version #endif diff --git a/polyp/util.c b/polyp/util.c index 0b459ddc..970ebb93 100644 --- a/polyp/util.c +++ b/polyp/util.c @@ -861,3 +861,12 @@ char *pa_runtime_path(const char *fn, char *s, size_t l) { snprintf(s, l, PA_RUNTIME_PATH_PREFIX"%s%s%s", pa_get_user_name(u, sizeof(u)), fn ? "/" : "", fn ? fn : ""); return s; } + +int pa_msleep(unsigned long t) { + struct timespec ts; + + ts.tv_sec = t/1000; + ts.tv_nsec = (t % 1000) * 1000000; + + return nanosleep(&ts, NULL); +} diff --git a/polyp/util.h b/polyp/util.h index ef7e4d96..922aa49e 100644 --- a/polyp/util.h +++ b/polyp/util.h @@ -88,4 +88,6 @@ int pa_startswith(const char *s, const char *pfx); char *pa_runtime_path(const char *fn, char *s, size_t l); +int pa_msleep(unsigned long t); + #endif -- cgit