static ssize_t pcm_read(u_char *data, size_t rcount) { ssize_t r; size_t result = 0; size_t count = rcount; if (count != chunk_size) { count = chunk_size; } while (count > 0) { r = readi_func(handle, data, count); if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { snd_pcm_wait(handle, 1000); } else if (r == -EPIPE) { xrun(); } else if (r == -ESTRPIPE) { suspend(); } else if (r < 0) { error(_("read error: %s"), snd_strerror(r)); exit(EXIT_FAILURE); } if (r > 0) { if (vumeter) compute_max_peak(data, r * hwparams.channels); result += r; count -= r; data += r * bits_per_frame / 8; } } return rcount; }
static ssize_t pcm_write(u_char *data, size_t count) { ssize_t r; ssize_t result = 0; if (sleep_min == 0 && count < chunk_size) { snd_pcm_format_set_silence(hwparams.format, data + count * bits_per_frame / 8, (chunk_size - count) * hwparams.channels); count = chunk_size; } while (count > 0) { r = snd_pcm_writei(handle, data, count); if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { snd_pcm_wait(handle, 1000); } else if (r == -EPIPE) { xrun(); } else if (r == -ESTRPIPE) { suspend(); } else if (r < 0) { error(_("write error: %s"), snd_strerror(r)); exit(EXIT_FAILURE); } if (r > 0) { result += r; count -= r; data += r * bits_per_frame / 8; } } return result; }
static ssize_t pcm_write (short *data, size_t count) { ssize_t r; ssize_t result = 0; while (count > 0) { r = snd_pcm_writei (AHandle, data, count); if (r == -EAGAIN || (r >= 0 && (size_t) r < count)) { snd_pcm_wait (AHandle, 1000); } else if (r == -EPIPE) { xrun (); } else if (r == -ESTRPIPE) { suspend (); } else if (r < 0) { fprintf (stderr, "write error: %s", snd_strerror (r)); exit (EXIT_FAILURE); } if (r > 0) { result += r; count -= r; data += r; } } return result; }
static size_t pcm_read(snd_pcm_uframes_t chunk_size, u_char *data, size_t rcount) { ssize_t r; size_t result = 0; size_t count = rcount; if (count != chunk_size) { count = chunk_size; } while (count > 0) { r = snd_pcm_readi(handle, data, count); if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { snd_pcm_wait(handle, 1000); }else if (r == -EPIPE){ xrun(SND_PCM_STREAM_CAPTURE); }else if (r < 0) { printf("read error: %s", snd_strerror(r)); exit(EXIT_FAILURE); } if (r > 0) { result += r; count -= r; data += r * bits_per_frame / 8; } } return result; }
static ssize_t pcm_write(size_t *data, size_t count) { ssize_t r; ssize_t result = 0; if (count < chunk_size) { snd_pcm_format_set_silence(DEFAULT_FORMAT, data + count * bits_per_frame / 8, (chunk_size - count) * CHANNELS); count = chunk_size; } while (count > 0) { r = snd_pcm_writei(AHandle, data, count); if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { ; } else if (r == -EPIPE) { xrun(); } else if (r == -ESTRPIPE) { suspend(); } else if (r < 0) { fprintf(stderr, "write error: %s", snd_strerror(r)); } if (r > 0) { result += r; count -= r; data += r * bits_per_frame / 8; } } return result; }
ssize_t AudioStreamInALSA::read(void *buffer, ssize_t bytes) { /*m@nufront start*/ /*AutoMutex lock(mLock);*/ android::AutoMutex lock(mLock); /*m@nufront end*/ if (!mPowerLock) { acquire_wake_lock (PARTIAL_WAKE_LOCK, "AudioInLock"); mPowerLock = true; } acoustic_device_t *aDev = acoustics(); // If there is an acoustics module read method, then it overrides this // implementation (unlike AudioStreamOutALSA write). if (aDev && aDev->read) return aDev->read(aDev, buffer, bytes); snd_pcm_sframes_t n, frames = snd_pcm_bytes_to_frames(mHandle->handle, bytes); status_t err; do { n = snd_pcm_readi(mHandle->handle, buffer, frames); /*a@nufront start*/ if (n == -EPIPE) { ZJFLOGD("xrun."); xrun(mHandle->handle); } /*a@nufront end*/ if (n < frames) { if (mHandle->handle) { if (n < 0) { n = snd_pcm_recover(mHandle->handle, n, 0); if (aDev && aDev->recover) aDev->recover(aDev, n); } else n = snd_pcm_prepare(mHandle->handle); } return static_cast<ssize_t>(n); } } while (n == -EAGAIN); return static_cast<ssize_t>(snd_pcm_frames_to_bytes(mHandle->handle, n)); }
void inotifyd_main(void) { struct pollfd fds; char *prog_args[5], **ss = toys.optargs; char *masklist ="acew0rmyndDM uox"; fds.events = POLLIN; *prog_args = *toys.optargs; prog_args[4] = 0; if ((fds.fd = inotify_init()) == -1) perror_exit(0); // Track number of watched files. First one was program to run. toys.optc--; while (*++ss) { char *path = *ss, *masks = strchr(*ss, ':'); int i, mask = 0; if (!masks) mask = 0xfff; // default to all else{ *masks++ = 0; for (*masks++ = 0; *masks; masks++) { i = stridx(masklist, *masks);; if (i == -1) error_exit("bad mask '%c'", *masks); mask |= 1<<i; } } // This returns increasing numbers starting from 1, which coincidentally // is the toys.optargs position of the file. (0 is program to run.) if (inotify_add_watch(fds.fd, path, mask) < 0) perror_exit_raw(path); } for (;;) { int ret = 0, len; void *buf = 0; struct inotify_event *event; // Read next event(s) ret = poll(&fds, 1, -1); if (ret < 0 && errno == EINTR) continue; if (ret <= 0) break; xioctl(fds.fd, FIONREAD, &len); event = buf = xmalloc(len); len = readall(fds.fd, buf, len); // Loop through set of events. for (;;) { int left = len - (((char *)event)-(char *)buf), size = sizeof(struct inotify_event); // Don't dereference event if ->len is off end of bufer if (left >= size) size += event->len; if (left < size) break; if (event->mask) { char *s = toybuf, *m; for (m = masklist; *m; m++) if (event->mask & (1<<(m-masklist))) *s++ = *m; *s = 0; if (**prog_args == '-' && !prog_args[0][1]) { xprintf("%s\t%s\t%s\n" + 3*!event->len, toybuf, toys.optargs[event->wd], event->name); } else { prog_args[1] = toybuf; prog_args[2] = toys.optargs[event->wd]; prog_args[3] = event->len ? event->name : 0; xrun(prog_args); } if (event->mask & IN_IGNORED) { if (--toys.optc <= 0) { free(buf); goto done; } inotify_rm_watch(fds.fd, event->wd); } } event = (void*)(size + (char*)event); } free(buf); } done: toys.exitval = !!toys.signal; }