/* * 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 #ifdef USE_ARTS #include #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