}
for (i = 0; i < n2; i++) _poll_fd [i].events |= POLLERR;
- r = poll (_poll_fd, n2, 1000);
+ timespec timeout;
+ timeout.tv_sec = 1;
+ timeout.tv_nsec = 0;
+ r = ppoll (_poll_fd, n2, &timeout, NULL);
+
if (r < 0)
{
if (errno == EINTR) return 0;
const snd_pcm_channel_area_t *a;
int err;
+ if (!_play_handle) {
+ return 0;
+ }
if ((err = snd_pcm_mmap_begin (_play_handle, &a, &_play_offs, &len)) < 0)
{
if (_debug & DEBUG_DATA) fprintf (stderr, "Alsa_pcmi: snd_pcm_mmap_begin(play): %s.\n", snd_strerror (err));
const snd_pcm_channel_area_t *a;
int err;
+ if (!_capt_handle) {
+ return 0;
+ }
+
if ((err = snd_pcm_mmap_begin (_capt_handle, &a, &_capt_offs, &len)) < 0)
{
if (_debug & DEBUG_DATA) fprintf (stderr, "Alsa_pcmi: snd_pcm_mmap_begin(capt): %s.\n", snd_strerror (err));
int Alsa_pcmi::play_done (int len)
{
+ if (!_play_handle) return 0;
return snd_pcm_mmap_commit (_play_handle, _play_offs, len);
}
int Alsa_pcmi::capt_done (int len)
{
+ if (!_capt_handle) return 0;
return snd_pcm_mmap_commit (_capt_handle, _capt_offs, len);
}
}
}
+ _state = -2;
if (_play_handle)
{
if (snd_pcm_hw_params_malloc (&_play_hwpar) < 0)
if (snd_pcm_hw_params_get_rate (_play_hwpar, &fsamp, &dir) || (fsamp != _fsamp) || dir)
{
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't get requested sample rate for playback.\n");
+ _state = -3;
return;
}
if (snd_pcm_hw_params_get_period_size (_play_hwpar, &fsize, &dir) || (fsize != _fsize) || dir)
{
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't get requested period size for playback.\n");
+ _state = -4;
return;
}
if (snd_pcm_hw_params_get_periods (_play_hwpar, &nfrag, &dir) || (nfrag != _nfrag) || dir)
{
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't get requested number of periods for playback.\n");
+ _state = -5;
return;
}
default:
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't handle playback sample format.\n");
+ _state = -6;
return;
}
#elif __BYTE_ORDER == __BIG_ENDIAN
default:
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't handle playback sample format.\n");
+ _state = -6;
return;
}
#else
if (snd_pcm_hw_params_get_rate (_capt_hwpar, &fsamp, &dir) || (fsamp != _fsamp) || dir)
{
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't get requested sample rate for capture.\n");
+ _state = -3;
return;
}
if (snd_pcm_hw_params_get_period_size (_capt_hwpar, &fsize, &dir) || (fsize != _fsize) || dir)
{
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't get requested period size for capture.\n");
+ _state = -4;
return;
}
if (snd_pcm_hw_params_get_periods (_capt_hwpar, &nfrag, &dir) || (nfrag != _nfrag) || dir)
{
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't get requested number of periods for capture.\n");
+ _state = -5;
return;
}
default:
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't handle capture sample format.\n");
+ _state = -6;
return;
}
#elif __BYTE_ORDER == __BIG_ENDIAN
default:
if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't handle capture sample format.\n");
+ _state = -6;
return;
}
#else