nkeynes@657: /** nkeynes@663: * $Id$ nkeynes@657: * nkeynes@657: * The pulseaudio sound driver nkeynes@657: * nkeynes@657: * Copyright (c) 2005 Nathan Keynes. nkeynes@657: * nkeynes@657: * This program is free software; you can redistribute it and/or modify nkeynes@657: * it under the terms of the GNU General Public License as published by nkeynes@657: * the Free Software Foundation; either version 2 of the License, or nkeynes@657: * (at your option) any later version. nkeynes@657: * nkeynes@657: * This program is distributed in the hope that it will be useful, nkeynes@657: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@657: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@657: * GNU General Public License for more details. nkeynes@657: */ nkeynes@657: #include nkeynes@657: #include nkeynes@657: #include nkeynes@657: #include "aica/audio.h" nkeynes@657: #include "lxdream.h" nkeynes@657: nkeynes@657: static pa_simple *pulse_server = NULL; nkeynes@657: nkeynes@697: gboolean audio_init( ) nkeynes@657: { nkeynes@697: int rate = DEFAULT_SAMPLE_RATE; nkeynes@697: int format = DEFAULT_SAMPLE_FORMAT; nkeynes@657: pa_sample_spec ss; nkeynes@657: nkeynes@657: if( pulse_server != NULL ) { nkeynes@657: pa_simple_free(pulse_server); nkeynes@657: } nkeynes@657: ss.rate = rate; nkeynes@657: nkeynes@657: if( format & AUDIO_FMT_16BIT ) { nkeynes@657: ss.format = PA_SAMPLE_S16NE; nkeynes@657: } else { nkeynes@657: ss.format = PA_SAMPLE_U8; nkeynes@657: } nkeynes@657: nkeynes@657: if( format & AUDIO_FMT_STEREO ) { nkeynes@657: ss.channels = 2; nkeynes@657: } else { nkeynes@657: ss.channels = 1; nkeynes@657: } nkeynes@657: nkeynes@657: pulse_server = pa_simple_new(NULL, APP_NAME, PA_STREAM_PLAYBACK, nkeynes@657: NULL, "Audio", &ss, NULL, NULL, NULL); nkeynes@657: if( pulse_server == NULL ) { nkeynes@657: ERROR( "Unable to open audio output (pulseaudio)" ); nkeynes@657: return FALSE; nkeynes@657: } nkeynes@657: return TRUE; nkeynes@657: } nkeynes@657: nkeynes@657: gboolean audio_pulse_process_buffer( audio_buffer_t buffer ) nkeynes@657: { nkeynes@657: if( pulse_server != NULL ) { nkeynes@657: int error; nkeynes@657: pa_simple_write( pulse_server, buffer->data, buffer->length, &error ); nkeynes@657: return TRUE; nkeynes@657: } else { nkeynes@657: ERROR( "Pulseaudio not initialized" ); nkeynes@657: return FALSE; nkeynes@657: } nkeynes@657: } nkeynes@657: nkeynes@697: gboolean audio_pulse_shutdown() nkeynes@657: { nkeynes@657: pa_simple_free(pulse_server); nkeynes@657: pulse_server = NULL; nkeynes@657: return TRUE; nkeynes@657: } nkeynes@657: nkeynes@697: struct audio_driver audio_pulse_driver = { "pulse", nkeynes@697: DEFAULT_SAMPLE_RATE, nkeynes@697: DEFAULT_SAMPLE_FORMAT, nkeynes@697: audio_pulse_init, nkeynes@697: NULL, nkeynes@697: audio_pulse_process_buffer, nkeynes@697: NULL, nkeynes@697: audio_pulse_shutdown}; nkeynes@657: