Update of /cvsroot/playerstage/code/player/utils/xmms-plugin
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26844/utils/xmms-plugin
Added Files:
AUTHORS Makefile.am README playerxmms.c
Log Message:
added xmms plugin for player audio interface
--- NEW FILE: README ---
to install the plugin, install player and then
ln -s /usr/local/lib/libplayxmms.so* ~/.xmms/Plugins/
and restart xmms
--- NEW FILE: Makefile.am ---
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/client_libs
lib_LTLIBRARIES =
if HAVE_XMMS
lib_LTLIBRARIES += libplayerxmms.la
endif
libplayerxmms_la_CFLAGS = `xmms-config --cflags`
libplayerxmms_la_LDFLAGS = `xmms-config --libs`
$(top_builddir)/client_libs/libplayerc/libplayerc.la
$(top_builddir)/libplayerxdr/libplayerxdr.la
$(top_builddir)/libplayercore/libplayererror.la
libplayerxmms_la_SOURCES = playerxmms.c
--- NEW FILE: AUTHORS ---
The original skeleton and player packaging were put together by Toby Collett.
All the real hard work was done by Geoff Biggs
--- NEW FILE: playerxmms.c ---
/* XMMS - Cross-platform multimedia player
* Copyright (C) 1998-2004 Peter Alm, Mikael Alm, Olle Hallnas,
* Thomas Nilsson and 4Front Technologies
* Copyright (C) 1999-2004 Haavard Kvaalen
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#define VERSION "0.0.0"
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include <xmms/plugin.h>
#include <xmms/xmmsctrl.h>
#include <xmms/dirbrowser.h>
#include <xmms/configfile.h>
#include <xmms/util.h>
#include <libplayerc/playerc.h>
static GtkWidget *configure_win = NULL, *configure_vbox;
static GtkWidget *server_address_entry;
static GtkWidget *server_port_entry;
static GtkWidget *buffer_entry;
static GtkWidget *server_index_entry;
static GtkWidget *configure_separator;
static GtkWidget *configure_bbox, *configure_ok, *configure_cancel;
static gchar *server_address = NULL;
static guint32 server_port = 6665;
static guint32 server_index = 0;
static playerc_client_t *client;
static playerc_audio_t *audio_proxy;
static guint64 written = 0;
static AFormat afmt;
static guint32 sampleRate = 44100;
static guint8 numChannels = 2;
static guint32 bytesPerSecond = 176400;
static guint8 *buffer = NULL;
static guint32 bufferTime = 5000;
static guint32 bufferLength = 0;
static guint32 bufferPos = 0;
gint ctrlsocket_get_session_id(void); /* FIXME */
static void playerout_init(void);
static void playerout_get_volume (int *l, int *r);
static void playerout_set_volume (int l, int r);
static gint playerout_open(AFormat fmt, gint rate, gint nch);
static void playerout_write(void *ptr, gint length);
static void playerout_close(void);
static void playerout_flush(gint time);
static void playerout_pause(short p);
static gint playerout_free(void);
static gint playerout_playing(void);
static gint playerout_get_written_time(void);
static gint playerout_get_output_time(void);
static void playerout_configure(void);
OutputPlugin playerout_op =
{
NULL,
NULL,
NULL, /* Description */
playerout_init,
NULL, /* about */
playerout_configure, /* configure */
playerout_get_volume, /* get_volume */
playerout_set_volume, /* set_volume */
playerout_open,
playerout_write,
playerout_close,
playerout_flush,
playerout_pause,
playerout_free,
playerout_playing,
playerout_get_output_time,
playerout_get_written_time,
};
OutputPlugin *get_oplugin_info(void)
{
playerout_op.description = g_strdup_printf("Player Output Driver %s",
VERSION);
return &playerout_op;
}
static void playerout_init(void)
{
ConfigFile *cfgfile;
cfgfile = xmms_cfg_open_default_file();
if (cfgfile)
{
xmms_cfg_read_string(cfgfile, "playerout", "server_address",
&server_address);
xmms_cfg_read_int(cfgfile, "playerout", "server_port",
&server_port);
xmms_cfg_read_int(cfgfile, "playerout", "server_index",
&server_index);
xmms_cfg_read_int (cfgfile, "playerout", "buffer_time",
&bufferTime);
xmms_cfg_free(cfgfile);
}
if (!server_address)
server_address = g_strdup ("localhost");
}
static void playerout_get_volume (int *l, int *r)
{
if (audio_proxy)
{
// playerc_audio_get_mixer_levels (audio_proxy);
*l = (int) (audio_proxy->mixer_data.channels[0].amplitude *
100);
*r = (int) (audio_proxy->mixer_data.channels[0].amplitude *
100);
}
else
*l = *r = 0;
}
static void playerout_set_volume (int l, int r)
{
if (audio_proxy)
{
// Find the average of l and r
float avg = ((float) (l + r) / 2.0f) / 100.0f;
playerc_audio_mixer_channel_cmd (audio_proxy, 0, avg, 1);
}
}
static gint playerout_open(AFormat fmt, gint rate, gint nch)
{
gint pos;
written = 0;
afmt = fmt;
sampleRate = rate;
numChannels = nch;
if (xmms_check_realtime_priority())
{
xmms_show_message("Error",
"You cannot use the Player Output plugin\n"
"when you're running in realtime mode.",
"Ok", FALSE, NULL, NULL);
return 0;
}
/* do player server connection here */
// Create a client object and connect to the server; the server must
// be running on "localhost" at port 6665
client = playerc_client_create(NULL, server_address, server_port);
if (playerc_client_connect(client) != 0)
{
fprintf(stderr, "error: %s\n", playerc_error_str());
client = NULL;
return 0;
}
// Create a audio proxy susbscribe
audio_proxy = playerc_audio_create(client, server_index);
if (playerc_audio_subscribe(audio_proxy, PLAYERC_OPEN_MODE) != 0)
{
fprintf(stderr, "error: %s\n", playerc_error_str());
return 0;
}
bytesPerSecond = sampleRate * numChannels;
if (fmt == FMT_S16_LE || fmt == FMT_S16_BE || fmt == FMT_S16_NE ||
fmt == FMT_U16_LE || fmt == FMT_U16_BE || fmt == FMT_U16_NE)
bytesPerSecond *= 2;
// Allocate a buffer
bufferLength = (int) (((float) bufferTime / 1000.0f) * bytesPerSecond);
if (buffer != NULL)
free (buffer);
buffer = malloc (bufferLength);
bufferPos = 0;
return 1;
}
static void convert_buffer(gpointer buffer, gint length)
{
gint i;
if (afmt == FMT_S8)
{
guint8 *ptr1 = buffer;
gint8 *ptr2 = buffer;
for (i = 0; i < length; i++)
*(ptr1++) = *(ptr2++) ^ 128;
}
if (afmt == FMT_S16_BE)
{
gint16 *ptr = buffer;
for (i = 0; i < length >> 1; i++, ptr++)
*ptr = GUINT16_SWAP_LE_BE(*ptr);
}
if (afmt == FMT_S16_NE)
{
gint16 *ptr = buffer;
for (i = 0; i < length >> 1; i++, ptr++)
*ptr = GINT16_TO_LE(*ptr);
}
if (afmt == FMT_U16_BE)
{
gint16 *ptr1 = buffer;
guint16 *ptr2 = buffer;
for (i = 0; i < length >> 1; i++, ptr2++)
*(ptr1++) = GINT16_TO_LE(GUINT16_FROM_BE(*ptr2) ^
32768);
}
if (afmt == FMT_U16_LE)
{
gint16 *ptr1 = buffer;
guint16 *ptr2 = buffer;
for (i = 0; i < length >> 1; i++, ptr2++)
*(ptr1++) = GINT16_TO_LE(GUINT16_FROM_LE(*ptr2) ^
32768);
}
if (afmt == FMT_U16_NE)
{
gint16 *ptr1 = buffer;
guint16 *ptr2 = buffer;
for (i = 0; i < length >> 1; i++, ptr2++)
*(ptr1++) = GINT16_TO_LE((*ptr2) ^ 32768);
}
}
static void playerout_write(void *ptr, gint length)
{
unsigned int format = 0;
// Add to buffer if there is space
if (length + bufferPos > bufferLength)
{
// Copy what we can fit into the buffer
// printf ("Filling up remainder of buffer with %d bytes at
position %d\n", (bufferLength - bufferPos), bufferPos);
memcpy (&buffer[bufferPos], ptr, (bufferLength - bufferPos));
ptr += bufferLength - bufferPos;
length -= bufferLength - bufferPos;
// Send out the buffer
if (afmt == FMT_S8 || afmt == FMT_S16_BE ||
afmt == FMT_U16_LE || afmt == FMT_U16_BE ||
afmt == FMT_U16_NE)
convert_buffer(ptr, length);
#ifdef WORDS_BIGENDIAN
if (afmt == FMT_S16_NE)
convert_buffer(ptr, length);
#endif
format = PLAYER_AUDIO_FORMAT_RAW;
if (numChannels == 2)
format |= PLAYER_AUDIO_STEREO;
format |= PLAYER_AUDIO_16BIT;
if (sampleRate == 11025)
format |= PLAYER_AUDIO_FREQ_11k;
else if (sampleRate == 22050)
format |= PLAYER_AUDIO_FREQ_22k;
else if (sampleRate == 48000)
format |= PLAYER_AUDIO_FREQ_48k;
else
format |= PLAYER_AUDIO_FREQ_44k;
playerc_audio_wav_play_cmd (audio_proxy, bufferLength, buffer,
format);
written += bufferLength - bufferPos;
// Reset the buffer
bufferPos = 0;
}
// Copy data into the buffer
// printf ("Copying %d bytes into buffer at position %d\n", length,
bufferPos);
memcpy (&buffer[bufferPos], ptr, length);
bufferPos += length;
written += length;
}
static void playerout_close(void)
{
if (client)
{
// Shutdown and tidy up
playerc_audio_unsubscribe(audio_proxy);
playerc_audio_destroy(audio_proxy);
playerc_client_disconnect(client);
playerc_client_destroy(client);
audio_proxy = NULL;
client = NULL;
free (buffer);
buffer = NULL;
}
}
static void playerout_flush(gint time)
{
}
static void playerout_pause(short p)
{
// Don't really need to do anything for pausing/unpausing
printf ("Told to %s\n", p ? "pause" : "unpause");
}
static gint playerout_free(void)
{
// Use the max size of a wave message as free space size
return 1048576;
}
static gint playerout_playing(void)
{
return TRUE;
}
static gint playerout_get_written_time(void)
{
/* double bps = -1, result = -1;
printf ("written = %d\tsr = %d\tnch = %d\tbps = %f\tresult = %f\n",
written, sampleRate, numChannels, 44100 * 2, result);
bps = 44100 * 2;
result = ((double) written) / bps;
printf ("written = %d\tsr = %d\tnch = %d\tbps = %f\tresult = %f\n",
written, sampleRate, numChannels, 44100 * 2, result);
if (afmt == FMT_S16_LE || afmt == FMT_S16_BE || afmt == FMT_S16_NE ||
afmt == FMT_U16_LE || afmt == FMT_U16_BE || afmt ==
FMT_U16_NE)
result /= 2.0f;
return (gint) result;*/
return 0;
}
static gint playerout_get_output_time(void)
{
return playerout_get_written_time();
}
static void configure_ok_cb(gpointer data)
{
ConfigFile *cfgfile;
if (server_address)
g_free(server_address);
server_address =
g_strdup(gtk_entry_get_text(GTK_ENTRY(server_address_entry)));
server_port = atoi (gtk_entry_get_text (GTK_ENTRY (server_port_entry)));
server_index = atoi (gtk_entry_get_text( GTK_ENTRY
(server_index_entry)));
bufferTime = atoi (gtk_entry_get_text (GTK_ENTRY (buffer_entry)));
cfgfile = xmms_cfg_open_default_file();
if (!cfgfile)
cfgfile = xmms_cfg_new();
xmms_cfg_write_string(cfgfile, "playerout", "server_address",
server_address);
xmms_cfg_write_int(cfgfile, "playerout", "server_port", server_port);
xmms_cfg_write_int(cfgfile, "playerout", "server_index", server_index);
xmms_cfg_write_int (cfgfile, "playerout", "buffer_time", bufferTime);
xmms_cfg_free(cfgfile);
gtk_widget_destroy(configure_win);
}
static void configure_destroy(void)
{
}
static void playerout_configure(void)
{
char temp[10];
GtkWidget *server_hbox, *server_label;
GtkWidget *port_hbox, *port_label;
GtkWidget *index_hbox, *index_label;
GtkWidget *buffer_hbox, *buffer_label;
if(configure_win)
return;
configure_win = gtk_window_new(GTK_WINDOW_DIALOG);
gtk_signal_connect(GTK_OBJECT(configure_win), "destroy",
GTK_SIGNAL_FUNC(configure_destroy), NULL);
gtk_signal_connect(GTK_OBJECT(configure_win), "destroy",
GTK_SIGNAL_FUNC(gtk_widget_destroyed), &configure_win);
gtk_window_set_title(GTK_WINDOW(configure_win), "Player Output
Configuration");
gtk_window_set_position(GTK_WINDOW(configure_win), GTK_WIN_POS_MOUSE);
gtk_container_set_border_width(GTK_CONTAINER(configure_win), 10);
configure_vbox = gtk_vbox_new(FALSE, 10);
gtk_container_add(GTK_CONTAINER(configure_win), configure_vbox);
server_hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(configure_vbox), server_hbox, FALSE, FALSE,
0);
server_label = gtk_label_new("Server Address:");
gtk_box_pack_start(GTK_BOX(server_hbox), server_label, FALSE, FALSE, 0);
gtk_widget_show(server_label);
server_address_entry = gtk_entry_new();
if (server_address)
gtk_entry_set_text(GTK_ENTRY(server_address_entry),
server_address);
gtk_widget_set_usize(server_address_entry, 200, -1);
gtk_box_pack_start(GTK_BOX(server_hbox), server_address_entry, TRUE,
TRUE, 0);
gtk_widget_show(server_address_entry);
gtk_widget_show(server_hbox);
port_hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(configure_vbox), port_hbox, FALSE, FALSE, 0);
port_label = gtk_label_new("Server Port:");
gtk_box_pack_start(GTK_BOX(port_hbox), port_label, FALSE, FALSE, 0);
gtk_widget_show(port_label);
server_port_entry = gtk_entry_new();
snprintf (temp, 9, "%d", server_port);
gtk_entry_set_text (GTK_ENTRY(server_port_entry), temp);
gtk_widget_set_usize(server_port_entry, 200, -1);
gtk_box_pack_start(GTK_BOX(port_hbox), server_port_entry, TRUE, TRUE,
0);
gtk_widget_show(server_port_entry);
gtk_widget_show(port_hbox);
index_hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(configure_vbox), index_hbox, FALSE, FALSE,
0);
index_label = gtk_label_new("Proxy index:");
gtk_box_pack_start(GTK_BOX(index_hbox), index_label, FALSE, FALSE, 0);
gtk_widget_show(index_label);
server_index_entry = gtk_entry_new();
snprintf (temp, 9, "%d", server_index);
gtk_entry_set_text (GTK_ENTRY(server_index_entry), temp);
gtk_widget_set_usize(server_index_entry, 200, -1);
gtk_box_pack_start(GTK_BOX(index_hbox), server_index_entry, TRUE, TRUE,
0);
gtk_widget_show(server_index_entry);
gtk_widget_show(index_hbox);
buffer_hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(configure_vbox), buffer_hbox, FALSE, FALSE,
0);
buffer_label = gtk_label_new("Buffer length (ms):");
gtk_box_pack_start(GTK_BOX(buffer_hbox), buffer_label, FALSE, FALSE, 0);
gtk_widget_show(buffer_label);
buffer_entry = gtk_entry_new();
snprintf (temp, 9, "%d", bufferTime);
gtk_entry_set_text (GTK_ENTRY(buffer_entry), temp);
gtk_widget_set_usize(buffer_entry, 200, -1);
gtk_box_pack_start(GTK_BOX(buffer_hbox), buffer_entry, TRUE, TRUE, 0);
gtk_widget_show(buffer_entry);
gtk_widget_show(buffer_hbox);
configure_separator = gtk_hseparator_new();
gtk_box_pack_start(GTK_BOX(configure_vbox), configure_separator, FALSE,
FALSE, 0);
gtk_widget_show(configure_separator);
configure_bbox = gtk_hbutton_box_new();
gtk_button_box_set_layout(GTK_BUTTON_BOX(configure_bbox),
GTK_BUTTONBOX_END);
gtk_button_box_set_spacing(GTK_BUTTON_BOX(configure_bbox), 5);
gtk_box_pack_start(GTK_BOX(configure_vbox), configure_bbox, FALSE,
FALSE, 0);
configure_ok = gtk_button_new_with_label("Ok");
gtk_signal_connect(GTK_OBJECT(configure_ok), "clicked",
GTK_SIGNAL_FUNC(configure_ok_cb), NULL);
GTK_WIDGET_SET_FLAGS(configure_ok, GTK_CAN_DEFAULT);
gtk_box_pack_start(GTK_BOX(configure_bbox), configure_ok, TRUE, TRUE,
0);
gtk_widget_show(configure_ok);
gtk_widget_grab_default(configure_ok);
configure_cancel = gtk_button_new_with_label("Cancel");
gtk_signal_connect_object(GTK_OBJECT(configure_cancel), "clicked",
GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(configure_win));
GTK_WIDGET_SET_FLAGS(configure_cancel, GTK_CAN_DEFAULT);
gtk_box_pack_start(GTK_BOX(configure_bbox), configure_cancel, TRUE,
TRUE, 0);
gtk_widget_show(configure_cancel);
gtk_widget_show(configure_bbox);
gtk_widget_show(configure_vbox);
gtk_widget_show(configure_win);
}
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit