static void CALLBACK waveInCallback(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { struct ausrc_st *st = (struct ausrc_st *)dwInstance; WAVEHDR *wh = (WAVEHDR *)dwParam1; static size_t gen_idx = 0; size_t i = 0; (void)hwo; (void)dwParam2; if (!st->rh) return; switch (uMsg) { default: break; case WIM_CLOSE: break; case WIM_OPEN: break; case WIM_DATA: if (st->inuse < (READ_BUFFERS-1)) add_wave_in(st); for( i = 0; i < wh->dwBytesRecorded/2; i++ ) { ((int16_t*)wh->lpData)[i] = generator(&st->gen, gen_idx++); } st->rh((void *)wh->lpData, wh->dwBytesRecorded/2, st->arg); waveInUnprepareHeader(st->wavein, wh, sizeof(*wh)); st->inuse--; break; } }
static int read_stream_open(struct ausrc_st *st, const struct ausrc_prm *prm, unsigned int dev) { WAVEFORMATEX wfmt; MMRESULT res; uint32_t sampc; unsigned format; int i, err = 0; st->sampsz = aufmt_sample_size(prm->fmt); format = winwave_get_format(prm->fmt); if (format == WAVE_FORMAT_UNKNOWN) { warning("winwave: source: unsupported sample format (%s)\n", aufmt_name(prm->fmt)); return ENOTSUP; } /* Open an audio INPUT stream. */ st->wavein = NULL; st->pos = 0; st->rdy = false; sampc = prm->srate * prm->ch * prm->ptime / 1000; for (i = 0; i < READ_BUFFERS; i++) { memset(&st->bufs[i].wh, 0, sizeof(WAVEHDR)); st->bufs[i].mb = mbuf_alloc(st->sampsz * sampc); if (!st->bufs[i].mb) return ENOMEM; } wfmt.wFormatTag = format; wfmt.nChannels = prm->ch; wfmt.nSamplesPerSec = prm->srate; wfmt.wBitsPerSample = (WORD)(st->sampsz * 8); wfmt.nBlockAlign = (prm->ch * wfmt.wBitsPerSample) / 8; wfmt.nAvgBytesPerSec = wfmt.nSamplesPerSec * wfmt.nBlockAlign; wfmt.cbSize = 0; res = waveInOpen(&st->wavein, dev, &wfmt, (DWORD_PTR) waveInCallback, (DWORD_PTR) st, CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT); if (res != MMSYSERR_NOERROR) { warning("winwave: waveInOpen: failed res=%d\n", res); return EINVAL; } /* Prepare enough IN buffers to suite at least 50ms of data */ for (i = 0; i < READ_BUFFERS; i++) err |= add_wave_in(st); waveInStart(st->wavein); return err; }
static void CALLBACK waveInCallback(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { struct ausrc_st *st = (struct ausrc_st *) dwInstance; WAVEHDR *wh = (WAVEHDR *) dwParam1; struct mbuf *mb; (void)hwo; (void)dwParam2; switch (uMsg) { case WIM_CLOSE: st->rdy = false; break; case WIM_OPEN: st->rdy = true; break; case WIM_DATA: if (st->stop) break; if (st->inuse < 3) add_wave_in(st); mb = (struct mbuf *) wh->dwUser; mb->pos = 0; mb->end = wh->dwBytesRecorded; if (st->rh) { st->n++; st->rh((uint8_t *)wh->lpData, wh->dwBytesRecorded, st->arg); } waveInUnprepareHeader(st->wavein, wh, sizeof(WAVEHDR)); st->inuse--; break; default: break; } }
static int read_stream_open(struct ausrc_st *st, const struct ausrc_prm *prm, unsigned int dev) { WAVEFORMATEX wfmt; MMRESULT res; uint32_t sampc; int i, err = 0; /* Open an audio INPUT stream. */ st->wavein = NULL; st->bufs_idx = 0; sampc = prm->srate * prm->ch * prm->ptime / 1000; for (i = 0; i < READ_BUFFERS; i++) { memset(&st->bufs[i].wh, 0, sizeof(WAVEHDR)); st->bufs[i].mb = mbuf_alloc(2 * sampc); if (!st->bufs[i].mb) return ENOMEM; } wfmt.wFormatTag = WAVE_FORMAT_PCM; wfmt.nChannels = prm->ch; wfmt.nSamplesPerSec = prm->srate; wfmt.wBitsPerSample = 16; wfmt.nBlockAlign = (prm->ch * wfmt.wBitsPerSample) / 8; wfmt.nAvgBytesPerSec = wfmt.nSamplesPerSec * wfmt.nBlockAlign; wfmt.cbSize = 0; res = waveInOpen(&st->wavein, dev, &wfmt, (DWORD_PTR) waveInCallback, (DWORD_PTR) st, CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT); if (res != MMSYSERR_NOERROR) { warning("sinwave: waveInOpen: failed %d\n", err); return EINVAL; } /* Prepare enough IN buffers to suite at least 50ms of data */ for (i = 0; i < READ_BUFFERS; i++) err |= add_wave_in(st); waveInStart(st->wavein); return err; }
static int read_stream_open(struct ausrc_st *st) { MMRESULT err; WAVEFORMATEX wfmt; int i; /* Open an audio INPUT stream. */ st->wavein = NULL; st->pos = 0; st->rdy = false; st->stop = false; for (i = 0; i < READ_BUFFERS; i++) { memset(&st->bufs[i].wh, 0, sizeof(WAVEHDR)); st->bufs[i].mb = mbuf_alloc(2 * st->prm.frame_size); } wfmt.wFormatTag = WAVE_FORMAT_PCM; wfmt.nChannels = st->prm.ch; wfmt.nSamplesPerSec = st->prm.srate; wfmt.wBitsPerSample = 16; wfmt.nBlockAlign = (st->prm.ch * wfmt.wBitsPerSample) / 8; wfmt.nAvgBytesPerSec = wfmt.nSamplesPerSec * wfmt.nBlockAlign; wfmt.cbSize = 0; err = waveInOpen(&st->wavein, WAVE_MAPPER, &wfmt, (DWORD_PTR) waveInCallback, (DWORD_PTR) st, CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT); if (err != MMSYSERR_NOERROR) { DEBUG_WARNING("waveInOpen: failed %d\n", err); return EINVAL; } /* Prepare enough IN buffers to suite at least 50ms of data */ for (i = 0; i < READ_BUFFERS; i++) add_wave_in(st); waveInStart(st->wavein); return 0; }
static void CALLBACK waveInCallback(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { struct ausrc_st *st = (struct ausrc_st *)dwInstance; WAVEHDR *wh = (WAVEHDR *)dwParam1; (void)hwo; (void)dwParam2; if (!st->rh) return; switch (uMsg) { case WIM_CLOSE: st->rdy = false; break; case WIM_OPEN: st->rdy = true; break; case WIM_DATA: if (st->inuse < (READ_BUFFERS-1)) add_wave_in(st); st->rh((void *)wh->lpData, wh->dwBytesRecorded/st->sampsz, st->arg); waveInUnprepareHeader(st->wavein, wh, sizeof(*wh)); st->inuse--; break; default: break; } }