diff options
| author | Lennart Poettering <lennart@poettering.net> | 2004-11-21 18:15:33 +0000 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2004-11-21 18:15:33 +0000 | 
| commit | 28d97441e7c88441c4fbc77458932af7fd61a59c (patch) | |
| tree | 3ccf6114d2b4871153a7082fc200a9abf8e28c6a | |
| parent | c90409e4b74d1a4a405bdf560f280694b3e0bb29 (diff) | |
* 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
| -rw-r--r-- | polyp/Makefile.am | 13 | ||||
| -rw-r--r-- | polyp/ioline.c | 9 | ||||
| -rw-r--r-- | polyp/pacat.c | 2 | ||||
| -rw-r--r-- | polyp/pacmd.c | 183 | ||||
| -rw-r--r-- | polyp/pactl.c | 2 | ||||
| -rw-r--r-- | polyp/paplay.c | 2 | ||||
| -rw-r--r-- | polyp/util.c | 9 | ||||
| -rw-r--r-- | polyp/util.h | 2 | 
8 files changed, 218 insertions, 4 deletions
| 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 <polyp/mainloop-signal.h>  #include <polyp/polyplib-version.h> -#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 <config.h> +#endif + +#include <assert.h> +#include <signal.h> +#include <sys/select.h> +#include <sys/socket.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <sys/un.h> + +#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 <polyp/mainloop-signal.h>  #include <polyp/sample.h> -#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 <polyp/mainloop-signal.h>  #include <polyp/polyplib-version.h> -#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 | 
