static int winwave_run_in (HWVoiceIn *hw) { WaveVoiceIn *wave = (WaveVoiceIn *) hw; int live = audio_pcm_hw_get_live_in (hw); int dead = hw->samples - live; int decr, ret; if (!dead) { return 0; } EnterCriticalSection (&wave->crit_sect); { decr = audio_MIN (dead, wave->avail); wave->avail -= decr; } LeaveCriticalSection (&wave->crit_sect); ret = decr; while (decr) { int left = hw->samples - hw->wpos; int conv = audio_MIN (left, decr); hw->conv (hw->conv_buf + hw->wpos, advance (wave->pcm_buf, wave->rpos << hw->info.shift), conv); wave->rpos = (wave->rpos + conv) % hw->samples; hw->wpos = (hw->wpos + conv) % hw->samples; decr -= conv; } winwave_add_buffers (wave, ret); return ret; }
/* capture */ static int qesd_run_in (HWVoiceIn *hw) { int wpos, liveSamples, totalSamples; int grabSamples; ESDVoiceIn *esd = (ESDVoiceIn *) hw; wpos = hw->wpos; liveSamples = audio_pcm_hw_get_live_in (hw); grabSamples = hw->samples - liveSamples; totalSamples = 0; while (grabSamples > 0) { ssize_t nread; int chunkSamples = audio_MIN (grabSamples, hw->samples - wpos); int chunkBytes = chunkSamples << hw->info.shift; int readSamples, readBytes; void* buf = advance (esd->pcm_buf, wpos); AGAIN: nread = read (esd->fd, buf, chunkBytes); if (nread == -1) { if (errno == EINTR) goto AGAIN; if (errno == EAGAIN || errno == EWOULDBLOCK) break; qesd_logerr (errno, "read failed: %s\n", strerror(errno)); break; } if (nread == 0) break; readSamples = nread >> hw->info.shift; readBytes = readSamples << hw->info.shift; if (readBytes != nread) { dolog ("warning: Misaligned read %d (requested %d), " "alignment %d\n", nread, readBytes, hw->info.align + 1); } hw->conv (hw->conv_buf + wpos, buf, readSamples, &nominal_volume); wpos = (wpos + readSamples) % hw->samples; grabSamples -= readSamples; totalSamples += readSamples; } hw->wpos = wpos; return totalSamples; }
static int genode_run_in(HWVoiceIn *hw) { GenodeVoiceIn *in = (GenodeVoiceIn*)hw; int const live = audio_pcm_hw_get_live_in(&in->hw); if (!(in->hw.samples - live)) return 0; int const dead = in->hw.samples - live; int const samples = read_samples(in, dead); in->hw.wpos = (in->hw.wpos + samples) % in->hw.samples; return samples; }
static int dsound_run_in (HWVoiceIn *hw) { int err; HRESULT hr; DSoundVoiceIn *ds = (DSoundVoiceIn *) hw; LPDIRECTSOUNDCAPTUREBUFFER dscb = ds->dsound_capture_buffer; int live, len, dead; DWORD blen1, blen2; DWORD len1, len2; DWORD decr; DWORD cpos, rpos; LPVOID p1, p2; int hwshift; dsound *s = ds->s; if (!dscb) { dolog ("Attempt to run without capture buffer\n"); return 0; } hwshift = hw->info.shift; live = audio_pcm_hw_get_live_in (hw); dead = hw->samples - live; if (!dead) { return 0; } hr = IDirectSoundCaptureBuffer_GetCurrentPosition ( dscb, &cpos, ds->first_time ? &rpos : NULL ); if (FAILED (hr)) { dsound_logerr (hr, "Could not get capture buffer position\n"); return 0; } if (ds->first_time) { ds->first_time = 0; if (rpos & hw->info.align) { ldebug ("warning: Misaligned capture read position %ld(%d)\n", rpos, hw->info.align); } hw->wpos = rpos >> hwshift; }
static int qpa_run_in (HWVoiceIn *hw) { int live, incr, dead; PAVoiceIn *pa = (PAVoiceIn *) hw; if (audio_pt_lock(&pa->pt, __func__)) { return 0; } live = audio_pcm_hw_get_live_in (hw); dead = hw->samples - live; incr = audio_MIN (dead, pa->incr); pa->incr -= incr; pa->dead = dead - incr; hw->wpos = pa->wpos; if (pa->dead > 0) { audio_pt_unlock_and_signal(&pa->pt, __func__); } else { audio_pt_unlock(&pa->pt, __func__); } return incr; }