static snd_pcm_t * alsa_open_r(const char *pcmdev,int bits,int stereo,int rate) { snd_pcm_t *pcm_handle; int err; ms_message("alsa_open_r: opening %s at %iHz, bits=%i, stereo=%i",pcmdev,rate,bits,stereo); #ifndef THREADED_VERSION if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_CAPTURE,SND_PCM_NONBLOCK) < 0) { ms_warning("alsa_open_r: Error opening PCM device %s",pcmdev ); return NULL; } #else /* want blocking mode for threaded version */ if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_CAPTURE,0) < 0) { ms_warning("alsa_open_r: Error opening PCM device %s",pcmdev ); return NULL; } #endif if (alsa_set_params(pcm_handle,0,bits,stereo,rate)<0){ snd_pcm_close(pcm_handle); return NULL; } err=snd_pcm_start(pcm_handle); if (err<0){ ms_warning("snd_pcm_start() failed: %s", snd_strerror(err)); } return pcm_handle; }
// Retry approach taken from pa_linux_alsa.c, part of PortAudio bool AlsaLayer::openDevice(snd_pcm_t **pcm, const std::string &dev, snd_pcm_stream_t stream) { DEBUG("Alsa: Opening %s", dev.c_str()); static const int MAX_RETRIES = 100; int err = snd_pcm_open(pcm, dev.c_str(), stream, 0); // Retry if busy, since dmix plugin may not have released the device yet for (int tries = 0; tries < MAX_RETRIES and err == -EBUSY; ++tries) { const struct timespec req = {0, 100000000L}; nanosleep(&req, 0); err = snd_pcm_open(pcm, dev.c_str(), stream, 0); } if (err < 0) { ERROR("Alsa: couldn't open device %s : %s", dev.c_str(), snd_strerror(err)); return false; } if (!alsa_set_params(*pcm)) { snd_pcm_close(*pcm); return false; } return true; }
static snd_pcm_t * alsa_open_r(const char *pcmdev,int bits,int stereo,int rate) { snd_pcm_t *pcm_handle; int err; ms_message("alsa_open_r: opening %s at %iHz, bits=%i, stereo=%i",pcmdev,rate,bits,stereo); #ifndef THREADED_VERSION if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_CAPTURE,SND_PCM_NONBLOCK) < 0) { ms_warning("alsa_open_r: Error opening PCM device %s",pcmdev ); return NULL; } #else /* want blocking mode for threaded version */ if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_CAPTURE,0) < 0) { ms_warning("alsa_open_r: Error opening PCM device %s",pcmdev ); return NULL; } #endif { struct timeval tv1; struct timeval tv2; struct timezone tz; int diff = 0; err = gettimeofday(&tv1, &tz); while (1) { if (!(alsa_set_params(pcm_handle,0,bits,stereo,rate)<0)){ ms_message("alsa_open_r: Audio params set"); break; } if (!gettimeofday(&tv2, &tz) && !err) { diff = ((tv2.tv_sec - tv1.tv_sec) * 1000000) + (tv2.tv_usec - tv1.tv_usec); } else { diff = -1; } if ((diff < 0) || (diff > 3000000)) { /* 3 secondes */ ms_error("alsa_open_r: Error setting params for more than 3 seconds"); snd_pcm_close(pcm_handle); return NULL; } ms_warning("alsa_open_r: Error setting params (for %d micros)", diff); usleep(200000); } } err=snd_pcm_start(pcm_handle); if (err<0){ ms_warning("snd_pcm_start() failed: %s", snd_strerror(err)); } return pcm_handle; }
static snd_pcm_t * alsa_open_w(const char *pcmdev,int bits,int stereo,int rate) { snd_pcm_t *pcm_handle; if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_PLAYBACK,SND_PCM_NONBLOCK) < 0) { ms_warning("alsa_open_w: Error opening PCM device %s\n",pcmdev ); return NULL; } if (alsa_set_params(pcm_handle,1,bits,stereo,rate)<0){ snd_pcm_close(pcm_handle); return NULL; } return pcm_handle; }
static snd_pcm_t * alsa_open_w(const char *pcmdev,int bits,int stereo,int rate) { snd_pcm_t *pcm_handle; ms_message("alsa_open_w: opening %s at %iHz, bits=%i, stereo=%i",pcmdev,rate,bits,stereo); if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_PLAYBACK,SND_PCM_NONBLOCK) < 0) { ms_warning("alsa_open_w: Error opening PCM device %s",pcmdev ); return NULL; } alsa_resume(pcm_handle); { struct timeval tv1; struct timeval tv2; struct timezone tz; int diff = 0; int err; err = gettimeofday(&tv1, &tz); while (1) { if (!(alsa_set_params(pcm_handle,1,bits,stereo,rate)<0)){ ms_message("alsa_open_w: Audio params set"); break; } if (!gettimeofday(&tv2, &tz) && !err) { diff = ((tv2.tv_sec - tv1.tv_sec) * 1000000) + (tv2.tv_usec - tv1.tv_usec); } else { diff = -1; } if ((diff < 0) || (diff > 3000000)) { /* 3 secondes */ ms_error("alsa_open_w: Error setting params for more than 3 seconds"); snd_pcm_close(pcm_handle); return NULL; } ms_warning("alsa_open_w: Error setting params (for %d micros)", diff); usleep(200000); } } return pcm_handle; }
static snd_pcm_t * alsa_open_r(const char *pcmdev,int bits,int stereo,int rate) { snd_pcm_t *pcm_handle; int err; ms_message("alsa_open_r: opening %s at %iHz, bits=%i, stereo=%i",pcmdev,rate,bits,stereo); if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_CAPTURE,SND_PCM_NONBLOCK) < 0) { ms_warning("alsa_open_r: Error opening PCM device %s\n",pcmdev ); return NULL; } if (alsa_set_params(pcm_handle,0,bits,stereo,rate)<0){ snd_pcm_close(pcm_handle); return NULL; } err=snd_pcm_start(pcm_handle); if (err<0){ ms_warning("snd_pcm_start() failed: %s", snd_strerror(err)); } return pcm_handle; }