shout audioOutput will now connect and disconnect from icecast server

git-svn-id: https://svn.musicpd.org/mpd/trunk@2285 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Warren Dukes 2004-10-20 20:41:21 +00:00
parent eefcf79436
commit 72a7740fd5
5 changed files with 121 additions and 9 deletions

View File

@ -32,6 +32,7 @@ static AudioFormat audio_format;
static AudioFormat * audio_configFormat = NULL; static AudioFormat * audio_configFormat = NULL;
static AudioOutput * aoOutput = NULL; static AudioOutput * aoOutput = NULL;
static AudioOutput * shoutOutput = NULL;
static void copyAudioFormat(AudioFormat * dest, AudioFormat * src) { static void copyAudioFormat(AudioFormat * dest, AudioFormat * src) {
dest->sampleRate = src->sampleRate; dest->sampleRate = src->sampleRate;
@ -49,6 +50,7 @@ void initAudioDriver() {
aoOutput = newAudioOutput("ao"); aoOutput = newAudioOutput("ao");
assert(aoOutput); assert(aoOutput);
shoutOutput = newAudioOutput("shout");
} }
void getOutputAudioFormat(AudioFormat * inAudioFormat, void getOutputAudioFormat(AudioFormat * inAudioFormat,
@ -134,6 +136,7 @@ void finishAudioConfig() {
void finishAudioDriver() { void finishAudioDriver() {
finishAudioOutput(aoOutput); finishAudioOutput(aoOutput);
if(shoutOutput) finishAudioOutput(shoutOutput);
aoOutput = NULL; aoOutput = NULL;
} }
@ -148,6 +151,7 @@ int isCurrentAudioFormat(AudioFormat * audioFormat) {
int openAudioDevice(AudioFormat * audioFormat) { int openAudioDevice(AudioFormat * audioFormat) {
if(!aoOutput->open || !isCurrentAudioFormat(audioFormat)) { if(!aoOutput->open || !isCurrentAudioFormat(audioFormat)) {
copyAudioFormat(&audio_format, audioFormat); copyAudioFormat(&audio_format, audioFormat);
if(shoutOutput) openAudioOutput(shoutOutput, audioFormat);
return openAudioOutput(aoOutput, audioFormat); return openAudioOutput(aoOutput, audioFormat);
} }
@ -155,6 +159,7 @@ int openAudioDevice(AudioFormat * audioFormat) {
} }
int playAudio(char * playChunk, int size) { int playAudio(char * playChunk, int size) {
if(shoutOutput) playAudioOutput(shoutOutput, playChunk, size);
return playAudioOutput(aoOutput, playChunk, size); return playAudioOutput(aoOutput, playChunk, size);
} }
@ -163,5 +168,6 @@ int isAudioDeviceOpen() {
} }
void closeAudioDevice() { void closeAudioDevice() {
if(shoutOutput) closeAudioOutput(shoutOutput);
closeAudioOutput(aoOutput); closeAudioOutput(aoOutput);
} }

View File

@ -28,13 +28,16 @@ AudioOutput * newAudioOutput(char * name) {
if(findInList(audioOutputPluginList, name, &data)) { if(findInList(audioOutputPluginList, name, &data)) {
AudioOutputPlugin * plugin = (AudioOutputPlugin *) data; AudioOutputPlugin * plugin = (AudioOutputPlugin *) data;
ret = malloc(sizeof(AudioOutput)); ret = malloc(sizeof(AudioOutput));
ret->finishDriverFunc = plugin->initDriverFunc; ret->finishDriverFunc = plugin->finishDriverFunc;
ret->openDeviceFunc = plugin->openDeviceFunc; ret->openDeviceFunc = plugin->openDeviceFunc;
ret->playFunc = plugin->playFunc; ret->playFunc = plugin->playFunc;
ret->closeDeviceFunc = plugin->closeDeviceFunc; ret->closeDeviceFunc = plugin->closeDeviceFunc;
ret->open = 0; ret->open = 0;
plugin->initDriverFunc(ret); if(plugin->initDriverFunc(ret) != 0) {
free(ret);
ret = NULL;
}
} }
return ret; return ret;

View File

@ -28,7 +28,7 @@
typedef struct _AudioOutput AudioOutput; typedef struct _AudioOutput AudioOutput;
typedef void (* AudioOutputInitDriverFunc) (AudioOutput * audioOutput); typedef int (* AudioOutputInitDriverFunc) (AudioOutput * audioOutput);
typedef void (* AudioOutputFinishDriverFunc) (AudioOutput * audioOutput); typedef void (* AudioOutputFinishDriverFunc) (AudioOutput * audioOutput);

View File

@ -56,7 +56,7 @@ static void audioOutputAo_error() {
} }
} }
static void audioOutputAo_initDriver(AudioOutput * audioOutput) { static int audioOutputAo_initDriver(AudioOutput * audioOutput) {
ao_info * ai; ao_info * ai;
char * dup; char * dup;
char * stk1; char * stk1;
@ -71,7 +71,7 @@ static void audioOutputAo_initDriver(AudioOutput * audioOutput) {
ad->writeSize = strtol((getConf())[CONF_AUDIO_WRITE_SIZE],&test,10); ad->writeSize = strtol((getConf())[CONF_AUDIO_WRITE_SIZE],&test,10);
if (*test!='\0') { if (*test!='\0') {
ERROR("\"%s\" is not a valid write size", ERROR("\"%s\" is not a valid write size\n",
(getConf())[CONF_AUDIO_WRITE_SIZE]); (getConf())[CONF_AUDIO_WRITE_SIZE]);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -133,6 +133,8 @@ static void audioOutputAo_initDriver(AudioOutput * audioOutput) {
} }
} }
free(dup); free(dup);
return 0;
} }
static void freeAoData(AoData * ad) { static void freeAoData(AoData * ad) {

View File

@ -26,33 +26,127 @@
#include <assert.h> #include <assert.h>
#include <signal.h> #include <signal.h>
#include <shout/shout.h>
#include <vorbis/vorbisenc.h>
static int shoutInitCount = 0;
typedef struct _ShoutData { typedef struct _ShoutData {
shout_t * shoutConn;
} ShoutData; } ShoutData;
static ShoutData * newShoutData() { static ShoutData * newShoutData() {
ShoutData * ret = malloc(sizeof(ShoutData)); ShoutData * ret = malloc(sizeof(ShoutData));
ret->shoutConn = shout_new();
return ret; return ret;
} }
static void freeShoutData(ShoutData * sd) { static void freeShoutData(ShoutData * sd) {
if(sd->shoutConn) shout_free(sd->shoutConn);
free(sd); free(sd);
} }
static void shout_initDriver(AudioOutput * audioOutput) { static int shout_initDriver(AudioOutput * audioOutput) {
ShoutData * sd = newShoutData(); ShoutData * sd;
char * test;
int port;
char * host;
char * mount;
char * passwd;
char * user;
char * name;
if(!getConf()[CONF_SHOUT_HOST]) {
return -1;
}
sd = newShoutData();
if(!getConf()[CONF_SHOUT_MOUNT]) {
ERROR("shout host defined but not shout mount point\n");
exit(EXIT_FAILURE);
}
if(!getConf()[CONF_SHOUT_PORT]) {
ERROR("shout host defined but not shout port\n");
exit(EXIT_FAILURE);
}
if(!getConf()[CONF_SHOUT_PASSWD]) {
ERROR("shout host defined but not shout password\n");
exit(EXIT_FAILURE);
}
if(!getConf()[CONF_SHOUT_NAME]) {
ERROR("shout host defined but not shout name\n");
exit(EXIT_FAILURE);
}
if(!getConf()[CONF_SHOUT_USER]) {
ERROR("shout host defined but not shout user\n");
exit(EXIT_FAILURE);
}
host = getConf()[CONF_SHOUT_HOST];
passwd = getConf()[CONF_SHOUT_PASSWD];
user = getConf()[CONF_SHOUT_USER];
mount = getConf()[CONF_SHOUT_MOUNT];
name = getConf()[CONF_SHOUT_NAME];
port = strtol(getConf()[CONF_SHOUT_PORT], &test, 10);
if(*test != '\0' || port <= 0) {
ERROR("shout port \"%s\" is not a positive integer\n",
getConf()[CONF_SHOUT_PORT]);
exit(EXIT_FAILURE);
}
if(shout_set_host(sd->shoutConn, host) != SHOUTERR_SUCCESS ||
shout_set_port(sd->shoutConn, port) != SHOUTERR_SUCCESS ||
shout_set_password(sd->shoutConn, passwd) != SHOUTERR_SUCCESS ||
shout_set_mount(sd->shoutConn, mount) != SHOUTERR_SUCCESS ||
shout_set_name(sd->shoutConn, name) != SHOUTERR_SUCCESS ||
shout_set_user(sd->shoutConn, user) != SHOUTERR_SUCCESS ||
shout_set_format(sd->shoutConn, SHOUT_FORMAT_VORBIS)
!= SHOUTERR_SUCCESS ||
shout_set_protocol(sd->shoutConn, SHOUT_PROTOCOL_HTTP)
!= SHOUTERR_SUCCESS)
{
ERROR("error configuring shout: %s\n",
shout_get_error(sd->shoutConn));
exit(EXIT_FAILURE);
}
audioOutput->data = sd; audioOutput->data = sd;
if(shoutInitCount == 0) shout_init();
shoutInitCount++;
return 0;
} }
static void shout_finishDriver(AudioOutput * audioOutput) { static void shout_finishDriver(AudioOutput * audioOutput) {
ShoutData * sd = (ShoutData *)audioOutput->data; ShoutData * sd = (ShoutData *)audioOutput->data;
freeShoutData(sd); freeShoutData(sd);
shoutInitCount--;
if(shoutInitCount == 0) shout_shutdown();
} }
static void shout_closeDevice(AudioOutput * audioOutput) { static void shout_closeDevice(AudioOutput * audioOutput) {
/*ShoutData * sd = (ShoutData *) audioOutput->data;*/ ShoutData * sd = (ShoutData *) audioOutput->data;
if(shout_close(sd->shoutConn) != SHOUTERR_SUCCESS)
{
ERROR("problem closing connection to shout server: %s\n",
shout_get_error(sd->shoutConn));
}
audioOutput->open = 0; audioOutput->open = 0;
} }
@ -60,7 +154,14 @@ static void shout_closeDevice(AudioOutput * audioOutput) {
static int shout_openDevice(AudioOutput * audioOutput, static int shout_openDevice(AudioOutput * audioOutput,
AudioFormat * audioFormat) AudioFormat * audioFormat)
{ {
/*ShoutData * sd = (ShoutData *)audioOutput->data;*/ ShoutData * sd = (ShoutData *)audioOutput->data;
if(shout_open(sd->shoutConn) != SHOUTERR_SUCCESS)
{
ERROR("problem opening connection to shout server: %s\n",
shout_get_error(sd->shoutConn));
return -1;
}
audioOutput->open = 1; audioOutput->open = 1;