static int setup_recording(void) { int err; if ((err = snd_pcm_capture_info(pcm_handle, &rec_info)) < 0) { module_logger(&alsaSound, _L|LOG_USER | LOG_ERROR, _("record info error: %s\n"), snd_strerror(err)); return 0; } /* Verify that our format is legal. */ if (rec_info.min_rate > rec_format.rate || rec_info.max_rate < rec_format.rate) { module_logger(&alsaSound, _L|LOG_USER, _("device supports recording range %d to %d Hz" "clipping default rate.\n"), rec_info.min_rate, rec_info.max_rate); if (rec_info.min_rate > rec_format.rate) rec_format.rate = rec_info.min_rate; if (rec_format.rate > rec_info.max_rate) rec_format.rate = rec_info.max_rate; } memset((void *) &rec_format, 0, sizeof(rec_format)); rec_format.rate = pcm_hz; rec_format.channels = 1; if (!(rec_info.formats & (1 << (rec_format.format = SND_PCM_SFMT_S8))) && !(rec_info.formats & (1 << (rec_format.format = SND_PCM_SFMT_U8)))) { module_logger(&alsaSound, _L|LOG_ERROR | LOG_USER, _("device does not support desired eight-bit recording format\n")); //!!! until mix_server.c is more flexible return 0; } if ((err = snd_pcm_capture_format(pcm_handle, &rec_format)) < 0) { module_logger(&alsaSound, _L|LOG_ERROR | LOG_USER, _("device cannot set recording format\n"), snd_strerror(err)); return 0; } /* Optimize fragments */ pcm_samplesize = 512; samplebuf = (s16 *) malloc(pcm_samplesize * sizeof(samplebuf[0])); // log(_("ALSA sample size = %d"), pcm_samplesize); memset((void *) &rec_params, 0, sizeof(rec_params)); rec_params.fragment_size = pcm_samplesize * sizeof(s16); if ((err = snd_pcm_capture_params(pcm_handle, &rec_params)) < 0) { module_logger(&alsaSound, _L|LOG_ERROR | LOG_USER, _("device cannot set requested PCM recording parameters:\n" "%s\n"), snd_strerror(err)); return 0; } return 1; }
static gboolean alsa_open (void *dp) { alsa_driver * const d = dp; int mf; snd_pcm_format_t pf; snd_pcm_capture_info_t pcm_info; snd_pcm_capture_params_t pp; snd_pcm_capture_status_t pbstat; // int err = snd_pcm_open(&(d->soundfd), d->card_number, d->device_number, // SND_PCM_OPEN_CAPTURE); int err = snd_pcm_open(&(d->soundfd), 0, 0, SND_PCM_OPEN_CAPTURE); if (err != 0) { char buf[256]; g_sprintf(buf, _("Couldn't open ALSA device for sound input (card:%d, device:%d):\n%s"), d->card_number, d->device_number, snd_strerror(err)); error_error(buf); goto out; } // --- // Set non-blocking mode. // --- snd_pcm_block_mode(d->soundfd, 1); // enable block mode d->bits = 0; mf = 0; // --- // Select audio format // --- memset(&pf, 0, sizeof(pf)); if (d->p_resolution == 16) { pf.format = SND_PCM_SFMT_S16_LE; d->bits = 16; mf = ST_MIXER_FORMAT_S16_LE; } else { pf.format = SND_PCM_SFMT_U8; d->bits = 8; mf = ST_MIXER_FORMAT_S8; } /* if(d->p_channels == 2) { */ /* d->stereo = 1; */ /* pf.channels = d->p_channels; */ /* mf |= ST_MIXER_FORMAT_STEREO; */ /* } */ /* else { */ /* pf.channels = d->p_channels; */ /* d->stereo = 0; */ /* } */ d->stereo = 0; pf.channels = 1; pf.rate = d->p_mixfreq; d->playrate = d->p_mixfreq; mf = ST_MIXER_FORMAT_S16_LE; d->mf = mf; err = snd_pcm_capture_format(d->soundfd, &pf); if (err < 0) { error_error(_("Required sound output format not supported.\n")); goto out; } snd_pcm_capture_info(d->soundfd, &pcm_info); memset(&pp, 0, sizeof(pp)); pp.fragment_size = d->p_fragsize * pf.channels * d->bits / 8; pp.fragments_min = 1; err = snd_pcm_capture_params(d->soundfd, &pp); if (err < 0) { error_error(_("Required sound output parameters not supported.\n")); goto out; } snd_pcm_capture_status(d->soundfd, &pbstat); /* d->numfrags = pbstat.fragments; */ d->numfrags = 1; d->fragsize = pbstat.fragment_size; d->sndbuf = calloc(1, d->fragsize); if(d->stereo == 1) { d->fragsize /= 2; } if(d->bits == 16) { d->fragsize /= 2; } d->polltag = gdk_input_add(snd_pcm_file_descriptor(d->soundfd), GDK_INPUT_READ, alsa_poll_ready_sampling, d); // d->firstpoll = TRUE; // d->playtime = 0; return TRUE; out: alsa_release(dp); return FALSE; }