#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include "mpg123.h"
#include <sys/audio.h>
int audio_open(struct audio_info_struct *ai)
{
struct audio_describe ades;
struct audio_gain again;
int i,audio;
ai->fn = open("/dev/audio",O_RDWR);
if(ai->fn < 0)
return -1;
ioctl(ai->fn,AUDIO_DESCRIBE,&ades);
if(ai->gain != -1)
{
if(ai->gain > ades.max_transmit_gain)
{
fprintf(stderr,"your gainvalue was to high -> set to maximum./n");
ai->gain = ades.max_transmit_gain;
}
if(ai->gain < ades.min_transmit_gain)
{
fprintf(stderr,"your gainvalue was to low -> set to minimum./n");
ai->gain = ades.min_transmit_gain;
}
again.channel_mask = AUDIO_CHANNEL_0 | AUDIO_CHANNEL_1;
ioctl(ai->fn,AUDIO_GET_GAINS,&again);
again.cgain[0].transmit_gain = ai->gain;
again.cgain[1].transmit_gain = ai->gain;
again.channel_mask = AUDIO_CHANNEL_0 | AUDIO_CHANNEL_1;
ioctl(ai->fn,AUDIO_SET_GAINS,&again);
}
if(ai->output != -1)
{
if(ai->output & AUDIO_OUT_INTERNAL_SPEAKER)
ioctl(ai->fn,AUDIO_SET_OUTPUT,AUDIO_OUT_SPEAKER);
else if(ai->output & AUDIO_OUT_HEADPHONES)
ioctl(ai->fn,AUDIO_SET_OUTPUT,AUDIO_OUT_HEADPHONE);
else if(ai->output & AUDIO_OUT_LINE_OUT)
ioctl(ai->fn,AUDIO_SET_OUTPUT,AUDIO_OUT_LINE);
}
if(ai->rate == -1)
ai->rate = 44100;
for(i=0;i<ades.nrates;i++)
{
if(ai->rate == ades.sample_rate[i])
break;
}
if(i == ades.nrates)
{
fprintf(stderr,"Can't set sample-rate to %ld./n",ai->rate);
i = 0;
}
if(audio_reset_parameters(ai) < 0)
return -1;
return ai->fn;
}
int audio_reset_parameters(struct audio_info_struct *ai)
{
int ret;
ret = audio_set_format(ai);
if(ret >= 0)
ret = audio_set_channels(ai);
if(ret >= 0)
ret = audio_set_rate(ai);
return ret;
}
int audio_rate_best_match(struct audio_info_struct *ai)
{
return 0;
}
int audio_set_rate(struct audio_info_struct *ai)
{
if(ai->rate >= 0)
return ioctl(ai->fn,AUDIO_SET_SAMPLE_RATE,ai->rate);
return 0;
}
int audio_set_channels(struct audio_info_struct *ai)
{
if(ai->channels<0)
return 0;
return ioctl(ai->fn,AUDIO_SET_CHANNELS,ai->channels);
}
int audio_set_format(struct audio_info_struct *ai)
{
int fmt;
switch(ai->format) {
case -1:
case AUDIO_FORMAT_SIGNED_16:
default:
fmt = AUDIO_FORMAT_LINEAR16BIT;
break;
case AUDIO_FORMAT_UNSIGNED_8:
fprintf(stderr,"unsigned 8 bit linear not supported/n");
return -1;
case AUDIO_FORMAT_SIGNED_8:
fprintf(stderr,"signed 8 bit linear not supported/n");
return -1;
case AUDIO_FORMAT_ALAW_8:
fmt = AUDIO_FORMAT_ALAW;
break;
case AUDIO_FORMAT_ULAW_8:
fmt = AUDIO_FORMAT_ULAW;
break;
}
return ioctl(ai->fn,AUDIO_SET_DATA_FORMAT,fmt);
}
int audio_get_formats(struct audio_info_struct *ai)
{
return AUDIO_FORMAT_SIGNED_16;
}
int audio_play_samples(struct audio_info_struct *ai,unsigned char *buf,int len)
{
return write(ai->fn,buf,len);
}
int audio_close(struct audio_info_struct *ai)
{
close (ai->fn);
return 0;
}