You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/kscd/libwm/audio/audio_arts.c

142 lines
2.9 KiB

/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*
* Linux digital audio functions.
*
*
* Forget /dev/audio
* most modern soundcards accept 16LE with 44.1kHz
* Alexander Kern alex.kern@gmx.de
*/
#include <config.h>
#ifdef USE_ARTS
#include <artsc.h>
#include "audio.h"
arts_stream_t arts_stream = NULL;
int arts_open(void);
int arts_close(void);
int arts_stop(void);
int arts_play(struct cdda_block *blk);
int arts_state(struct cdda_block *blk);
struct audio_oops* setup_arts(const char *dev, const char *ctl);
/*
* Initialize the audio device.
*/
int
arts_open(void)
{
int err;
DEBUGLOG("arts_open\n");
if(!(arts_stream = arts_play_stream(44100, 16, 2, "cddaslave"))) {
ERRORLOG("cannot open ARTS stream for playback\n");
return -1;
}
/* 1000 ms because we read 75 frames = 1 sec */
if((err = arts_stream_set(arts_stream, ARTS_P_BUFFER_TIME, 1000)) < 0) {
ERRORLOG("arts_stream_set failed (%s)\n", arts_error_text(err));
return -1;
}
return 0;
}
/*
* Close the audio device.
*/
int
arts_close(void)
{
arts_stop();
DEBUGLOG("arts_close\n");
arts_close_stream(arts_stream);
arts_free();
return 0;
}
/*
* Play some audio and pass a status message upstream, if applicable.
* Returns 0 on success.
*/
int
arts_play(struct cdda_block *blk)
{
int err;
if((err = arts_write(arts_stream, blk->buf, blk->buflen)) < 0) {
ERRORLOG("arts_write failed (%s)\n", arts_error_text(err));
blk->status = WM_CDM_CDDAERROR;
return -1;
}
return 0;
}
/*
* Stop the audio immediately.
*/
int
arts_stop(void)
{
DEBUGLOG("arts_stop\n");
return 0;
}
/*
* Get the current audio state.
*/
int
arts_state(struct cdda_block *blk)
{
return -1; /* not implemented yet for ARTS */
}
static struct audio_oops arts_oops = {
.wmaudio_open = arts_open,
.wmaudio_close = arts_close,
.wmaudio_play = arts_play,
.wmaudio_stop = arts_stop,
.wmaudio_state = arts_state,
.wmaudio_balance = NULL,
.wmaudio_volume = NULL
};
struct audio_oops*
setup_arts(const char *dev, const char *ctl)
{
int err;
if((err = arts_init())) {
ERRORLOG("cannot initialize ARTS audio subsystem (%s)\n", arts_error_text(err));
return NULL;
}
arts_open();
return &arts_oops;
}
#endif