Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}