コード例 #1
0
ファイル: winwaveaudio.c プロジェクト: 0bliv10n/s2e
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;
}
コード例 #2
0
ファイル: esdaudio.c プロジェクト: 325116067/semc-qsd8x50
/* 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;
}
コード例 #3
0
ファイル: audiodrv.cpp プロジェクト: hb9cwp/genode
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;
}
コード例 #4
0
ファイル: dsoundaudio.c プロジェクト: 01org/qemu-lite
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;
    }
コード例 #5
0
ファイル: paaudio.c プロジェクト: juanquintela/qemu
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;
}