Audio-Play-MPG123
view release on metacpan or search on metacpan
mpg123/audio_alsa.c view on Meta::CPAN
#endif
int audio_open(struct audio_info_struct *ai)
{
int err;
int card=0,device=0;
char scard[128], sdevice[128];
if(!ai)
return -1;
if(ai->device) { /* parse ALSA device name */
if(strchr(ai->device,':')) { /* card with device */
strncpy(scard, ai->device, sizeof(scard)-1);
scard[sizeof(scard)-1] = '\0';
if (strchr(scard,':')) *strchr(scard,':') = '\0';
card = snd_card_name(scard);
if (card < 0) {
fprintf(stderr, "wrong soundcard number: %s\n", scard);
exit(1);
}
strncpy(sdevice, strchr(ai->device, ':') + 1, sizeof(sdevice)-1);
} else {
strncpy(sdevice, ai->device, sizeof(sdevice)-1);
}
sdevice[sizeof(sdevice)-1] = '\0';
device = atoi(sdevice);
if (!isdigit(sdevice[0]) || device < 0 || device > 31) {
fprintf(stderr, "wrong device number: %s\n", sdevice);
exit(1);
}
}
if((err=snd_pcm_open(&ai->handle, card, device, SND_PCM_OPEN_PLAYBACK)) < 0 )
{
fprintf(stderr, "open failed: %s\n", snd_strerror(err));
exit(1);
}
if(audio_reset_parameters(ai) < 0)
{
audio_close(ai);
return -1;
}
return 0;
}
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 */
}
}
int audio_reset_parameters(struct audio_info_struct *ai)
{
audio_set_format(ai);
audio_set_channels(ai);
audio_set_rate(ai);
return 0;
}
int audio_rate_best_match(struct audio_info_struct *ai)
{
return 0;
}
int audio_set_rate(struct audio_info_struct *ai)
{
int ret;
if(!ai || ai->rate < 0)
return -1;
ai->alsa_format.rate=ai->rate;
if((ret=snd_pcm_playback_format(ai->handle, &ai->alsa_format)) < 0 )
return -1;
audio_set_playback_params(ai);
return 0;
}
int audio_set_channels(struct audio_info_struct *ai)
{
int ret;
if(ai->alsa_format.channels < 0)
return 0;
ai->alsa_format.channels = ai->channels;
if((ret=snd_pcm_playback_format(ai->handle, &ai->alsa_format)) < 0 )
return -1;
audio_set_playback_params(ai);
return 0;
}
int audio_set_format(struct audio_info_struct *ai)
{
int ret;
( run in 1.650 second using v1.01-cache-2.11-cpan-800906f7e73 )