+ if(kidfd >= 0) {
+ if(!formats_equal(&playing->format, &config->sample_format)) {
+ char argbuf[1024], *q = argbuf;
+ const char *av[18], **pp = av;
+ int soxpipe[2];
+ pid_t soxkid;
+ *pp++ = "sox";
+ soxargs(&pp, &q, &playing->format);
+ *pp++ = "-";
+ soxargs(&pp, &q, &config->sample_format);
+ *pp++ = "-";
+ *pp++ = 0;
+ if(debugging) {
+ for(pp = av; *pp; pp++)
+ D(("sox arg[%d] = %s", pp - av, *pp));
+ D(("end args"));
+ }
+ xpipe(soxpipe);
+ soxkid = xfork();
+ if(soxkid == 0) {
+ xdup2(playing->fd, 0);
+ xdup2(soxpipe[1], 1);
+ fcntl(0, F_SETFL, fcntl(0, F_GETFL) & ~O_NONBLOCK);
+ close(soxpipe[0]);
+ close(soxpipe[1]);
+ close(playing->fd);
+ execvp("sox", (char **)av);
+ _exit(1);
+ }
+ D(("forking sox for format conversion (kid = %d)", soxkid));
+ close(playing->fd);
+ close(soxpipe[1]);
+ playing->fd = soxpipe[0];
+ playing->format = config->sample_format;
+ ready = 0;
+ }
+ if(!ready) {
+ pcm_format = config->sample_format;
+ bufsize = 3 * FRAMES;
+ bpf = bytes_per_frame(&config->sample_format);
+ D(("acquired audio device"));
+ ready = 1;
+ }
+ return 0;
+ }
+ if(config->speaker_command)
+ return -1;
+#if API_ALSA