parent
2020e79100
commit
24cc08a67d
5 changed files with 124 additions and 111 deletions
@ -1,101 +0,0 @@ |
||||
/* Extended Module Player
|
||||
* Copyright (C) 1996-2012 Claudio Matsuoka and Hipolito Carraro Jr |
||||
* |
||||
* This file is part of the Extended Module Player and is distributed |
||||
* under the terms of the GNU General Public License. See doc/COPYING |
||||
* for more information. |
||||
*/ |
||||
|
||||
#ifdef HAVE_CONFIG_H |
||||
#include "config.h" |
||||
#endif |
||||
|
||||
#include <unistd.h> |
||||
#include <pulse/simple.h> |
||||
#include <pulse/error.h> |
||||
|
||||
#include "common.h" |
||||
#include "driver.h" |
||||
#include "mixer.h" |
||||
|
||||
static pa_simple *s; |
||||
|
||||
static int init(struct context_data *); |
||||
static void bufdump(struct context_data *, void *, int); |
||||
static void myshutdown(struct context_data *); |
||||
static void flush(); |
||||
|
||||
static void dummy() |
||||
{ |
||||
} |
||||
|
||||
struct sound_driver sound_pulseaudio = { |
||||
"pulseaudio", /* driver ID */ |
||||
"PulseAudio", /* driver description */ |
||||
NULL, /* help */ |
||||
init, /* init */ |
||||
myshutdown, /* shutdown */ |
||||
dummy, /* starttimer */ |
||||
flush, /* flush */ |
||||
bufdump, /* bufdump */ |
||||
}; |
||||
|
||||
static int init(struct context_data *ctx) |
||||
{ |
||||
struct xmp_options *o = &ctx->o; |
||||
pa_sample_spec ss; |
||||
int error; |
||||
|
||||
ss.format = PA_SAMPLE_S16NE; |
||||
ss.channels = o->outfmt & XMP_FORMAT_MONO ? 1 : 2; |
||||
ss.rate = o->freq; |
||||
|
||||
s = pa_simple_new(NULL, /* Use the default server */ |
||||
"xmp", /* Our application's name */ |
||||
PA_STREAM_PLAYBACK, |
||||
NULL, /* Use the default device */ |
||||
"Music", /* Description of our stream */ |
||||
&ss, /* Our sample format */ |
||||
NULL, /* Use default channel map */ |
||||
NULL, /* Use default buffering attributes */ |
||||
&error); /* Ignore error code */ |
||||
|
||||
if (s == 0) { |
||||
fprintf(stderr, "pulseaudio error: %s\n", pa_strerror(error)); |
||||
return XMP_ERR_DINIT; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static void flush() |
||||
{ |
||||
int error; |
||||
|
||||
if (pa_simple_drain(s, &error) < 0) { |
||||
fprintf(stderr, "pulseaudio error: %s\n", pa_strerror(error)); |
||||
} |
||||
} |
||||
|
||||
static void bufdump(struct context_data *ctx, void *b, int i) |
||||
{ |
||||
int j, error; |
||||
|
||||
do { |
||||
if ((j = pa_simple_write(s, b, i, &error)) > 0) { |
||||
i -= j; |
||||
b += j; |
||||
} else |
||||
break; |
||||
} while (i); |
||||
|
||||
if (j < 0) { |
||||
fprintf(stderr, "pulseaudio error: %s\n", pa_strerror(error)); |
||||
} |
||||
} |
||||
|
||||
static void myshutdown(struct context_data *ctx) |
||||
{ |
||||
if (s) |
||||
pa_simple_free(s); |
||||
} |
||||
@ -0,0 +1,88 @@ |
||||
#include <unistd.h> |
||||
#include <pulse/simple.h> |
||||
#include <pulse/error.h> |
||||
#include "sound.h" |
||||
|
||||
static pa_simple *s; |
||||
|
||||
|
||||
static int init(struct options *options) |
||||
{ |
||||
pa_sample_spec ss; |
||||
int error; |
||||
|
||||
options->format &= ~(XMP_FORMAT_UNSIGNED | XMP_FORMAT_8BIT); |
||||
|
||||
ss.format = PA_SAMPLE_S16NE; |
||||
ss.channels = options->format & XMP_FORMAT_MONO ? 1 : 2; |
||||
ss.rate = options->rate; |
||||
|
||||
s = pa_simple_new(NULL, /* Use the default server */ |
||||
"xmp", /* Our application's name */ |
||||
PA_STREAM_PLAYBACK, |
||||
NULL, /* Use the default device */ |
||||
"Music", /* Description of our stream */ |
||||
&ss, /* Our sample format */ |
||||
NULL, /* Use default channel map */ |
||||
NULL, /* Use default buffering attributes */ |
||||
&error); /* Ignore error code */ |
||||
|
||||
if (s == NULL) { |
||||
fprintf(stderr, "pulseaudio error: %s\n", pa_strerror(error)); |
||||
return -1; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static void play(void *b, int i) |
||||
{ |
||||
int j, error; |
||||
|
||||
do { |
||||
if ((j = pa_simple_write(s, b, i, &error)) > 0) { |
||||
i -= j; |
||||
b += j; |
||||
} else |
||||
break; |
||||
} while (i); |
||||
|
||||
if (j < 0) { |
||||
fprintf(stderr, "pulseaudio error: %s\n", pa_strerror(error)); |
||||
} |
||||
} |
||||
|
||||
static void deinit() |
||||
{ |
||||
pa_simple_free(s); |
||||
} |
||||
|
||||
static void flush() |
||||
{ |
||||
int error; |
||||
|
||||
if (pa_simple_drain(s, &error) < 0) { |
||||
fprintf(stderr, "pulseaudio error: %s\n", pa_strerror(error)); |
||||
} |
||||
} |
||||
|
||||
static void onpause() |
||||
{ |
||||
} |
||||
|
||||
static void onresume() |
||||
{ |
||||
} |
||||
|
||||
|
||||
struct sound_driver sound_pulseaudio = { |
||||
"pulseaudio", |
||||
"PulseAudio", |
||||
NULL, |
||||
init, |
||||
deinit, |
||||
play, |
||||
flush, |
||||
onpause, |
||||
onresume |
||||
}; |
||||
Loading…
Reference in new issue