static void audio_set_playback_params(struct audio_info_struct *ai) { int err; snd_pcm_playback_info_t pi; snd_pcm_playback_params_t pp; if((err=snd_pcm_playback_info(ai->handle, &pi)) < 0 ) { fprintf(stderr, "playback info failed: %s\n", snd_strerror(err)); return; /* not fatal error */ } bzero(&pp, sizeof(pp)); pp.fragment_size = pi.buffer_size/4; if (pp.fragment_size > pi.max_fragment_size) pp.fragment_size = pi.max_fragment_size; if (pp.fragment_size < pi.min_fragment_size) pp.fragment_size = pi.min_fragment_size; pp.fragments_max = -1; pp.fragments_room = 1; if((err=snd_pcm_playback_params(ai->handle, &pp)) < 0 ) { fprintf(stderr, "playback params failed: %s\n", snd_strerror(err)); return; /* not fatal error */ } }
static gboolean alsa_open (void *dp) { alsa_driver * const d = dp; int mf; snd_pcm_format_t pf; snd_pcm_playback_info_t pcm_info; snd_pcm_playback_params_t pp; snd_pcm_playback_status_t pbstat; int err = snd_pcm_open(&(d->soundfd), d->card_number, d->device_number, SND_PCM_OPEN_PLAYBACK); if (err != 0) { char buf[256]; g_sprintf(buf, _("Couldn't open ALSA device for sound output (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, 0); // enable block mode d->outtime = 0; 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; } pf.rate = d->p_mixfreq; d->playrate = d->p_mixfreq; d->mf = mf; err = snd_pcm_playback_format(d->soundfd, &pf); if (err < 0) { error_error(_("Required sound output format not supported.\n")); goto out; } snd_pcm_playback_info(d->soundfd, &pcm_info); memset(&pp, 0, sizeof(pp)); pp.fragment_size = d->p_fragsize * pf.channels * (d->bits / 8); pp.fragments_max = 1; // pp.fragments_max = 16pcm_info.buffer_size / pp.fragment_size; pp.fragments_room = 1; err = snd_pcm_playback_params(d->soundfd, &pp); if (err < 0) { error_error(_("Required sound output parameters not supported.\n")); goto out; } snd_pcm_playback_status(d->soundfd, &pbstat); // d->numfrags = pbstat.fragments; // d->numfrags = 1; d->fragsize = pbstat.fragment_size; d->numfrags = 1; /* fprintf(stderr, "Numfrags: %d\n", d->numfrags); fprintf(stderr, "Fragsize: %d\n", d->fragsize); */ d->sndbuf = calloc(1, d->fragsize); if(d->stereo == 1) { d->fragsize /= 2; } if(d->bits == 16) { d->fragsize /= 2; } d->polltag = audio_poll_add(snd_pcm_file_descriptor(d->soundfd), GDK_INPUT_WRITE, alsa_poll_ready_playing, d); /* d->firstpoll = TRUE; */ d->firstpoll = TRUE; d->playtime = 0; return TRUE; out: alsa_release(dp); return FALSE; }