# HG changeset patch # User nenolod # Date 1162883163 28800 # Node ID ee81e087615cc47dd5dcab6f18d35248c4a7bb6c # Parent 5783d6281431dd493969b9114fceee5bae2c63b5 [svn] - remove plugins that now live in -ugly diff -r 5783d6281431 -r ee81e087615c ChangeLog --- a/ChangeLog Mon Nov 06 15:04:13 2006 -0800 +++ b/ChangeLog Mon Nov 06 23:06:03 2006 -0800 @@ -1,3 +1,11 @@ +2006-11-06 23:04:13 +0000 William Pitcock + revision [458] + - revert due to branching issue + + trunk/src/sexypsf/xmms.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + + 2006-11-06 22:11:04 +0000 Tony Vroon revision [456] New-style VFS probe function. If you want an #ifdef feel free to bolt some on. diff -r 5783d6281431 -r ee81e087615c configure.ac --- a/configure.ac Mon Nov 06 15:04:13 2006 -0800 +++ b/configure.ac Mon Nov 06 23:06:03 2006 -0800 @@ -364,25 +364,6 @@ GENERAL_PLUGINS="$GENERAL_PLUGINS lirc" fi -dnl *** libnotify requirement - -AC_ARG_ENABLE(notify, - [ --disable-notify disable libnotify plugin (default=enabled)], - [enable_libnotify=$enableval], - [enable_libnotify="yes"] -) - -if test "$enable_libnotify" = "yes"; then - PKG_CHECK_MODULES(LIBNOTIFY, [libnotify >= 0.4.2], - [have_libnotify=yes - GENERAL_PLUGINS="$GENERAL_PLUGINS notify"], - [have_libnotify=no] - ) -else - AC_MSG_RESULT([*** libnotify plugin disabled per user request ***]) - have_libnotify="no" -fi - dnl *** AdPlug requirement (libbinio) AC_ARG_ENABLE(adplug, @@ -403,26 +384,6 @@ INPUT_PLUGINS="$INPUT_PLUGINS adplug" fi -AC_ARG_ENABLE(mplayer, - [ --enable-mplayer enable mplayer plugin. (default=disabled) ], - [enable_mplayer=$enableval], - [enable_mplayer=no] -) - -if test "$enable_mplayer" = "yes"; then - INPUT_PLUGINS="$INPUT_PLUGINS mplayer" -fi - -AC_ARG_ENABLE(sap, - [ --enable-sap enable Atari XL SAP plugin. (default=disabled) ], - [enable_sap=$enableval], - [enable_sap=no] -) - -if test "$enable_sap" = "yes"; then - INPUT_PLUGINS="$INPUT_PLUGINS sap" -fi - dnl *** Ogg Vorbis AC_ARG_ENABLE(vorbis, @@ -857,25 +818,6 @@ INPUT_PLUGINS="$INPUT_PLUGINS timidity" fi -dnl *** Iris - -AC_ARG_ENABLE(iris, -[ --disable-iris disable iris plugin. (default=enabled)], -[enable_iris=$enableval], -[enable_iris=yes] -) - -if test "$enable_iris" = "yes"; then - PKG_CHECK_MODULES(XXF86VM, [xxf86vm >= 1.0.0], - [enable_iris=yes - VISUALIZATION_PLUGINS="$VISUALIZATION_PLUGINS iris"], - [enable_iris=no] - ) -else - AC_MSG_RESULT([*** Iris plugin disabled per user request ***]) - enable_iris=no -fi - dnl FreeBSD newpcm driver detection AC_CACHE_CHECK(for FreeBSD newpcm driver, beep_cv_newpcm_driver, @@ -1162,8 +1104,6 @@ echo " AdLib synthesizer (adplug): $have_adplug" echo " Apple Lossless Audio Codec (alac): yes" echo " WavPack 4.31+ (wavpack): $have_wavpack" -echo " Mplayer controls (mplayer): $enable_mplayer" -echo " Atari XL SAP playback (sap): $enable_sap" echo echo " General" echo " -------" @@ -1171,7 +1111,6 @@ echo " Song Change: yes" echo " LIRC: $have_lirc" echo " AudioScrobbler Client: $scrobbler" -echo " libnotify Plugin: $have_libnotify" echo echo " Effect" echo " ------" @@ -1186,7 +1125,6 @@ echo " Blur Scope: yes" echo " Spectrum Analyzer: yes" echo " Paranormal Visualization Library: $have_paranormal" -echo " IRIS 3D: $enable_iris" echo echo " Container" echo " ---------" diff -r 5783d6281431 -r ee81e087615c src/a52dec/Makefile --- a/src/a52dec/Makefile Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -include ../../mk/rules.mk -include ../../mk/init.mk - -OBJECTIVE_LIBS = liba52dec$(SHARED_SUFFIX) - -LIBDIR = $(plugindir)/$(INPUT_PLUGIN_DIR) - -SOURCES = a52dec.c - -LIBADD = -L/usr/local/lib -la52 - -CFLAGS += $(PICFLAGS) $(GTK_CFLAGS) -I../../intl -I../.. - -OBJECTS = ${SOURCES:.c=.o} - -include ../../mk/objective.mk diff -r 5783d6281431 -r ee81e087615c src/a52dec/a52dec.c --- a/src/a52dec/a52dec.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1536 +0,0 @@ - -/* - * xmms-a52dec.c - * - * xmms-a52dec 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, or (at your option) - * any later version. - * - * xmms-a52dec 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 GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "a52dec.h" - -#define DRC_BOTH 0 -#define DRC_BOOST 1 -#define DRC_REDUCE 2 - -#define SYNC_SEARCH_LIMIT 65536 -#define COMPRESSION_FACTOR_DEFAULT 0.0 -#define COMPRESSION_TYPE_DEFAULT DRC_BOTH -#define NODOWNMIX_SURROUND_DEFAULT FALSE -#define NODOWNMIX_LFE_DEFAULT FALSE -#define UPMIX_STEREO_DEFAULT FALSE -#define DUALMONO_DEFAULT 1 -#define REQUESTED_OUTPUT_DEFAULT A52_STEREO - -sample_t *sample; -char *buf; -long int lastset_time; -char *name; -int flags, sample_rate, bit_rate, frame_size, length; -VFSFile *in_file; -int a52_run, a52_not_eof; -gint output_type; // See also: requested_output -int output_nch; - -// Configuration Options. - -gdouble compression_factor; -gboolean compression_type; -gint requested_output; // See also: output_type -gint dualmono_channel; -gboolean nodownmix_surround, nodownmix_lfe, upmix_stereo; - -static pthread_t decode_thread = (pthread_t) NULL; -sem_t play_loop_signal; -pthread_mutex_t infile_lock; - -extern InputPlugin a52_ip; - -static int is_our_file_a52 (char *); -static int synchronise_a52(VFSFile *, int *, int *, int *, int *); -sample_t dynamic_range(sample_t, void *); -static void init_a52 (void); -static void *play_loop (void *); -void convertsample(sample_t *, int16_t *, int); -int16_t float2int (float); -static void play_a52 (char *); -static void stop_a52 (void); -static int get_time_a52 (void); -static void get_song_info_a52 (char *, char **, int *); -static void pause_a52 (short); -static void seek_a52 (int); -static void about_a52 (void); -static void configure_a52 (void); -static void configure_ok(GtkWidget *, gpointer); -static void configure_apply(GtkWidget *, gpointer); -static void info_a52 (char *); - -InputPlugin a52_ip = { - NULL, - NULL, - "AC-3 / A52 Decoding Plugin", - init_a52, - about_a52, - configure_a52, - is_our_file_a52, - NULL, - play_a52, - stop_a52, - pause_a52, - seek_a52, - NULL, - get_time_a52, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - get_song_info_a52, - info_a52, - NULL -}; - -InputPlugin * -get_iplugin_info (void) -{ - return &a52_ip; -} - -static void -init_a52 (void) -{ - ConfigDb *config; - - // Retrieve settings from file, setting to default if not found. - - config = bmp_cfg_db_open(); - if (!bmp_cfg_db_get_double(config, "xmms-a52dec", "compression_factor", - &compression_factor)) - { - bmp_cfg_db_set_double(config, "xmms-a52dec", "compression_factor", - COMPRESSION_FACTOR_DEFAULT); - compression_factor = COMPRESSION_FACTOR_DEFAULT; - } - - if (!bmp_cfg_db_get_int(config, "xmms-a52dec", "compression_type", - &compression_type)) - { - bmp_cfg_db_set_int(config, "xmms-a52dec", "compression_type", - COMPRESSION_TYPE_DEFAULT); - compression_type = COMPRESSION_TYPE_DEFAULT; - } - - if (!bmp_cfg_db_get_bool(config, "xmms-a52dec", "nodownmix_surround", - &nodownmix_surround)) - { - bmp_cfg_db_set_bool(config, "xmms-a52dec", "nodownmix_surround", - NODOWNMIX_SURROUND_DEFAULT); - nodownmix_surround = NODOWNMIX_SURROUND_DEFAULT; - } - - if (!bmp_cfg_db_get_bool(config, "xmms-a52dec", "nodownmix_lfe", - &nodownmix_lfe)) - { - bmp_cfg_db_set_bool(config, "xmms-a52dec", "nodownmix_lfe", - NODOWNMIX_LFE_DEFAULT); - nodownmix_lfe = NODOWNMIX_LFE_DEFAULT; - } - - if (!bmp_cfg_db_get_bool(config, "xmms-a52dec", "upmix_stereo", - &upmix_stereo)) - { - bmp_cfg_db_set_bool(config, "xmms-a52dec", "upmix_stereo", - UPMIX_STEREO_DEFAULT); - upmix_stereo = UPMIX_STEREO_DEFAULT; - } - - if (!bmp_cfg_db_get_int(config, "xmms-a52dec", "dualmono_channel", - &dualmono_channel)) - { - bmp_cfg_db_set_int(config, "xmms-a52dec", "dualmono_channel", - DUALMONO_DEFAULT); - requested_output = DUALMONO_DEFAULT; - } - - bmp_cfg_db_close(config); -} - -static int -is_our_file_a52 (char *filename) -{ - int l_flags, l_sample_rate, l_bit_rate, l_frame_size; - gchar *extension; - VFSFile *temp_file; - - temp_file = vfs_fopen (filename, "r"); - if (!temp_file) - return FALSE; - - extension = strrchr (filename, '.'); - - if (extension) - if (!strcasecmp (extension, ".a52") || !strcasecmp (extension, ".ac3")) - if (synchronise_a52(temp_file, &l_flags, &l_sample_rate, - &l_bit_rate, &l_frame_size) == 0) - { - vfs_fclose (temp_file); - return TRUE; - } - - vfs_fclose (temp_file); - return FALSE; -} - -/* Synchronises a52 bitstream and set parameters. - - Starting from the current file pointer position, search up to - SYNC_SEARCH_LIMIT bytes for a valid frame, and set file pointer - to start of frame. file pointer will be set to an undefined position if - no valid frame found. - - Return 0 if successful. - Return -1 if failed. */ - -static int -synchronise_a52(VFSFile *file, int *l_flags, int *l_sample_rate, - int *l_bit_rate, int *l_frame_size) -{ - int count; - char temp_buf[7]; - - for (count=0; count <= SYNC_SEARCH_LIMIT; count++) - { - if (vfs_fread(temp_buf, 7, 1, file) != 1) - return -1; - - if (vfs_fseek(file, -6, SEEK_CUR)) - return -1; - - *l_frame_size = a52_syncinfo (temp_buf, l_flags, l_sample_rate, l_bit_rate); - if (*l_frame_size != 0) - break; - } - - // No valid frame found. - - if (count == SYNC_SEARCH_LIMIT) - return -1; - - // Valid frame found. Go back 1 bytes to return to start of frame. - - if (vfs_fseek(file, -1, SEEK_CUR)) - return -1; - - return 0; -} - -sample_t dynamic_range(sample_t recommend, void *nothing) -{ - switch (compression_type) - { - case DRC_BOOST: - if (recommend > 1) - return pow(recommend, (double) compression_factor); - else - return 1; - case DRC_REDUCE: - if (recommend < 1) - return pow(recommend, (double) compression_factor); - else - return 1; - case DRC_BOTH: - default: - return pow(recommend, (double) compression_factor); - } -} - -static void * -play_loop (void *arg) -{ - int old_frame_size, old_bit_rate; - a52_state_t *dec_state; - char *filebuf; - int16_t outbuf[256*6]; - int sample_type; - int first_run=1; - int tempcount; - sample_t level=32766.0; - - /* Re-initialise the a52 library. Without this, there will be - some noise when switching songs */ - - dec_state = a52_init(0); - sample = a52_samples(dec_state); - - a52_run = 1; - lastset_time = 0; - - old_frame_size = frame_size; - old_bit_rate = bit_rate; - filebuf = malloc(frame_size); - - while (a52_run) - { - a52_not_eof = 1; - - /* Lock the mutex before synch and read. - - This prevent a52_seek from calling an vfs_fseek between a - synch and read. */ - - pthread_mutex_lock(&infile_lock); - - // Re-synchronise before reading each frame. - - if (synchronise_a52(in_file, &flags, &sample_rate, - &bit_rate, &frame_size) == -1) - { - pthread_mutex_unlock(&infile_lock); - a52_not_eof = 0; - xmms_usleep(1000); - continue; - } - - // Check if frame_size has changed. If yes, realloc filebuf. - - if (frame_size != old_frame_size) - { - filebuf = realloc(filebuf, frame_size); - old_frame_size = frame_size; - } - - if(!vfs_fread(filebuf, frame_size, 1, in_file)) - { - pthread_mutex_unlock(&infile_lock); - a52_not_eof = 0; - xmms_usleep(1000); - continue; - } - - pthread_mutex_unlock(&infile_lock); - - if (bit_rate != old_bit_rate) - { - a52_ip.set_info (name, length / (bit_rate / 8 / 1000), - bit_rate, sample_rate, output_nch); - old_bit_rate = bit_rate; - } - - if (nodownmix_surround == TRUE) - sample_type = A52_3F2R | A52_ADJUST_LEVEL; - else - sample_type = output_type | A52_ADJUST_LEVEL; - - if (nodownmix_lfe == TRUE) - sample_type |= A52_LFE; - else - sample_type &= A52_CHANNEL_MASK; - - // The above is for non-5.1, for 5.1 we add in the LFE channel. - - sample_type |= output_type & A52_LFE; - - if(a52_frame(dec_state, filebuf, &sample_type, &level, 0.0)) - break; // Don't know how to deal with this properly. - - a52_dynrng (dec_state, dynamic_range, NULL); - - for (tempcount = 0; tempcount < 6; tempcount++) - { - a52_block(dec_state); - - convertsample(sample, outbuf, sample_type); - - /* Sleep while the buffer is full */ - while (a52_run && (a52_ip.output->buffer_free () < 512 * output_nch)) - xmms_usleep (10000); - - a52_ip.output->write_audio (outbuf, 512 * output_nch); - - /* Signal the play_a52 thread to let it know that we have - finished writing to buffer. It can safely exit now. - - Without this, get_time_a52 may run before we have started - playing anything. get_time_a52 will find that the buffer - is not playing (yet) and return -1 causing stop_a52 to - stop play_loop. - - We must only run this once, because play_a52 will destroy - the semaphore once it receive the signal. */ - - if (first_run) - { - sem_post(&play_loop_signal); - first_run=0; - } - - /* Add visualisation data. Do not use a52_ip.gettime() - for the time. Due to buffering, the time for which the - data is submitted and the current playing time is not - the same. The vis data is sent in advance and must be - set for the correct time. */ - - a52_ip.add_vis_pcm (vfs_ftell(in_file) / (bit_rate / 8 / 1000), - FMT_S16_LE, output_nch, 512 * output_nch, outbuf); - } - } - - /* If sem_post didn't run above, we'll run it now */ - - if (first_run) - { - sem_post(&play_loop_signal); - first_run=0; - } - - // Free memory allocated by a52_init. - - a52_free(dec_state); - - /* If we break from the loop due to end of file, the music - is probably still playing, so we'll sleep and wait for - it to end. We'll set a52_not_eof to 0 to let get_time_a52 - know that we have reached the end of file.*/ - - vfs_fclose (in_file); - a52_not_eof=0; - - pthread_exit (NULL); -} - -void -convertsample(sample_t *sample, int16_t *outbuf, int sample_type) -{ - int count; - int lfe_offset; - - if (sample_type & A52_LFE) - lfe_offset = 256; - else - lfe_offset = 0; - - for (count = 0; count < 256; count++) - if (output_type == A52_STEREO) - switch (sample_type & A52_CHANNEL_MASK) - { - case A52_MONO: - case A52_CHANNEL1: - case A52_CHANNEL2: - outbuf[count * 2] = float2int (sample[count + lfe_offset]); - outbuf[count * 2 + 1] = outbuf[count * 2]; - break; - case A52_CHANNEL: - if (dualmono_channel == 1) - { - outbuf[count * 2] = float2int (sample[count + lfe_offset]); - outbuf[count * 2 + 1] = outbuf[count * 2]; - } - else - { - outbuf[count * 2] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 2 + 1] = outbuf[count * 2]; - } - break; - case A52_STEREO: - case A52_DOLBY: - case A52_2F1R: - case A52_2F2R: - outbuf[count * 2] = float2int (sample[count + lfe_offset]); - outbuf[count * 2 + 1] = float2int (sample[count + 256 + lfe_offset]); - break; - case A52_3F: - case A52_3F1R: - case A52_3F2R: - outbuf[count * 2] = float2int (sample[count + lfe_offset]); - outbuf[count * 2 + 1] = float2int (sample[count + 512 + lfe_offset]); - break; - } - else if (output_type == A52_2F2R) - switch (sample_type & A52_CHANNEL_MASK) - { - case A52_MONO: - case A52_CHANNEL1: - case A52_CHANNEL2: - outbuf[count * 4] = float2int (sample[count + lfe_offset]); - outbuf[count * 4 + 1] = outbuf[count * 4]; - if (upmix_stereo == TRUE) - { - outbuf[count * 4 + 2] = outbuf[count * 4]; - outbuf[count * 4 + 3] = outbuf[count * 4]; - } - else - { - outbuf[count * 4 + 2] = 0; - outbuf[count * 4 + 3] = 0; - } - break; - case A52_CHANNEL: - if (dualmono_channel == 1) - { - outbuf[count * 4] = float2int (sample[count + lfe_offset]); - outbuf[count * 4 + 1] = outbuf[count * 4]; - if (upmix_stereo == TRUE) - { - outbuf[count * 4 + 2] = outbuf[count * 4]; - outbuf[count * 4 + 3] = outbuf[count * 4]; - } - else - { - outbuf[count * 4 + 2] = 0; - outbuf[count * 4 + 3] = 0; - } - } - else - { - outbuf[count * 4] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 4 + 1] = outbuf[count * 4]; - if (upmix_stereo == TRUE) - { - outbuf[count * 4 + 2] = outbuf[count * 4]; - outbuf[count * 4 + 3] = outbuf[count * 4]; - } - else - { - outbuf[count * 4 + 2] = 0; - outbuf[count * 4 + 3] = 0; - } - } - break; - case A52_STEREO: - case A52_DOLBY: - outbuf[count * 4] = float2int (sample[count + lfe_offset]); - outbuf[count * 4 + 1] = float2int (sample[count + 256 + lfe_offset]); - if (upmix_stereo == TRUE) - { - outbuf[count * 4 + 2] = outbuf[count * 4]; - outbuf[count * 4 + 3] = outbuf[count * 4 + 1]; - } - else - { - outbuf[count * 4 + 2] = 0; - outbuf[count * 4 + 3] = 0; - } - break; - case A52_3F: - outbuf[count * 4] = float2int (sample[count + lfe_offset]); - outbuf[count * 4 + 1] = float2int (sample[count + 512 + lfe_offset]); - if (upmix_stereo == TRUE) - { - outbuf[count * 4 + 2] = outbuf[count * 4]; - outbuf[count * 4 + 3] = outbuf[count * 4 + 1]; - } - else - { - outbuf[count * 4 + 2] = 0; - outbuf[count * 4 + 3] = 0; - } - break; - case A52_2F1R: - outbuf[count * 4] = float2int (sample[count + lfe_offset]); - outbuf[count * 4 + 1] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 4 + 2] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 4 + 3] = outbuf[count * 4 + 2]; - break; - case A52_2F2R: - outbuf[count * 4] = float2int (sample[count + lfe_offset]); - outbuf[count * 4 + 1] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 4 + 2] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 4 + 3] = float2int (sample[count + 768 + lfe_offset]); - break; - case A52_3F1R: - outbuf[count * 4] = float2int (sample[count + lfe_offset]); - outbuf[count * 4 + 1] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 4 + 2] = float2int (sample[count + 768 + lfe_offset]); - outbuf[count * 4 + 3] = outbuf[count * 4 + 2]; - break; - case A52_3F2R: - outbuf[count * 4] = float2int (sample[count + lfe_offset]); - outbuf[count * 4 + 1] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 4 + 2] = float2int (sample[count + 768 + lfe_offset]); - outbuf[count * 4 + 3] = float2int (sample[count + 1024 + lfe_offset]); - break; - } - else if (output_type == A52_3F2R) - switch (sample_type & A52_CHANNEL_MASK) - { - case A52_MONO: - case A52_CHANNEL1: - case A52_CHANNEL2: - outbuf[count * 5] = float2int (sample[count + lfe_offset]); - outbuf[count * 5 + 1] = outbuf[count * 5]; - if (upmix_stereo == TRUE) - { - outbuf[count * 5 + 2] = outbuf[count * 5]; - outbuf[count * 5 + 3] = outbuf[count * 5]; - } - else - { - outbuf[count * 5 + 2] = 0; - outbuf[count * 5 + 3] = 0; - } - outbuf[count * 5 + 4] = outbuf[count * 5]; - break; - case A52_CHANNEL: - if (dualmono_channel == 1) - { - outbuf[count * 5] = float2int (sample[count + lfe_offset]); - outbuf[count * 5 + 1] = outbuf[count * 5]; - if (upmix_stereo == TRUE) - { - outbuf[count * 5 + 2] = outbuf[count * 5]; - outbuf[count * 5 + 3] = outbuf[count * 5]; - } - else - { - outbuf[count * 5 + 2] = 0; - outbuf[count * 5 + 3] = 0; - } - } - else - { - outbuf[count * 5] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 5 + 1] = outbuf[count * 5]; - if (upmix_stereo == TRUE) - { - outbuf[count * 5 + 2] = outbuf[count * 5]; - outbuf[count * 5 + 3] = outbuf[count * 5]; - } - else - { - outbuf[count * 5 + 2] = 0; - outbuf[count * 5 + 3] = 0; - } - } - break; - case A52_STEREO: - case A52_DOLBY: - outbuf[count * 5] = float2int (sample[count + lfe_offset]); - outbuf[count * 5 + 1] = float2int (sample[count + 256 + lfe_offset]); - if (upmix_stereo == TRUE) - { - outbuf[count * 5 + 2] = outbuf[count * 5]; - outbuf[count * 5 + 3] = outbuf[count * 5 + 1]; - } - else - { - outbuf[count * 5 + 2] = 0; - outbuf[count * 5 + 3] = 0; - } - outbuf[count * 5 + 4] = 0; - break; - case A52_3F: - outbuf[count * 5] = float2int (sample[count + lfe_offset]); - outbuf[count * 5 + 1] = float2int (sample[count + 512 + lfe_offset]); - if (upmix_stereo == TRUE) - { - outbuf[count * 5 + 2] = outbuf[count * 5]; - outbuf[count * 5 + 3] = outbuf[count * 5 + 1]; - } - else - { - outbuf[count * 5 + 2] = 0; - outbuf[count * 5 + 3] = 0; - } - outbuf[count * 5 + 4] = float2int (sample[count + 256 + lfe_offset]); - break; - case A52_2F1R: - outbuf[count * 5] = float2int (sample[count + lfe_offset]); - outbuf[count * 5 + 1] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 5 + 2] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 5 + 3] = outbuf[count * 5 + 2]; - outbuf[count * 5 + 4] = 0; - break; - case A52_2F2R: - outbuf[count * 5] = float2int (sample[count + lfe_offset]); - outbuf[count * 5 + 1] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 5 + 2] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 5 + 3] = float2int (sample[count + 768 + lfe_offset]); - outbuf[count * 5 + 4] = 0; - break; - case A52_3F1R: - outbuf[count * 5] = float2int (sample[count + lfe_offset]); - outbuf[count * 5 + 1] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 5 + 2] = float2int (sample[count + 768 + lfe_offset]); - outbuf[count * 5 + 3] = outbuf[count * 5 + 2]; - outbuf[count * 5 + 4] = float2int (sample[count + 256 + lfe_offset]); - break; - case A52_3F2R: - outbuf[count * 5] = float2int (sample[count + lfe_offset]); - outbuf[count * 5 + 1] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 5 + 2] = float2int (sample[count + 768 + lfe_offset]); - outbuf[count * 5 + 3] = float2int (sample[count + 1024 + lfe_offset]); - outbuf[count * 5 + 4] = float2int (sample[count + 256 + lfe_offset]); - break; - } - else if (output_type == (A52_3F2R | A52_LFE)) - switch (sample_type & A52_CHANNEL_MASK) - { - case A52_MONO: - case A52_CHANNEL1: - case A52_CHANNEL2: - outbuf[count * 6] = float2int (sample[count + lfe_offset]); - outbuf[count * 6 + 1] = outbuf[count * 6]; - if (upmix_stereo == TRUE) - { - outbuf[count * 6 + 2] = outbuf[count * 6]; - outbuf[count * 6 + 3] = outbuf[count * 6]; - } - else - { - outbuf[count * 6 + 2] = 0; - outbuf[count * 6 + 3] = 0; - } - outbuf[count * 6 + 4] = outbuf[count * 6]; - if (lfe_offset) - outbuf[count * 6 + 5] = float2int (sample[count]); - else - outbuf[count * 6 + 5] = 0; - break; - case A52_CHANNEL: - if (dualmono_channel == 1) - { - outbuf[count * 6] = float2int (sample[count + lfe_offset]); - outbuf[count * 6 + 1] = outbuf[count * 6]; - if (upmix_stereo == TRUE) - { - outbuf[count * 6 + 2] = outbuf[count * 6]; - outbuf[count * 6 + 3] = outbuf[count * 6]; - } - else - { - outbuf[count * 6 + 2] = 0; - outbuf[count * 6 + 3] = 0; - } - } - else - { - outbuf[count * 6] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 6 + 1] = outbuf[count * 6]; - if (upmix_stereo == TRUE) - { - outbuf[count * 6 + 2] = outbuf[count * 6]; - outbuf[count * 6 + 3] = outbuf[count * 6]; - } - else - { - outbuf[count * 6 + 2] = 0; - outbuf[count * 6 + 3] = 0; - } - } - break; - case A52_STEREO: - case A52_DOLBY: - outbuf[count * 6] = float2int (sample[count + lfe_offset]); - outbuf[count * 6 + 1] = float2int (sample[count + 256 + lfe_offset]); - if (upmix_stereo == TRUE) - { - outbuf[count * 6 + 2] = outbuf[count * 6]; - outbuf[count * 6 + 3] = outbuf[count * 6 + 1]; - } - else - { - outbuf[count * 6 + 2] = 0; - outbuf[count * 6 + 3] = 0; - } - outbuf[count * 6 + 4] = 0; - if (lfe_offset) - outbuf[count * 6 + 5] = float2int (sample[count]); - else - outbuf[count * 6 + 5] = 0; - break; - case A52_3F: - outbuf[count * 6] = float2int (sample[count + lfe_offset]); - outbuf[count * 6 + 1] = float2int (sample[count + 512 + lfe_offset]); - if (upmix_stereo == TRUE) - { - outbuf[count * 6 + 2] = outbuf[count * 6]; - outbuf[count * 6 + 3] = outbuf[count * 6 + 1]; - } - else - { - outbuf[count * 6 + 2] = 0; - outbuf[count * 6 + 3] = 0; - } - outbuf[count * 6 + 4] = float2int (sample[count + 256 + lfe_offset]); - if (lfe_offset) - outbuf[count * 6 + 5] = float2int (sample[count]); - else - outbuf[count * 6 + 5] = 0; - break; - case A52_2F1R: - outbuf[count * 6] = float2int (sample[count + lfe_offset]); - outbuf[count * 6 + 1] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 6 + 2] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 6 + 3] = outbuf[count * 6 + 2]; - outbuf[count * 6 + 4] = 0; - if (lfe_offset) - outbuf[count * 6 + 5] = float2int (sample[count]); - else - outbuf[count * 6 + 5] = 0; - break; - case A52_2F2R: - outbuf[count * 6] = float2int (sample[count + lfe_offset]); - outbuf[count * 6 + 1] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 6 + 2] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 6 + 3] = float2int (sample[count + 768 + lfe_offset]); - outbuf[count * 6 + 4] = 0; - if (lfe_offset) - outbuf[count * 6 + 5] = float2int (sample[count]); - else - outbuf[count * 6 + 5] = 0; - break; - case A52_3F1R: - outbuf[count * 6] = float2int (sample[count + lfe_offset]); - outbuf[count * 6 + 1] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 6 + 2] = float2int (sample[count + 768 + lfe_offset]); - outbuf[count * 6 + 3] = outbuf[count * 6 + 2]; - outbuf[count * 6 + 4] = float2int (sample[count + 256 + lfe_offset]); - if (lfe_offset) - outbuf[count * 6 + 5] = float2int (sample[count]); - else - outbuf[count * 6 + 5] = 0; - break; - case A52_3F2R: - outbuf[count * 6] = float2int (sample[count + lfe_offset]); - outbuf[count * 6 + 1] = float2int (sample[count + 512 + lfe_offset]); - outbuf[count * 6 + 2] = float2int (sample[count + 768 + lfe_offset]); - outbuf[count * 6 + 3] = float2int (sample[count + 1024 + lfe_offset]); - outbuf[count * 6 + 4] = float2int (sample[count + 256 + lfe_offset]); - if (lfe_offset) - outbuf[count * 6 + 5] = float2int (sample[count]); - else - outbuf[count * 6 + 5] = 0; - break; - } - else if (output_type == A52_DOLBY) - switch (sample_type & A52_CHANNEL_MASK) - { - case A52_CHANNEL1: - case A52_CHANNEL2: - outbuf[count * 2] = float2int (sample[count + lfe_offset]); - outbuf[count * 2 + 1] = outbuf[count * 2]; - break; - case A52_CHANNEL: - if (dualmono_channel == 1) - { - outbuf[count * 2] = float2int (sample[count + lfe_offset]); - outbuf[count * 2 + 1] = outbuf[count * 2]; - } - else - { - outbuf[count * 2] = float2int (sample[count + 256 + lfe_offset]); - outbuf[count * 2 + 1] = outbuf[count * 2]; - } - break; - case A52_STEREO: - case A52_DOLBY: - outbuf[count * 2] = float2int (sample[count + lfe_offset]); - outbuf[count * 2 + 1] = float2int (sample[count + 256 + lfe_offset]); - break; - } -} - -int16_t -float2int (float sample) -{ - if (sample > 32767.0) - return 32767; - else if (sample < -32767.0) - return -32767; - else - return (int16_t) sample; -} - -static void -play_a52 (char *filename) -{ - char *temp; - - if (a52_run) - return; - - in_file = vfs_fopen (filename, "r"); - - if (!in_file) - return; - - if (synchronise_a52(in_file, &flags, &sample_rate, - &bit_rate, &frame_size) == -1) - { - vfs_fclose(in_file); - return; - } - - output_type = requested_output; - - if ((output_type & A52_STEREO) || (output_type & A52_DOLBY)) - { - output_nch = a52_ip.output->open_audio (FMT_S16_NE, sample_rate, 2); - if (output_nch == 0) - { - vfs_fclose (in_file); - return; - } - } - - if (output_type != A52_DOLBY) - output_type = A52_STEREO; - - /* don't ask. -nenolod */ - if (output_nch == 1) - output_nch = 2; - - // Get song title - - temp = strrchr (filename, '/'); - if (!temp) - temp = filename; - else - temp++; - name = malloc (strlen (temp) + 1); - strcpy (name, temp); - *strrchr (name, '.') = '\0'; - - // Get song length - - vfs_fseek (in_file, 0, SEEK_END); - - /* If we can get the file length, we divide it by byterate (not bitrate) - and multiply by 1000 to get time in milliseconds. - If we can't get file length, we'll set it to -1 - - length (the variable) : file length - length (passed to set_info) : milliseconds - bit_rate : bits/second - sample_rate : sample/second */ - - if ((length = vfs_ftell (in_file)) != -1) - a52_ip.set_info (name, length / (bit_rate / 8 / 1000), - bit_rate, sample_rate, 2); - else - a52_ip.set_info (name, -1, bit_rate, sample_rate, 2); - - free(name); - - // Return to start of file. - - vfs_fseek (in_file, 0, SEEK_SET); - - // Mutex will be used in play_loop. - - pthread_mutex_destroy(&infile_lock); - pthread_mutex_init(&infile_lock, NULL); - - /* Ensure that play_loop has written to the buffer before exiting. - See play_loop for further details. */ - - sem_init(&play_loop_signal, 0, 0); - pthread_create (&decode_thread, NULL, play_loop, NULL); - sem_wait(&play_loop_signal); - sem_destroy(&play_loop_signal); - - return; -} - -static void -stop_a52 (void) -{ - if (a52_run) - { - a52_run = 0; - pthread_join (decode_thread, NULL); - a52_ip.output->close_audio (); - } -} - -static int -get_time_a52 (void) -{ - /* lastset_time is set when playing starts and - when seeking. We can't use it directly because - it's based on file position for reading. Due to - buffering, the file position is always ahead of - the play position. - - Instead, we set lastset_time when playing and - seeking, and use the output_time() as an offset. */ - - a52_ip.output->buffer_free(); - - if ((a52_run && a52_not_eof) || a52_ip.output->buffer_playing ()) - return lastset_time + a52_ip.output->output_time (); - - return -1; -} - -static void -pause_a52 (short paused) -{ - a52_ip.output->pause (paused); -} - -static void -get_song_info_a52 (gchar * filename, gchar ** title, gint * info_length) -{ - int l_flags, l_sample_rate, l_bit_rate, l_frame_size; - VFSFile *temp_file; - char *temp_name, *temp; - - // Set the song title - - temp = strrchr (filename, '/'); - if (!temp) - temp = filename; - else - temp++; - temp_name = malloc (strlen (temp) + 1); - strcpy (temp_name, temp); - *strrchr (temp_name, '.') = '\0'; - (*title) = temp_name; - - // Determine the song length from filesize. - - temp_file = vfs_fopen (filename, "r"); - - if (synchronise_a52(temp_file, &l_flags, &l_sample_rate, - &l_bit_rate, &l_frame_size) == -1) - { - *info_length = -1; - return; - } - - vfs_fseek (temp_file, 0, SEEK_END); - - if ((*info_length = vfs_ftell (temp_file)) == -1) - { - // Can't get file position - *info_length = -1; - return; - } - - // Song length in milliseconds - - *info_length = *info_length / (l_bit_rate / 8 / 1000); -} - -static void -seek_a52 (gint time) -{ - // time is in seconds. - - // Don't seek while play_loop is reading/synching. - - pthread_mutex_lock(&infile_lock); - vfs_fseek(in_file, time * bit_rate / 8, SEEK_SET); - pthread_mutex_unlock(&infile_lock); - - a52_ip.output->flush (0); - lastset_time = time * 1000; -} - -void -about_a52 (void) -{ - GdkPixmap *pixmap; - GdkBitmap *mask; - GtkStyle *style; - static GtkWidget *dialog, *button, *label, *pixmapwid; - - if (dialog) - return; - - dialog = gtk_dialog_new (); - gtk_signal_connect (GTK_OBJECT (dialog), "destroy", - GTK_SIGNAL_FUNC (gtk_widget_destroyed), &dialog); - gtk_window_set_title (GTK_WINDOW (dialog), "About xmms-a52dec 1.0"); - gtk_window_set_policy (GTK_WINDOW (dialog), FALSE, FALSE, FALSE); - gtk_container_border_width (GTK_CONTAINER (dialog), 5); - label = gtk_label_new ("\nXMMS-AC3DEC VERSION 1.0\n\n \ -An A52/AC3 decoder plugin for xmms based on the a52dec package.\n \ -\nCoded by Cort \nEnhanced by David Weisgerber "); - - /* now for the pixmap from gdk */ - style = gtk_widget_get_style (dialog); - pixmap = gdk_pixmap_create_from_xpm_d (dialog->window, &mask, - &style->bg[GTK_STATE_NORMAL], - (gchar **) a52dec_xpm); - /* a pixmap widget to contain the pixmap */ - pixmapwid = gtk_pixmap_new (pixmap, NULL); - gtk_widget_show (pixmapwid); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), pixmapwid, TRUE, - TRUE, 0); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, TRUE, TRUE, - 0); - gtk_widget_show (label); - - button = gtk_button_new_with_label (" Close "); - gtk_signal_connect_object (GTK_OBJECT (button), "clicked", - GTK_SIGNAL_FUNC (gtk_widget_destroy), - GTK_OBJECT (dialog)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), button, - FALSE, FALSE, 0); - - gtk_widget_show (button); - gtk_widget_show (dialog); - gtk_widget_grab_focus (button); -} - -static GtkWidget *drc_scale, *drc_both, *drc_boost, *drc_reduce; -static GtkWidget *effect_surround, *effect_lfe, *effect_upmix; -static GtkWidget *dualmono_channel1, *dualmono_channel2; - -void -configure_a52 (void) -{ - static GtkWidget *dialog; - static GtkWidget *button_cancel, *button_apply, *button_ok; - static GtkWidget *hbox, *vbox, *vbox2; - static GtkWidget *effect_vbox, *button_hbox, *dualmono_vbox; - static GtkWidget *drc_vbox; - static GtkWidget *range_frame, *effect_frame, *output_frame, *dualmono_frame; - static GtkTooltips *tooltips; - - if (dialog) - return; - - tooltips = gtk_tooltips_new(); - - // Create dialog and set window parameters. - - dialog = gtk_dialog_new (); - gtk_signal_connect (GTK_OBJECT (dialog), "destroy", - GTK_SIGNAL_FUNC (gtk_widget_destroyed), &dialog); - gtk_window_set_title (GTK_WINDOW (dialog), "xmms-a52dec Configuration"); - gtk_window_set_policy (GTK_WINDOW (dialog), FALSE, FALSE, FALSE); - gtk_container_border_width (GTK_CONTAINER (dialog), 5); - - // Prepare all the vbox and hbox. - - hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, - 0); - vbox = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); - vbox2 = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0); - - // Prepare all the frames. - - range_frame = gtk_frame_new("Dynamic Range Compression"); - effect_frame = gtk_frame_new("Effect"); - output_frame = gtk_frame_new("Output"); - dualmono_frame = gtk_frame_new("Dual Mono"); - - // Pack the frames in. - - gtk_box_pack_start (GTK_BOX (vbox), range_frame, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), effect_frame, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox2), output_frame, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox2), dualmono_frame, TRUE, TRUE, 0); - - // Create Dynamic Range Compression options. - - drc_vbox = gtk_vbox_new(FALSE, 0); - drc_scale = gtk_hscale_new (GTK_ADJUSTMENT - (gtk_adjustment_new - (compression_factor, 0, 1, 0.01, 0.1, 0))); - gtk_scale_set_digits (GTK_SCALE (drc_scale), 2); - drc_both = gtk_radio_button_new_with_label (NULL, "Boost and Reduce"); - drc_boost = gtk_radio_button_new_with_label_from_widget ( - GTK_RADIO_BUTTON(drc_both), "Boost only"); - drc_reduce = gtk_radio_button_new_with_label_from_widget ( - GTK_RADIO_BUTTON(drc_both), "Reduce only"); - gtk_box_pack_start (GTK_BOX (drc_vbox), drc_scale, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (drc_vbox), drc_both, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (drc_vbox), drc_boost, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (drc_vbox), drc_reduce, TRUE, TRUE, 0); - gtk_container_add (GTK_CONTAINER(range_frame), drc_vbox); - - if (compression_type == DRC_BOTH) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(drc_both), TRUE); - else if (compression_type == DRC_BOOST) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(drc_boost), TRUE); - else if (compression_type == DRC_REDUCE) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(drc_reduce), TRUE); - - - // Create effect toggle button. - - effect_vbox = gtk_vbox_new(FALSE, 0); - effect_surround = gtk_check_button_new_with_label("No downmix of surround"); - effect_lfe = gtk_check_button_new_with_label("No downmix of LFE channel"); - effect_upmix = gtk_check_button_new_with_label("Upmix stereo to surround"); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(effect_surround), - nodownmix_surround); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(effect_lfe), nodownmix_lfe); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(effect_upmix), upmix_stereo); - gtk_box_pack_start (GTK_BOX (effect_vbox), effect_surround, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (effect_vbox), effect_lfe, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (effect_vbox), effect_upmix, TRUE, TRUE, 0); - gtk_container_add (GTK_CONTAINER(effect_frame), effect_vbox); - - // Create dualmono channel radio button. - - dualmono_vbox = gtk_vbox_new(FALSE, 0); - dualmono_channel1 = gtk_radio_button_new_with_label (NULL, "Play First channel"); - dualmono_channel2 = gtk_radio_button_new_with_label_from_widget ( - GTK_RADIO_BUTTON(dualmono_channel1), "Play Second channel"); - - if (dualmono_channel == 1) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dualmono_channel1), TRUE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dualmono_channel2), TRUE); - - gtk_box_pack_start (GTK_BOX (dualmono_vbox), dualmono_channel1, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (dualmono_vbox), dualmono_channel2, TRUE, TRUE, 0); - gtk_container_add (GTK_CONTAINER(dualmono_frame), dualmono_vbox); - - // Create hbuttonbox for buttons. - - button_hbox = gtk_hbutton_box_new(); - - // Create cancel button. - - button_cancel = gtk_button_new_with_label ("Cancel"); - gtk_signal_connect_object (GTK_OBJECT (button_cancel), "clicked", - GTK_SIGNAL_FUNC (gtk_widget_destroy), - GTK_OBJECT (dialog)); - gtk_box_pack_start(GTK_BOX(button_hbox), button_cancel, TRUE, TRUE, 0); - - // Create apply button. - - button_apply = gtk_button_new_with_label ("Apply"); - gtk_signal_connect_object (GTK_OBJECT (button_apply), "clicked", - GTK_SIGNAL_FUNC (configure_apply), - GTK_OBJECT (dialog)); - gtk_box_pack_start(GTK_BOX(button_hbox), button_apply, TRUE, TRUE, 0); - - // Create ok button. - - button_ok = gtk_button_new_with_label ("Ok"); - gtk_signal_connect_object (GTK_OBJECT (button_ok), "clicked", - GTK_SIGNAL_FUNC (configure_ok), - GTK_OBJECT (dialog)); - gtk_box_pack_start(GTK_BOX(button_hbox), button_ok, TRUE, TRUE, 0); - - // Pack hbuttonbox into dialog. - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button_hbox, TRUE, TRUE,0); - - // Set tooltips. - - gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), drc_scale, - "Dynamic range compression is used to lower the\ - volume of loud sounds and increase the volume of\ - soft sounds.\nSet to 0.00 if you wish to disable this feature.", NULL); - - gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), drc_both, - "Boost the volume of soft sounds and reduce the volume\ - of loud sounds.", NULL); - - gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), drc_boost, - "Boost the volume of soft sounds, but leave loud sounds\ - unchanged.", NULL); - - gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), drc_reduce, - "Reduce the volume of loud sounds, but leave soft sounds\ - unchanged.", NULL); - - gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), dualmono_channel1, - "Dualmono tracks contain 2 seperate mono channels. Select\ - this option to play the first channels.", NULL); - - gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips), dualmono_channel2, - "Dualmono tracks contain 2 seperate mono channels. Select\ - this option to play the second channels.", NULL); - - // Show all of the above. - - gtk_widget_show (hbox); - gtk_widget_show (vbox); - gtk_widget_show (vbox2); - gtk_widget_show (range_frame); - gtk_widget_show (drc_scale); - gtk_widget_show (drc_both); - gtk_widget_show (drc_boost); - gtk_widget_show (drc_reduce); - gtk_widget_show (drc_vbox); - gtk_widget_show (effect_frame); - gtk_widget_show (effect_surround); - gtk_widget_show (effect_lfe); - gtk_widget_show (effect_upmix); - gtk_widget_show (effect_vbox); - gtk_widget_show (dualmono_vbox); - gtk_widget_show (dualmono_channel1); - gtk_widget_show (dualmono_channel2); - gtk_widget_show (dualmono_frame); - gtk_widget_show (button_hbox); - gtk_widget_show (button_cancel); - gtk_widget_show (button_apply); - gtk_widget_show (button_ok); - gtk_widget_show (dialog); - gtk_widget_grab_focus (button_ok); -} - -static void configure_ok(GtkWidget * w, gpointer data) -{ - // Let configure_apply set and save compression_factor. - - configure_apply(NULL, NULL); - - // Close the window. - - gtk_widget_destroy(w); -} - -static void configure_apply(GtkWidget * w, gpointer data) -{ - GtkAdjustment *scale_adj; - ConfigDb *config; - - scale_adj = gtk_range_get_adjustment(GTK_RANGE(drc_scale)); - compression_factor = (gdouble) scale_adj->value; - - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(drc_both)) == TRUE) - compression_type = DRC_BOTH; - else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(drc_boost)) == TRUE) - compression_type = DRC_BOOST; - else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(drc_reduce)) == TRUE) - compression_type = DRC_REDUCE; - - nodownmix_surround = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(effect_surround)); - nodownmix_lfe = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(effect_lfe)); - upmix_stereo = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(effect_upmix)); - requested_output = A52_STEREO; - - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dualmono_channel1)) == TRUE) - dualmono_channel = 1; - else - dualmono_channel = 2; - - config = bmp_cfg_db_open(); - bmp_cfg_db_set_double(config, "xmms-a52dec", "compression_factor", - compression_factor); - bmp_cfg_db_set_int(config, "xmms-a52dec", "compression_type", - compression_type); - bmp_cfg_db_set_bool(config, "xmms-a52dec", "nodownmix_surround", - nodownmix_surround); - bmp_cfg_db_set_bool(config, "xmms-a52dec", "nodownmix_lfe", - nodownmix_lfe); - bmp_cfg_db_set_bool(config, "xmms-a52dec", "upmix_stereo", - upmix_stereo); - bmp_cfg_db_set_int(config, "xmms-a52dec", "requested_output", - requested_output); - bmp_cfg_db_close(config); -} - -void -info_a52 (char *filename) -{ - static GtkWidget *window; - static GtkWidget *button_ok; - static GtkWidget *hbox, *vbox, *label, *label2, *entry, *frame; - static char *temp_text, *label2_text, *temp, *temp_name; - VFSFile *temp_file; - int l_flags, l_sample_rate, l_bit_rate, l_frame_size, l_length; - int no_window = 0; - - if (!window) - no_window = 1; - - // Create window and set parameters. - - if (no_window) - { - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_signal_connect (GTK_OBJECT (window), "destroy", - GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window); - gtk_window_set_default_size (GTK_WINDOW (window), 485, -1); - gtk_window_set_policy (GTK_WINDOW (window), FALSE, FALSE, TRUE); - gtk_container_border_width (GTK_CONTAINER (window), 5); - } - - temp = strrchr (filename, '/'); - if (!temp) - temp = filename; - else - temp++; - temp_name = malloc (strlen (temp) + 1); - strcpy (temp_name, temp); - *strrchr (temp_name, '.') = '\0'; - - sprintf(temp_text, "File Info - %s", temp_name); - gtk_window_set_title (GTK_WINDOW (window), temp_text); - - free(temp_name); - free(temp_text); - - // Create vbuttonbox for filename and fileinfo frame. - - if (no_window) - { - vbox = gtk_vbox_new(FALSE, 0); - - // Create label with a text entry containing filename. - - hbox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 8); - label = gtk_label_new ("Filename: "); - gtk_label_set_justify (GTK_LABEL(label), GTK_JUSTIFY_LEFT); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - entry = gtk_entry_new (); - gtk_widget_set_usize (entry, 400, -1); - gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); - } - gtk_entry_set_text (GTK_ENTRY(entry), filename); - - // Determine the song length from filesize. - - temp_file = vfs_fopen (filename, "r"); - - if (synchronise_a52(temp_file, &l_flags, &l_sample_rate, - &l_bit_rate, &l_frame_size) == -1) - { - l_length = -1; - return; - } - - vfs_fseek (temp_file, 0, SEEK_END); - - if ((l_length = vfs_ftell (temp_file)) == -1) - { - // Can't get file position - l_length = -1; - return; - } - - // Determine channel type. - - switch (l_flags & A52_CHANNEL_MASK) - { - case A52_CHANNEL: - sprintf(temp_text, "Channel"); - break; - case A52_MONO: - sprintf(temp_text, "Mono"); - break; - case A52_STEREO: - sprintf(temp_text, "Stereo"); - break; - case A52_3F: - sprintf(temp_text, "3 Front"); - break; - case A52_2F1R: - sprintf(temp_text, "2 Front 1 Rear"); - break; - case A52_3F1R: - sprintf(temp_text, "3 Front 1 Rear"); - break; - case A52_2F2R: - sprintf(temp_text, "2 Front 2 Rear"); - break; - case A52_3F2R: - sprintf(temp_text, "3 Front 2 Rear"); - break; - case A52_CHANNEL1: - sprintf(temp_text, "Channel1"); - break; - case A52_CHANNEL2: - sprintf(temp_text, "Channel2"); - break; - case A52_DOLBY: - sprintf(temp_text, "Dolby"); - break; - } - - // Create frame for file info. - - if (no_window) - { - frame = gtk_frame_new ("A/52 Info:"); - gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 8); - - // Create label inside frame. - - label2 = gtk_label_new (NULL); - gtk_container_add(GTK_CONTAINER(frame), label2); - gtk_misc_set_alignment (GTK_MISC (label2), 0, 0); - gtk_label_set_justify (GTK_LABEL(label2), GTK_JUSTIFY_LEFT); - - } - - // Set text of label inside frame. - - if (l_flags & A52_LFE) - sprintf(label2_text, "\n Bitrate: %d kb/s\n Samplerate: %d Hz\n Channel Type: %s\n Low Frequency Enhancement: Yes\n %d frames\n Filesize: %d B\n", - l_bit_rate / 1000, l_sample_rate, temp_text, l_length / l_frame_size, l_length); - else - sprintf(label2_text, "\n Bitrate: %d kb/s\n Samplerate: %d Hz\n Channel Type: %s\n Low Frequency Enhancement: No\n %d frames\n Filesize: %d B\n", - l_bit_rate / 1000, l_sample_rate, temp_text, l_length / l_frame_size, l_length); - - gtk_label_set_text (GTK_LABEL(label2), label2_text); - - if (no_window) - { - // Create ok button. - - button_ok = gtk_button_new_with_label ("Ok"); - gtk_signal_connect_object (GTK_OBJECT (button_ok), "clicked", - GTK_SIGNAL_FUNC (gtk_widget_destroy), - GTK_OBJECT (window)); - gtk_widget_set_usize (button_ok, 100, -1); - gtk_box_pack_start(GTK_BOX (vbox), button_ok, - TRUE, FALSE, 8); - - // Pack vbuttonbox into window. - - gtk_container_add (GTK_CONTAINER (window), vbox); - - // Show all of the above. - - gtk_widget_show (label2); - gtk_widget_show (label); - gtk_widget_show (entry); - gtk_widget_show (frame); - gtk_widget_show (hbox); - gtk_widget_show (button_ok); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_widget_grab_focus (button_ok); - } -} diff -r 5783d6281431 -r ee81e087615c src/a52dec/a52dec.h --- a/src/a52dec/a52dec.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/* - * xmms-a52dec.h - * - * xmms-a52dec 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, or (at your option) - * any later version. - * - * xmms-a52dec 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 GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -static char * a52dec_xpm[] = { -"400 50 83 1", -" c None", -". c #000000", -"+ c #555555", -"@ c #E2E2E2", -"# c #FFFFFF", -"$ c #8D8D8D", -"% c #AAAAAA", -"& c #1C1C1C", -"* c #717171", -"= c #383838", -"- c #999999", -"; c #666666", -"> c #333333", -", c #C6C6C6", -"' c #CCCCCC", -") c #D7D7D7", -"! c #525252", -"~ c #191919", -"{ c #4C4C4C", -"] c #EBEBEB", -"^ c #212121", -"/ c #080808", -"( c #494949", -"_ c #4B4B4B", -": c #323232", -"< c #8A8A8A", -"[ c #252525", -"} c #6B6B6B", -"| c #585858", -"1 c #B0B0B0", -"2 c #3B3B3B", -"3 c #424242", -"4 c #101010", -"5 c #8E8E8E", -"6 c #505050", -"7 c #6A6A6A", -"8 c #696969", -"9 c #9C9C9C", -"0 c #303030", -"a c #7E7E7E", -"b c #565656", -"c c #939393", -"d c #535353", -"e c #707070", -"f c #878787", -"g c #8F8F8F", -"h c #3E3E3E", -"i c #404040", -"j c #676767", -"k c #757575", -"l c #454545", -"m c #747474", -"n c #464646", -"o c #7B7B7B", -"p c #898989", -"q c #626262", -"r c #232323", -"s c #595959", -"t c #5B5B5B", -"u c #7A7A7A", -"v c #111111", -"w c #515151", -"x c #9D9D9D", -"y c #434343", -"z c #2B2B2B", -"A c #A5A5A5", -"B c #7F7F7F", -"C c #2A2A2A", -"D c #4A4A4A", -"E c #818181", -"F c #A8A8A8", -"G c #B1B1B1", -"H c #F5F5F5", -"I c #6F6F6F", -"J c #6D6D6D", -"K c #3A3A3A", -"L c #828282", -"M c #A2A2A2", -"N c #5F5F5F", -"O c #181818", -"P c #A9A9A9", -"Q c #D8D8D8", -"R c #C5C5C5", -"................................................................................................................................................................................................................................................................................................................................................................................................................", -"................................................................................................................................................................................................................................................................................................................................................................................................................", -"..................+@#$............+#+...........................................................................................................................................................................................................................................................................................................................................................................", -".................%####&..........+###*..........................................................................................................................................................................................................................................................................................................................................................................", -"...............&%#####$.........+#####+.........................................................................................................................................................................................................................................................................................................................................................................", -"..............$########=.......+#######+........................................................................................................................................................................................................................................................................................................................................................................", -"............+@#########%......+#########=....................-;-;-;-;-;-;-;-;;.-;-;-;-;-;-;-;-;;...>;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;->...............................................................................................................................................................................................................................................", -"..........=,############&....+##########@&...................################'.################'...>############################################################-...............................................................................................................................................................................................................................................", -".........+#######%@#####*...=####@,######,...................################'.################'...>#->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;#;...............................................................................................................................................................................................................................................", -"........%#####@*&.&#####@..+@###%&.$######+..................###';-;--#######'.########-;-;-###'...>#-........................................................>#-.........................................................................................................................................*%%%%%%%%%$....................&*%,#####%%+.............................&+%,#####,%+&.................", -"......=@####@*.....$#####*+####,....+#####@&.................###'......-#####'.######-......###'...>#;........................................................>#;.........................................................................................................................................###########=.................=,#############$&........................&$#############$&...............", -".....$####@*.......&##########@&.....+#####%.................###'.......-####'.#####;.......###'...>#-........................................................>#-........................................................................................................................................+###########$...............&%################@=......................&@###############@&..............", -"...&,####$..........,########@&.......+#####%................###'........-###'.####;........###'...>#;.....;-;-;->>....>-;-;>..;-;>....;-;-;-;>.;-;>..>;-;....>#;........................................................................................................................................,###########@..............&@###################+....................&@#################@..............", -"...*####,...........+########+.........+#####*...............###'........>###'.###'.........###'...>#-.....########;.;#######;.'##>....########;'##-..'##;....>#-.......................................................................................................................................&#############=............&@#####################&...................,###################*.............", -"....@####&...........@######+..........*######...............###'.........-##'.###-.........###'...>#;.....########'.'########.'##>....########->###.;###.....>#;.......................................................................................................................................*#############%............%######################,..................=########,++$########,.............", -"....&@###,...........*#####+..........+#####@+...............###'.........;##'.###>.........###'...>#-.....##'..>###>###>..'##>'##>....###..;##'.-##-'##;.....>#-.......................................................................................................................................,##############...........=###########,%%##########=.................%#######,....*########.............", -".....+####=..........&####+..........=#####@&................###'.........>##'.###..........###'...>#;.....##'...'##>##'...'##>'##>....###;--##;.>#####'......>#;......................................................................................................................................=#######@#######*..........,#########%&....*########,.................%%@#####+.....########.............", -"......+#)#@...........$##!..........&@####@&.................###'.........>##'.###..........###'...>#-.....##'...'##>##'...'##>'##>....########>..-####>......>#-......................................................................................................................................$#######$#######,.........&#########%.......+########=....................&++%.....&#######,.............", -"......~{{]#*..........=]{{^........&@####@&..................###'.........>##'.###..........###'...>#;.....##'...'##>##'...'##>'##>....###'''##-...###'.......>#;......................................................................................................................................@#######.########&........+########@.........,###,%+&..............................%#######*.............", -"...../{{{%#@&.{{{{.....({{_....:{{{<####@&...................###'.........;##'.###>.........###'...>#-.....##'...###>###...'##>'##>....###..>##'...'##>.......>#-.....................................................................................................................................=#######%.%#######*........%########$.........+*+...............................=+*@#######@..............", -".....[{{{}##$.{{{{.....{{{{/...|{{{1###)2{{{~................###'.........-##'.###;.........###'...>#;.....##'''####.####''###>'##''''>###'''##'...'##>.......>#;.....................................................................................................................................%#######+.+#######@........,########+...........................................%#########@&..............", -".....3{{{{)##&{{{{....4{{{{:...|{{{1##5{{{{{{/...............###'.........###'.###'.........###'...>#-.....########-.;#######-.'######>########-...'##>.......>#-.....................................................................................................................................########...########=.......#########............................................%########$................", -".....6{{7{8##9{{{{~...0{{7{{/..{{{{a#@{{bcb{{[...............###'........-###'.####;........###'...>#;.....''''''';...;-'''-;..-''''''>''''''';....-''>.......>#;....................................................................................................................................+#######,...%#######$.......#########............................................%########@$&..............", -".....d{beb{f#g{{{{h...i{{jk{l/4{{{{m@&b{{no7p=...............###'.......;####'.#####>.......###'...>#-........................................................>#-....................................................................................................................................,#######*...+########.......#########............................................###########@=.............", -".....{{q.o{{m{{b{{h..._{{rsb{l({b{{e&.......###'...>#;........................................................>#;...................................................................................................................................&########&...&########+......#########.....................%%%%%%%%%%%=...........############@&............", -"..../{{t.=7{{{bu{{3...d{b.vo{{{{g{{w..vtxkb{y~...............###'>>>>;'######'.#######';>>>>###'...>#-........................................................>#-...................................................................................................................................*#######@.....,#######,......#########.....................###########+...........+&.&*########%............", -"....z{{b..e7{bA9{{6../{{q..=p{{p@{{{....vtcB{{C..............################'.################'...>#;........................................................>#;...................................................................................................................................,#######$.....*########&.....,########=.........&@$=.......###########+................+########............", -"....D{{2...EFGH@{{|..:{{t...IFF@#7{{...C...(p{{^.............################'.################'...>############################################################-..................................................................................................................................=#######################*.....%########+.........*###@$+....###########+.................@#######+...........", -"...^{{{r..&@###@{{{./{{{b....@###J{{~.^{:~~~l{{_.............''''''''''''''''-.''''''''''''''''-...>'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';..................................................................................................................................$#######################,.....*########%.........,#######*..###########+.................%#######+...........", -"...(ppp..&@###%.b{{.vcppK....&@##L{{h.D{{{{{{{b}...................................................................................................................................................................................................................................................@########################=....&#########&.......+########+..###########+.....=++$*.......%#######+...........", -"....===.=@###%..q{{/.r==v.....&@#M{{N.(Fpk777pcv..................................................................................................................................................................................................................................................=#########################$.....,########@&.....=@########...%%%%%%%%%%%=.&@#######.......@#######&...........", -".......+####$...}k7O...........=#@B7P+..=teee=................................................>>>>................................................................................................................................................................................................%#########################@.....=##########%+++%#########$.................@#######*.....*#######@............", -"......*####+....vtev............+#QR@#*......................>######-..........'##..........>'####-..........'#'........-#######'.........;##-...........'#'......................................................................................................................................###########################+.....,#######################&.................*########$&.&*########$............", -".....%###@=......................+#####%.....................>#######-.........'##.........>#######-.........'#'........;#######'.........'###>..........'#'.....................................................................................................................................+########$+++++++++$########%.....&@#####################*...................@####################&............", -"....%###@&........................*#####*....................>##;>;###>........'##.........-##-.>###.........'#'........>>>'##>>>........>####;..........'#'.....................................................................................................................................,########&..........#########......=####################%....................+###################+.............", -"...+####*...........&+.............%#####&...................>##>..;##;........'##.........##'...>>>.........'#'...........'##...........-##'#'..........'#'....................................................................................................................................&########,...........%########*......&@#################%......................+#################+..............", -"....@####*.........&@#%............+#####$...................>##>..>##-........'##.........##-..####>........'#'...........'##...........##-;##>.........'#'....................................................................................................................................*########$...........*########,.......&$##############@*........................=@#############@+...............", -"....&@####*.......=@###,&........&,######%...................>##>..;##;........'##.........##'..####>........'#'...........'##..........;##-;##-.........'#'....................................................................................................................................,########=...........&#########&........&*,#########,*&...........................*%#########,*.................", -".....&#####+.....+######@&......+@######%&...................>##>..'##;........'##.........'##>.>-##>........'#'...........'##..........-#######.........'#'................................................................................................................................................................................&+++++&..................................&+++++&....................", -"......+#####+...+########@&....$#######+.....................>##''###'.........'##.........;###''###>........'#'...........'##..........##''''##;........'##''''>...............................................................................................................................................................................................................................................", -".......+#####+.+##########@&&*@######@&......................>######'>.........'##..........-#######>........'#'...........'##.........;##;..>##-........'######>...............................................................................................................................................................................................................................................", -"........%#####%############@########%&.......................>;-;-;;...........;;-...........>-'-;;;>........;;;...........;;-.........;;-....;;-........;-;-;-;>...............................................................................................................................................................................................................................................", -".........%###########*&%###########%............................................................................................................................................................................................................................................................................................................................................................................", -"..........@#########+...%#########%.............................................................................................................................................................................................................................................................................................................................................................................", -"..........&@######@=.....%#######+..............................................................................................................................................................................................................................................................................................................................................................................", -"...........&#####@&.......%####@+...............................................................................................................................................................................................................................................................................................................................................................................", -"............+###@&........&@##%&................................................................................................................................................................................................................................................................................................................................................................................", -".............+#%&..........&,+..................................................................................................................................................................................................................................................................................................................................................................................", -"..............*.................................................................................................................................................................................................................................................................................................................................................................................................", -"................................................................................................................................................................................................................................................................................................................................................................................................................"}; - - diff -r 5783d6281431 -r ee81e087615c src/iris/3Dstuff.c --- a/src/iris/3Dstuff.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include "iris.h" - - -void -bar_top_or_bottom (GLfloat height, xz * xz1, xz * xz2, xz * xz3, xz * xz4) -{ - glVertex3f (xz1->x, height, xz1->z); - glVertex3f (xz2->x, height, xz2->z); - glVertex3f (xz4->x, height, xz4->z); - glVertex3f (xz3->x, height, xz3->z); -} - - -void -bar_side (GLfloat height, xz * xz1, xz * xz2) -{ - glVertex3f (xz1->x, height, xz1->z); - glVertex3f (xz1->x, 0, xz1->z); - glVertex3f (xz2->x, 0, xz2->z); - - glVertex3f (xz2->x, height, xz2->z); -} - - -void -bar_full (GLfloat height, xz * xz1, xz * xz2, xz * xz3, xz * xz4) -{ - bar_top_or_bottom (height, xz1, xz2, xz3, xz4); - bar_side (height, xz1, xz2); - bar_side (height, xz3, xz4); - bar_side (height, xz1, xz2); - bar_side (height, xz3, xz4); -} diff -r 5783d6281431 -r ee81e087615c src/iris/Makefile --- a/src/iris/Makefile Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -include ../../mk/rules.mk -include ../../mk/init.mk - -OBJECTIVE_LIBS = libiris$(SHARED_SUFFIX) - -LIBDIR = $(plugindir)/$(VISUALIZATION_PLUGIN_DIR) - -LIBADD = $(GTK_LIBS) -lGL $(XXF86VM_LIBS) - -SOURCES = \ - 3Dstuff.c \ - color.c \ - config.c \ - iris.c \ - theme.c \ - theme_flash.c \ - theme_float.c \ - theme_fountain.c \ - theme_knot.c \ - theme_original.c \ - theme_pinwheel.c \ - theme_pipes.c \ - theme_pyramid.c \ - theme_spectrotoy.c \ - theme_spectrum.c \ - theme_squarefield.c \ - theme_waves.c \ - transition.c - -OBJECTS = ${SOURCES:.c=.o} - -CFLAGS += $(PICFLAGS) -D_REENTRANT $(GTK_CFLAGS) $(ARCH_DEFINES) -I../../intl -I../.. $(XXF86VM_CFLAGS) - -include ../../mk/objective.mk diff -r 5783d6281431 -r ee81e087615c src/iris/color.c --- a/src/iris/color.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include "iris.h" - -void -get_color (GLfloat * red, GLfloat * green, GLfloat * blue, GLfloat * signal) -{ - switch (config.color_mode) - { - case 0: - { - *red = config.color_red; - *green = config.color_green; - *blue = config.color_blue; - break; - } - case 1: - { - *red = - config.color1_red + - ((*signal) * (config.color2_red - config.color1_red)); - *green = - config.color1_green + - ((*signal) * (config.color2_green - config.color1_green)); - *blue = - config.color1_blue + - ((*signal) * (config.color2_blue - config.color1_blue)); - break; - } - case 2: - { - *red = 1.0 * rand () / (RAND_MAX + 1.0); - *green = 1.0 * rand () / (RAND_MAX + 1.0); - *blue = 1.0 * rand () / (RAND_MAX + 1.0); - break; - } - } -} diff -r 5783d6281431 -r ee81e087615c src/iris/config.c --- a/src/iris/config.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1289 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include -#include -#include -#include -#include "iris.h" -#include "config.h" - -iris_config config; -iris_config newconfig; -GLWindow GLWin; - -static char section_name[] = "iris"; - -GtkWidget *config_window; - -GtkWidget *preview_color_one_color; -GtkWidget *preview_color_two_colors_1; -GtkWidget *preview_color_two_colors_2; -GtkWidget *preview_background; -GtkWidget *preview_flash; - -static GtkWidget *config_ctree; -static GtkWidget *config_notebook; -static gint config_page; - -static gboolean -check_cfg_version (ConfigDb * db) -{ - char *vstr; - - if (bmp_cfg_db_get_string (db, "iris", "version", &vstr)) - if (!strcmp (vstr, VERSION)) - return FALSE; - return TRUE; -} - - -void -iris_set_default_prefs (void) -{ - int i; - - for (i = 0; i < THEME_NUMBER; i++) - { - theme_config_global_default (i); - if (theme[i].config_default != NULL) - theme[i].config_default (); - } - - config.bgc_red = 0.0; - config.bgc_green = 0.0; - config.bgc_blue = 0.0; - - config.bgc_random = FALSE; - - config.color_red = 0.0; - config.color_green = 0.0; - config.color_blue = 1.0; - - config.color_random = TRUE; - - config.color1_red = 1.0; - config.color1_green = 0.0; - config.color1_blue = 0.0; - - config.color2_red = 0.0; - config.color2_green = 1.0; - config.color2_blue = 0.0; - - config.color12_random = TRUE; - - config.color_flash_red = 1.0; - config.color_flash_green = 1.0; - config.color_flash_blue = 1.0; - - config.color_mode = 1; - - config.color_beat = TRUE; - - config.flash_speed = 5; - - config.fps = 50; - - config.change_theme_on_beat = FALSE; - - config.fs_width = 640; - config.fs_height = 480; - - config.window_width = 640; - config.window_height = 480; - - config.fullscreen = FALSE; - - config.transition = TRUE; - config.trans_duration = 10.0; -} - - -void -iris_config_read (void) -{ - ConfigDb *db; - - db = bmp_cfg_db_open(); - - /* Check the config version string. If the string is too old, default values - * are installed. If the string returns NULL, iris has not been run before, - * and default values are installed. */ - if (check_cfg_version (db)) - { - printf("Bad iris plugin version detected in config, using default configuration\n"); - iris_set_default_prefs (); - } - else - { - int i; - - /* load config of all the theme */ - for (i = 0; i < THEME_NUMBER; i++) - { - theme_config_global_read (db, section_name, i); - if (theme[i].config_read != NULL) - theme[i].config_read (db, section_name); - } - - bmp_cfg_db_get_float (db, section_name, "bgc_red", &config.bgc_red); - bmp_cfg_db_get_float (db, section_name, "bgc_green", &config.bgc_green); - bmp_cfg_db_get_float (db, section_name, "bgc_blue", &config.bgc_blue); - bmp_cfg_db_get_bool (db, section_name, "bgc_random", &config.bgc_random); - bmp_cfg_db_get_float (db, section_name, "color_red", &config.color_red); - bmp_cfg_db_get_float (db, section_name, "color_green", &config.color_green); - bmp_cfg_db_get_float (db, section_name, "color_blue", &config.color_blue); - bmp_cfg_db_get_bool (db, section_name, "color_random", &config.color_random); - bmp_cfg_db_get_float (db, section_name, "color1_red", &config.color1_red); - bmp_cfg_db_get_float (db, section_name, "color1_green", &config.color1_green); - bmp_cfg_db_get_float (db, section_name, "color1_blue", &config.color1_blue); - bmp_cfg_db_get_float (db, section_name, "color2_red", &config.color2_red); - bmp_cfg_db_get_float (db, section_name, "color2_green", &config.color2_green); - bmp_cfg_db_get_float (db, section_name, "color2_blue", &config.color2_blue); - bmp_cfg_db_get_bool (db, section_name, "color12_random", &config.color12_random); - bmp_cfg_db_get_float (db, section_name, "color_flash_red", &config.color_flash_red); - bmp_cfg_db_get_float (db, section_name, "color_flash_green", &config.color_flash_green); - bmp_cfg_db_get_float (db, section_name, "color_flash_blue", &config.color_flash_blue); - bmp_cfg_db_get_int (db, section_name, "color_mode", &config.color_mode); - bmp_cfg_db_get_bool (db, section_name, "color_beat", &config.color_beat); - bmp_cfg_db_get_int (db, section_name, "flash_speed", &config.flash_speed); - bmp_cfg_db_get_int (db, section_name, "fps", &config.fps); - bmp_cfg_db_get_bool (db, section_name, "change_theme_on_beat", &config.change_theme_on_beat); - bmp_cfg_db_get_int (db, section_name, "fs_width", &config.fs_width); - bmp_cfg_db_get_int (db, section_name, "fs_height", &config.fs_height); - bmp_cfg_db_get_int (db, section_name, "window_width", &config.window_width); - bmp_cfg_db_get_int (db, section_name, "window_height", &config.window_height); - bmp_cfg_db_get_bool (db, section_name, "fullscreen", &config.fullscreen); - bmp_cfg_db_get_bool (db, section_name, "transition", &config.transition); - bmp_cfg_db_get_float (db, section_name, "trans_duration", &config.trans_duration); - } - bmp_cfg_db_close(db); -} - - -void -iris_config_write (iris_config * config) -{ - ConfigDb *db; - int i; - - db = bmp_cfg_db_open(); - - /* save config of all the theme */ - for (i = 0; i < THEME_NUMBER; i++) - { - theme_config_global_write (db, section_name, i); - if (theme[i].config_write != NULL) - theme[i].config_write (db, section_name); - } - - /* Save the current configuration in the "iris" section */ - bmp_cfg_db_set_string (db, section_name, "version", VERSION); - bmp_cfg_db_set_float (db, section_name, "bgc_red", config->bgc_red); - bmp_cfg_db_set_float (db, section_name, "bgc_green", config->bgc_green); - bmp_cfg_db_set_float (db, section_name, "bgc_blue", config->bgc_blue); - bmp_cfg_db_set_bool (db, section_name, "bgc_random", config->bgc_random); - bmp_cfg_db_set_float (db, section_name, "color_red", config->color_red); - bmp_cfg_db_set_float (db, section_name, "color_green", config->color_green); - bmp_cfg_db_set_float (db, section_name, "color_blue", config->color_blue); - bmp_cfg_db_set_bool (db, section_name, "color_random", config->color_random); - bmp_cfg_db_set_float (db, section_name, "color1_red", config->color1_red); - bmp_cfg_db_set_float (db, section_name, "color1_green", config->color1_green); - bmp_cfg_db_set_float (db, section_name, "color1_blue", config->color1_blue); - bmp_cfg_db_set_float (db, section_name, "color2_red", config->color2_red); - bmp_cfg_db_set_float (db, section_name, "color2_green", config->color2_green); - bmp_cfg_db_set_float (db, section_name, "color2_blue", config->color2_blue); - bmp_cfg_db_set_bool (db, section_name, "color12_random", config->color12_random); - bmp_cfg_db_set_float (db, section_name, "color_flash_red", config->color_flash_red); - bmp_cfg_db_set_float (db, section_name, "color_flash_green", config->color_flash_green); - bmp_cfg_db_set_float (db, section_name, "color_flash_blue", config->color_flash_blue); - bmp_cfg_db_set_int (db, section_name, "color_mode", config->color_mode); - bmp_cfg_db_set_bool (db, section_name, "color_beat", config->color_beat); - bmp_cfg_db_set_int (db, section_name, "flash_speed", config->flash_speed); - bmp_cfg_db_set_int (db, section_name, "fps", config->fps); - bmp_cfg_db_set_bool (db, section_name, "change_theme_on_beat", config->change_theme_on_beat); - bmp_cfg_db_set_int (db, section_name, "fs_width", config->fs_width); - bmp_cfg_db_set_int (db, section_name, "fs_height", config->fs_height); - bmp_cfg_db_set_int (db, section_name, "window_width", config->window_width); - bmp_cfg_db_set_int (db, section_name, "window_height", config->window_height); - bmp_cfg_db_set_bool (db, section_name, "fullscreen", config->fullscreen); - bmp_cfg_db_set_bool (db, section_name, "transition", config->transition); - bmp_cfg_db_set_float (db, section_name, "trans_duration", config->trans_duration); - - /* write out the XMMS config file */ - bmp_cfg_db_close(db); -} - - -static void -set_color_preview (GLfloat red, GLfloat green, GLfloat blue, - GtkWidget * preview) -{ - unsigned int a; - guchar buf[3 * 32]; - char r, g, b; - char s[3]; - - // how to convert a float into a char ? - sprintf (s, "%.0f", red * 255); - r = (unsigned char) atoi (s); - sprintf (s, "%.0f", green * 255); - g = (unsigned char) atoi (s); - sprintf (s, "%.0f", blue * 255); - b = (unsigned char) atoi (s); - - for (a = 0; a < 32; a++) - { - buf[3 * a] = (char) r; - buf[3 * a + 1] = (char) g; - buf[3 * a + 2] = (char) b; - } - - for (a = 0; a < 16; a++) - gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, a, 32); - - gtk_widget_draw (preview, NULL); -} - - -static void -csel_ok (GtkWidget * w, GtkWidget * csel) -{ - gdouble a[3]; - - gtk_color_selection_get_color (GTK_COLOR_SELECTION - (GTK_COLOR_SELECTION_DIALOG (csel)-> - colorsel), &a[0]); - - gtk_widget_destroy (csel); -} - - -static void -csel_ok2 (GtkWidget * csel, gpointer data) -{ - gdouble a[3]; - - gtk_color_selection_get_color (GTK_COLOR_SELECTION - (GTK_COLOR_SELECTION_DIALOG (csel)-> - colorsel), &a[0]); - - switch ((int) data) - { - case 0: - { - newconfig.color_red = (GLfloat) a[0]; - newconfig.color_green = (GLfloat) a[1]; - newconfig.color_blue = (GLfloat) a[2]; - set_color_preview (newconfig.color_red, newconfig.color_green, - newconfig.color_blue, preview_color_one_color); - break; - } - case 1: - { - newconfig.color1_red = (GLfloat) a[0]; - newconfig.color1_green = (GLfloat) a[1]; - newconfig.color1_blue = (GLfloat) a[2]; - set_color_preview (newconfig.color1_red, newconfig.color1_green, - newconfig.color1_blue, preview_color_two_colors_1); - break; - } - case 2: - { - newconfig.color2_red = (GLfloat) a[0]; - newconfig.color2_green = (GLfloat) a[1]; - newconfig.color2_blue = (GLfloat) a[2]; - set_color_preview (newconfig.color2_red, newconfig.color2_green, - newconfig.color2_blue, preview_color_two_colors_2); - break; - } - case 3: - { - newconfig.bgc_red = (GLfloat) a[0]; - newconfig.bgc_green = (GLfloat) a[1]; - newconfig.bgc_blue = (GLfloat) a[2]; - set_color_preview (newconfig.bgc_red, newconfig.bgc_green, - newconfig.bgc_blue, preview_background); - break; - } - case 4: - { - newconfig.color_flash_red = (GLfloat) a[0]; - newconfig.color_flash_green = (GLfloat) a[1]; - newconfig.color_flash_blue = (GLfloat) a[2]; - set_color_preview (newconfig.color_flash_red, - newconfig.color_flash_green, - newconfig.color_flash_blue, preview_flash); - break; - } - } - - gtk_widget_destroy (csel); -} - - -static void -apply_clicked (void) -{ - gint i; - - memcpy (&config, &newconfig, sizeof (iris_config)); - for (i = 0; i < THEME_NUMBER; i++) - { - memcpy (theme[i].config->global, theme[i].config_new->global, - sizeof (config_global)); - theme_config_apply (i); - } -} - - -static void -cancel_clicked (GtkWidget * w, GtkWidget * window) -{ - gtk_widget_destroy (window); - config_window = NULL; -} - - -static void -csel_deleteevent (GtkWidget * w, GtkWidget * csel) -{ - gtk_widget_destroy (csel); -} - - -static void -ok_clicked (GtkWidget * w, GtkWidget * window) -{ - apply_clicked (); - iris_config_write (&newconfig); - cancel_clicked (w, window); -} - - -static void -color_clicked (GtkWidget * w, gpointer data) -{ - GtkWidget *csel; - gdouble a[3]; - - switch ((int) data) - { - case 0: - { - a[0] = (gdouble) newconfig.color_red; - a[1] = (gdouble) newconfig.color_green; - a[2] = (gdouble) newconfig.color_blue; - break; - } - case 1: - { - a[0] = (gdouble) newconfig.color1_red; - a[1] = (gdouble) newconfig.color1_green; - a[2] = (gdouble) newconfig.color1_blue; - break; - } - case 2: - { - a[0] = (gdouble) newconfig.color2_red; - a[1] = (gdouble) newconfig.color2_green; - a[2] = (gdouble) newconfig.color2_blue; - break; - } - case 3: - { - a[0] = (gdouble) newconfig.bgc_red; - a[1] = (gdouble) newconfig.bgc_green; - a[2] = (gdouble) newconfig.bgc_blue; - break; - } - case 4: - { - a[0] = (gdouble) newconfig.color_flash_red; - a[1] = (gdouble) newconfig.color_flash_green; - a[2] = (gdouble) newconfig.color_flash_blue; - break; - } - } - - csel = gtk_color_selection_dialog_new ("Please choose a color"); - /*gtk_window_set_modal (GTK_WINDOW - (&(GTK_COLOR_SELECTION_DIALOG (csel)->window)), TRUE); - gtk_window_set_transient_for (GTK_WINDOW - (& - (GTK_COLOR_SELECTION_DIALOG (csel)->window)), - GTK_WINDOW (config_window)); */ - gtk_widget_hide (GTK_COLOR_SELECTION_DIALOG (csel)->help_button); - gtk_widget_hide (GTK_COLOR_SELECTION_DIALOG (csel)->cancel_button); - gtk_color_selection_set_color (GTK_COLOR_SELECTION - (GTK_COLOR_SELECTION_DIALOG (csel)-> - colorsel), &a[0]); - gtk_widget_show (csel); - - gtk_signal_connect (GTK_OBJECT - (GTK_COLOR_SELECTION_DIALOG (csel)->ok_button), - "clicked", GTK_SIGNAL_FUNC (csel_ok), csel); - gtk_signal_connect (GTK_OBJECT (csel), "delete_event", - GTK_SIGNAL_FUNC (csel_deleteevent), csel); - gtk_signal_connect (GTK_OBJECT (csel), "destroy", - GTK_SIGNAL_FUNC (csel_ok2), data); -} - - -void -colormode_toggled (GtkWidget * widget, gpointer data) -{ - newconfig.color_mode = (unsigned int) data; -} - - -void -colorbeat_toggled (GtkWidget * widget, gpointer data) -{ - newconfig.color_beat = !newconfig.color_beat; -} - - -void -theme_beat_toggled (GtkWidget * widget, gpointer data) -{ - newconfig.change_theme_on_beat = !newconfig.change_theme_on_beat; -} - - -void -color_random_toggled (GtkWidget * widget, gpointer data) -{ - newconfig.color_random = !newconfig.color_random; -} - - -void -color12_random_toggled (GtkWidget * widget, gpointer data) -{ - newconfig.color12_random = !newconfig.color12_random; -} - - -void -bgc_random_toggled (GtkWidget * widget, gpointer data) -{ - newconfig.bgc_random = !newconfig.bgc_random; -} - - -void -wireframe_toggled (GtkWidget * widget, gpointer * data) -{ - newconfig.wireframe = !newconfig.wireframe; -} - - -void -fullscreen_toggled (GtkWidget * widget, gpointer data) -{ - newconfig.fullscreen = !newconfig.fullscreen; -} - -void -transition_toggled (GtkWidget * widget, gpointer data) -{ - newconfig.transition = !newconfig.transition; -} - -static void -combo_fs_activated (GtkWidget * widget, gpointer data) -{ - sscanf (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (data)->entry)), "%dx%d", - &newconfig.fs_width, &newconfig.fs_height); -} - - -static void -value_flash_speed (GtkAdjustment * adj) -{ - newconfig.flash_speed = (int) adj->value; -} - -static void -value_trans_duration (GtkAdjustment * adj) -{ - newconfig.trans_duration = (int) adj->value; -} - -static void -conf_closed (GtkWidget * w, GdkEvent * e, GtkWidget ** window) -{ - gtk_widget_destroy (*window); - *window = NULL; -} - - -static void -priority_value_changed (GtkAdjustment * adj, gint i) -{ - theme[i].config_new->global->priority = adj->value / 100.0; -} - - -static void -create_config_color (GtkWidget * vbox_container) -{ - GtkWidget *frame; - GtkWidget *vbox; - GtkWidget *hbox; - GSList *group; - - GtkWidget *radio_button_one_color; - GtkWidget *button_color_one_color; - // GtkWidget *preview_color_one_color; must be static - - GtkWidget *radio_button_two_colors; - GtkWidget *button_color_two_colors_1; - GtkWidget *button_color_two_colors_2; - // GtkWidget *preview_color_two_colors_1; must be static - // GtkWidget *preview_color_two_colors_2; must be static - - GtkWidget *check_button; - - GtkWidget *hseparator; - - GtkWidget *label; - GtkWidget *button_background; - // GtkWidget *preview_background; static - - frame = gtk_frame_new ("color"); - gtk_box_pack_start (GTK_BOX (vbox_container), frame, TRUE, TRUE, 0); - vbox = gtk_vbox_new (TRUE, 2); - gtk_container_add (GTK_CONTAINER (frame), vbox); - - /* the first hbox: a radio button and a color selection/preview button */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 8); - - radio_button_one_color = - gtk_radio_button_new_with_label (NULL, "one color"); - gtk_box_pack_start (GTK_BOX (hbox), radio_button_one_color, FALSE, FALSE, - 4); - gtk_widget_set_usize (radio_button_one_color, 100, 20); - gtk_widget_show (radio_button_one_color); - - button_color_one_color = gtk_button_new (); - gtk_box_pack_start (GTK_BOX (hbox), button_color_one_color, FALSE, FALSE, - 4); - gtk_widget_show (button_color_one_color); - preview_color_one_color = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_size (GTK_PREVIEW (preview_color_one_color), 32, 16); - gtk_widget_show (preview_color_one_color); - gtk_container_add (GTK_CONTAINER (button_color_one_color), - preview_color_one_color); - set_color_preview (newconfig.color_red, newconfig.color_green, - newconfig.color_blue, preview_color_one_color); - gtk_widget_set_usize (button_color_one_color, 50, 20); - gtk_signal_connect (GTK_OBJECT (button_color_one_color), "clicked", - GTK_SIGNAL_FUNC (color_clicked), (gpointer) 0); - - /* the second hbox: a radio button and two color selection/preview buttons */ - - hbox = gtk_hbox_new (FALSE, 3); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 8); - - group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button_one_color)); - radio_button_two_colors = - gtk_radio_button_new_with_label (group, "two colors"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button_two_colors), - TRUE); - gtk_box_pack_start (GTK_BOX (hbox), radio_button_two_colors, FALSE, FALSE, - 4); - gtk_widget_set_usize (radio_button_two_colors, 100, 20); - gtk_widget_show (radio_button_two_colors); - - button_color_two_colors_1 = gtk_button_new (); - gtk_box_pack_start (GTK_BOX (hbox), button_color_two_colors_1, FALSE, FALSE, - 4); - gtk_widget_show (button_color_two_colors_1); - preview_color_two_colors_1 = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_size (GTK_PREVIEW (preview_color_two_colors_1), 32, 16); - gtk_widget_show (preview_color_two_colors_1); - gtk_container_add (GTK_CONTAINER (button_color_two_colors_1), - preview_color_two_colors_1); - set_color_preview (newconfig.color1_red, newconfig.color1_green, - newconfig.color1_blue, preview_color_two_colors_1); - gtk_widget_set_usize (button_color_two_colors_1, 50, 20); - - gtk_signal_connect (GTK_OBJECT (button_color_two_colors_1), "clicked", - GTK_SIGNAL_FUNC (color_clicked), (gpointer) 1); - - button_color_two_colors_2 = gtk_button_new (); - gtk_box_pack_start (GTK_BOX (hbox), button_color_two_colors_2, FALSE, FALSE, - 4); - gtk_widget_show (button_color_two_colors_2); - preview_color_two_colors_2 = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_size (GTK_PREVIEW (preview_color_two_colors_2), 32, 16); - gtk_widget_show (preview_color_two_colors_2); - gtk_container_add (GTK_CONTAINER (button_color_two_colors_2), - preview_color_two_colors_2); - set_color_preview (newconfig.color2_red, newconfig.color2_green, - newconfig.color2_blue, preview_color_two_colors_2); - gtk_widget_set_usize (button_color_two_colors_2, 50, 20); - - gtk_signal_connect (GTK_OBJECT (button_color_two_colors_2), "clicked", - GTK_SIGNAL_FUNC (color_clicked), (gpointer) 2); - - switch (newconfig.color_mode) - { - case 0: - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON - (radio_button_one_color), TRUE); - break; - } - case 1: - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON - (radio_button_two_colors), TRUE); - } - } - - gtk_signal_connect (GTK_OBJECT (radio_button_one_color), "toggled", - GTK_SIGNAL_FUNC (colormode_toggled), (gpointer) 0); - gtk_signal_connect (GTK_OBJECT (radio_button_two_colors), "toggled", - GTK_SIGNAL_FUNC (colormode_toggled), (gpointer) 1); - - check_button = gtk_check_button_new_with_label ("Random on beat"); - gtk_widget_show (check_button); - gtk_box_pack_start (GTK_BOX (vbox), check_button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), - newconfig.color12_random); - gtk_signal_connect (GTK_OBJECT (check_button), "toggled", - GTK_SIGNAL_FUNC (color12_random_toggled), NULL); - - hseparator = gtk_hseparator_new (); - gtk_widget_show (hseparator); - gtk_box_pack_start (GTK_BOX (vbox), hseparator, FALSE, FALSE, 4); - - /* the third hbox: a color selection/preview button */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Background color"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - button_background = gtk_button_new (); - gtk_box_pack_start (GTK_BOX (hbox), button_background, FALSE, FALSE, 4); - gtk_widget_show (button_background); - preview_background = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_size (GTK_PREVIEW (preview_background), 32, 16); - gtk_widget_show (preview_background); - gtk_container_add (GTK_CONTAINER (button_background), preview_background); - set_color_preview (newconfig.bgc_red, newconfig.bgc_green, - newconfig.bgc_blue, preview_background); - gtk_widget_set_usize (button_background, 50, 20); - - gtk_signal_connect (GTK_OBJECT (button_background), "clicked", - GTK_SIGNAL_FUNC (color_clicked), (gpointer) 3); - - check_button = gtk_check_button_new_with_label ("Random on beat"); - gtk_widget_show (check_button); - gtk_box_pack_start (GTK_BOX (vbox), check_button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), - newconfig.bgc_random); - gtk_signal_connect (GTK_OBJECT (check_button), "toggled", - GTK_SIGNAL_FUNC (bgc_random_toggled), NULL); -/* - check_button = gtk_check_button_new_with_label ("Wireframe"); - gtk_widget_show (check_button); - gtk_box_pack_start (GTK_BOX (vbox), check_button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), - newconfig.wireframe); - gtk_signal_connect (GTK_OBJECT (check_button), "toggled", - GTK_SIGNAL_FUNC (wireframe_toggled), NULL); -*/ - /* end */ - -} - - -static void -create_config_beat (GtkWidget * vbox_container) -{ - GtkWidget *frame; - GtkWidget *vbox; - GtkWidget *hbox; - - GtkWidget *button_beat; - GtkWidget *button_theme_beat; - - GtkWidget *label; - GtkWidget *button_flash; - GtkWidget *preview_flash; - - GtkObject *adjustment; - GtkWidget *hscale; - - frame = gtk_frame_new ("beat"); - gtk_box_pack_start (GTK_BOX (vbox_container), frame, TRUE, TRUE, 0); - vbox = gtk_vbox_new (FALSE, 2); - gtk_container_add (GTK_CONTAINER (frame), vbox); - - /* the first hbox: two buttons */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button_beat = gtk_check_button_new_with_label ("Flash on beat"); - gtk_widget_show (button_beat); - gtk_box_pack_start (GTK_BOX (hbox), button_beat, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button_beat), - newconfig.color_beat); - gtk_signal_connect (GTK_OBJECT (button_beat), "toggled", - GTK_SIGNAL_FUNC (colorbeat_toggled), NULL); - - button_theme_beat = - gtk_check_button_new_with_label ("Change theme on beat"); - gtk_widget_show (button_theme_beat); - gtk_box_pack_start (GTK_BOX (hbox), button_theme_beat, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button_theme_beat), - newconfig.change_theme_on_beat); - gtk_signal_connect (GTK_OBJECT (button_theme_beat), "toggled", - GTK_SIGNAL_FUNC (theme_beat_toggled), NULL); - - /* the second hbox: a label and a color selection/preview button */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Flash color"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - button_flash = gtk_button_new (); - gtk_box_pack_start (GTK_BOX (hbox), button_flash, FALSE, FALSE, 4); - gtk_widget_show (button_flash); - preview_flash = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_size (GTK_PREVIEW (preview_flash), 32, 16); - gtk_widget_show (preview_flash); - gtk_container_add (GTK_CONTAINER (button_flash), preview_flash); - set_color_preview (newconfig.color_flash_red, newconfig.color_flash_green, - newconfig.color_flash_blue, preview_flash); - gtk_widget_set_usize (button_flash, 50, 20); - gtk_signal_connect (GTK_OBJECT (button_flash), "clicked", - GTK_SIGNAL_FUNC (color_clicked), (gpointer) 4); - - /* the third hbox: a label and a horizontal scale */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Flash duration (in frames)"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - adjustment = gtk_adjustment_new (newconfig.flash_speed, 1, 50, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_value_pos (GTK_SCALE (hscale), GTK_POS_LEFT); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_flash_speed), NULL); - - label = - gtk_label_new - ("Image are drawn at a rate of 50 frames per second.\n So a flash of 50 frames lasts 1 second."); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); -} - - -static void -create_config_fs (GtkWidget * vbox_container) -{ - GtkWidget *frame; - GtkWidget *vbox; - GtkWidget *hbox; - - GtkWidget *button_fs; - GtkWidget *combobox_fs; - - GtkWidget *label; - - char str[10]; - - frame = gtk_frame_new ("fullscreen"); - gtk_box_pack_start (GTK_BOX (vbox_container), frame, TRUE, TRUE, 0); - vbox = gtk_vbox_new (FALSE, 2); - gtk_container_add (GTK_CONTAINER (frame), vbox); - - /* the first hbox: a button */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button_fs = gtk_check_button_new_with_label ("Start in fullscreen mode"); - gtk_widget_show (button_fs); - gtk_box_pack_start (GTK_BOX (hbox), button_fs, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button_fs), - newconfig.fullscreen); - gtk_signal_connect (GTK_OBJECT (button_fs), "toggled", - GTK_SIGNAL_FUNC (fullscreen_toggled), NULL); - - /* the second hbox: a label combobox */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Fullscreen resolution"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - combobox_fs = gtk_combo_new (); - - gtk_combo_set_popdown_strings (GTK_COMBO (combobox_fs), GLWin.glist); - - gtk_box_pack_start (GTK_BOX (hbox), combobox_fs, FALSE, FALSE, 4); - gtk_widget_show (combobox_fs); - - gtk_signal_connect (GTK_OBJECT (GTK_COMBO (combobox_fs)->entry), "changed", - GTK_SIGNAL_FUNC (combo_fs_activated), combobox_fs); - gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combobox_fs)->entry), FALSE); - sprintf (str, "%dx%d", newconfig.fs_width, newconfig.fs_height); - gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combobox_fs)->entry), str); - - label = gtk_label_new - ("Use the f key in the GL window\nto switch to fullscreen and back.\n\ -Use the esc key to quit the plugin.\n\ -\n\ -If you use the sawfish window manager,\n\ -you may have problem going fullscreen.\n\ -In this case, switch to a console and\n\ -type \'killall xmms\'."); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); -} - -static void -create_config_transition (GtkWidget * vbox_container) -{ - GtkWidget *frame; - GtkWidget *vbox; - GtkWidget *hbox; - - GtkWidget *button_ts; - GtkWidget *label; - - GtkObject *adjustment; - GtkWidget *hscale; - - frame = gtk_frame_new ("transition"); - gtk_box_pack_start (GTK_BOX (vbox_container), frame, TRUE, TRUE, 0); - vbox = gtk_vbox_new (FALSE, 2); - gtk_container_add (GTK_CONTAINER (frame), vbox); - - /* the first hbox: a button */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button_ts = - gtk_check_button_new_with_label ("Use transitions on theme change"); - gtk_widget_show (button_ts); - gtk_box_pack_start (GTK_BOX (hbox), button_ts, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button_ts), - newconfig.transition); - gtk_signal_connect (GTK_OBJECT (button_ts), "toggled", - GTK_SIGNAL_FUNC (transition_toggled), NULL); - - label = gtk_label_new ("Chooses a random transition for now"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); - - /* the second hbox: a label and a horizontal scale */ - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Transition duration (in miliseconds)"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (newconfig.trans_duration, 1.0, 50.0, 1.0, 1.0, 1.0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_value_pos (GTK_SCALE (hscale), GTK_POS_LEFT); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_trans_duration), NULL); -} - -static void -create_config_glx_info (GtkWidget * vbox_container) -{ - GtkWidget *frame; - GtkWidget *vbox; - GtkWidget *hbox; - - GtkWidget *label; - - frame = gtk_frame_new ("GLX informations"); - gtk_box_pack_start (GTK_BOX (vbox_container), frame, TRUE, TRUE, 0); - vbox = gtk_vbox_new (FALSE, 2); - gtk_container_add (GTK_CONTAINER (frame), vbox); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - if (GLWin.ctx == NULL) - { - label = gtk_label_new ("Launch the plugin and reopen the configure window to see\n\ -informations about your GL setup."); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); - } - else - { - char *string; - string = g_strconcat ("GLX version: ", g_strdup_printf ("%d.%d", GLWin.glxMajorVersion, GLWin.glxMinorVersion), NULL); - label = gtk_label_new (string); - free(string); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); - - if (GLWin.DRI) - string = g_strconcat ("Use DRI: ", "yes", NULL); - else - string = g_strconcat ("Use DRI: ", "no", NULL); - label = gtk_label_new (string); - free(string); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); - - if (GLWin.DoubleBuffered) - string = g_strconcat ("Double buffered rendering: ", "yes", NULL); - else - string = g_strconcat ("Double buffered rendering: : ", "no", NULL); - label = gtk_label_new (string); - free(string); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); - } -} - -static void -create_config_theme (GtkWidget * vbox_container) -{ - GtkWidget *frame; - GtkWidget *hbox; - GtkWidget *table; - GtkWidget *label; - gint i, y; - - frame = gtk_frame_new ("Themes priorities"); - gtk_box_pack_start (GTK_BOX (vbox_container), frame, TRUE, TRUE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_container_add (GTK_CONTAINER (frame), hbox); - - table = gtk_table_new (2, THEME_NUMBER, FALSE); - gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 12); - - for (i = 0, y = 0; i < THEME_NUMBER; i++) - { - GtkObject *adjustment; - GtkWidget *hscale; - - label = gtk_label_new (theme[i].name); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, y, y + 1, GTK_EXPAND, - 0, 0, 8); - adjustment = - gtk_adjustment_new (theme[i].config->global->priority * 100.0, 0.0, - 100.0, 1.0, 10.0, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_scale_set_value_pos (GTK_SCALE (hscale), GTK_POS_LEFT); - gtk_table_attach (GTK_TABLE (table), hscale, 1, 2, y, y + 1, - GTK_EXPAND | GTK_FILL, 0, 0, 8); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (priority_value_changed), - (void *) i); - - y++; - } - - gtk_widget_show (frame); -} - - -static void -cb_select_monitor_config (GtkWidget * ctree, GtkCTreeNode * node) -{ - gint row; - - if (!GTK_CLIST (ctree)->selection) - return; - row = - GPOINTER_TO_INT (gtk_ctree_node_get_row_data (GTK_CTREE (ctree), node)); - gtk_notebook_set_page (GTK_NOTEBOOK (config_notebook), row); -} - - -static GtkWidget * -create_config_page (GtkNotebook * notebook, gchar * text, GtkCTree * ctree, - GtkCTreeNode * node_parent, GtkCTreeNode ** node_result) -{ - GtkWidget *vbox; - GtkCTreeNode *node; - gchar *title[1] = { text }; - - vbox = gtk_vbox_new (FALSE, 0); - node = gtk_ctree_insert_node (ctree, node_parent, NULL, title, 0, - NULL, NULL, NULL, NULL, FALSE, FALSE); - gtk_ctree_node_set_row_data (ctree, node, GINT_TO_POINTER (config_page++)); - gtk_notebook_append_page (notebook, vbox, NULL); - if (node_result) - *node_result = node; - return vbox; -} - - -void -iris_first_init (void) -{ - static gboolean init; - int i; - - if (!init) - { - theme_register (); - theme_config_init (); - /* here we collect information about resolutions supported by the display */ - /* get a connection */ - GLWin.dpy = XOpenDisplay (0); - GLWin.screen = DefaultScreen (GLWin.dpy); - XF86VidModeQueryVersion (GLWin.dpy, &GLWin.vidModeMajorVersion, - &GLWin.vidModeMinorVersion); - XF86VidModeGetAllModeLines (GLWin.dpy, GLWin.screen, &GLWin.modeNum, - &GLWin.modes); - /* save desktop-resolution before switching modes */ - GLWin.deskMode = *(GLWin.modes[0]); - - /* fill an array of string for the config combo box */ - for (i = 0; i < GLWin.modeNum; i++) - GLWin.glist = - g_list_append (GLWin.glist, - g_strdup_printf ("%dx%d", GLWin.modes[i]->hdisplay, - GLWin.modes[i]->vdisplay)); - - init = TRUE; - XCloseDisplay (GLWin.dpy); - } -} - -void -iris_configure (void) -{ - GtkWidget *config_vbox; - - GtkWidget *vbox, *buttonbox, *ok, *apply, *cancel; - GtkWidget *config_hbox; - GtkWidget *config_scrolled; - - gchar *title[1] = { "iris config" }; - GtkCTreeNode *node; - GtkCTreeNode *node_themes; - gint i; - - if (config_window) - return; - config_page = 0; - - iris_first_init (); - iris_config_read (); - memcpy (&newconfig, &config, sizeof (iris_config)); - - config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_signal_connect (GTK_OBJECT (config_window), "delete_event", - GTK_SIGNAL_FUNC (conf_closed), &config_window); - gtk_container_set_border_width (GTK_CONTAINER (config_window), 6); - gtk_window_set_title (GTK_WINDOW (config_window), "iris configuration"); - - config_hbox = gtk_hbox_new (FALSE, 4); - gtk_container_add (GTK_CONTAINER (config_window), config_hbox); - - config_scrolled = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (config_scrolled), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (config_hbox), config_scrolled, TRUE, TRUE, 0); - - config_vbox = gtk_vbox_new (FALSE, 4); - gtk_box_pack_start (GTK_BOX (config_hbox), config_vbox, TRUE, TRUE, 0); - - config_ctree = gtk_ctree_new_with_titles (1, 0, title); - gtk_ctree_set_indent (GTK_CTREE (config_ctree), 16); - gtk_clist_column_titles_passive (GTK_CLIST (config_ctree)); - gtk_widget_set_usize (config_ctree, 150, 0); - gtk_container_add (GTK_CONTAINER (config_scrolled), config_ctree); - gtk_signal_connect (GTK_OBJECT (config_ctree), "tree_select_row", - (GtkSignalFunc) cb_select_monitor_config, NULL); - config_notebook = gtk_notebook_new (); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (config_notebook), FALSE); - gtk_box_pack_start (GTK_BOX (config_vbox), config_notebook, TRUE, TRUE, 0); - - vbox = create_config_page (GTK_NOTEBOOK (config_notebook), "Color", - GTK_CTREE (config_ctree), NULL, &node); - create_config_color (vbox); - gtk_ctree_select (GTK_CTREE (config_ctree), node); - - vbox = create_config_page (GTK_NOTEBOOK (config_notebook), "Beat", - GTK_CTREE (config_ctree), NULL, NULL); - create_config_beat (vbox); - - vbox = create_config_page (GTK_NOTEBOOK (config_notebook), - "Transition", GTK_CTREE (config_ctree), - NULL, NULL); - create_config_transition (vbox); - - vbox = create_config_page (GTK_NOTEBOOK (config_notebook), - "Fullscreen", GTK_CTREE (config_ctree), - NULL, NULL); - create_config_fs (vbox); - - vbox = create_config_page (GTK_NOTEBOOK (config_notebook), "Themes", - GTK_CTREE (config_ctree), NULL, &node_themes); - create_config_theme (vbox); - - for (i = 0; i < THEME_NUMBER; i++) - { - GtkWidget *tabs; - GtkWidget *vbox_1, *vbox_2, *vbox_3; - GtkWidget *label; - vbox = - create_config_page (GTK_NOTEBOOK (config_notebook), - theme[i].name, - GTK_CTREE (config_ctree), node_themes, &node); - - tabs = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX (vbox), tabs, TRUE, TRUE, 4); - - /* first tab : global conf tab */ - vbox_1 = gtk_vbox_new (FALSE, 0); - gtk_container_border_width (GTK_CONTAINER (vbox_1), 0); - theme_config_global_widgets (vbox_1, i); - - label = gtk_label_new ("global settings"); - gtk_notebook_append_page (GTK_NOTEBOOK (tabs), vbox_1, label); - - /* second tab : specific theme tab */ - if (theme[i].config_create != NULL) - { - vbox_2 = gtk_vbox_new (FALSE, 2); - theme[i].config_create (vbox_2); - - label = gtk_label_new ("theme settings"); - gtk_notebook_append_page (GTK_NOTEBOOK (tabs), vbox_2, label); - } - - /* third tab : info tab */ - vbox_3 = gtk_vbox_new (FALSE, 0); - gtk_container_border_width (GTK_CONTAINER (vbox_3), 0); - theme_about (vbox_3, i); - - label = gtk_label_new ("theme info"); - gtk_notebook_append_page (GTK_NOTEBOOK (tabs), vbox_3, label); - - } - - vbox = create_config_page (GTK_NOTEBOOK (config_notebook), - "GLX infos", GTK_CTREE (config_ctree), - NULL, NULL); - create_config_glx_info (vbox); - - // vbox = create_config_page(GTK_NOTEBOOK(config_notebook), _("About"), - // GTK_CTREE(config_ctree), NULL, NULL); - // create_config_about(vbox); - - /* this is the box where are Ok, Cancel and Apply */ - buttonbox = gtk_hbutton_box_new (); - gtk_box_pack_end (GTK_BOX (config_vbox), buttonbox, FALSE, FALSE, 8); - gtk_hbutton_box_set_layout_default (GTK_BUTTONBOX_END); - gtk_widget_show (buttonbox); - - ok = gtk_button_new_with_label ("Quit\nand save"); - GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT); - gtk_box_pack_end (GTK_BOX (buttonbox), ok, FALSE, FALSE, 8); - gtk_widget_show (ok); - - cancel = gtk_button_new_with_label ("Quit\nwithout saving"); - GTK_WIDGET_SET_FLAGS (cancel, GTK_CAN_DEFAULT); - gtk_box_pack_end (GTK_BOX (buttonbox), cancel, FALSE, FALSE, 8); - gtk_widget_show (cancel); - - apply = gtk_button_new_with_label ("Apply"); - GTK_WIDGET_SET_FLAGS (apply, GTK_CAN_DEFAULT); - gtk_box_pack_end (GTK_BOX (buttonbox), apply, FALSE, FALSE, 8); - gtk_widget_show (apply); - - gtk_window_set_default (GTK_WINDOW (config_window), ok); - - gtk_signal_connect (GTK_OBJECT (cancel), "clicked", - GTK_SIGNAL_FUNC (cancel_clicked), config_window); - gtk_signal_connect (GTK_OBJECT (ok), "clicked", - GTK_SIGNAL_FUNC (ok_clicked), config_window); - gtk_signal_connect (GTK_OBJECT (apply), "clicked", - GTK_SIGNAL_FUNC (apply_clicked), config_window); - - gtk_widget_show_all (config_window); -} - -/* -** Saves all window attributes (goal) -** saves only non-fullscreen window sizes for now -** ADDME : window position -*/ -void -iris_save_window_attributes (void) -{ - XWindowAttributes attr; - if (!GLWin.fs) - { - XGetWindowAttributes (GLWin.dpy, GLWin.window, &attr); - config.window_width = attr.width; - config.window_height = attr.height; - iris_config_write (&config); - } -} diff -r 5783d6281431 -r ee81e087615c src/iris/config.h --- a/src/iris/config.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* config.h.in. Generated from configure.in by autoheader. */ - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_GL_GLX_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_GL_GL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Name of package */ -#define PACKAGE "Iris" - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "Iris OpenGL XMMS Visualization" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "Iris OpenGL XMMS Visualization" - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Version number of package */ -#define VERSION "0.12" - -/* Define to 1 if the X Window System is missing or not being used. */ -#undef X_DISPLAY_MISSING diff -r 5783d6281431 -r ee81e087615c src/iris/iris.c --- a/src/iris/iris.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1025 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include "config.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#ifdef HAVE_SCHED_SETSCHEDULER -#include -#endif -#include -#include -#include - -#include -#include -#include -#include -#include "iris.h" - -#define BEAT_MAX 100 - -GLfloat y_angle = 45.0, y_speed = 0.5; -GLfloat x_angle = 20.0, x_speed = 0.0; -GLfloat z_angle = 0.0, z_speed = 0.0; -static GLfloat scale; -static GLfloat x_angle_wanted; - -GLWindow GLWin; - -/* attributes for a single buffered visual in RGBA format with at least - * 4 bits per color and a 16 bit depth buffer */ -static int attrListSgl[] = { GLX_RGBA, GLX_RED_SIZE, 4, - GLX_GREEN_SIZE, 4, - GLX_BLUE_SIZE, 4, - GLX_DEPTH_SIZE, 16, - None -}; - -/* attributes for a double buffered visual in RGBA format with at least - * 4 bits per color and a 16 bit depth buffer */ -static int attrListDbl[] = { GLX_RGBA, GLX_DOUBLEBUFFER, - GLX_RED_SIZE, 4, - GLX_GREEN_SIZE, 4, - GLX_BLUE_SIZE, 4, - GLX_DEPTH_SIZE, 16, - None -}; - -static gboolean going = FALSE; -static gboolean initialized = FALSE; -static gboolean grabbed_pointer = FALSE, firsttime = TRUE; -static Atom wmDelete; -static pthread_t draw_thread; - -datas_t datas; - -static int num_bands = NUM_BANDS; -static int beat = 0; - -unsigned int transition_frames = 0; -unsigned int max_transition_frames = 0; - -static void iris_init (void); -static void iris_cleanup (void); -static void iris_about (void); -static void iris_playback_start (void); -static void iris_playback_stop (void); -static void iris_render_freq (gint16 data[][256]); - -static float dps = 0; - -gint beat_before = -1; - -extern iris_config newconfig; - -VisPlugin iris_vp = { - NULL, - NULL, - 0, - NULL, /* Description */ - 0, - 1, - iris_init, /* init */ - iris_cleanup, /* cleanup */ - iris_about, /* about */ - iris_configure, /* configure */ - NULL, /* disable_plugin */ - iris_playback_start, /* playback_start */ - iris_playback_stop, /* playback_stop */ - NULL, /* render_pcm */ - iris_render_freq /* render_freq */ -}; - - -void -about_close_clicked (GtkWidget * w, GtkWidget ** window) -{ - gtk_widget_destroy (*window); - *window = NULL; -} - - -void -about_closed (GtkWidget * w, GdkEvent * e, GtkWidget ** window) -{ - about_close_clicked (w, window); -} - - -static void -iris_about (void) -{ - static GtkWidget *window_about = NULL; - GtkWidget *vbox, *button, *close, *label; - - if (window_about) - return; - - window_about = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window_about), "About IRIS plugin"); - gtk_window_set_policy (GTK_WINDOW (window_about), FALSE, FALSE, FALSE); - gtk_window_set_position (GTK_WINDOW (window_about), GTK_WIN_POS_MOUSE); - vbox = gtk_vbox_new (FALSE, 4); - gtk_container_add (GTK_CONTAINER (window_about), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_widget_show (vbox); - - label = gtk_label_new ("\n\ -Iris XMMS Plugin.\n\ -Copyright (C) 2001-2003, Cédric Delfosse.\n\ -\n\ -Email: \n\ -Homepage: \n\ -Development: \n\ -\n\ -Authors:\n\ -Cédric Delfosse\n\ -Marinus Schraal\n\ -Ron Lockwood-Childs\n\ -Ported to Audacious by Arthur Taylor\n\ -\n\ -This program is free software; you can redistribute it and/or modify\n\ -it under the terms of the GNU General Public License as published by\n\ -the Free Software Foundation; either version 2 of the License, or\n\ -(at your option) any later version.\n\ -\n\ -This program is distributed in the hope that it will be useful,\n\ -but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ -GNU General Public License for more details.\n\ -\n\ -You should have received a copy of the GNU General Public License\n\ -along with this program; if not, write to the Free Software\n\ -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307\n\ -USA"); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 8); - gtk_widget_show (label); - - button = gtk_hbutton_box_new (); - gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 8); - gtk_widget_show (button); - - close = gtk_button_new_with_label ("Close"); - GTK_WIDGET_SET_FLAGS (close, GTK_CAN_DEFAULT); - gtk_window_set_default (GTK_WINDOW (window_about), close); - gtk_hbutton_box_set_layout_default (GTK_BUTTONBOX_END); - gtk_box_pack_end (GTK_BOX (button), close, FALSE, FALSE, 8); - gtk_widget_show (close); - - gtk_signal_connect (GTK_OBJECT (close), "clicked", - GTK_SIGNAL_FUNC (about_close_clicked), &window_about); - gtk_signal_connect (GTK_OBJECT (window_about), "delete-event", - GTK_SIGNAL_FUNC (about_closed), &window_about); - - gtk_widget_show (window_about); -} - - -/* Creates an empty cursor icon for when hovering over our window content */ -void -hide_cursor () -{ - Cursor no_ptr; - Pixmap bm_no; - Colormap cmap; - XColor black, dummy; - - static unsigned char bm_no_data[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - - cmap = DefaultColormap (GLWin.dpy, DefaultScreen (GLWin.dpy)); - XAllocNamedColor (GLWin.dpy, cmap, "black", &black, &dummy); - bm_no = XCreateBitmapFromData (GLWin.dpy, GLWin.window, bm_no_data, 8, 8); - no_ptr = - XCreatePixmapCursor (GLWin.dpy, bm_no, bm_no, &black, &black, 0, 0); - XDefineCursor (GLWin.dpy, GLWin.window, no_ptr); -} - - -/* this function creates our window and sets it up properly */ -static Window -create_window (char *title) -{ - XVisualInfo *vi; - int i; - - /* get a connection */ - GLWin.dpy = XOpenDisplay (0); - if (GLWin.dpy == NULL) - g_log (NULL, G_LOG_LEVEL_CRITICAL, - __FILE__ ": XOpenDisplay returns NULL"); - GLWin.screen = DefaultScreen (GLWin.dpy); - - /* get an appropriate visual */ - vi = glXChooseVisual (GLWin.dpy, GLWin.screen, attrListDbl); - if (vi == NULL) - { - vi = glXChooseVisual (GLWin.dpy, GLWin.screen, attrListSgl); - GLWin.DoubleBuffered = 0; - } - else - GLWin.DoubleBuffered = 1; - - if (vi == NULL) - g_log (NULL, G_LOG_LEVEL_CRITICAL, - __FILE__ ": glXChooseVisual returns NULL"); - - glXQueryVersion (GLWin.dpy, &GLWin.glxMajorVersion, &GLWin.glxMinorVersion); - /* create a GLX context */ - GLWin.ctx = glXCreateContext (GLWin.dpy, vi, 0, GL_TRUE); - if (GLWin.ctx == NULL) - g_log (NULL, G_LOG_LEVEL_CRITICAL, - __FILE__ ": glXCreateContext can\'t create a rendering context"); - - /* create a color map */ - GLWin.attr.colormap = - XCreateColormap (GLWin.dpy, RootWindow (GLWin.dpy, vi->screen), - vi->visual, AllocNone); - GLWin.attr.border_pixel = 0; - - if ((config.fullscreen && firsttime) || GLWin.fs) - { - int bestMode = 0; - - GLWin.fs = True; - GLWin.fs_width = config.fs_width; - GLWin.fs_height = config.fs_height; - /* look for mode with requested resolution */ - for (i = 0; i < GLWin.modeNum; i++) - { - if ((GLWin.modes[i]->hdisplay == GLWin.fs_width) - && (GLWin.modes[i]->vdisplay == GLWin.fs_height)) - { - bestMode = i; - } - } - XF86VidModeSwitchToMode (GLWin.dpy, GLWin.screen, - GLWin.modes[bestMode]); - XF86VidModeSetViewPort (GLWin.dpy, GLWin.screen, 0, 0); - GLWin.fs_width = GLWin.modes[bestMode]->hdisplay; - GLWin.fs_height = GLWin.modes[bestMode]->vdisplay; - - /* create a fullscreen window */ - GLWin.attr.override_redirect = True; - GLWin.attr.event_mask = - ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask; - GLWin.window = - XCreateWindow (GLWin.dpy, - RootWindow (GLWin.dpy, vi->screen), 0, - 0, GLWin.fs_width, GLWin.fs_height, 0, vi->depth, - InputOutput, vi->visual, - CWBorderPixel | CWColormap | - CWEventMask | CWOverrideRedirect, &GLWin.attr); - XWarpPointer (GLWin.dpy, None, GLWin.window, 0, 0, 0, 0, 0, 0); - XMapRaised (GLWin.dpy, GLWin.window); - XGrabKeyboard (GLWin.dpy, GLWin.window, True, GrabModeAsync, - GrabModeAsync, CurrentTime); - XGrabPointer (GLWin.dpy, GLWin.window, True, ButtonPressMask, - GrabModeAsync, GrabModeAsync, GLWin.window, - FALSE, CurrentTime); - } - else - { - XClassHint xclasshint={"xmms","visplugin"}; - GLWin.window_width = config.window_width; - GLWin.window_height = config.window_height; - /* needed if those aren't set yet - ideally need a way to get the default values for these */ - if (config.window_height == 0 || config.window_width == 0) - { - config.window_width = 640; - config.window_height = 480; - } - - /* create a window in window mode */ - GLWin.attr.event_mask = - ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask; - GLWin.window = - XCreateWindow (GLWin.dpy, - RootWindow (GLWin.dpy, vi->screen), 0, - 0, GLWin.window_width, GLWin.window_height, 0, - vi->depth, InputOutput, vi->visual, - CWBorderPixel | CWColormap | CWEventMask, &GLWin.attr); - XmbSetWMProperties(GLWin.dpy, GLWin.window, "iris","iris", NULL, 0, NULL, NULL, &xclasshint); - - /* only set window title and handle wm_delete_events if in windowed mode */ - wmDelete = XInternAtom (GLWin.dpy, "WM_DELETE_WINDOW", True); - XSetWMProtocols (GLWin.dpy, GLWin.window, &wmDelete, 1); - XSetStandardProperties (GLWin.dpy, GLWin.window, title, - title, None, NULL, 0, NULL); - XMapRaised (GLWin.dpy, GLWin.window); - } - /* connect the glx-context to the window */ - if (!glXMakeCurrent (GLWin.dpy, GLWin.window, GLWin.ctx)) - g_log (NULL, G_LOG_LEVEL_CRITICAL, - __FILE__ ": glXMakeCurrent returns an error"); - if (glXIsDirect (GLWin.dpy, GLWin.ctx)) - GLWin.DRI = 1; - - hide_cursor (); - - XFree (vi); - firsttime = FALSE; - return GLWin.window; -} - - -VisPlugin * -get_vplugin_info (void) -{ - iris_vp.description = g_strdup_printf ("iris 3D analyzer %s", VERSION); - return &iris_vp; -} - - -static int -detect_beat (gint32 loudness) -{ - static gint32 aged; /* smoothed out oudness */ - static gint32 lowest; /* quietest point in current beat */ - static int elapsed; /* frames since last beat */ - static int isquiet; /* was previous frame quiet */ - int detected_beat; - - /* Incorporate the current loudness into history */ - aged = (aged * 7 + loudness) >> 3; - elapsed++; - - /* If silent, then clobber the beat */ - if (aged < 2000 || elapsed > BEAT_MAX) - { - elapsed = 0; - lowest = aged; - } - else if (aged < lowest) - lowest = aged; - - /* Beats are detected by looking for a sudden loudness after a lull. - * They are also limited to occur no more than once every 15 frames, - * so the beat flashes don't get too annoying. - */ - detected_beat = (loudness * 4 > aged * 3 && aged * 2 > lowest * 3 - && elapsed > 15); - if (detected_beat) - lowest = aged, elapsed = 0; - - /* Silence is computed from the aged loudness. The quietref value is - * set to TRUE only at the start of silence, not throughout the silent - * period. Also, there is some hysteresis so that silence followed - * by a slight noise and more silence won't count as two silent - * periods -- that sort of thing happens during many fade edits, so - * we have to account for it. - */ - if (aged < (isquiet ? 1500 : 500)) - /* Quiet now -- is this the start of quiet? */ - isquiet = TRUE; - else - isquiet = FALSE; - - /* return the result */ - return detected_beat; -} - - -/* limit_rotation_speed keep rotation speed to at least dps_config - by second */ -static void -limit_rotation_speed (gboolean init) -{ - static struct timeval tv_past; - struct timezone tz; - struct timeval tv_now; - float dps_config = 15; - - if (!init) - { - long t; - - gettimeofday (&tv_now, &tz); - t = - (tv_now.tv_sec - tv_past.tv_sec) * 10000000 + (tv_now.tv_usec - - tv_past.tv_usec); - dps = y_speed * ((float) 1000000 / (float) t); - if (dps >= (float) dps_config) - y_speed -= 0.02; - else - y_speed += 0.02; - - memcpy (&tv_past, &tv_now, sizeof (struct timeval)); - } - else - gettimeofday (&tv_past, &tz); -} - - -/* limit_fps tries to keep the number of - frame per seconds to config.fps */ -static void -limit_fps (gboolean init) -{ - static float fps = 0; - static struct timeval tv_past; - struct timezone tz; - struct timeval tv_now; - static int usec = 0; - - if (init) - gettimeofday (&tv_past, &tz); - else - { - long t; - - gettimeofday (&tv_now, &tz); - t = - (tv_now.tv_sec - tv_past.tv_sec) * 10000000 + (tv_now.tv_usec - - tv_past.tv_usec); - fps = (float) 1000000 / (float) t; - - if (fps >= (float) config.fps) - usec += 100; - else - { - if (usec > 0) - usec -= 100; - } - xmms_usleep (usec); - memcpy (&tv_past, &tv_now, sizeof (struct timeval)); - } -} - -static void -init_general_draw_mode (int num) -{ - int transparency; - int wireframe; - - if (theme[num].config->global->transparency != -1) - transparency = theme[num].config->global->transparency; - else - transparency = (int) (2.0 * rand () / (RAND_MAX + 1.0)); - - if (theme[num].config->global->wireframe != -1) - wireframe = theme[num].config->global->wireframe; - else - wireframe = (int) (2.0 * rand () / (RAND_MAX + 1.0)); - - if (transparency) - { - if (!glIsEnabled (GL_BLEND)) - { - glBlendFunc (GL_SRC_ALPHA, GL_ONE); - glEnable (GL_BLEND); - } - glDisable (GL_DEPTH_TEST); - } - else - { - if (glIsEnabled (GL_BLEND)) - { - glDisable (GL_BLEND); - } - glEnable (GL_DEPTH_TEST); - } - - if (wireframe) - glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); - else - glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); - - if (glIsEnabled(GL_TEXTURE_2D)) - glDisable(GL_TEXTURE_2D); -} - - -static int -compute_theme () -{ - gfloat f_rand, f; - gint i; - - for (i = 0, f_rand = 0.0; i < THEME_NUMBER; i++) - f_rand += theme[i].config->global->priority; - f_rand = f_rand * rand () / (RAND_MAX + 1.0); - - i = 0; - f = 0; - while (i < THEME_NUMBER) - { - gfloat f_theme; - f_theme = theme[i].config->global->priority; - if (f_theme) - { - f += f_theme; - if (f_rand < f) - break; - } - i++; - } - - if (!f) - return (int) ((gfloat) THEME_NUMBER * rand () / (RAND_MAX + 1.0)); - else - return i; -} - - -static int -choose_theme (gboolean init) -{ - static long sec_btw_theme = 10 * 10000000; - static struct timeval tv_past; - struct timezone tz; - struct timeval tv_now; - static int th, th_tmp; - - if (!init) - { - long t; - - gettimeofday (&tv_now, &tz); - t = - (tv_now.tv_sec - tv_past.tv_sec) * 10000000 + (tv_now.tv_usec - - tv_past.tv_usec); - if ((t > sec_btw_theme) || (beat && config.change_theme_on_beat)) - { - /* we come here if: - - time for the theme is expired - - a beat is detected and the change_theme_on_beat option is on - */ - if (config.transition) - { - if (transition_frames == 0) - { - th_tmp = compute_theme (); - if (th != th_tmp) - { - transition_frames = - (unsigned int) config.fps * config.trans_duration / - 10; - max_transition_frames = transition_frames; - memcpy (&tv_past, &tv_now, sizeof (struct timeval)); - init_theme_transition (transition_frames, - max_transition_frames); - } - } - } - else - { - th = compute_theme (); - init_general_draw_mode (th); - if (theme[th].init_draw_mode != NULL) - theme[th].init_draw_mode (); - memcpy (&tv_past, &tv_now, sizeof (struct timeval)); - x_angle_wanted = theme[th].get_x_angle (); - x_speed = copysign (0.08, x_angle_wanted - x_angle); - } - } - /* change theme after half of the set frames have passed */ - else if ((((int) max_transition_frames / 2) == transition_frames) - && config.transition && (transition_frames != 0)) - { - th = th_tmp; - init_general_draw_mode (th); - if (theme[th].init_draw_mode != NULL) - theme[th].init_draw_mode (); - x_angle_wanted = theme[th].get_x_angle (); - x_speed = copysign (0.08, x_angle_wanted - x_angle); - } - } - else - { - /* the first time choose_theme is called, - tv_past is initialized */ - gettimeofday (&tv_past, &tz); - th = compute_theme (); - init_general_draw_mode (th); - if (theme[th].init_draw_mode != NULL) - theme[th].init_draw_mode (); - } - - return (th); -} - - -static void -draw_iris (void) -{ - int th; - - limit_fps (FALSE); - th = choose_theme (FALSE); - - if ((config.color_beat) && (beat_before > 0)) - glClearColor (config.color_flash_red, config.color_flash_green, - config.color_flash_blue, 1); - else - glClearColor (config.bgc_red, config.bgc_green, config.bgc_blue, 1); - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix (); - glTranslatef (0.0, -0.5, -7.0); - glRotatef (x_angle, 1.0, 0.0, 0.0); - glRotatef (y_angle, 0.0, 1.0, 0.0); - glRotatef (z_angle, 0.0, 0.0, 1.0); - - if (transition_frames > 0 && config.transition) - { - theme_transition (); - transition_frames--; - } - - theme[th].draw_one_frame (beat); - - glEnd (); - glPopMatrix (); - - glXSwapBuffers (GLWin.dpy, GLWin.window); -} - - -static gint -disable_func (gpointer data) -{ - iris_vp.disable_plugin (&iris_vp); - return FALSE; -} - - -GLvoid -init_gl (GLvoid) -{ - glMatrixMode (GL_PROJECTION); - glLoadIdentity (); - glFrustum (-1, 1, -1.5, 1, 1.5, 12); - glMatrixMode (GL_MODELVIEW); - glLoadIdentity (); -} - - -GLvoid -kill_gl_window (GLvoid) -{ - if (GLWin.ctx) - { - glXMakeCurrent (GLWin.dpy, None, NULL); - glXDestroyContext (GLWin.dpy, GLWin.ctx); - GLWin.ctx = NULL; - } - /* switch back to original desktop resolution if we were in fs */ - if (GLWin.fs) - { - XF86VidModeSwitchToMode (GLWin.dpy, GLWin.screen, &GLWin.deskMode); - XF86VidModeSetViewPort (GLWin.dpy, GLWin.screen, 0, 0); - } -} - - -void * -draw_thread_func (void *arg) -{ - Bool configured = FALSE; - - g_log (NULL, G_LOG_LEVEL_DEBUG, __FILE__ ": draw_thread_func: Starting."); - - if ((GLWin.window = create_window ("Iris")) == 0) - { - g_log (NULL, G_LOG_LEVEL_CRITICAL, - __FILE__ ": unable to create window"); - pthread_exit (NULL); - } - - init_gl (); - choose_theme (TRUE); - - -#ifdef HAVE_SCHED_SETSCHEDULER - if (xmms_check_realtime_priority ()) - { - struct sched_param sparam; - sparam.sched_priority = sched_get_priority_max (SCHED_OTHER); - pthread_setschedparam (pthread_self (), SCHED_OTHER, &sparam); - } -#endif - - while (going) /* plugin enabled */ - { - while (XPending (GLWin.dpy)) - { - XEvent event; - KeySym keysym; - char buf[16]; - - XNextEvent (GLWin.dpy, &event); - switch (event.type) - { - case Expose: - if (event.xexpose.count != 0) - break; - configured = TRUE; - break; - case ConfigureNotify: - glViewport (0, 0, event.xconfigure.width, - event.xconfigure.height); - configured = TRUE; - break; - case KeyPress: - - XLookupString (&event.xkey, buf, 16, &keysym, NULL); - switch (keysym) - { - case XK_Escape: - - /* Ugly hack to get the disable_plugin call in the main thread. */ - GDK_THREADS_ENTER (); - gtk_idle_add (disable_func, NULL); - GDK_THREADS_LEAVE (); - break; - case XK_z: - xmms_remote_playlist_prev (iris_vp.xmms_session); - break; - case XK_x: - xmms_remote_play (iris_vp.xmms_session); - break; - case XK_c: - xmms_remote_pause (iris_vp.xmms_session); - break; - case XK_v: - xmms_remote_stop (iris_vp.xmms_session); - break; - case XK_b: - xmms_remote_playlist_next (iris_vp.xmms_session); - break; - case XK_Left: - y_speed -= 0.1; - if (y_speed < -3.0) - y_speed = -3.0; - break; - case XK_Right: - y_speed += 0.1; - if (y_speed > 3.0) - y_speed = 3.0; - break; - case XK_Return: - x_speed = 0.0; - y_speed = 0.3; - z_speed = 0.0; - x_angle = 70.0; - y_angle = 45.0; - z_angle = 0.0; - break; - case XK_Tab: - iris_configure (); - break; - case XK_f: - //iris_save_window_attributes (); - kill_gl_window (); - XCloseDisplay (GLWin.dpy); - GLWin.fs = !GLWin.fs; - create_window ("Iris"); - init_gl (); - choose_theme (TRUE); - break; - } - - break; - case ClientMessage: - if ((Atom) event.xclient.data.l[0] == wmDelete) - { - GDK_THREADS_ENTER (); - gtk_idle_add (disable_func, NULL); - GDK_THREADS_LEAVE (); - } - break; - } - } - if (configured) - { - limit_rotation_speed (FALSE); - - if ((x_angle > x_angle_wanted) && (x_speed > 0)) - x_angle = x_angle_wanted; - else if ((x_angle < x_angle_wanted) && (x_speed < 0)) - x_angle = x_angle_wanted; - - x_angle += x_speed; - if (x_angle > 85.0) - x_angle = 85.0; - else if (x_angle < 0.0) - x_angle = 0.0; - - y_angle += y_speed; - if (y_angle >= 360.0) - y_angle -= 360.0; - - z_angle += z_speed; - if (z_angle >= 360.0) - z_angle -= 360.0; - - draw_iris (); - } - } - - g_log (NULL, G_LOG_LEVEL_DEBUG, __FILE__ ": draw_thread_func: Exiting."); - pthread_exit (NULL); -} - - -static void -start_display (void) -{ - scale = 1.0 / log (256.0); - - x_speed = 0.0; - y_speed = 0.3; - z_speed = 0.0; - x_angle = 45.0; - y_angle = 45.0; - z_angle = 0.0; - - going = TRUE; - limit_fps (TRUE); - limit_rotation_speed (TRUE); - if (pthread_create (&draw_thread, NULL, draw_thread_func, NULL)) - g_log (NULL, G_LOG_LEVEL_CRITICAL, __FILE__ ": pthread_create: Can't create drawing thread."); - -} - - -static void -stop_display (void) -{ - if (going) - { - going = FALSE; - pthread_join (draw_thread, NULL); - } - - kill_gl_window (); - - if (GLWin.window) - { - if (grabbed_pointer) - { - XUngrabPointer (GLWin.dpy, CurrentTime); - grabbed_pointer = FALSE; - } - - XDestroyWindow (GLWin.dpy, GLWin.window); - GLWin.window = 0; - } - XCloseDisplay (GLWin.dpy); -} - - -static void -iris_init (void) -{ - int i; - - initialized = TRUE; - iris_first_init (); - datas.loudness = 0; - /* if the config window is open, we don't want to trash the config the user - * has done */ - if (!config_window) - iris_config_read (); - for (i = 0; i < THEME_NUMBER; i++) - if (theme[i].init != NULL) - theme[i].init (); - srand (666); - start_display (); -} - - -static void -iris_cleanup (void) -{ - int i; - - if(initialized) - { - stop_display (); - for (i = 0; i < THEME_NUMBER; i++) - if (theme[i].cleanup != NULL) - theme[i].cleanup (); - } -} - - -static void -iris_playback_start (void) -{ -} - - -static void -iris_playback_stop (void) -{ -} - - -static void -iris_render_freq (gint16 data[2][256]) -{ - GLfloat val; - static int angle = 0; - int i; - - for (i = 0; i < num_bands; i++) - { - int y, c; - gint xscale[] = - { 0, 1, 2, 3, 5, 7, 10, 14, 20, 28, 40, 54, 74, 101, 137, 156, - 255 - }; - gint xscale8[] = { 0, 2, 5, 10, 20, 40, 74, 137, 255 }; - - if (num_bands == 16) - for (c = xscale[i], y = 0; c < xscale[i + 1]; c++) - { - if (data[0][c] > y) - y = data[0][c]; - } - else - for (c = xscale8[i], y = 0; c < xscale8[i + 1]; c++) - { - if (data[0][c] > y) - y = data[0][c]; - } - - datas.loudness += - (y / (xscale[i + 1] - xscale[i] + 1)) * (abs (i - NUM_BANDS / 2) + - NUM_BANDS / 2) * (4 + i); - - y >>= 7; - if (y > 0) - val = (log (y) * scale); - else - val = 0; - datas.data360[angle][i] = val; - datas.data1[i] = val; - } - - datas.loudness /= (NUM_BANDS * 4); - - beat = detect_beat (datas.loudness); - if (beat) - { - beat_before = config.flash_speed; - if (dps <= 90.0) - y_speed += 0.7; - - if (config.bgc_random) - { - config.bgc_red = 1.0 * rand () / (RAND_MAX + 1.0); - config.bgc_green = 1.0 * rand () / (RAND_MAX + 1.0); - config.bgc_blue = 1.0 * rand () / (RAND_MAX + 1.0); - } - - if (config.color12_random) - { - config.color1_red = 1.0 * rand () / (RAND_MAX + 1.0); - config.color1_green = 1.0 * rand () / (RAND_MAX + 1.0); - config.color1_blue = 1.0 * rand () / (RAND_MAX + 1.0); - config.color2_red = 1.0 * rand () / (RAND_MAX + 1.0); - config.color2_green = 1.0 * rand () / (RAND_MAX + 1.0); - config.color2_blue = 1.0 * rand () / (RAND_MAX + 1.0); - } - - if (config.color_random) - { - config.color_red = 1.0 * rand () / (RAND_MAX + 1.0); - config.color_green = 1.0 * rand () / (RAND_MAX + 1.0); - config.color_blue = 1.0 * rand () / (RAND_MAX + 1.0); - } - } - - if (beat_before > 0) - beat_before--; - - angle++; - if (angle == 360) - angle = 0; -} diff -r 5783d6281431 -r ee81e087615c src/iris/iris.h --- a/src/iris/iris.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,198 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#ifndef IRIS_H - -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct -{ - - GLfloat bgc_red; - GLfloat bgc_green; - GLfloat bgc_blue; - - GLfloat color_red; - GLfloat color_green; - GLfloat color_blue; - - GLfloat color1_red; - GLfloat color1_green; - GLfloat color1_blue; - - GLfloat color2_red; - GLfloat color2_green; - GLfloat color2_blue; - - GLfloat color_flash_red; - GLfloat color_flash_green; - GLfloat color_flash_blue; - - unsigned int color_mode; - unsigned int flash_speed; - unsigned int fps; - - // in fullscreen, we are only interested in width and height - unsigned int fs_width; - unsigned int fs_height; - - unsigned int window_width; - unsigned int window_height; - - gboolean bgc_random; - gboolean color_random; - gboolean color12_random; - gboolean flash_random; - gboolean color_beat; - gboolean change_theme_on_beat; - - gboolean fullscreen; - gboolean wireframe; - - gboolean transition; - gfloat trans_duration; -} -iris_config; - -typedef struct -{ - gfloat priority; /* priority of the theme */ - int transparency; /* transparency can be off (0), on (1) or random (-1) */ - int wireframe; /* wireframe can be off (0), on (1) or random (-1) */ -} -config_global; /* options implemented by all the themes */ - -typedef struct -{ - config_global *global; - void *private; /* private config of the theme */ -} -config_theme; - -typedef struct -{ - char *name; /* the name of the theme */ - char *description; /* what the theme does */ - char *author; /* who did the theme */ - char *key; /* key used to get config items in ~/.xmms/config */ - config_theme *config; /* where the theme config is */ - config_theme *config_new; /* copy of the theme config used by the configuration widgets */ - int config_private_size; /* size of the private theme config structure (we can't get it dynamically) */ - void (*config_read) (ConfigDb * db, char *); /* read the private theme config and put it into the privateconfig */ - void (*config_write) (ConfigDb * db, char *); /* write the private config into ~/.xmms/config */ - void (*config_default) (void); /* put default values into private config */ - void (*config_create) (GtkWidget *); /* create the Gtk widget (into a vbox) to configure the theme */ - void (*init) (void); /* called once at iris init */ - void (*cleanup) (void); /* called once at iris cleanup */ - void (*init_draw_mode) (void); /* called once when iris switch to this theme */ - GLfloat (*get_x_angle) (void); /* called once when iris switch to this theme to get a camera position to move */ - void (*draw_one_frame) (gboolean beat); /* draw one frame of the theme */ -} -iris_theme; - -#define NUM_BANDS 16 -typedef struct { - GLfloat data360[360][NUM_BANDS]; - GLfloat data1[NUM_BANDS]; - GLfloat loudness; -} -datas_t; - -typedef struct -{ - GLfloat x; - GLfloat z; -} -xz; - -/* stuff about our window grouped together */ -typedef struct -{ - // X stuff - Display *dpy; - int screen; - Window window; - GLXContext ctx; - XSetWindowAttributes attr; - Bool fs; - XF86VidModeModeInfo deskMode; - unsigned int window_x, window_y; - unsigned int window_width, window_height; - unsigned int fs_width, fs_height; - - // rendering info - int glxMajorVersion; - int glxMinorVersion; - int vidModeMajorVersion; - int vidModeMinorVersion; - XF86VidModeModeInfo **modes; - int modeNum; - unsigned int depth; - gboolean DRI; - gboolean DoubleBuffered; - GList *glist; -} -GLWindow; - -/* config.c */ -extern GtkWidget *config_window; -extern iris_config config; -extern iris_config newconfig; -extern GLWindow GLWin; -extern datas_t datas; -extern void iris_first_init (void); -extern void iris_configure (void); -extern void iris_config_read (void); -extern void iris_config_write (iris_config *); -extern void iris_set_default_prefs (void); -extern void iris_save_window_attributes (void); -extern GLvoid init_gl (GLvoid); - -/* color.c */ -extern void get_color (GLfloat *, GLfloat *, GLfloat *, GLfloat *); - -/* 3Dstuff.c */ -extern void bar_top_or_bottom (GLfloat height, xz * xz1, xz * xz2, xz * xz3, - xz * xz4); -extern void bar_side (GLfloat height, xz * xz1, xz * xz2); -extern void bar_full (GLfloat height, xz * xz1, xz * xz2, xz * xz3, xz * xz4); - -/* theme.c */ -#define THEME_NUMBER 12 -extern void theme_register (void); -extern iris_theme theme[THEME_NUMBER]; -extern void theme_config_init (void); -extern void theme_config_global_default (int); -extern void theme_config_global_read (ConfigDb *, char *, int); -extern void theme_config_global_write (ConfigDb *, char *, int); -extern void theme_config_apply(int num); -extern void theme_config_global_widgets(GtkWidget *, int); -extern void theme_about(GtkWidget *, int); - -/* transition.c */ -extern void init_theme_transition (); -extern void theme_transition (); - -#endif diff -r 5783d6281431 -r ee81e087615c src/iris/particle.h --- a/src/iris/particle.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/* GIMP RGBA C-Source image dump (particle.h) */ - -static const struct -{ - guint width; - guint height; - guint bytes_per_pixel; /* 3:RGB, 4:RGBA */ - guint8 pixel_data[32 * 32 * 4 + 1]; -} particle_image = -{ -32, 32, 4, - "\0\0\0\377\3\3\3\377\2\2\2\377\5\5\5\377\7\7\7\377\6\6\6\377\6\6\6\377\12" - "\12\12\377\13\13\13\377\11\11\11\377\12\12\12\377\12\12\12\377\14\14\14\377" - "\14\14\14\377\14\14\14\377\16\16\16\377\15\15\15\377\14\14\14\377\12\12\12" - "\377\13\13\13\377\13\13\13\377\11\11\11\377\12\12\12\377\12\12\12\377\10" - "\10\10\377\7\7\7\377\6\6\6\377\6\6\6\377\5\5\5\377\2\2\2\377\0\0\0\377\0" - "\0\0\377\4\4\4\377\3\3\3\377\4\4\4\377\7\7\7\377\6\6\6\377\10\10\10\377\11" - "\11\11\377\11\11\11\377\14\14\14\377\14\14\14\377\15\15\15\377\16\16\16\377" - "\20\20\20\377\21\21\21\377\20\20\20\377\22\22\22\377\20\20\20\377\21\21\21" - "\377\17\17\17\377\20\20\20\377\17\17\17\377\13\13\13\377\13\13\13\377\13" - "\13\13\377\14\14\14\377\11\11\11\377\6\6\6\377\6\6\6\377\6\6\6\377\4\4\4" - "\377\1\1\1\377\0\0\0\377\5\5\5\377\4\4\4\377\6\6\6\377\6\6\6\377\12\12\12" - "\377\12\12\12\377\11\11\11\377\14\14\14\377\15\15\15\377\20\20\20\377\20" - "\20\20\377\24\24\24\377\24\24\24\377\23\23\23\377\23\23\23\377\26\26\26\377" - "\25\25\25\377\23\23\23\377\21\21\21\377\24\24\24\377\22\22\22\377\17\17\17" - "\377\17\17\17\377\15\15\15\377\15\15\15\377\11\11\11\377\11\11\11\377\7\7" - "\7\377\7\7\7\377\6\6\6\377\3\3\3\377\3\3\3\377\6\6\6\377\6\6\6\377\6\6\6" - "\377\12\12\12\377\13\13\13\377\13\13\13\377\13\13\13\377\17\17\17\377\22" - "\22\22\377\24\24\24\377\22\22\22\377\30\30\30\377\30\30\30\377\31\31\31\377" - "\31\31\31\377\33\33\33\377\31\31\31\377\30\30\30\377\30\30\30\377\30\30\30" - "\377\25\25\25\377\25\25\25\377\23\23\23\377\22\22\22\377\17\17\17\377\13" - "\13\13\377\12\12\12\377\11\11\11\377\7\7\7\377\6\6\6\377\5\5\5\377\4\4\4" - "\377\7\7\7\377\6\6\6\377\12\12\12\377\11\11\11\377\14\14\14\377\15\15\15" - "\377\20\20\20\377\22\22\22\377\25\25\25\377\30\30\30\377\32\32\32\377\35" - "\35\35\377\34\34\34\377\34\34\34\377\36\36\36\377\40\40\40\377\36\36\36\377" - "\34\34\34\377\34\34\34\377\34\34\34\377\32\32\32\377\31\31\31\377\26\26\26" - "\377\25\25\25\377\22\22\22\377\16\16\16\377\12\12\12\377\12\12\12\377\12" - "\12\12\377\10\10\10\377\6\6\6\377\4\4\4\377\10\10\10\377\11\11\11\377\12" - "\12\12\377\13\13\13\377\16\16\16\377\21\21\21\377\22\22\22\377\25\25\25\377" - "\30\30\30\377\34\34\34\377\37\37\37\377!!!\377\"\"\"\377###\377###\377&&" - "&\377&&&\377$$$\377###\377\40\40\40\377!!!\377\35\35\35\377\34\34\34\377" - "\25\25\25\377\24\24\24\377\21\21\21\377\15\15\15\377\14\14\14\377\14\14\14" - "\377\12\12\12\377\6\6\6\377\6\6\6\377\10\10\10\377\12\12\12\377\12\12\12" - "\377\16\16\16\377\22\22\22\377\24\24\24\377\26\26\26\377\30\30\30\377\34" - "\34\34\377\37\37\37\377###\377&&&\377,,,\377+++\377,,,\377---\377---\377" - ",,,\377+++\377&&&\377)))\377$$$\377\34\34\34\377\34\34\34\377\27\27\27\377" - "\24\24\24\377\23\23\23\377\17\17\17\377\15\15\15\377\12\12\12\377\7\7\7\377" - "\6\6\6\377\12\12\12\377\12\12\12\377\16\16\16\377\21\21\21\377\22\22\22\377" - "\27\27\27\377\31\31\31\377\36\36\36\377!!!\377%%%\377(((\377111\377222\377" - "555\377;;;\377<<<\377999\377888\377333\377111\377---\377'''\377\"\"\"\377" - "\34\34\34\377\36\36\36\377\32\32\32\377\25\25\25\377\21\21\21\377\15\15\15" - "\377\11\11\11\377\12\12\12\377\7\7\7\377\13\13\13\377\14\14\14\377\17\17" - "\17\377\21\21\21\377\31\31\31\377\31\31\31\377\35\35\35\377!!!\377'''\377" - "+++\377111\377===\377EEE\377HHH\377MMM\377MMM\377JJJ\377III\377AAA\377AA" - "A\377888\377,,,\377%%%\377$$$\377\"\"\"\377\34\34\34\377\24\24\24\377\22" - "\22\22\377\17\17\17\377\13\13\13\377\12\12\12\377\11\11\11\377\13\13\13\377" - "\14\14\14\377\20\20\20\377\23\23\23\377\27\27\27\377\35\35\35\377$$$\377" - "(((\377...\377666\377===\377HHH\377WWW\377YYY\377]]]\377aaa\377\\\\\\\377" - "\\\\\\\377UUU\377OOO\377???\377444\377---\377+++\377\40\40\40\377\32\32\32" - "\377\27\27\27\377\23\23\23\377\22\22\22\377\15\15\15\377\11\11\11\377\13" - "\13\13\377\12\12\12\377\15\15\15\377\21\21\21\377\25\25\25\377\30\30\30\377" - "\37\37\37\377$$$\377...\377999\377???\377NNN\377XXX\377hhh\377rrr\377www" - "\377|||\377xxx\377ppp\377kkk\377\\\\\\\377JJJ\377FFF\377999\377***\377$$" - "$\377\36\36\36\377\30\30\30\377\25\25\25\377\24\24\24\377\20\20\20\377\14" - "\14\14\377\12\12\12\377\15\15\15\377\17\17\17\377\22\22\22\377\27\27\27\377" - "\34\34\34\377\40\40\40\377%%%\377...\377<<<\377MMM\377[[[\377lll\377~~~\377" - "\227\227\227\377\230\230\230\377\234\234\234\377\233\233\233\377\226\226" - "\226\377\205\205\205\377iii\377bbb\377PPP\377999\377---\377(((\377!!!\377" - "\35\35\35\377\32\32\32\377\25\25\25\377\21\21\21\377\13\13\13\377\12\12\12" - "\377\15\15\15\377\21\21\21\377\23\23\23\377\31\31\31\377\37\37\37\377!!!" - "\377(((\377444\377@@@\377QQQ\377ggg\377\200\200\200\377\231\231\231\377\254" - "\254\254\377\275\275\275\377\310\310\310\377\304\304\304\377\264\264\264" - "\377\227\227\227\377\212\212\212\377fff\377QQQ\377BBB\377:::\377///\377&" - "&&\377\36\36\36\377\32\32\32\377\26\26\26\377\21\21\21\377\14\14\14\377\12" - "\12\12\377\17\17\17\377\22\22\22\377\24\24\24\377\31\31\31\377\40\40\40\377" - "&&&\377---\377:::\377HHH\377XXX\377kkk\377\220\220\220\377\252\252\252\377" - "\324\324\324\377\363\363\363\377\370\370\370\377\366\366\366\377\335\335" - "\335\377\263\263\263\377\221\221\221\377www\377bbb\377PPP\377>>>\377000\377" - "&&&\377\37\37\37\377\32\32\32\377\26\26\26\377\23\23\23\377\15\15\15\377" - "\11\11\11\377\16\16\16\377\21\21\21\377\27\27\27\377\33\33\33\377\"\"\"\377" - "(((\377///\377<<<\377NNN\377bbb\377zzz\377\231\231\231\377\275\275\275\377" - "\361\361\361\377\375\375\375\377\376\376\376\377\376\376\376\377\370\370" - "\370\377\316\316\316\377\240\240\240\377\205\205\205\377bbb\377LLL\377<<" - "<\377...\377&&&\377\40\40\40\377\33\33\33\377\26\26\26\377\22\22\22\377\15" - "\15\15\377\12\12\12\377\16\16\16\377\22\22\22\377\24\24\24\377\32\32\32\377" - "\40\40\40\377$$$\377,,,\377:::\377LLL\377```\377|||\377\231\231\231\377\310" - "\310\310\377\372\372\372\377\375\375\375\377\376\376\376\377\376\376\376" - "\377\375\375\375\377\332\332\332\377\241\241\241\377\207\207\207\377fff\377" - "RRR\377@@@\377333\377+++\377\"\"\"\377\35\35\35\377\30\30\30\377\24\24\24" - "\377\17\17\17\377\14\14\14\377\16\16\16\377\22\22\22\377\25\25\25\377\30" - "\30\30\377\40\40\40\377$$$\377,,,\377;;;\377NNN\377eee\377\206\206\206\377" - "\246\246\246\377\327\327\327\377\374\374\374\377\375\375\375\377\376\376" - "\376\377\376\376\376\377\374\374\374\377\331\331\331\377\243\243\243\377" - "\210\210\210\377bbb\377OOO\377>>>\377...\377&&&\377\40\40\40\377\33\33\33" - "\377\27\27\27\377\22\22\22\377\15\15\15\377\12\12\12\377\16\16\16\377\22" - "\22\22\377\23\23\23\377\32\32\32\377\40\40\40\377'''\377000\377???\377UU" - "U\377hhh\377\200\200\200\377\237\237\237\377\270\270\270\377\344\344\344" - "\377\372\372\372\377\375\375\375\377\376\376\376\377\354\354\354\377\275" - "\275\275\377\227\227\227\377\200\200\200\377eee\377QQQ\377>>>\377...\377" - "%%%\377\40\40\40\377\33\33\33\377\26\26\26\377\22\22\22\377\15\15\15\377" - "\11\11\11\377\17\17\17\377\22\22\22\377\25\25\25\377\31\31\31\377\"\"\"\377" - "***\377333\377===\377JJJ\377^^^\377ooo\377\211\211\211\377\235\235\235\377" - "\271\271\271\377\327\327\327\377\342\342\342\377\335\335\335\377\302\302" - "\302\377\240\240\240\377\216\216\216\377kkk\377XXX\377CCC\377999\377///\377" - "&&&\377\"\"\"\377\33\33\33\377\26\26\26\377\22\22\22\377\14\14\14\377\12" - "\12\12\377\15\15\15\377\22\22\22\377\31\31\31\377\35\35\35\377\37\37\37\377" - "$$$\377,,,\377777\377AAA\377QQQ\377[[[\377ppp\377\212\212\212\377\231\231" - "\231\377\242\242\242\377\253\253\253\377\251\251\251\377\236\236\236\377" - "\215\215\215\377uuu\377bbb\377OOO\377<<<\377111\377)))\377\"\"\"\377\34\34" - "\34\377\32\32\32\377\27\27\27\377\21\21\21\377\16\16\16\377\12\12\12\377" - "\17\17\17\377\21\21\21\377\20\20\20\377\27\27\27\377\37\37\37\377$$$\377" - "&&&\377,,,\377888\377BBB\377RRR\377___\377kkk\377~~~\377\207\207\207\377" - "\220\220\220\377\220\220\220\377\203\203\203\377qqq\377___\377VVV\377FFF" - "\377777\377,,,\377%%%\377!!!\377\31\31\31\377\25\25\25\377\22\22\22\377\17" - "\17\17\377\14\14\14\377\11\11\11\377\12\12\12\377\16\16\16\377\22\22\22\377" - "\27\27\27\377\33\33\33\377\35\35\35\377\"\"\"\377(((\377///\377999\377EE" - "E\377LLL\377^^^\377ddd\377eee\377kkk\377lll\377ddd\377aaa\377OOO\377CCC\377" - "===\377000\377)))\377$$$\377\35\35\35\377\30\30\30\377\25\25\25\377\22\22" - "\22\377\16\16\16\377\12\12\12\377\13\13\13\377\13\13\13\377\15\15\15\377" - "\20\20\20\377\21\21\21\377\31\31\31\377\33\33\33\377\35\35\35\377$$$\377" - ")))\377111\377666\377@@@\377JJJ\377NNN\377PPP\377SSS\377XXX\377PPP\377JJ" - "J\377EEE\377777\377,,,\377+++\377%%%\377\40\40\40\377\32\32\32\377\26\26" - "\26\377\21\21\21\377\21\21\21\377\14\14\14\377\11\11\11\377\12\12\12\377" - "\13\13\13\377\11\11\11\377\14\14\14\377\21\21\21\377\23\23\23\377\27\27\27" - "\377\33\33\33\377\37\37\37\377&&&\377(((\377***\377444\377999\377<<<\377" - "===\377CCC\377EEE\377???\377999\377:::\377...\377(((\377!!!\377!!!\377\35" - "\35\35\377\31\31\31\377\24\24\24\377\21\21\21\377\16\16\16\377\12\12\12\377" - "\11\11\11\377\10\10\10\377\10\10\10\377\11\11\11\377\13\13\13\377\16\16\16" - "\377\22\22\22\377\25\25\25\377\30\30\30\377\33\33\33\377\"\"\"\377!!!\377" - "%%%\377***\377---\377000\377///\377333\377222\377444\377---\377,,,\377**" - "*\377\"\"\"\377\37\37\37\377\32\32\32\377\33\33\33\377\27\27\27\377\21\21" - "\21\377\17\17\17\377\16\16\16\377\12\12\12\377\11\11\11\377\6\6\6\377\10" - "\10\10\377\12\12\12\377\11\11\11\377\15\15\15\377\20\20\20\377\22\22\22\377" - "\23\23\23\377\30\30\30\377\32\32\32\377\35\35\35\377\40\40\40\377!!!\377" - "%%%\377(((\377&&&\377)))\377(((\377+++\377$$$\377!!!\377###\377\36\36\36" - "\377\30\30\30\377\30\30\30\377\24\24\24\377\22\22\22\377\20\20\20\377\15" - "\15\15\377\11\11\11\377\12\12\12\377\6\6\6\377\6\6\6\377\7\7\7\377\7\7\7" - "\377\11\11\11\377\12\12\12\377\16\16\16\377\17\17\17\377\22\22\22\377\23" - "\23\23\377\26\26\26\377\31\31\31\377\33\33\33\377\34\34\34\377!!!\377\40" - "\40\40\377\"\"\"\377\"\"\"\377\"\"\"\377&&&\377\36\36\36\377\35\35\35\377" - "\35\35\35\377\34\34\34\377\26\26\26\377\24\24\24\377\23\23\23\377\20\20\20" - "\377\15\15\15\377\14\14\14\377\13\13\13\377\7\7\7\377\5\5\5\377\6\6\6\377" - "\7\7\7\377\6\6\6\377\11\11\11\377\12\12\12\377\11\11\11\377\15\15\15\377" - "\16\16\16\377\21\21\21\377\22\22\22\377\26\26\26\377\26\26\26\377\30\30\30" - "\377\33\33\33\377\32\32\32\377\34\34\34\377\33\33\33\377\32\32\32\377\37" - "\37\37\377\31\31\31\377\31\31\31\377\27\27\27\377\30\30\30\377\21\21\21\377" - "\22\22\22\377\17\17\17\377\14\14\14\377\11\11\11\377\11\11\11\377\12\12\12" - "\377\6\6\6\377\6\6\6\377\4\4\4\377\6\6\6\377\6\6\6\377\5\5\5\377\7\7\7\377" - "\13\13\13\377\11\11\11\377\12\12\12\377\16\16\16\377\21\21\21\377\21\21\21" - "\377\20\20\20\377\22\22\22\377\30\30\30\377\26\26\26\377\27\27\27\377\30" - "\30\30\377\27\27\27\377\30\30\30\377\26\26\26\377\23\23\23\377\22\22\22\377" - "\20\20\20\377\20\20\20\377\16\16\16\377\14\14\14\377\11\11\11\377\11\11\11" - "\377\10\10\10\377\6\6\6\377\6\6\6\377\4\4\4\377\3\3\3\377\4\4\4\377\4\4\4" - "\377\4\4\4\377\7\7\7\377\10\10\10\377\12\12\12\377\10\10\10\377\11\11\11" - "\377\15\15\15\377\16\16\16\377\16\16\16\377\20\20\20\377\23\23\23\377\21" - "\21\21\377\23\23\23\377\22\22\22\377\22\22\22\377\21\21\21\377\22\22\22\377" - "\22\22\22\377\20\20\20\377\16\16\16\377\15\15\15\377\12\12\12\377\11\11\11" - "\377\12\12\12\377\7\7\7\377\6\6\6\377\7\7\7\377\5\5\5\377\4\4\4\377\1\1\1" - "\377\1\1\1\377\3\3\3\377\3\3\3\377\6\6\6\377\7\7\7\377\6\6\6\377\10\10\10" - "\377\12\12\12\377\12\12\12\377\11\11\11\377\13\13\13\377\16\16\16\377\16" - "\16\16\377\16\16\16\377\17\17\17\377\16\16\16\377\16\16\16\377\17\17\17\377" - "\17\17\17\377\15\15\15\377\14\14\14\377\12\12\12\377\11\11\11\377\12\12\12" - "\377\12\12\12\377\7\7\7\377\6\6\6\377\6\6\6\377\6\6\6\377\3\3\3\377\1\1\1" - "\377\1\1\1\377\0\0\0\377\0\0\0\377\2\2\2\377\4\4\4\377\7\7\7\377\6\6\6\377" - "\6\6\6\377\7\7\7\377\13\13\13\377\13\13\13\377\10\10\10\377\11\11\11\377" - "\11\11\11\377\11\11\11\377\15\15\15\377\13\13\13\377\14\14\14\377\11\11\11" - "\377\13\13\13\377\11\11\11\377\12\12\12\377\13\13\13\377\11\11\11\377\11" - "\11\11\377\6\6\6\377\7\7\7\377\4\4\4\377\5\5\5\377\3\3\3\377\1\1\1\377\0" - "\0\0\377\0\0\0\377",}; diff -r 5783d6281431 -r ee81e087615c src/iris/theme.c --- a/src/iris/theme.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,308 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include "iris.h" - -/* declaration of all the themes start here */ -extern iris_theme theme_original; -extern iris_theme theme_spectrum; -extern iris_theme theme_spectrotoy; -extern iris_theme theme_squarefield; -extern iris_theme theme_waves; -extern iris_theme theme_pyramid; -extern iris_theme theme_knot; -extern iris_theme theme_pinwheel; -extern iris_theme theme_pipes; -extern iris_theme theme_float; -extern iris_theme theme_fountain; -extern iris_theme theme_flash; - -/* this is the array where all the themes are */ -iris_theme theme[THEME_NUMBER]; - - -/* this initialize the theme registry */ -void -theme_register (void) -{ - theme[0] = theme_original; - theme[1] = theme_spectrum; - theme[2] = theme_spectrotoy; - theme[3] = theme_squarefield; - theme[4] = theme_waves; - theme[5] = theme_pyramid; - theme[6] = theme_knot; - theme[7] = theme_pinwheel; - theme[8] = theme_pipes; - theme[9] = theme_float; - theme[10] = theme_fountain; - theme[11] = theme_flash;} - - -/* allocate memory for the config struct of the themes */ -void -theme_config_init (void) -{ - int i; - - for (i = 0; i < THEME_NUMBER; i++) - { - theme[i].config->global = g_malloc (sizeof (config_global)); - theme[i].config_new->global = g_malloc (sizeof (config_global)); - } -} - - -/* set the default global config of a theme */ -void -theme_config_global_default (int num) -{ - theme[num].config->global->priority = 1.0; /* priority set to max */ - theme[num].config->global->transparency = -1; /* transparency random */ - theme[num].config->global->wireframe = 0; /* wireframe off */ -} - - -/* read the global config of a theme - (priority, transparency, wireframe) */ -void -theme_config_global_read (ConfigDb * db, char *section_name, int num) -{ - char *string; - - string = g_strconcat (theme[num].key, "_", "priority", NULL); - bmp_cfg_db_get_float (db, section_name, string, &theme[num].config->global->priority); - g_free (string); - - string = g_strconcat (theme[num].key, "_", "transparency", NULL); - bmp_cfg_db_get_int (db, section_name, string, &theme[num].config->global->transparency); - g_free (string); - - string = g_strconcat (theme[num].key, "_", "wireframe", NULL); - bmp_cfg_db_get_int (db, section_name, string, &theme[num].config->global->wireframe); - g_free (string); -} - - -/* write the global config of a theme */ -void -theme_config_global_write (ConfigDb * db, char *section_name, int num) -{ - char *string; - - string = g_strconcat (theme[num].key, "_", "priority", NULL); - bmp_cfg_db_set_float (db, section_name, string, theme[num].config->global->priority); - g_free (string); - - string = g_strconcat (theme[num].key, "_", "transparency", NULL); - bmp_cfg_db_set_int (db, section_name, string, theme[num].config->global->transparency); - g_free (string); - - string = g_strconcat (theme[num].key, "_", "wireframe", NULL); - bmp_cfg_db_set_int (db, section_name, string, theme[num].config->global->wireframe); - g_free (string); -} - - -/* the following 6 functions are callbacks for the theme_config_global_widgets function */ -void -on_rb_transparency_random (GtkWidget * widget, gpointer data) -{ - theme[(int) data].config_new->global->transparency = -1; -} - - -void -on_rb_transparency_on (GtkWidget * widget, gpointer data) -{ - theme[(int) data].config_new->global->transparency = 1; -} - - -void -on_rb_transparency_off (GtkWidget * widget, gpointer data) -{ - theme[(int) data].config_new->global->transparency = 0; -} - - -void -on_rb_wireframe_random (GtkWidget * widget, gpointer data) -{ - theme[(int) data].config_new->global->wireframe = -1; -} - - -void -on_rb_wireframe_on (GtkWidget * widget, gpointer data) -{ - theme[(int) data].config_new->global->wireframe = 1; -} - - -void -on_rb_wireframe_off (GtkWidget * widget, gpointer data) -{ - theme[(int) data].config_new->global->wireframe = 0; -} - - -void -theme_config_apply (int num) -{ - memcpy (theme[num].config->private, theme[num].config_new->private, - theme[num].config_private_size); -} - - -/* create the config widgets of all the themes */ -void -theme_config_global_widgets (GtkWidget * vbox, int num) -{ - GtkWidget *hbox; - GtkWidget *label; - GtkWidget *radio_button_on1; - GtkWidget *radio_button_off1; - GtkWidget *radio_button_random1; - GSList *group; - - memcpy (theme[num].config_new->global, theme[num].config->global, - sizeof (config_global)); - - /* transparency mode */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Transparency"); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - radio_button_random1 = gtk_radio_button_new_with_label (NULL, "Random"); - gtk_box_pack_start (GTK_BOX (hbox), radio_button_random1, FALSE, FALSE, 4); - - group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button_random1)); - radio_button_on1 = gtk_radio_button_new_with_label (group, "On"); - gtk_box_pack_start (GTK_BOX (hbox), radio_button_on1, FALSE, FALSE, 4); - - group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button_on1)); - radio_button_off1 = gtk_radio_button_new_with_label (group, "Off"); - gtk_box_pack_start (GTK_BOX (hbox), radio_button_off1, FALSE, FALSE, 4); - - switch (theme[num].config->global->transparency) - { - case -1: - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON - (radio_button_random1), TRUE); - break; - } - case 0: - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON - (radio_button_off1), TRUE); - break; - } - case 1: - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON - (radio_button_on1), TRUE); - } - } - - gtk_signal_connect (GTK_OBJECT (radio_button_random1), "toggled", - GTK_SIGNAL_FUNC (on_rb_transparency_random), - (gpointer) num); - gtk_signal_connect (GTK_OBJECT (radio_button_off1), "toggled", - GTK_SIGNAL_FUNC (on_rb_transparency_off), - (gpointer) num); - gtk_signal_connect (GTK_OBJECT (radio_button_on1), "toggled", - GTK_SIGNAL_FUNC (on_rb_transparency_on), - (gpointer) num); - - /* wireframe mode */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Wireframe"); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - radio_button_random1 = gtk_radio_button_new_with_label (NULL, "Random"); - gtk_box_pack_start (GTK_BOX (hbox), radio_button_random1, FALSE, FALSE, 4); - - group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button_random1)); - radio_button_on1 = gtk_radio_button_new_with_label (group, "On"); - gtk_box_pack_start (GTK_BOX (hbox), radio_button_on1, FALSE, FALSE, 4); - - group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button_on1)); - radio_button_off1 = gtk_radio_button_new_with_label (group, "Off"); - gtk_box_pack_start (GTK_BOX (hbox), radio_button_off1, FALSE, FALSE, 4); - - switch (theme[num].config->global->wireframe) - { - case -1: - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON - (radio_button_random1), TRUE); - break; - } - case 0: - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON - (radio_button_off1), TRUE); - break; - } - case 1: - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON - (radio_button_on1), TRUE); - } - } - - gtk_signal_connect (GTK_OBJECT (radio_button_random1), "toggled", - GTK_SIGNAL_FUNC (on_rb_wireframe_random), - (gpointer) num); - gtk_signal_connect (GTK_OBJECT (radio_button_off1), "toggled", - GTK_SIGNAL_FUNC (on_rb_wireframe_off), (gpointer) num); - gtk_signal_connect (GTK_OBJECT (radio_button_on1), "toggled", - GTK_SIGNAL_FUNC (on_rb_wireframe_on), (gpointer) num); - -} - - -/* create the theme about vbox */ -void -theme_about (GtkWidget * vbox_about, int num) -{ - GtkWidget *label; - GtkWidget *vbox; - - vbox = gtk_vbox_new (FALSE, 4); - label = gtk_label_new (g_strconcat ("Theme name: ", theme[num].name, NULL)); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); - - label = - gtk_label_new (g_strconcat ("Theme author: ", theme[num].author, NULL)); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); - - label = - gtk_label_new (g_strconcat - ("Theme description: ", theme[num].description, NULL)); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 4); - - gtk_box_pack_start (GTK_BOX (vbox_about), vbox, FALSE, FALSE, 4); -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_flash.c --- a/src/iris/theme_flash.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,486 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2004 Marc Pompl (marc.pompl@lynorics.de) - * - * 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. - */ - -#include -#include -#include -#include -#include -#include "iris.h" -#include "particle.h" - -static GLuint texture[1]; /* Storage For Our Particle Texture */ - -static gboolean flash_already_initialized = FALSE; - -static float flash_timer = 0; /* timer for flash */ - -static struct -{ - gboolean flash_on_beat; - int flash_timer; - GLfloat speed; - GLfloat r1, r2, r3; - GLfloat m,n,o; - GLfloat f,g,h; - GLfloat t; -} -conf_private, conf_private_new; - -static config_theme conf = { - (config_global *) NULL, - &conf_private -}; - -static config_theme conf_new = { - (config_global *) NULL, - &conf_private_new -}; - -static char flash_flash_on_beat[] = "flashlight_flash_on_beat"; -static char flash_flash_timer[] = "flashlight_flash_timer"; -static char flash_speed[] = "flashlight_speed"; - -static void config_read (ConfigDb *, char *); -static void config_write (ConfigDb *, char *); -static void config_default (void); -static void config_create (GtkWidget *); -static void init_draw_mode (void); -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - -iris_theme theme_flash = { - "Flash light", - "flash lights moving by a lissajou figure\n", - "Marc Pompl (marc.pompl@lynorics.de)", - "flashlight", - &conf, - &conf_new, - sizeof (conf_private), - config_read, - config_write, - config_default, - config_create, - NULL, - NULL, - init_draw_mode, - get_x_angle, - draw_one_frame -}; - -/* Create our particle structure */ -typedef struct -{ - GLint active; /* Active (Yes/No) */ - GLfloat life; /* Particle Life */ - GLfloat fade; /* Fade Speed */ - - GLfloat r; /* Red Value */ - GLfloat g; /* Green Value */ - GLfloat b; /* Blue Value */ - - GLfloat fr; /* Red Flash Value */ - GLfloat fg; /* Green Flash Value */ - GLfloat fb; /* Blue Flash Value */ - - GLfloat x; /* X Position */ - GLfloat y; /* Y Position */ - GLfloat z; /* Z Position */ - - GLfloat xi; /* X Direction */ - GLfloat yi; /* Y Direction */ - GLfloat zi; /* Z Direction */ - - GLfloat xg; /* X Gravity */ - GLfloat yg; /* Y Gravity */ - GLfloat zg; /* Z Gravity */ -} particle; - -/* Rainbow of colors */ -static GLfloat flash_colors[16][3] = -{ - { 1.0f, 0.5f, 0.5f}, - { 1.0f, 0.75f, 0.5f}, - { 1.0f, 1.0f, 0.5f}, - - { 0.75f, 1.0f, 0.5f}, - - { 0.5f, 1.0f, 0.5f}, - { 0.5f, 1.0f, 0.75f}, - { 0.5f, 1.0f, 1.0f}, - - { 0.5f, 0.75f, 1.0f}, - { 0.5f, 0.5f, 1.0f}, - { 0.75f, 0.5f, 1.0f}, - - { 1.0f, 0.5f, 1.0f}, - { 1.0f, 0.5f, 0.75f}, - { 0.75f, 0.5f, 0.75f}, - - { 0.5f, 0.5f, 0.5f}, - { 0.75f, 0.75f, 0.75f}, - { 1.0f, 1.0f, 1.0f}, -}; - -/* Our beloved array of particles */ -static particle particles[NUM_BANDS]; - -void FlashColor( int num ) -{ - GLfloat dr; - GLfloat dg; - GLfloat db; - dr = 1-particles[num].r; - dg = 1-particles[num].g; - db = 1-particles[num].b; - particles[num].fr = 1-dr*dr; - particles[num].fg = 1-dg*dg; - particles[num].fb = 1-db*db; -} - -/* function to "load" a GL texture */ -void flash_loadTexture( ) -{ - /* Create The Texture */ - glGenTextures( 1, &texture[0] ); - - /* Typical Texture Generation Using Data From The Bitmap */ - glBindTexture( GL_TEXTURE_2D, texture[0] ); - - /* Generate The Texture */ - glTexImage2D( GL_TEXTURE_2D, 0, 3, particle_image.width, - particle_image.height, 0, GL_RGBA, - GL_UNSIGNED_BYTE, particle_image.pixel_data ); - - /* Linear Filtering */ - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); -} - -/* function to reset one particle to initial state */ -void ResetFlash( int num, GLfloat xDir, GLfloat yDir, GLfloat zDir ) -{ - /* Make the particels active */ - particles[num].active = TRUE; - /* Give the particles life */ - particles[num].life = 1.0f; - /* Random Fade Speed */ - particles[num].fade = ( GLfloat )( rand( ) *150 )/ (RAND_MAX + 1.0) / 1000.0f + 0.003f; - /* Select Red Rainbow Color */ - particles[num].r = flash_colors[num][0]; - /* Select Green Rainbow Color */ - particles[num].g = flash_colors[num][1]; - /* Select Blue Rainbow Color */ - particles[num].b = flash_colors[num][2]; - /* Set the position on the X axis */ - particles[num].x = 0.0f; - /* Set the position on the Y axis */ - particles[num].y = 0.0f; - /* Set the position on the Z axis */ - particles[num].z = 0.0f; - /* Random Speed On X Axis */ - particles[num].xi = xDir; - /* Random Speed On Y Axi */ - particles[num].yi = yDir; - /* Random Speed On Z Axis */ - particles[num].zi = zDir; - /* Set Horizontal Pull To Zero */ - particles[num].xg = 0.0f; - /* Set Vertical Pull Downward */ - particles[num].yg = -0.8f; - /* Set Pull On Z Axis To Zero */ - particles[num].zg = 0.0f; - FlashColor(num); -} - -static void initFlash ( int num, GLfloat value ) -{ - GLfloat xi, yi, zi; - xi = num; - yi = 0; - zi = 0; - ResetFlash( num, xi, yi, zi ); -} - -static void -init_draw_mode () -{ - int loop; - conf.global->transparency = TRUE; - //conf.global->wireframe = FALSE; - - flash_loadTexture(); - /* Enable smooth shading */ - glShadeModel( GL_SMOOTH ); - - /* Set the background black */ - //glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); - - /* Depth buffer setup */ - //glClearDepth( 1.0f ); - - /* Enables Depth Testing */ - glDisable( GL_DEPTH_TEST ); - - /* Enable Blending */ - glEnable( GL_BLEND ); - - glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); - - /* Type Of Blending To Perform */ - glBlendFunc( GL_SRC_ALPHA, GL_ONE ); - - /* Really Nice Perspective Calculations */ - glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); - /* Really Nice Point Smoothing */ - glHint( GL_POINT_SMOOTH_HINT, GL_NICEST ); - - /* Enable Texture Mapping */ - glEnable( GL_TEXTURE_2D ); - /* Select Our Texture */ - glBindTexture( GL_TEXTURE_2D, texture[0] ); - if (!flash_already_initialized) - { - for (loop=0; loop0)) - glColor4f( particles[loop].fr, - particles[loop].fg, - particles[loop].fb, - 1.0f ); - else - { - glColor4f( particles[loop].r, - particles[loop].g, - particles[loop].b, - 1.0f ); - } - - /* Build Quad From A Triangle Strip */ - glBegin( GL_TRIANGLE_STRIP ); - /* Top Right */ - glTexCoord2d( 1, 1 ); - glVertex3f( x + datas.data1[loop], y + datas.data1[loop], z ); - /* Top Left */ - glTexCoord2d( 0, 1 ); - glVertex3f( x - datas.data1[loop], y + datas.data1[loop], z ); - /* Bottom Right */ - glTexCoord2d( 1, 0 ); - glVertex3f( x + datas.data1[loop], y - datas.data1[loop], z ); - /* Bottom Left */ - glTexCoord2d( 0, 0 ); - glVertex3f( x - datas.data1[loop], y - datas.data1[loop], z ); - glEnd( ); - - glBegin( GL_TRIANGLE_STRIP ); - /* Top Right */ - glTexCoord2d( 1, 1 ); - glVertex3f( x, y + datas.data1[loop], z+datas.data1[loop] ); - /* Top Left */ - glTexCoord2d( 0, 1 ); - glVertex3f( x, y + datas.data1[loop], z-datas.data1[loop] ); - /* Bottom Right */ - glTexCoord2d( 1, 0 ); - glVertex3f( x, y - datas.data1[loop], z+datas.data1[loop] ); - /* Bottom Left */ - glTexCoord2d( 0, 0 ); - glVertex3f( x, y - datas.data1[loop], z-datas.data1[loop] ); - glEnd( ); - - glBegin( GL_TRIANGLE_STRIP ); - /* Top Right */ - glTexCoord2d( 1, 1 ); - glVertex3f( x+datas.data1[loop], y, z+datas.data1[loop] ); - /* Top Left */ - glTexCoord2d( 0, 1 ); - glVertex3f( x+datas.data1[loop], y, z-datas.data1[loop] ); - /* Bottom Right */ - glTexCoord2d( 1, 0 ); - glVertex3f( x-datas.data1[loop], y, z+datas.data1[loop] ); - /* Bottom Left */ - glTexCoord2d( 0, 0 ); - glVertex3f( x-datas.data1[loop], y, z-datas.data1[loop] ); - glEnd( ); - } - } - - if (flash_timer>0) - flash_timer --; -} - - -static void -config_read (ConfigDb * db, char *section_name) -{ - config_default(); - bmp_cfg_db_get_bool (db, section_name, flash_flash_on_beat, &conf_private.flash_on_beat); - bmp_cfg_db_get_int (db, section_name, flash_flash_timer, &conf_private.flash_timer); - bmp_cfg_db_get_float (db, section_name, flash_speed, &conf_private.speed); -} - - -static void -config_write (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_set_bool (db, section_name, flash_flash_on_beat, conf_private.flash_on_beat); - bmp_cfg_db_set_int (db, section_name, flash_flash_timer, conf_private.flash_timer); - bmp_cfg_db_set_float (db, section_name, flash_speed, conf_private.speed); -} - - -static void -config_default () -{ - conf_private.flash_on_beat = TRUE; - conf_private.flash_timer = 8; - conf_private.speed = 0.01f; -} - -void -flash_flash_toggled (GtkWidget * widget, gpointer data) -{ - conf_private_new.flash_on_beat = !conf_private_new.flash_on_beat; -} - -static void -flash_value_flash (GtkAdjustment * adj) -{ - conf_private_new.flash_timer = (int)adj->value; -} - -static void -value_speed (GtkAdjustment * adj) -{ - conf_private_new.speed = (GLfloat) (adj->value/1000); -} - -static void -config_create (GtkWidget * vbox) -{ - GtkWidget *hbox; - GtkWidget *button; - GtkWidget *label; - GtkObject *adjustment; - GtkWidget *hscale; - - memcpy (&conf_private_new, &conf_private, sizeof (conf_private_new)); - -/* flash on beat */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button = gtk_check_button_new_with_label ("Flash on beats"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), - conf_private_new.flash_on_beat); - gtk_signal_connect (GTK_OBJECT (button), "toggled", - GTK_SIGNAL_FUNC (flash_flash_toggled), NULL); - - /* number of frame for the flash to propagate */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Flash propagation timer (in frames)"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.flash_timer, 1, 50, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (flash_value_flash), NULL); - - /* speed */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Speed"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.speed*1000, 1, 100, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_speed), NULL); -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_float.c --- a/src/iris/theme_float.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,367 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -/* New Theme created by Ron Lockwood-Childs - * Looks best when alpha blending is OFF - */ - -/* $Id: theme_float.c,v 1.1 2002/10/27 19:21:06 cedric Exp $ */ - -#include -#include -#include -#include -#include -#include -#include -#include "iris.h" - -#define HISTORY_SIZE 16 -#define HALF_BOX 0.15 -#define HALF_BOX_Y (HALF_BOX * 2) -#define FAR_LEFT -3.0 -#define FAR_BACK -3.0 -#define BOTTOM -2.6 - - -typedef struct -{ - GLfloat xc; - GLfloat yc; - GLfloat zc; -} triple; - -static struct -{ - int wave_speed; - gfloat num_blocks; -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); -static gfloat speed_to_phase(int speed); -static void config_read (ConfigDb *, char *); -static void config_write (ConfigDb *, char *); -static void config_default (void); -static void config_create (GtkWidget *); - - -static char float_numblocks[] = "float_numblocks"; -static char float_wavespeed[] = "float_wavespeed"; - - -iris_theme theme_float = { - "Floaters", - "A spectrum of floating blocks (alpha blend off for best effect)", - "Ron Lockwood-Childs", - "float", - &conf, - &conf_new, - sizeof (conf_private), - config_read, - config_write, - config_default, - config_create, - NULL, - NULL, - NULL, - get_x_angle, - draw_one_frame, -}; - -static GLfloat data2[NUM_BANDS][HISTORY_SIZE]; // previous freq band data -static GLfloat phase[HISTORY_SIZE]; // previous angle data - -static GLfloat -get_x_angle () -{ - return (10.0 + (int) (80.0 * rand () / (RAND_MAX + 1.0))); -} - -static void -draw_one_frame (gboolean beat) -{ - int t1, t2; // loop vars - GLfloat red, green, blue; - GLfloat y_color = 0.0; - triple ulf, urf, llf, lrf, ulb, urb, llb, lrb; - GLfloat basis[NUM_BANDS]; - int box_height; - int i; - - /* shift all data when a new datarow arrives */ - for (t2 = (HISTORY_SIZE-1); t2 > 0; t2--) - { - for (t1 = 0; t1 < NUM_BANDS; t1++) - { - data2[t1][t2] = data2[t1][t2-1]; - } - phase[t2] = phase[t2-1]; - } - for (t1 = 0; t1 < NUM_BANDS; t1++) - { - data2[t1][0] = datas.data1[t1]; - phase[0] = phase[1] + speed_to_phase(conf_private.wave_speed); - } - - glBegin (GL_QUADS); - - for (t2 = (HISTORY_SIZE-1); t2 >= 0; t2--) - { - for (t1 = 0; t1 < NUM_BANDS; t1++) - { - basis[t1] = BOTTOM + sin( phase[t2] + (speed_to_phase(conf_private.wave_speed) * t1)); - box_height = (int)ceilf( data2[t1][t2] * conf_private.num_blocks ); - - for (i = 0; i < box_height; i++) - { - if (i < (box_height-1)) - { - y_color = (GLfloat)i * (1.0 / (GLfloat)conf_private.num_blocks); - } - else - { - y_color = data2[t1][t2]; - } - get_color (&red, &green, &blue, &y_color); // box color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - - ulf.xc = FAR_LEFT + (HALF_BOX * 3 * t1) - HALF_BOX; - ulf.yc = basis[t1] + (HALF_BOX_Y * 3 * i) + HALF_BOX_Y; - ulf.zc = (FAR_BACK + t2 * HALF_BOX * 3) - HALF_BOX; - - urf.xc = FAR_LEFT + (HALF_BOX * 3 * t1) + HALF_BOX; - urf.yc = basis[t1] + (HALF_BOX_Y * 3 * i) + HALF_BOX_Y; - urf.zc = (FAR_BACK + t2 * HALF_BOX * 3) - HALF_BOX; - - lrf.xc = FAR_LEFT + (HALF_BOX * 3 * t1) + HALF_BOX; - lrf.yc = basis[t1] + (HALF_BOX_Y * 3 * i) - HALF_BOX_Y; - lrf.zc = (FAR_BACK + t2 * HALF_BOX * 3) - HALF_BOX; - - llf.xc = FAR_LEFT + (HALF_BOX * 3 * t1) - HALF_BOX; - llf.yc = basis[t1] + (HALF_BOX_Y * 3 * i) - HALF_BOX_Y; - llf.zc = (FAR_BACK + t2 * HALF_BOX * 3) - HALF_BOX; - - ulb.xc = FAR_LEFT + (HALF_BOX * 3 * t1) - HALF_BOX; - ulb.yc = basis[t1] + (HALF_BOX_Y * 3 * i) + HALF_BOX_Y; - ulb.zc = (FAR_BACK + t2 * HALF_BOX * 3) + HALF_BOX; - - urb.xc = FAR_LEFT + (HALF_BOX * 3 * t1) + HALF_BOX; - urb.yc = basis[t1] + (HALF_BOX_Y * 3 * i) + HALF_BOX_Y; - urb.zc = (FAR_BACK + t2 * HALF_BOX * 3) + HALF_BOX; - - lrb.xc = FAR_LEFT + (HALF_BOX * 3 * t1) + HALF_BOX; - lrb.yc = basis[t1] + (HALF_BOX_Y * 3 * i) - HALF_BOX_Y; - lrb.zc = (FAR_BACK + t2 * HALF_BOX * 3) + HALF_BOX; - - llb.xc = FAR_LEFT + (HALF_BOX * 3 * t1) - HALF_BOX; - llb.yc = basis[t1] + (HALF_BOX_Y * 3 * i) - HALF_BOX_Y; - llb.zc = (FAR_BACK + t2 * HALF_BOX * 3) + HALF_BOX; - - // now start drawin' - // start with the front, then left, back, right, finally the top - - // "front" - glVertex3f (ulf.xc, ulf.yc, ulf.zc); // "top-left" - - glVertex3f (urf.xc, urf.yc, urf.zc); // "top-right" - - glVertex3f (lrf.xc, lrf.yc, lrf.zc); // "bottom-right" - - glVertex3f (llf.xc, llf.yc, llf.zc); // "bottom-left" - - // "back" - glVertex3f (ulb.xc, ulb.yc, ulb.zc); // "top-left" - - glVertex3f (urb.xc, urb.yc, urb.zc); // "top-right" - - glVertex3f (lrb.xc, lrb.yc, lrb.zc); // "bottom-right" - - glVertex3f (llb.xc, llb.yc, llb.zc); // "bottom-left" - - // "left" - glVertex3f( llb.xc, llb.yc, llb.zc); // "bottom-in" - - glVertex3f( llf.xc, llf.yc, llf.zc); // "bottom-out" - - glVertex3f( ulf.xc, ulf.yc, ulf.zc); // "top-out" - - glVertex3f( ulb.xc, ulb.yc, ulb.zc); // "top-in" - - // "top" - glVertex3f( ulb.xc, ulb.yc, ulb.zc); // "left-in" - - glVertex3f( ulf.xc, ulf.yc, ulf.zc); // "left-out" - - glVertex3f( urf.xc, urf.yc, urf.zc); // "right-out" - - glVertex3f( urb.xc, urb.yc, urb.zc); // "right-in" - - // "right" - glVertex3f( urb.xc, urb.yc, urb.zc); // "top-in" - - glVertex3f( urf.xc, urf.yc, urf.zc); // "top-out" - - glVertex3f( lrf.xc, lrf.yc, lrf.zc); // "bottom-out" - - glVertex3f( lrb.xc, lrb.yc, lrb.zc); // "bottom-in" - - // "bottom" - glVertex3f( lrb.xc, lrb.yc, lrb.zc); // "right-in" - - glVertex3f( lrf.xc, lrf.yc, lrf.zc); // "right-out" - - glVertex3f( llf.xc, llf.yc, llf.zc); // "left-out" - - glVertex3f( llb.xc, llb.yc, llb.zc); // "left-in" - } - } - } - - glEnd (); - -} - - -static void -config_read (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_get_float (db, section_name, float_numblocks, &conf_private.num_blocks); - bmp_cfg_db_get_int (db, section_name, float_wavespeed, &conf_private.wave_speed); -} - - -static void -config_write (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_set_float (db, section_name, float_numblocks, conf_private.num_blocks); - bmp_cfg_db_set_int (db, section_name, float_wavespeed, conf_private.wave_speed); -} - - -static void -config_default () -{ - conf_private.num_blocks = 8.0; - conf_private.wave_speed = 4; -} - - -static void -blocks_changed (GtkAdjustment * adj) -{ - conf_private_new.num_blocks = (int) adj->value; -} - - -// speeds: pi/8, pi/12, pi/16, pi/20, pi/24, pi/28, pi/32,0 -static gfloat speed_to_phase(int speed) -{ - gfloat phase; - - if (speed == 0) - { - phase = 0; - } - else - { - phase = M_PI_4/(9-speed); - } - - return phase; -} - -static void -speed_changed (GtkWidget *menuitem, gpointer data) -{ - conf_private_new.wave_speed = GPOINTER_TO_INT(data); -} - - - -static void -config_create (GtkWidget * vbox) -{ - GtkWidget *hbox; - GtkWidget *label; - GtkObject *adjustment; - GtkWidget *hscale; - GtkWidget *menu; - GtkWidget *menuitem; - GtkWidget *optionmenu; - gchar *speeds[8] = {"0","1","2","3","4","5","6","7"}; - int i; - - memcpy (&conf_private_new, &conf_private, sizeof (conf_private)); - - /* number blocks */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Max number blocks per stack"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.num_blocks, 4, 8, 1, 2, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (blocks_changed), NULL); - - /* set wave speed */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Wave speed"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - menu = gtk_menu_new (); - for (i=0; i<8; i++) - { - menuitem = gtk_menu_item_new_with_label(speeds[i]); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show (menuitem); - gtk_signal_connect (GTK_OBJECT (menuitem), "activate", - GTK_SIGNAL_FUNC (speed_changed), GINT_TO_POINTER(i)); - } - optionmenu = gtk_option_menu_new(); - gtk_menu_set_active(GTK_MENU(menu), conf_private.wave_speed); - gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu); - gtk_box_pack_start (GTK_BOX (hbox), optionmenu, FALSE, FALSE, 4); - gtk_widget_show (optionmenu); - -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_fountain.c --- a/src/iris/theme_fountain.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,789 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2004 Marc Pompl (marc.pompl@lynorics.de) - * - * 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. - */ - -#include -#include -#include -#include -#include -#include "iris.h" -#include "particle.h" - -/* Max number of particles */ -#define MAX_PARTICLES 10000 - -static GLuint texture[1]; /* Storage For Our Particle Texture */ - -static int draw_mode = 0; // the drawing mode - -static GLuint col = 0; /* Current Color Selection */ - -static gboolean fountain_already_initialized = FALSE; - -static float flash_timer = 0; /* timer for flash */ - -static struct -{ - int draw_mode; - gboolean flash_on_beat; - int flash_timer; - - gboolean rainbow; /* Toggle rainbow effect */ - - GLfloat slowdown; /* Slow Down Particles (1.0 - 4.0) */ - GLfloat xspeed; /* Base X Speed */ - GLfloat yspeed; /* Base Y Speed */ - GLfloat up; /* Particles firing upways (0.0 - 1.0) */ - GLfloat side; /* Particles firing sideways (0.0 - 1.0) */ - GLfloat strength; /* Strength of particle blast (0.0 - 1.0) */ - gboolean hide_inactive; /* Disable inactive ("just falling") particles? */ - GLfloat size; /* Size of particles */ - int particles; /* number of particles */ -} -conf_private, conf_private_new; - -static config_theme conf = { - (config_global *) NULL, - &conf_private -}; - -static config_theme conf_new = { - (config_global *) NULL, - &conf_private_new -}; - -static char fountain_flash_on_beat[] = "fountain_flash_on_beat"; -static char fountain_flash_timer[] = "fountain_flash_timer"; -static char fountain_rainbow[] = "fountain_rainbow"; -static char fountain_slowdown[] = "fountain_slowdown"; -static char fountain_xspeed[] = "fountain_xspeed"; -static char fountain_yspeed[] = "fountain_yspeed"; -static char fountain_up[] = "fountain_up"; -static char fountain_side[] = "fountain_side"; -static char fountain_strength[] = "fountain_strength"; -static char fountain_hide_inactive[] = "fountain_hide_inactive"; -static char fountain_size[] = "fountain_size"; -static char fountain_particles[] = "fountain_particles"; - -static void config_read (ConfigDb *, char *); -static void config_write (ConfigDb *, char *); -static void config_default (void); -static void config_create (GtkWidget *); -static void init_draw_mode (void); -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - -iris_theme theme_fountain = { - "fountain", - "an atmospheric particle fountain\nno support for wireframe or solid surfaces\nbased upon NeHe tutorial #19", - "Marc Pompl (marc.pompl@lynorics.de)", - "fountain", - &conf, - &conf_new, - sizeof (conf_private), - config_read, - config_write, - config_default, - config_create, - NULL, - NULL, - init_draw_mode, - get_x_angle, - draw_one_frame -}; - -/* Create our particle structure */ -typedef struct -{ - GLint active; /* Active (Yes/No) */ - GLfloat life; /* Particle Life */ - GLfloat fade; /* Fade Speed */ - - GLfloat r; /* Red Value */ - GLfloat g; /* Green Value */ - GLfloat b; /* Blue Value */ - - GLfloat fr; /* Red Flash Value */ - GLfloat fg; /* Green Flash Value */ - GLfloat fb; /* Blue Flash Value */ - - GLfloat x; /* X Position */ - GLfloat y; /* Y Position */ - GLfloat z; /* Z Position */ - - GLfloat xi; /* X Direction */ - GLfloat yi; /* Y Direction */ - GLfloat zi; /* Z Direction */ - - GLfloat xg; /* X Gravity */ - GLfloat yg; /* Y Gravity */ - GLfloat zg; /* Z Gravity */ -} particle; - -/* Rainbow of colors */ -static GLfloat fountain_colors[16][3] = { - {1.0f, 0.5f, 0.5f}, - {1.0f, 0.75f, 0.5f}, - {1.0f, 1.0f, 0.5f}, - - {0.75f, 1.0f, 0.5f}, - - {0.5f, 1.0f, 0.5f}, - {0.5f, 1.0f, 0.75f}, - {0.5f, 1.0f, 1.0f}, - - {0.5f, 0.75f, 1.0f}, - {0.5f, 0.5f, 1.0f}, - {0.75f, 0.5f, 1.0f}, - - {1.0f, 0.5f, 1.0f}, - {1.0f, 0.5f, 0.75f}, - {0.75f, 0.5f, 0.75f}, - - {0.5f, 0.5f, 0.5f}, - {0.75f, 0.75f, 0.75f}, - {1.0f, 1.0f, 1.0f}, -}; - -/* Our beloved array of particles */ -static particle particles[MAX_PARTICLES]; - -void -flashParticleColor (int num) -{ - GLfloat dr; - GLfloat dg; - GLfloat db; - dr = 1 - particles[num].r; - dg = 1 - particles[num].g; - db = 1 - particles[num].b; - particles[num].fr = 1 - dr * dr; - particles[num].fg = 1 - dg * dg; - particles[num].fb = 1 - db * db; -} - -/* function to "load" a GL texture */ -void -loadTexture () -{ - /* Create The Texture */ - glGenTextures (1, &texture[0]); - - /* Typical Texture Generation Using Data From The Bitmap */ - glBindTexture (GL_TEXTURE_2D, texture[0]); - - /* Generate The Texture */ - glTexImage2D (GL_TEXTURE_2D, 0, 3, particle_image.width, - particle_image.height, 0, GL_RGBA, - GL_UNSIGNED_BYTE, particle_image.pixel_data); - - /* Linear Filtering */ - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -} - -/* function to reset one particle to initial state */ -void -ResetParticle (int num, GLint color, GLfloat xDir, GLfloat yDir, GLfloat zDir) -{ - /* Make the particels active */ - particles[num].active = TRUE; - /* Give the particles life */ - particles[num].life = 1.0f; - /* Random Fade Speed */ - particles[num].fade = - (GLfloat) (rand () * 150) / (RAND_MAX + 1.0) / 1000.0f + 0.003f; - /* Select Red Rainbow Color */ - particles[num].r = fountain_colors[color][0]; - /* Select Green Rainbow Color */ - particles[num].g = fountain_colors[color][1]; - /* Select Blue Rainbow Color */ - particles[num].b = fountain_colors[color][2]; - /* Set the position on the X axis */ - particles[num].x = 0.0f; - /* Set the position on the Y axis */ - particles[num].y = 0.0f; - /* Set the position on the Z axis */ - particles[num].z = 0.0f; - /* Random Speed On X Axis */ - particles[num].xi = xDir; - /* Random Speed On Y Axi */ - particles[num].yi = yDir; - /* Random Speed On Z Axis */ - particles[num].zi = zDir; - /* Set Horizontal Pull To Zero */ - particles[num].xg = 0.0f; - /* Set Vertical Pull Downward */ - particles[num].yg = -0.8f; - /* Set Pull On Z Axis To Zero */ - particles[num].zg = 0.0f; - flashParticleColor (num); -} - -static void -initParticle (int num, GLint color, GLfloat value) -{ - GLfloat xi, yi, zi; - xi = conf_private.xspeed + - (GLfloat) ((rand () * 60 - 30.0f) / (RAND_MAX + - 1.0) * 500 * conf_private.side * - (value + conf_private.strength)); - yi = - conf_private.yspeed + - (GLfloat) ((rand () * 100) / (RAND_MAX + 1.0) * 500 * conf_private.up * - (value + conf_private.strength)); - zi = - (GLfloat) ((rand () * 60 - 30.0f) / (RAND_MAX + - 1.0) * 500 * conf_private.side * - (value + conf_private.strength)); - ResetParticle (num, color, xi, yi, zi); -} - -static void -init_draw_mode () -{ - GLfloat ratio; - int loop; - - conf.global->transparency = TRUE; - conf.global->wireframe = FALSE; - - draw_mode = 1 + (int) (3.0 * rand () / (RAND_MAX + 1.0)); - - ratio = (GLfloat) GLWin.window_width / (GLfloat) GLWin.window_height; - - loadTexture (); - /* Enable smooth shading */ - glShadeModel (GL_SMOOTH); - - /* Set the background black */ - glClearColor (0.0f, 0.0f, 0.0f, 0.0f); - - /* Depth buffer setup */ - glClearDepth (1.0f); - - /* Enables Depth Testing */ - glDisable (GL_DEPTH_TEST); - - /* Enable Blending */ - glEnable (GL_BLEND); - - glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); - - /* Type Of Blending To Perform */ - glBlendFunc (GL_SRC_ALPHA, GL_ONE); - - /* Really Nice Perspective Calculations */ - glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - /* Really Nice Point Smoothing */ - glHint (GL_POINT_SMOOTH_HINT, GL_NICEST); - - /* Enable Texture Mapping */ - glEnable (GL_TEXTURE_2D); - /* Select Our Texture */ - glBindTexture (GL_TEXTURE_2D, texture[0]); - - /* Reset all the particles */ - if (!fountain_already_initialized) - { - for (loop = 0; loop < MAX_PARTICLES; loop++) - { - GLint color = (loop + 1) / (MAX_PARTICLES / 16); - initParticle (loop, color, (rand () * 0.5f) / (RAND_MAX + 1.0)); - } - } - fountain_already_initialized = TRUE; -} - - -static GLfloat -get_x_angle () -{ - return (5.0 + (int) (30.0 * rand () / (RAND_MAX + 1.0))); -} - -static void -draw_one_frame (gboolean beat) -{ - int loop; - if ((beat) && (conf_private.flash_on_beat)) - flash_timer = conf_private.flash_timer; - - /* If rainbow coloring is turned on, cycle the colors */ - if (conf_private.rainbow) // && ( delay > 25 ) ) - { - col++; - col = col % 16; - } - - /* Modify each of the particles */ - for (loop = 0; loop < MAX_PARTICLES; loop++) - { - /* Grab Our Particle X Position */ - GLfloat x = particles[loop].x; - /* Grab Our Particle Y Position */ - GLfloat y = particles[loop].y; - /* Particle Z Position + Zoom */ - GLfloat z = particles[loop].z; - - if ((loop < conf_private.particles) && (particles[loop].active)) - { - /* Draw The Particle Using Our RGB Values, - * Fade The Particle Based On It's Life - */ - if ((conf_private.flash_on_beat) && (flash_timer > 0)) - glColor4f (particles[loop].fr, - particles[loop].fg, - particles[loop].fb, particles[loop].life); - else if (conf_private.rainbow) - glColor4f (particles[loop].r, - particles[loop].g, - particles[loop].b, particles[loop].life); - else - { - GLfloat r, g, b; - get_color (&r, &g, &b, &datas.data1[loop % NUM_BANDS]); - glColor4f (r, g, b, particles[loop].life); - } - - /* Build Quad From A Triangle Strip */ - glBegin (GL_TRIANGLE_STRIP); - /* Top Right */ - glTexCoord2d (1, 1); - glVertex3f (x + conf_private.size, y + conf_private.size, z); - /* Top Left */ - glTexCoord2d (0, 1); - glVertex3f (x - conf_private.size, y + conf_private.size, z); - /* Bottom Right */ - glTexCoord2d (1, 0); - glVertex3f (x + conf_private.size, y - conf_private.size, z); - /* Bottom Left */ - glTexCoord2d (0, 0); - glVertex3f (x - conf_private.size, y - conf_private.size, z); - glEnd (); - - glBegin (GL_TRIANGLE_STRIP); - /* Top Right */ - glTexCoord2d (1, 1); - glVertex3f (x, y + conf_private.size, z + conf_private.size); - /* Top Left */ - glTexCoord2d (0, 1); - glVertex3f (x, y + conf_private.size, z - conf_private.size); - /* Bottom Right */ - glTexCoord2d (1, 0); - glVertex3f (x, y - conf_private.size, z + conf_private.size); - /* Bottom Left */ - glTexCoord2d (0, 0); - glVertex3f (x, y - conf_private.size, z - conf_private.size); - glEnd (); - - glBegin (GL_TRIANGLE_STRIP); - /* Top Right */ - glTexCoord2d (1, 1); - glVertex3f (x + conf_private.size, y, z + conf_private.size); - /* Top Left */ - glTexCoord2d (0, 1); - glVertex3f (x + conf_private.size, y, z - conf_private.size); - /* Bottom Right */ - glTexCoord2d (1, 0); - glVertex3f (x - conf_private.size, y, z + conf_private.size); - /* Bottom Left */ - glTexCoord2d (0, 0); - glVertex3f (x - conf_private.size, y, z - conf_private.size); - glEnd (); - } - - if (flash_timer > 0) - { - /* Move On The X Axis By X Speed */ - particles[loop].x += particles[loop].xi / - (conf_private.slowdown * 2000); - /* Move On The Y Axis By Y Speed */ - particles[loop].y += particles[loop].yi / - (conf_private.slowdown * 2000); - /* Move On The Z Axis By Z Speed */ - particles[loop].z += particles[loop].zi / - (conf_private.slowdown * 2000); - } - else - { - /* Move On The X Axis By X Speed */ - particles[loop].x += particles[loop].xi / - (conf_private.slowdown * 1000); - /* Move On The Y Axis By Y Speed */ - particles[loop].y += particles[loop].yi / - (conf_private.slowdown * 1000); - /* Move On The Z Axis By Z Speed */ - particles[loop].z += particles[loop].zi / - (conf_private.slowdown * 1000); - } - /* Take Pull On X Axis Into Account */ - particles[loop].xi += particles[loop].xg; - /* Take Pull On Y Axis Into Account */ - particles[loop].yi += particles[loop].yg; - /* Take Pull On Z Axis Into Account */ - particles[loop].zi += particles[loop].zg; - /* If the particle dies, revive it */ - /* Reduce Particles Life By 'Fade' */ - particles[loop].life -= particles[loop].fade; - - if (particles[loop].life < 0.0f) - { - if (conf_private.rainbow) - initParticle (loop, col, datas.data1[col]); - else - initParticle (loop, col, - datas. - data1[(int) - ((rand () * NUM_BANDS) / (RAND_MAX + 1.0))]); - if ((conf_private.hide_inactive) && (datas.data1[col] == 0.0f)) - particles[loop].active = FALSE; - - } - } - if (flash_timer > 0) - flash_timer--; -} - - -static void -config_read (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_get_bool (db, section_name, fountain_flash_on_beat, &conf_private.flash_on_beat); - bmp_cfg_db_get_int (db, section_name, fountain_flash_timer, &conf_private.flash_timer); - bmp_cfg_db_get_bool (db, section_name, fountain_rainbow, &conf_private.rainbow); - bmp_cfg_db_get_float (db, section_name, fountain_slowdown, &conf_private.slowdown); - bmp_cfg_db_get_float (db, section_name, fountain_xspeed, &conf_private.xspeed); - bmp_cfg_db_get_float (db, section_name, fountain_yspeed, &conf_private.yspeed); - bmp_cfg_db_get_float (db, section_name, fountain_up, &conf_private.up); - bmp_cfg_db_get_float (db, section_name, fountain_side, &conf_private.side); - bmp_cfg_db_get_float (db, section_name, fountain_strength, &conf_private.strength); - bmp_cfg_db_get_bool (db, section_name, fountain_hide_inactive, &conf_private.hide_inactive); - bmp_cfg_db_get_float (db, section_name, fountain_size, &conf_private.size); - bmp_cfg_db_get_int (db, section_name, fountain_particles, &conf_private.particles); -} - - -static void -config_write (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_set_bool (db, section_name, fountain_flash_on_beat, conf_private.flash_on_beat); - bmp_cfg_db_set_int (db, section_name, fountain_flash_timer, conf_private.flash_timer); - bmp_cfg_db_set_bool (db, section_name, fountain_rainbow, conf_private.rainbow); - bmp_cfg_db_set_float (db, section_name, fountain_slowdown, conf_private.slowdown); - bmp_cfg_db_set_float (db, section_name, fountain_xspeed, conf_private.xspeed); - bmp_cfg_db_set_float (db, section_name, fountain_yspeed, conf_private.yspeed); - bmp_cfg_db_set_float (db, section_name, fountain_up, conf_private.up); - bmp_cfg_db_set_float (db, section_name, fountain_side, conf_private.side); - bmp_cfg_db_set_float (db, section_name, fountain_strength, conf_private.strength); - bmp_cfg_db_set_bool (db, section_name, fountain_hide_inactive, conf_private.hide_inactive); - bmp_cfg_db_set_float (db, section_name, fountain_size, conf_private.size); - bmp_cfg_db_set_int (db, section_name, fountain_particles, conf_private.particles); -} - - -static void -config_default () -{ - conf_private.flash_on_beat = TRUE; - conf_private.flash_timer = 8; - - conf_private.rainbow = TRUE; - conf_private.slowdown = 2.0f; - conf_private.xspeed = 0.0f; - conf_private.yspeed = 1.0f; - conf_private.up = 0.8f; - conf_private.side = 0.2f; - conf_private.strength = 0.1f; - conf_private.hide_inactive = TRUE; - conf_private.size = 0.16f; - conf_private.particles = 1000; -} - -void -flash_toggled (GtkWidget * widget, gpointer data) -{ - conf_private_new.flash_on_beat = !conf_private_new.flash_on_beat; -} - -static void -value_flash (GtkAdjustment * adj) -{ - conf_private_new.flash_timer = (float) adj->value; -} - -void -hide_inactive_toggled (GtkWidget * widget, gpointer data) -{ - conf_private_new.hide_inactive = !conf_private_new.hide_inactive; -} - -void -rainbow_toggled (GtkWidget * widget, gpointer data) -{ - conf_private_new.rainbow = !conf_private_new.rainbow; -} - -static void -value_slowdown (GtkAdjustment * adj) -{ - conf_private_new.slowdown = (float) adj->value / 100; -} - -static void -value_up (GtkAdjustment * adj) -{ - conf_private_new.up = (float) adj->value / 100; -} - -static void -value_side (GtkAdjustment * adj) -{ - conf_private_new.side = (float) adj->value / 100; -} - -static void -value_strength (GtkAdjustment * adj) -{ - conf_private_new.strength = (float) adj->value / 100; -} - -static void -value_size (GtkAdjustment * adj) -{ - conf_private_new.size = (float) adj->value / 100; -} - -static void -value_particles (GtkAdjustment * adj) -{ - conf_private_new.particles = (float) adj->value; -} -static void -config_create (GtkWidget * vbox) -{ - GtkWidget *hbox; - GtkWidget *button; - GtkWidget *label; - GtkObject *adjustment; - GtkWidget *hscale; - - memcpy (&conf_private_new, &conf_private, sizeof (conf_private_new)); - - /* Number of particles */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Number of particles"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.particles, 1, MAX_PARTICLES, 1, 10, - 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_particles), NULL); - - /* wave on beat */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button = gtk_check_button_new_with_label ("Flash on beats"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), - conf_private_new.flash_on_beat); - gtk_signal_connect (GTK_OBJECT (button), "toggled", - GTK_SIGNAL_FUNC (flash_toggled), NULL); - - /* number of frame for the wave to propagate */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Flash propagation timer (in frames)"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.flash_timer, 1, 50, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_flash), NULL); - - /* strength for up firing */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Slowdown"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.slowdown * 100, 100, 400, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_slowdown), NULL); - - /* strength for up firing */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Strength of up firing"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.up * 100, 1, 100, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_up), NULL); - - /* strength for side firing */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Strength of side firing"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.side * 100, 1, 100, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_side), NULL); - - /* overall strength */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Strength"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.strength * 100, 1, 100, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_strength), NULL); - - /* Toggle inactive particles */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button = gtk_check_button_new_with_label ("Hide inactive particles"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), - conf_private_new.hide_inactive); - gtk_signal_connect (GTK_OBJECT (button), "toggled", - GTK_SIGNAL_FUNC (hide_inactive_toggled), NULL); - - /* Toggle rainbow */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button = gtk_check_button_new_with_label ("Rainbow colors"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), - conf_private_new.rainbow); - gtk_signal_connect (GTK_OBJECT (button), "toggled", - GTK_SIGNAL_FUNC (rainbow_toggled), NULL); - - /* size of particles */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Size of particles"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.size * 100, 1, 100, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_size), NULL); - -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_knot.c --- a/src/iris/theme_knot.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,415 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include -#include -#include -#include "iris.h" - - -static struct -{ -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static void init (void); -static void cleanup (void); -static void init_draw_mode (void); -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - - -iris_theme theme_knot = { - "Knot", - "Dancing knot", - "Pascal Brochart for Nebulus, adapted for Iris by foser", - "knot", - &conf, - &conf_new, - sizeof (conf_private), - NULL, - NULL, - NULL, - NULL, - init, - cleanup, - init_draw_mode, - get_x_angle, - draw_one_frame, -}; - - -gboolean reverse = FALSE; -GLfloat knot_time; - -typedef struct -{ - GLfloat x, y, z; -} -glcoord; - -typedef struct -{ - GLfloat r, g, b; -} -glcolors; - -typedef struct -{ - int numfaces, numverts, numsides; - GLuint faces[16 * 64 * 4 * 4]; - glcoord vertices[16 * 64]; - glcolors Colors[16 * 64]; -} -tknotobject; - -tknotobject *knotobject; - - -void -createknot (int scaling_factor1, int scaling_factor2, GLfloat radius1, - GLfloat radius2, GLfloat radius3) -{ - int count1, count2; - GLfloat alpha, beta, distance, mindistance, rotation; - GLfloat x, y, z, dx, dy, dz; - GLfloat value, modulus, dist; - int index1, index2; - - knotobject->numsides = 4; - - knotobject->numverts = 0; - alpha = 0; - for (count2 = 0; count2 < scaling_factor2; count2++) - { - alpha = alpha + 2 * M_PI / scaling_factor2; - x = radius2 * cos (2 * alpha) + radius1 * sin (alpha); - y = radius2 * sin (2 * alpha) + radius1 * cos (alpha); - z = radius2 * cos (3 * alpha); - dx = -2 * radius2 * sin (2 * alpha) + radius1 * cos (alpha); - dy = 2 * radius2 * cos (2 * alpha) - radius1 * sin (alpha); - dz = -3 * radius2 * sin (3 * alpha); - value = sqrt (dx * dx + dz * dz); - modulus = sqrt (dx * dx + dy * dy + dz * dz); - - beta = 0; - for (count1 = 0; count1 < scaling_factor1; count1++) - { - beta = beta + 2 * M_PI / scaling_factor1; - - knotobject->vertices[knotobject->numverts].x = - x - radius3 * (cos (beta) * dz - - sin (beta) * dx * dy / modulus) / value; - knotobject->vertices[knotobject->numverts].y = - y - radius3 * sin (beta) * value / modulus; - knotobject->vertices[knotobject->numverts].z = - z + radius3 * (cos (beta) * dx + - sin (beta) * dy * dz / modulus) / value; - - - dist = - sqrt (knotobject->vertices[knotobject->numverts].x * - knotobject->vertices[knotobject->numverts].x + - knotobject->vertices[knotobject->numverts].y * - knotobject->vertices[knotobject->numverts].y + - knotobject->vertices[knotobject->numverts].z * - knotobject->vertices[knotobject->numverts].z); - - knotobject->Colors[knotobject->numverts].r = - ((2 / dist) + (0.5 * sin (beta) + 0.4)) / 2.0; - knotobject->Colors[knotobject->numverts].g = - ((2 / dist) + (0.5 * sin (beta) + 0.4)) / 2.0; - knotobject->Colors[knotobject->numverts].b = - ((2 / dist) + (0.5 * sin (beta) + 0.4)) / 2.0; - - knotobject->numverts++; - } - } - - for (count1 = 0; count1 < scaling_factor2; count1++) - { - index1 = count1 * scaling_factor1; - index2 = index1 + scaling_factor1; - index2 = index2 % knotobject->numverts; - rotation = 0; - mindistance = - (knotobject->vertices[index1].x - - knotobject->vertices[index2].x) * (knotobject->vertices[index1].x - - knotobject->vertices[index2].x) + - (knotobject->vertices[index1].y - - knotobject->vertices[index2].y) * (knotobject->vertices[index1].y - - knotobject->vertices[index2].y) + - (knotobject->vertices[index1].z - - knotobject->vertices[index2].z) * (knotobject->vertices[index1].z - - knotobject->vertices[index2].z); - for (count2 = 1; count2 < scaling_factor1; count2++) - { - index2 = count2 + index1 + scaling_factor1; - if (count1 == scaling_factor2 - 1) - index2 = count2; - distance = - (knotobject->vertices[index1].x - - knotobject->vertices[index2].x) * (knotobject->vertices[index1].x - - knotobject->vertices[index2]. - x) + - (knotobject->vertices[index1].y - - knotobject->vertices[index2].y) * (knotobject->vertices[index1].y - - knotobject->vertices[index2]. - y) + - (knotobject->vertices[index1].z - - knotobject->vertices[index2].z) * (knotobject->vertices[index1].z - - knotobject->vertices[index2].z); - if (distance < mindistance) - { - mindistance = distance; - rotation = count2; - } - } - - for (count2 = 0; count2 < scaling_factor1; count2++) - { - knotobject->faces[4 * (index1 + count2) + 0] = index1 + count2; - - index2 = count2 + 1; - index2 = index2 % scaling_factor1; - knotobject->faces[4 * (index1 + count2) + 1] = index1 + index2; - - index2 = (count2 + rotation + 1); - index2 = index2 % scaling_factor1; - knotobject->faces[4 * (index1 + count2) + 2] = - (index1 + index2 + scaling_factor1) % knotobject->numverts; - - index2 = (count2 + rotation); - index2 = index2 % scaling_factor1; - - knotobject->faces[4 * (index1 + count2) + 3] = - (index1 + index2 + scaling_factor1) % knotobject->numverts; - knotobject->numfaces++; - } - } -} - - -static void -init () -{ - knotobject = (tknotobject *)malloc(sizeof(tknotobject)); - createknot (16, 64, 2, 2.0, 1.0); -} - - -static void -cleanup() -{ - free(knotobject); -} - - -static GLfloat -get_x_angle () -{ - return (10.0 + (int) (80.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -init_draw_mode () -{ - //don't think all of this really is needed here.. - glDepthFunc (GL_LESS); - glDisable (GL_NORMALIZE); - glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - - glDisable (GL_BLEND); - glEnable (GL_DEPTH_TEST); -} - - -void -recalculateknot (int scaling_factor1, int scaling_factor2, GLfloat radius1, - GLfloat radius2, GLfloat radius3) -{ - int count1, count2; - GLfloat alpha, beta; - GLfloat x, y, z, dx, dy, dz; - GLfloat value, modulus; - int index1, index2; - GLfloat distance, Mindistance, rotation; - - knotobject->numverts = 0; - alpha = 0; - for (count2 = 0; count2 < scaling_factor2; count2++) - { - alpha = alpha + 2 * M_PI / scaling_factor2; - x = radius2 * cos (2 * alpha) + radius1 * sin (alpha); - y = radius2 * sin (2 * alpha) + radius1 * cos (alpha); - z = radius2 * cos (3 * alpha); - dx = -2 * radius2 * sin (2 * alpha) + radius1 * cos (alpha); - dy = 2 * radius2 * cos (2 * alpha) - radius1 * sin (alpha); - dz = -3 * radius2 * sin (3 * alpha); - value = sqrt (dx * dx + dz * dz); - modulus = sqrt (dx * dx + dy * dy + dz * dz); - - beta = 0; - for (count1 = 0; count1 < scaling_factor1; count1++) - { - beta = beta + 2 * M_PI / scaling_factor1; - - knotobject->vertices[knotobject->numverts].x = - x - radius3 * (cos (beta) * dz - - sin (beta) * dx * dy / modulus) / value; - knotobject->vertices[knotobject->numverts].y = - y - radius3 * sin (beta) * value / modulus; - knotobject->vertices[knotobject->numverts].z = - z + radius3 * (cos (beta) * dx + - sin (beta) * dy * dz / modulus) / value; - - knotobject->numverts++; - } - } - - knotobject->numfaces = 0; - for (count1 = 0; count1 < scaling_factor2; count1++) - { - index1 = count1 * scaling_factor1; - index2 = index1 + scaling_factor1; - index2 = index2 % knotobject->numverts; - rotation = 0; - Mindistance = - (knotobject->vertices[index1].x - - knotobject->vertices[index2].x) * (knotobject->vertices[index1].x - - knotobject->vertices[index2].x) + - (knotobject->vertices[index1].y - - knotobject->vertices[index2].y) * (knotobject->vertices[index1].y - - knotobject->vertices[index2].y) + - (knotobject->vertices[index1].z - - knotobject->vertices[index2].z) * (knotobject->vertices[index1].z - - knotobject->vertices[index2].z); - for (count2 = 1; count2 < scaling_factor1; count2++) - { - index2 = count2 + index1 + scaling_factor1; - if (count1 == scaling_factor2 - 1) - index2 = count2; - distance = - (knotobject->vertices[index1].x - - knotobject->vertices[index2].x) * (knotobject->vertices[index1].x - - knotobject->vertices[index2]. - x) + - (knotobject->vertices[index1].y - - knotobject->vertices[index2].y) * (knotobject->vertices[index1].y - - knotobject->vertices[index2]. - y) + - (knotobject->vertices[index1].z - - knotobject->vertices[index2].z) * (knotobject->vertices[index1].z - - knotobject->vertices[index2].z); - if (distance < Mindistance) - { - Mindistance = distance; - rotation = count2; - } - } - - for (count2 = 0; count2 < scaling_factor1; count2++) - { - knotobject->faces[4 * (index1 + count2) + 0] = index1 + count2; - - //removes draw artifacts - //if (point_general->hide_glue) - index2 = index2 % scaling_factor1; - - knotobject->faces[4 * (index1 + count2) + 2] = - (index1 + index2 + scaling_factor1) % knotobject->numverts; - - index2 = count2 + rotation; - index2 = index2 % scaling_factor1; - - knotobject->faces[4 * (index1 + count2) + 3] = - (index1 + index2 + scaling_factor1) % knotobject->numverts; - knotobject->numfaces++; - } - } -} - - -void -draw_the_knot (void) -{ - int i, j, num; - float red, green, blue, peak; - - glBegin (GL_QUADS); - j = knotobject->numfaces * 4; - for (i = 0; i < j; i++) - { - num = knotobject->faces[i]; - - //adapted to use Iris colors - get_color (&red, &green, &blue, &peak); - glColor3f (knotobject->Colors[num].r * red, - knotobject->Colors[num].g * green, knotobject->Colors[num].b); - glVertex3f (knotobject->vertices[num].x, knotobject->vertices[num].y, - knotobject->vertices[num].z); - } - glEnd (); -} - - -void -createknotpolygons (void) -{ - if (datas.loudness > 12000) - if (reverse) - knot_time -= 12000.0f / (16.0f * config.fps); - else - knot_time += 12000.0f / (16.0f * config.fps); - else if (reverse) - knot_time -= datas.loudness / (16.0f * config.fps); - else - knot_time += datas.loudness / (16.0f * config.fps); - - recalculateknot (16, 64, 3 * sin (0.015 * knot_time) + 0.8, - 3 * cos (0.008 * knot_time) + 0.8, 1.1); - - glTranslatef (0.0f, 0.0f, 0.0f); - draw_the_knot (); -} - - -static void -draw_one_frame (gboolean beat) -{ - if (beat) - reverse = !reverse; - glPushMatrix (); - /* scale it all down to Iris sizes */ - glScalef (0.5, 0.5, 0.5); - createknotpolygons (); - glPopMatrix (); -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_original.c --- a/src/iris/theme_original.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,366 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include -#include -#include -#include "iris.h" - -GLfloat jump[16] = - { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 0.0 -}; - -xz xz1, xz2, xz3, xz4; - -static int draw_mode = 0; // the drawing mode - -static struct -{ - int draw_mode; - int angle_step; - gboolean wave_on_beat; - GLfloat wave_height; - int wave_timer; - GLfloat radius; - GLfloat interband; - GLfloat linelength; -} -conf_private, conf_private_new; - -static config_theme conf = { - (config_global *) NULL, - &conf_private -}; - -static config_theme conf_new = { - (config_global *) NULL, - &conf_private_new -}; - -static char original_draw_mode[] = "original_draw_mode"; -static char original_angle_step[] = "original_angle_step"; -static char original_wave_on_beat[] = "original_wave_on_beat"; -static char original_wave_height[] = "original_wave_height"; -static char original_wave_timer[] = "original_wave_timer"; -static char original_radius[] = "original_radius"; -static char original_interband[] = "original_interband"; -static char original_linelength[] = "original_linelength"; - -static void config_read (ConfigDb *, char *); -static void config_write (ConfigDb *, char *); -static void config_default (void); -static void config_create (GtkWidget *); -static void init_draw_mode (void); -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - -iris_theme theme_original = { - "Original", - "A 360 degrees spectrum analyzer", - "Cédric Delfosse (cdelfosse@free.fr)", - "original", - &conf, - &conf_new, - sizeof (conf_private), - config_read, - config_write, - config_default, - config_create, - NULL, - NULL, - init_draw_mode, - get_x_angle, - draw_one_frame -}; - - -static void -shift_jump () -{ - int i; - - for (i = 15; i > 0; i--) - jump[i] = jump[i - 1]; - jump[0] = 0.0; -} - - -static void -init_draw_mode () -{ - draw_mode = 1 + (int) (3.0 * rand () / (RAND_MAX + 1.0)); -} - - -static GLfloat -get_x_angle () -{ - if (draw_mode == 3) - return (45.0 + (int) (30.0 * rand () / (RAND_MAX + 1.0))); - else - return (55.0 + (int) (35.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -draw_one_frame (gboolean beat) -{ - static unsigned int cpt = 0; - static float a = 1.0; - static float b = 1.0; - int d = 0; - float step; - float rad = (float) ((2 * M_PI * d) / 360); - float cosv = a * (float) cos (rad); - float sinv = b * (float) sin (rad); - - if ((conf_private.wave_on_beat) && (beat)) - jump[0] = conf_private.wave_height; - - - glBegin (GL_QUADS); - for (d = 0, step = 0; d < 360; d = d + conf_private.angle_step) - { - int l; - float rad2 = (float) ((2 * M_PI * (d + conf_private.angle_step)) / 360); - float cosv2 = a * (float) cos (rad2); - float sinv2 = b * (float) sin (rad2); - - for (l = 0; l < 16; l++) - { - int i; - GLfloat red, green, blue; - xz xz1, xz2, xz3, xz4; - - GLfloat y; - GLfloat u = (float) (l * conf_private.interband * cosv); - GLfloat v = (float) (l * conf_private.interband * sinv); - GLfloat u2 = (float) (l * conf_private.interband * cosv2); - GLfloat v2 = (float) (l * conf_private.interband * sinv2); - - xz1.x = u + (conf_private.radius + conf_private.linelength) * cosv; - xz1.z = v + (conf_private.radius + conf_private.linelength) * sinv; - xz2.x = u + conf_private.radius * cosv; - xz2.z = v + conf_private.radius * sinv; - xz3.x = - u2 + (conf_private.radius + conf_private.linelength) * cosv2; - xz3.z = - v2 + (conf_private.radius + conf_private.linelength) * sinv2; - xz4.x = u2 + conf_private.radius * cosv2; - xz4.z = v2 + conf_private.radius * sinv2; - - // calculate the height of the bar - // this makes a fade with the past drawn values - for (i = 0, y = 0; i < conf_private.angle_step; i++) - y += datas.data360[d + i][l]; - y /= (float) conf_private.angle_step; - - // get the color associated with the height of the bar - if (y != 0.0) - get_color (&red, &green, &blue, &y); - else - break; // we draw nothing if the signal is null - - y *= 4; // should be in the config ? - - if (conf_private.wave_on_beat) - y += jump[l]; - - switch (draw_mode) - { - case 1: - // draw a bar - { - glColor4f (red / 2, green / 2, blue / 2, 0.3); - bar_side (y, &xz1, &xz2); - bar_side (y, &xz3, &xz4); - bar_side (y, &xz1, &xz3); - bar_side (y, &xz2, &xz4); - if (jump[l]) - glColor4f (config.color_flash_red, config.color_flash_green, - config.color_flash_blue, 0.3); - else - glColor4f (red, green, blue, 0.3); - bar_top_or_bottom (y, &xz1, &xz2, &xz3, &xz4); - - break; - } - case 2: - // draw only the top of a bar - { - if (jump[l]) - glColor4f (config.color_flash_red, config.color_flash_green, - config.color_flash_blue, 0.3); - else - glColor4f (red, green, blue, 0.3); - bar_top_or_bottom (y, &xz1, &xz2, &xz3, &xz4); - - break; - } - case 3: - // draw only a side of a bar - { - if (jump[l]) - glColor4f (config.color_flash_red, config.color_flash_green, - config.color_flash_blue, 0.3); - else - glColor4f (red, green, blue, 0.3); - bar_side (y, &xz3, &xz4); - - break; - } - case 4: - //draw only another side of a bar - { - if (jump[l]) - glColor4f (config.color_flash_red, config.color_flash_green, - config.color_flash_blue, 0.3); - else - glColor4f (red, green, blue, 0.3); - bar_side (y, &xz1, &xz3); - - break; - } - - } // switch - - } // for(l=0 - - rad = rad2; - cosv = cosv2; - sinv = sinv2; - - } // for(d=0 - - if (!cpt) - { - shift_jump (); - cpt = conf_private.wave_timer; - } - cpt--; - - glEnd (); - -} - - -static void -config_read (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_get_int (db, section_name, original_draw_mode, &conf_private.draw_mode); - bmp_cfg_db_get_int (db, section_name, original_angle_step, &conf_private.angle_step); - bmp_cfg_db_get_bool (db, section_name, original_wave_on_beat, &conf_private.wave_on_beat); - bmp_cfg_db_get_float (db, section_name, original_wave_height, &conf_private.wave_height); - bmp_cfg_db_get_int (db, section_name, original_wave_timer, &conf_private.wave_timer); - bmp_cfg_db_get_float (db, section_name, original_radius, &conf_private.radius); - bmp_cfg_db_get_float (db, section_name, original_interband, &conf_private.interband); - bmp_cfg_db_get_float (db, section_name, original_linelength, &conf_private.linelength); -} - - -static void -config_write (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_set_int (db, section_name, original_draw_mode, conf_private.draw_mode); - bmp_cfg_db_set_int (db, section_name, original_angle_step, conf_private.angle_step); - bmp_cfg_db_set_bool (db, section_name, original_wave_on_beat, conf_private.wave_on_beat); - bmp_cfg_db_set_float (db, section_name, original_wave_height, conf_private.wave_height); - bmp_cfg_db_set_int (db, section_name, original_wave_timer, conf_private.wave_timer); - bmp_cfg_db_set_float (db, section_name, original_radius, conf_private.radius); - bmp_cfg_db_set_float (db, section_name, original_interband, conf_private.interband); - bmp_cfg_db_set_float (db, section_name, original_linelength, conf_private.linelength); -} - - -static void -config_default () -{ - conf_private.draw_mode = 2; - conf_private.angle_step = 8; - conf_private.wave_on_beat = TRUE; - conf_private.wave_height = 0.5; - conf_private.wave_timer = 5; - conf_private.radius = 0.4; - conf_private.interband = 0.25; - conf_private.linelength = 0.11; -} - - -void -jumpbeat_toggled (GtkWidget * widget, gpointer data) -{ - conf_private_new.wave_on_beat = !conf_private_new.wave_on_beat; -} - - -static void -value_jump_speed (GtkAdjustment * adj) -{ - conf_private_new.wave_timer = (int) adj->value; -} - - -static void -config_create (GtkWidget * vbox) -{ - GtkWidget *hbox; - GtkWidget *button; - GtkWidget *label; - GtkObject *adjustment; - GtkWidget *hscale; - - memcpy (&conf_private_new, &conf_private, sizeof (conf_private_new)); - - /* wave on beat */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button = gtk_check_button_new_with_label ("Wave on beats"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), - conf_private_new.wave_on_beat); - gtk_signal_connect (GTK_OBJECT (button), "toggled", - GTK_SIGNAL_FUNC (jumpbeat_toggled), NULL); - - /* number of frame for the wave to propagate */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Wave propagation timer (in frames)"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.wave_timer, 1, 50, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (value_jump_speed), NULL); -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_pinwheel.c --- a/src/iris/theme_pinwheel.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,407 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -/* New Theme created by Ron Lockwood-Childs - * Looks best when alpha blending is on - */ - -/* $Id: theme_pinwheel.c,v 1.5 2002/05/16 20:38:17 cedric Exp $ */ - -#include -#include -#include -#include -#include -#include -#include -#include "iris.h" - -#define NUM_PER_RING 8 -#define GAP (M_PI_4) - -#define RANDOM_HEIGHT_COUNTDOWN 60 - - -static struct -{ - gboolean height_random; - gfloat height_set; - gfloat height; - gfloat num_sections; -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); -static void config_read (ConfigDb *, char *); -static void config_write (ConfigDb *, char *); -static void config_default (void); -static void config_create (GtkWidget *); - - -static char pinwheel_numsec[] = "pinwheel_numsec"; -static char pinwheel_hrandom[] = "pinwheel_hrandom"; -static char pinwheel_hset[] = "pinwheel_hset"; - - -iris_theme theme_pinwheel = { - "PinWheel", - "A spectrum of pinwheels", - "Ron Lockwood-Childs", - "pinwheel", - &conf, - &conf_new, - sizeof (conf_private), - config_read, - config_write, - config_default, - config_create, - NULL, - NULL, - NULL, - get_x_angle, - draw_one_frame, -}; - - -static time_t time_random = 0; // timer for random height mode - -static GLfloat data2[NUM_BANDS]; // previous freq band data -static GLfloat angle[NUM_BANDS]; // previous angle data -static GLfloat radii[NUM_BANDS + 2] = - { 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f, 3.0f, 3.5f, - 4.0f, 4.5f, 5.0f, 5.5f, 6.0f, 6.5f, 7.0f, 7.5f, - 8.0f -}; - - -static GLfloat -get_x_angle () -{ - return (10.0 + (int) (80.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -set_height (void) -{ - time_t cur_time = time (NULL); // current time - - if (conf_private.height_random) - { - /* we are in random height mode, see if it time to change height */ - if (cur_time - time_random > RANDOM_HEIGHT_COUNTDOWN) - { - /* generate float 1 <= x <= 3 */ - conf_private.height = ((gfloat) rand () * 2.0 / RAND_MAX) + 1.0; - - /* reset timer for when to generate new random height */ - time_random = time (NULL); - } - } - else - { - conf_private.height = conf_private.height_set; - } -} - - -static void -draw_one_frame (gboolean beat) -{ - int t1, t2; // loop vars - GLfloat red, green, blue; - GLfloat z = 0.0; - GLfloat scaler = 2.0f; // scales the whole field - lower is bigger - GLfloat scaleh; // height of the bar - lower is smaller - GLfloat xin_up, zin_up, xin_dn, zin_dn, xot_up, zot_up, xot_dn, zot_dn; - GLfloat rin, rot; // radius of inner and outer edges of p-gram - GLfloat angle_up, angle_dn; // angles of top and bottom of p-gram - GLfloat differ; // holds the angle increment - GLfloat maxdropoff = 0.05; // smooth changes in heights - GLfloat angle_step; - - /* update bar height (could be changing randomly over time) */ - set_height (); - scaleh = conf_private.height; - - /* internal routine to shift all data when a new datarow arrives */ - for (t1 = 0; t1 < 16; t1++) - { - differ = data2[t1] - datas.data1[t1]; - // Rotate counter c.w. if differ positive, c.w. if negative - angle[t1] += (differ * M_PI_4 / 3.0f); // max angle change = +/- PI/12 - if (angle[t1] > (2.0f * M_PI)) - { // cap angle at 360 - angle[t1] -= (2.0f * M_PI); - } - else if (angle[t1] < 0) - { // keep angle positive - angle[t1] += (2.0f * M_PI); - } - - // smooth bar height changes - if (datas.data1[t1] > data2[t1]) - { - if ((datas.data1[t1] - data2[t1]) > maxdropoff) - data2[t1] += maxdropoff; - else - data2[t1] += datas.data1[t1]; - } - else if (datas.data1[t1] < data2[t1]) - { - if ((data2[t1] - datas.data1[t1]) > maxdropoff) - data2[t1] -= maxdropoff; - else - data2[t1] -= datas.data1[t1]; - } - } - - glBegin (GL_QUADS); - - for (t1 = 0; t1 < 16; t1++) - { // iterate thru rings - - // calculate inner and outer radius for this ring of p-grams - rin = (radii[t1 + 1] - ((radii[1] - radii[0]) / 2.0f)) / scaler; - rot = (radii[t1 + 1] + ((radii[1] - radii[0]) / 2.0f)) / scaler; - for (t2 = 0; t2 < conf_private.num_sections; t2++) - { // iterate thru bars in a single ring - - angle_step = - angle[t1] + (t2 * 2 * M_PI / conf_private.num_sections); - if (angle_step > (M_PI * 2)) - angle_step -= (M_PI * 2); - else if (angle_step < 0) - angle_step += (M_PI * 2); - // calculate upper and lower angles for this p-gram - angle_up = angle_step + (M_PI_2 / 9.0f); - angle_dn = angle_step - (M_PI_2 / 9.0f); - // now figure out all the p-gram vertices - xin_dn = cos (angle_dn) * rin; - zin_dn = sin (angle_dn) * rin; - xin_up = cos (angle_up) * rin; - zin_up = sin (angle_up) * rin; - xot_dn = cos (angle_dn) * rot; - zot_dn = sin (angle_dn) * rot; - xot_up = cos (angle_up) * rot; - zot_up = sin (angle_up) * rot; - - // now start drawin' - // start with the front, then left, back, right, finally the top - - // "front" - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xot_dn, data2[t1] * scaleh, zot_dn); // "top-right" - - get_color (&red, &green, &blue, &z); // bottom color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xot_dn, z, zot_dn); // "bottom-right" - glVertex3f (xin_dn, z, zin_dn); // "bottom-left" - - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xin_dn, data2[t1] * scaleh, zin_dn); // "top-left" - - // "left" - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xin_dn, data2[t1] * scaleh, zin_dn); // "top-out" - - get_color (&red, &green, &blue, &z); // bottom color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xin_dn, z, zin_dn); // "bottom-out" - glVertex3f (xin_up, z, zin_up); // "bottom-in" - - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xin_up, data2[t1] * scaleh, zin_up); // "top-in" - - // "back" - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xin_up, data2[t1] * scaleh, zin_up); // "top-left" - - get_color (&red, &green, &blue, &z); // bottom color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xin_up, z, zin_up); // "bottom-left" - glVertex3f (xot_up, z, zot_up); // "bottom-right" - - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xot_up, data2[t1] * scaleh, zot_up); // "top-right" - - // "right" - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xot_up, data2[t1] * scaleh, zot_up); // "top-in" - - get_color (&red, &green, &blue, &z); // bottom color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xot_up, z, zot_up); // "bottom-in" - glVertex3f (xot_dn, z, zot_dn); // "bottom-out" - - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xot_dn, data2[t1] * scaleh, zot_dn); // "top-out" - - // "top" - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - glVertex3f (xot_dn, data2[t1] * scaleh, zot_dn); // "out-right" - glVertex3f (xin_dn, data2[t1] * scaleh, zin_dn); // "out-left" - glVertex3f (xin_up, data2[t1] * scaleh, zin_up); // "in-left" - glVertex3f (xot_up, data2[t1] * scaleh, zot_up); // "in-right" - - } - } - - glEnd (); - -} - - -static void -config_read (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_get_float (db, section_name, pinwheel_numsec, &conf_private.num_sections); - bmp_cfg_db_get_bool (db, section_name, pinwheel_hrandom, &conf_private.height_random); - bmp_cfg_db_get_float (db, section_name, pinwheel_hset, &conf_private.height_set); -} - - -static void -config_write (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_set_float (db, section_name, pinwheel_numsec, conf_private.num_sections); - bmp_cfg_db_set_bool (db, section_name, pinwheel_hrandom, conf_private.height_random); - bmp_cfg_db_set_float (db, section_name, pinwheel_hset, conf_private.height_set); -} - - -static void -config_default () -{ - conf_private.num_sections = 8.0; - conf_private.height_random = FALSE; - conf_private.height_set = 2.0; - conf_private.height = 2.0; -} - - -static void -sections_changed (GtkAdjustment * adj) -{ - conf_private_new.num_sections = (int) adj->value; -} - - -static void -height_changed (GtkAdjustment * adj) -{ - conf_private_new.height_set = (int) adj->value; -} - - -static void -height_toggled (GtkWidget * widget, GtkScale * height_scale) -{ - conf_private_new.height_random = !conf_private_new.height_random; - gtk_widget_set_sensitive (GTK_WIDGET (height_scale), - !conf_private_new.height_random); -} - - -static void -config_create (GtkWidget * vbox) -{ - GtkWidget *hbox; - GtkWidget *button; - GtkWidget *label; - GtkObject *adjustment; - GtkWidget *hscale; - - memcpy (&conf_private_new, &conf_private, sizeof (conf_private)); - - /* number sections per ring */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Number sections per ring"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.num_sections, 4, 20, 1, 5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 0); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (sections_changed), NULL); - - /* random max height */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button = gtk_check_button_new_with_label ("Random height"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), - conf_private_new.height_random); - - /* explicitly set max height */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Maximum height"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.height_set, 1, 3, 0.1, 1, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 1); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_set_sensitive (GTK_WIDGET (hscale), - !conf_private_new.height_random); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (height_changed), NULL); - - /* slider gets enabled/disabled according to random setting */ - gtk_signal_connect (GTK_OBJECT (button), "toggled", - GTK_SIGNAL_FUNC (height_toggled), GTK_SCALE (hscale)); -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_pipes.c --- a/src/iris/theme_pipes.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,368 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -/* New Theme created by Ron Lockwood-Childs - * Looks best when alpha blending is on - */ - -/* $Id: theme_pipes.c,v 1.5 2002/05/16 20:38:17 cedric Exp $ */ - -#include -#include -#include -#include -#include -#include -#include "iris.h" - -#define NUM_BANDS 16 -#define REPEAT 5 -#define CIRCLE_POINTS 12 -#define PIPE_DIAMETER 0.25f -#define PIPE_THICKNESS 0.10f -#define PIPE_ANGLE (45.0f / (float)NUM_BANDS) -#define PIPE_RING_ANGLE (300.0f / (float)NUM_BANDS) -#define PIPE_RING_RADIUS(side) (side / (2.0f * sin( PIPE_RING_ANGLE / 2.0f ))) - - -static struct -{ - gfloat slope; - gfloat length; -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); -static void config_read (ConfigDb *, char *); -static void config_write (ConfigDb *, char *); -static void config_default (void); -static void config_create (GtkWidget *); - - -static char pipes_slope[] = "pipes_slope"; -static char pipes_length[] = "pipes_length"; - - -iris_theme theme_pipes = { - "Pipes", - "Coral spectrum", - "Ron Lockwood-Childs", - "pipes", - &conf, - &conf_new, - sizeof (conf_private), - config_read, - config_write, - config_default, - config_create, - NULL, - NULL, - NULL, - get_x_angle, - draw_one_frame, -}; - - -typedef struct -{ - GLfloat x_n; - GLfloat z_n; -} -rectangular; - - -GLfloat data2[NUM_BANDS]; // previous freq band data - - -static GLfloat -get_x_angle () -{ - return (55.0 + (int) (35.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -draw_one_frame (gboolean beat) -{ - int t1, t2, t3; // loop vars - GLfloat red, green, blue; - GLfloat y = 0.0; -// GLfloat circumference; // loop var around cylinder - // store each set of points around the center of the cylinder - rectangular outer_cylinder[CIRCLE_POINTS]; // each y, z around outer circle - rectangular inner_cylinder[CIRCLE_POINTS]; // each y, z around inner circle - rectangular ring_of_pipes[NUM_BANDS]; // for wrapping pipes in a circle - GLfloat differ; // holds the angle increment - GLfloat maxdropoff = 0.05; // smooth changes in heights - GLfloat angle_step; -// GLfloat adj_x; // bar height adjustment - GLfloat repeat_index_adj; // adj for repeating NUM_BANDS bars around spiral - int next_point; - static int first_time = 0; - - for (t1 = 0, angle_step = 0; - t1 < CIRCLE_POINTS; - t1++, angle_step += ((M_PI * 2) / (float) CIRCLE_POINTS)) - { // get each point of each "circle" (more like a polygon) - outer_cylinder[t1].x_n = cos (angle_step) * (PIPE_DIAMETER / 2.0f); - outer_cylinder[t1].z_n = sin (angle_step) * (PIPE_DIAMETER / 2.0f); - inner_cylinder[t1].x_n = cos (angle_step) * - ((PIPE_DIAMETER - PIPE_THICKNESS) / 2.0f); - inner_cylinder[t1].z_n = sin (angle_step) * - ((PIPE_DIAMETER - PIPE_THICKNESS) / 2.0f); - } - for (t1 = 0; t1 < NUM_BANDS; t1++) - { - // smooth out the pipe length changes - differ = datas.data1[t1] - data2[t1]; // calculate change in amplitude - if (fabs (differ) > maxdropoff) - { - if (differ > 0) - data2[t1] += maxdropoff; - else if (differ < 0) - data2[t1] -= maxdropoff; - } - else - { - data2[t1] += differ; - } - // work out the pipe placement - ring_of_pipes[t1].x_n = cos (t1 * PIPE_RING_ANGLE) * 2; - ring_of_pipes[t1].z_n = sin (t1 * PIPE_RING_ANGLE) * 2; - } - - for (t3 = 0; t3 < REPEAT; t3++) - { - for (t1 = 0; t1 < NUM_BANDS; t1++) - { // iterate thru each pipe - - glPushMatrix (); - repeat_index_adj = t1 + (t3 * NUM_BANDS); - // now alter the model view matrix to put the pipe in the right position - glRotatef (PIPE_RING_ANGLE * repeat_index_adj, 0.0f, 0.5f, 0.0f); - glTranslatef (0.5f + (0.05f * repeat_index_adj), - (conf_private.slope * repeat_index_adj), 0); - glRotatef (-1 * PIPE_ANGLE * repeat_index_adj, 0.0f, 0.0f, 1.0f); - - glBegin (GL_QUADS); - // draw each cylinder segment, from one end of the pipe to the other - for (t2 = 0; t2 < CIRCLE_POINTS; t2++) - { - if (t2 >= (CIRCLE_POINTS - 1)) - next_point = 0; - else - next_point = t2 + 1; - // current angle to angle + PI / # of points - // can draw both inner and outer cylinder segments per angle - // also: split pipe height so we can do - // color 2 -> color 1 -> color 2 along its height - - // top half of outer pipe segment - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - // "top-left" - glVertex3f (outer_cylinder[t2].x_n, - data2[t1] * conf_private.length, - outer_cylinder[t2].z_n); - - get_color (&red, &green, &blue, &y); // bottom color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - // "middle-left" - glVertex3f (outer_cylinder[t2].x_n, - 0.0f, outer_cylinder[t2].z_n); - // "middle-right" - glVertex3f (outer_cylinder[next_point].x_n, - 0.0f, outer_cylinder[next_point].z_n); - - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - // "top-right" - glVertex3f (outer_cylinder[next_point].x_n, - data2[t1] * conf_private.length, - outer_cylinder[next_point].z_n); - - // top half of inner pipe segment - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - // "top-left" - glVertex3f (inner_cylinder[t2].x_n, - data2[t1] * conf_private.length, - inner_cylinder[t2].z_n); - - get_color (&red, &green, &blue, &y); // bottom color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - // "middle-left" - glVertex3f (inner_cylinder[t2].x_n, - 0.0f, inner_cylinder[t2].z_n); - // "middle-right" - glVertex3f (inner_cylinder[next_point].x_n, - 0.0f, inner_cylinder[next_point].z_n); - - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - // "top-right" - glVertex3f (inner_cylinder[next_point].x_n, - data2[t1] * conf_private.length, - inner_cylinder[next_point].z_n); - - // now "cap" the ends of the pipe - - // cap "top" of pipe - get_color (&red, &green, &blue, &data2[t1]); // top color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - // "outer-bottom" - glVertex3f (outer_cylinder[t2].x_n, - data2[t1] * conf_private.length, - outer_cylinder[t2].z_n); - // "inner-bottom" - glVertex3f (inner_cylinder[t2].x_n, - data2[t1] * conf_private.length, - inner_cylinder[t2].z_n); - // "inner-top" - glVertex3f (inner_cylinder[next_point].x_n, - data2[t1] * conf_private.length, - inner_cylinder[next_point].z_n); - // "outer-top" - glVertex3f (outer_cylinder[next_point].x_n, - data2[t1] * conf_private.length, - outer_cylinder[next_point].z_n); - - // cap "bottom" of pipe - get_color (&red, &green, &blue, &y); // bottom color - glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f); - // "outer-bottom" - glVertex3f (outer_cylinder[t2].x_n, - 0.0f, outer_cylinder[t2].z_n); - // "inner-bottom" - glVertex3f (inner_cylinder[t2].x_n, - 0.0f, inner_cylinder[t2].z_n); - // "inner-top" - glVertex3f (inner_cylinder[next_point].x_n, - 0.0f, inner_cylinder[next_point].z_n); - // "outer-top" - glVertex3f (outer_cylinder[next_point].x_n, - 0.0f, outer_cylinder[next_point].z_n); - } - glEnd (); // specify each pipe separately - glPopMatrix (); - } - } - - - first_time++; -} - - -static void -config_read (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_get_float (db, section_name, pipes_slope, &conf_private.slope); - bmp_cfg_db_get_float (db, section_name, pipes_length, &conf_private.length); -} - - -static void -config_write (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_set_float (db, section_name, pipes_slope, conf_private.slope); - bmp_cfg_db_set_float (db, section_name, pipes_length, conf_private.length); -} - - -static void -config_default () -{ - conf_private.slope = -0.05; - conf_private.length = 1.5; -} - - -static void -slope_changed (GtkAdjustment * adj) -{ - conf_private_new.slope = (float) adj->value; -} - - -static void -length_changed (GtkAdjustment * adj) -{ - conf_private_new.length = (float) adj->value; -} - - -static void -config_create (GtkWidget * vbox) -{ - GtkWidget *hbox; - GtkWidget *label; - GtkObject *adjustment; - GtkWidget *hscale; - - memcpy (&conf_private_new, &conf_private, sizeof (conf_private)); - - /* slope in vertical direction */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Rate of descent/ascent (vertical slope)"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.slope, -0.05, 0.05, 0.001, 0.01, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 2); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (slope_changed), NULL); - - /* length of each pipe */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - label = gtk_label_new ("Pipe length"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4); - - adjustment = - gtk_adjustment_new (conf_private_new.length, 0.5, 3.5, 0.1, 0.5, 0); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_scale_set_digits (GTK_SCALE (hscale), 1); - gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25); - gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (length_changed), NULL); -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_pyramid.c --- a/src/iris/theme_pyramid.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,140 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include -#include -#include -#include "iris.h" - - -static struct -{ -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - - -iris_theme theme_pyramid = { - "Pyramid", - "Pyramid shaped spectrum", - "Marinus Schraal (foser@sesmar.eu.org)", - "pyramid", - &conf, - &conf_new, - sizeof (conf_private), - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - get_x_angle, - draw_one_frame, -}; - - -static GLfloat -get_x_angle () -{ - return (10.0 + (int) (30.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -draw_one_frame (gboolean beat) -{ - GLfloat scale = 2.0; // scales the whole squares, higher is bigger - GLfloat x, height = -4, oldheight; - GLfloat red, green, blue; - static GLfloat data[16]; // where the spectrum values are stored - int l; - - for (l = 0; l < 16; l++) - { - if (datas.data1[l] > data[l]) - data[l] = datas.data1[l]; - else - data[l] -= 0.015; - if (data[l] < 0.0) - data[l] = 0.0; - } - - glBegin (GL_QUADS); - for (l = 0; l < 16; l++) - { - x = data[l] * scale; - oldheight = height; - height = height + 0.4; - - if (data[l] > 0.0) - { - get_color (&red, &green, &blue, &data[l]); - glColor4f (red, green, blue, 0.75); - - /* sides */ - //top right - glVertex3f (x, height, x); // top right (front) - glVertex3f (x, oldheight, x); //bottom right - glVertex3f (x, oldheight, -x); //bottom left - glVertex3f (x, height, -x); // top left - //top left - glVertex3f (x, height, -x); // top right (front) - glVertex3f (x, oldheight, -x); //bottom right - glVertex3f (-x, oldheight, -x); //bottom left - glVertex3f (-x, height, -x); // top left - //bottom left - glVertex3f (-x, height, -x); // top right (front) - glVertex3f (-x, oldheight, -x); //bottom right - glVertex3f (-x, oldheight, x); //bottom left - glVertex3f (-x, height, x); // top left - - //bottom right - glVertex3f (-x, height, x); // top right (front) - glVertex3f (-x, oldheight, x); //bottom right - glVertex3f (x, oldheight, x); //bottom left - glVertex3f (x, height, x); // top left - - get_color (&red, &green, &blue, &data[l]); - glColor4f (red, green, blue, 0.5); - /* top */ - glVertex3f (x, height, x); // Top Right Of The Quad (Bottom) - glVertex3f (x, height, -x); // Top Left Of The Quad (Bottom) - glVertex3f (-x, height, -x); // Bottom Left Of The Quad (Bottom) - glVertex3f (-x, height, x); // Bottom Right Of The Quad (Bottom) - - } - } - - glEnd (); - -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_spectrotoy.c --- a/src/iris/theme_spectrotoy.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,165 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include -#include -#include -#include "iris.h" - -static struct -{ -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - - -iris_theme theme_spectrotoy = { - "Spectrotoy", - "Seashell shaped spectrum", - "Cédric Delfosse (cdelfosse@free.fr)", - "spectrotoy", - &conf, - &conf_new, - sizeof (conf_private), - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - get_x_angle, - draw_one_frame, -}; - - -static GLfloat -get_x_angle () -{ - return (65.0 + (int) (25.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -draw_one_frame (gboolean beat) -{ - unsigned int step; - GLfloat x1, x2, y1, y2, x3, y3, x4, y4; - GLfloat y; - GLfloat red, green, blue; - static GLfloat data[16]; // where the spectrum values are stored - - for (step = 0; step < 16; step++) - { - if (datas.data1[step] > data[step]) - data[step] = datas.data1[step]; - else - data[step] -= 0.02; - if (data[step] < 0.0) - data[step] = 0.0; - } - data[16] = data[0]; - - glBegin (GL_TRIANGLES); - - x1 = 0.5 * cos (0); - y1 = 0.5 * sin (0); - - x2 = (0.5 + data[0] * 3) * cos (0); - y2 = (0.5 + data[0] * 3) * sin (0); - - for (step = 0; step < 17; step++) - { - y = data[step] * 3; - - x3 = 0.5 * cos (step * 2 * M_PI / 16); - y3 = 0.5 * sin (step * 2 * M_PI / 16); - - x4 = (0.5 + y) * cos (step * 2 * M_PI / 16); - y4 = (0.5 + y) * sin (step * 2 * M_PI / 16); - - get_color (&red, &green, &blue, &data[step]); - - /* a side */ - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1, 0, y1); - glVertex3f (x2, 0, y2); - glVertex3f (x2, y, y2); - glVertex3f (x2, y, y2); - glVertex3f (x1, y, y1); - glVertex3f (x1, 0, y1); - - /* another side */ - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x3, 0, y3); - glVertex3f (x4, 0, y4); - glVertex3f (x4, y, y4); - glVertex3f (x4, y, y4); - glVertex3f (x3, y, y3); - glVertex3f (x3, 0, y3); - - /* side in */ - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1, 0, y1); - glVertex3f (x3, 0, y3); - glVertex3f (x3, y, y3); - glVertex3f (x3, y, y3); - glVertex3f (x1, y, y1); - glVertex3f (x1, 0, y1); - - /* side out */ - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x4, 0, y4); - glVertex3f (x2, 0, y2); - glVertex3f (x2, y, y2); - glVertex3f (x2, y, y2); - glVertex3f (x4, y, y4); - glVertex3f (x4, 0, y4); - - /* top */ - glColor4f (red, green, blue, 0.5); - glVertex3f (x1, y, y1); - glVertex3f (x2, y, y2); - glVertex3f (x3, y, y3); - glVertex3f (x3, y, y3); - glVertex3f (x2, y, y2); - glVertex3f (x4, y, y4); - - x1 = x3; - y1 = y3; - x2 = x4; - y2 = y4; - } - - glEnd (); - -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_spectrum.c --- a/src/iris/theme_spectrum.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,278 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include -#include -#include -#include "iris.h" - - -static char spectrum_proportional[] = "spectrum_proportional"; - -static GLfloat peak[16]; // where the peak values are stored - -static struct -{ - gboolean proportional; -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static void config_read (ConfigDb *, char *); -static void config_write (ConfigDb *, char *); -static void config_default (void); -static void config_create (GtkWidget *); -static void init_draw_mode (void); -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - - -iris_theme theme_spectrum = { - "Spectrum", - "A simple spectrum", - "Cédric Delfosse (cdelfosse@free.fr)", - "spectrum", - &conf, - &conf_new, - sizeof (conf_private), - config_read, - config_write, - config_default, - config_create, - NULL, - NULL, - init_draw_mode, - get_x_angle, - draw_one_frame, -}; - - -static void -init_draw_mode () -{ - memset (peak, 0x00, 16); -} - - -static GLfloat -get_x_angle () -{ - return (10.0 + (int) (80.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -draw_one_frame (gboolean beat) -{ - GLfloat x1, x2; - GLfloat bar_length = 0.30; - GLfloat bar_distance = 0.1; - GLfloat bar_deep = 1.5; - GLfloat y, y2; - GLfloat red, green, blue; - GLfloat z = 0.0; - static GLfloat data[16]; // where the spectrum values are stored - int l; - - for (l = 0; l < 16; l++) - { - if (datas.data1[l] > data[l]) - data[l] = datas.data1[l]; - else - data[l] -= 0.015; - if (data[l] < 0.0) - data[l] = 0.0; - } - - glBegin (GL_TRIANGLES); - - x1 = -(bar_length * 16.0 + bar_distance * 15.0) / 2.0; - x2 = x1 + bar_length; - - for (l = 0; l < 16; l++) - { - GLfloat width; - y = data[l] * 4; - - if (peak[l] < data[l]) - { - peak[l] = data[l]; - if (beat) - peak[l] += 0.2; - } - else - peak[l] -= 0.007; - if (conf_private.proportional) - width = peak[l]; - else - width = bar_deep / 2; - if (peak[l] < 0.0) - peak[l] = 0.0; - else - { - y2 = peak[l] * 4 + 0.1; - get_color (&red, &green, &blue, &peak[l]); - glColor4f (red * 1.5, green * 1.5, blue * 1.5, 0.8); - glVertex3f (x1, y2, -width); - glVertex3f (x2, y2, -width); - glVertex3f (x2, y2, +width); - glVertex3f (x2, y2, +width); - glVertex3f (x1, y2, -width); - glVertex3f (x1, y2, +width); - } - - if (y > 0.0) - { - /* one side */ - get_color (&red, &green, &blue, &data[l]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1, y, -width); - glVertex3f (x2, y, -width); - - get_color (&red, &green, &blue, &z); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1, 0, -width); - glVertex3f (x1, 0, -width); - glVertex3f (x2, 0, -width); - - get_color (&red, &green, &blue, &data[l]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x2, y, -width); - - /* top */ - glColor4f (red, green, blue, 0.5); - glVertex3f (x1, y, -width); - glVertex3f (x2, y, -width); - glVertex3f (x2, y, +width); - glVertex3f (x2, y, +width); - glVertex3f (x1, y, -width); - glVertex3f (x1, y, +width); - - /* other side */ - get_color (&red, &green, &blue, &data[l]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1, y, width); - glVertex3f (x2, y, width); - - get_color (&red, &green, &blue, &z); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1, 0, width); - glVertex3f (x1, 0, width); - glVertex3f (x2, 0, width); - - get_color (&red, &green, &blue, &data[l]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x2, y, width); - - /**/ glVertex3f (x1, y, +width); - glVertex3f (x1, y, -width); - - get_color (&red, &green, &blue, &z); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1, 0, -width); - - glVertex3f (x1, 0, -width); - glVertex3f (x1, 0, +width); - - get_color (&red, &green, &blue, &data[l]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1, y, +width); - - /**/ glVertex3f (x2, y, +width); - glVertex3f (x2, y, -width); - - get_color (&red, &green, &blue, &z); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x2, 0, -width); - - glVertex3f (x2, 0, -width); - glVertex3f (x2, 0, +width); - - get_color (&red, &green, &blue, &data[l]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x2, y, +width); - } - - x1 += bar_length + bar_distance; - x2 += bar_length + bar_distance; - - } - - glEnd (); - -} - - -static void -config_read (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_get_bool (db, section_name, spectrum_proportional, &conf_private.proportional); -} - -static void -config_write (ConfigDb * db, char *section_name) -{ - bmp_cfg_db_set_bool (db, section_name, spectrum_proportional, conf_private.proportional); -} - -static void -config_default () -{ - conf_private.proportional = TRUE; -} - - -static void -proportional_toggled (GtkWidget * widget, gpointer data) -{ - conf_private_new.proportional = !conf_private_new.proportional; -} - - -static void -config_create (GtkWidget * vbox) -{ - GtkWidget *hbox; - GtkWidget *button; - - memcpy (&conf_private_new, &conf_private, sizeof (conf_private_new)); - - /* proportional mode */ - hbox = gtk_hbox_new (FALSE, 2); - gtk_widget_show (hbox); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4); - - button = gtk_check_button_new_with_label ("Proportional mode"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), - conf_private_new.proportional); - gtk_signal_connect (GTK_OBJECT (button), "toggled", - GTK_SIGNAL_FUNC (proportional_toggled), NULL); -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_squarefield.c --- a/src/iris/theme_squarefield.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include -#include -#include -#include -#include "iris.h" - - -static struct -{ -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - - -iris_theme theme_squarefield = { - "SquareField", - "Waving square field", - "Marinus Schraal (foser@sesmar.eu.org)", - "squarefield", - &conf, - &conf_new, - sizeof (conf_private), - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - get_x_angle, - draw_one_frame, -}; - - -GLfloat dataSquare[NUM_BANDS][NUM_BANDS]; // internal sounddata structure - - -static GLfloat -get_x_angle () -{ - return (10.0 + (int) (80.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -draw_one_frame (gboolean beat) -{ - int t1, t2; // loop vars - GLfloat x1, y1; - GLfloat red, green, blue; - GLfloat z = 0.0; - GLfloat scale = 4.5; // scales the whole field - lower is bigger - GLfloat scaleh = 3; // scales height of the bar - lower is smaller - GLfloat maxfalloff = 0.05; - - /* internal routine to shift all data when a new datarow arrives */ - for (t1 = 15; t1 > 0; t1--) - { - for (t2 = 0; t2 < 16; t2++) - { - dataSquare[t1][t2] = dataSquare[t1 - 1][t2]; - } - } - for (t2 = 0; t2 < 16; t2++) - { - if (dataSquare[0][t2] > datas.data1[t2] - && ((dataSquare[0][t2] - datas.data1[t2]) > maxfalloff)) - { - dataSquare[0][t2] = dataSquare[0][t2] - maxfalloff; - } - else - { - dataSquare[0][t2] = datas.data1[t2]; - } - } - - /* some kinda random base i started out on - turned out to be too big thats why i added scaling vars - */ - x1 = 11.75f; - y1 = 11.75f; - - glBegin (GL_QUADS); - - for (t1 = 0; t1 < 16; t1++) - { - x1 = 11.75f; - for (t2 = 0; t2 < 16; t2++) - { - /* bottom : turned off */ - -/* get_color (&red, &green, &blue, &z); - glColor4f (red/2 , green/2 , blue/2 , 0.5); - glVertex3f( (x1-1)/scale , 0, (y1-1)/scale); // Top Right Of The Quad (Bottom) - glVertex3f( x1/scale, 0, (y1-1)/scale); // Top Left Of The Quad (Bottom) - glVertex3f( x1/scale, 0, y1/scale); // Bottom Left Of The Quad (Bottom) - glVertex3f( (x1-1)/scale, 0, y1/scale); // Bottom Right Of The Quad (Bottom) -*/ - - /* sides */ - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f ((x1 - 1) / scale, dataSquare[t1][t2] * scaleh, (y1 - 1) / scale); // top right (front) - get_color (&red, &green, &blue, &z); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f ((x1 - 1) / scale, 0, (y1 - 1) / scale); //bottom right - glVertex3f (x1 / scale, 0, (y1 - 1) / scale); //bottom left - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1 / scale, dataSquare[t1][t2] * scaleh, (y1 - 1) / scale); // top left - - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1 / scale, dataSquare[t1][t2] * scaleh, (y1 - 1) / scale); // top fron (left) - get_color (&red, &green, &blue, &z); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1 / scale, 0, (y1 - 1) / scale); // bottom fron (left) - glVertex3f (x1 / scale, 0, y1 / scale); // back bottom (left) - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1 / scale, dataSquare[t1][t2] * scaleh, y1 / scale); // top back (left) - - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f ((x1 - 1) / scale, dataSquare[t1][t2] * scaleh, (y1 - 1) / scale); // top front (right) - get_color (&red, &green, &blue, &z); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f ((x1 - 1) / scale, 0, (y1 - 1) / scale); // bottom front (right) - glVertex3f ((x1 - 1) / scale, 0, y1 / scale); // bottom back (right) - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f ((x1 - 1) / scale, dataSquare[t1][t2] * scaleh, y1 / scale); // top back(right) - - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f ((x1 - 1) / scale, dataSquare[t1][t2] * scaleh, y1 / scale); // right top (back) - get_color (&red, &green, &blue, &z); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f ((x1 - 1) / scale, 0, y1 / scale); // right bottom (back) - glVertex3f (x1 / scale, 0, y1 / scale); // left bottom (back) - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red / 2, green / 2, blue / 2, 0.5); - glVertex3f (x1 / scale, dataSquare[t1][t2] * scaleh, y1 / scale); // left top (back) - - /* top */ - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red, green, blue, 0.5); - glVertex3f ((x1 - 1) / scale, dataSquare[t1][t2] * scaleh, (y1 - 1) / scale); // Top Right Of The Quad (Bottom) - glVertex3f (x1 / scale, dataSquare[t1][t2] * scaleh, (y1 - 1) / scale); // Top Left Of The Quad (Bottom) - glVertex3f (x1 / scale, dataSquare[t1][t2] * scaleh, y1 / scale); // Bottom Left Of The Quad (Bottom) - glVertex3f ((x1 - 1) / scale, dataSquare[t1][t2] * scaleh, y1 / scale); // Bottom Right Of The Quad (Bottom) - - x1 -= 1.5; - } - y1 -= 1.5; - } - - glEnd (); - -} diff -r 5783d6281431 -r ee81e087615c src/iris/theme_waves.c --- a/src/iris/theme_waves.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,160 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -#include -#include -#include -#include -#include -#include "iris.h" - - -static struct -{ - gboolean proportional; -} -conf_private, conf_private_new; - -static config_theme conf = { - NULL, - &conf_private -}; - -static config_theme conf_new = { - NULL, - &conf_private_new -}; - - -static GLfloat get_x_angle (void); -static void draw_one_frame (gboolean); - - -iris_theme theme_waves = { - "Waves", - "Pulsating waves", - "Marinus Schraal (foser@sesmar.eu.org)", - "waves", - &conf, - &conf_new, - sizeof (conf_private), - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - get_x_angle, - draw_one_frame, -}; - - -GLfloat dataSquare[NUM_BANDS][NUM_BANDS]; // internal sounddata structure - - -static GLfloat -get_x_angle () -{ - return (10.0 + (int) (80.0 * rand () / (RAND_MAX + 1.0))); -} - - -static void -draw_one_frame (gboolean beat) -{ - int t1, t2; // loop vars - GLfloat x1, y1; - GLfloat red, green, blue; - GLfloat scale = 3; // scales the whole field - lower is bigger - GLfloat scaleh = 2.5; // scales height of the bar - lower is smaller - GLfloat maxfalloff = 0.05; - GLfloat intensity = 0.5; - - /* internal routine to shift all data when a new datarow arrives */ - for (t1 = 15; t1 > 0; t1--) - { - for (t2 = 0; t2 < 16; t2++) - { - dataSquare[t1][t2] = dataSquare[t1 - 1][t2]; - } - } - for (t2 = 0; t2 < 16; t2++) - { - if (dataSquare[0][t2] > datas.data1[t2] - && ((dataSquare[0][t2] - datas.data1[t2]) > maxfalloff)) - { - dataSquare[0][t2] = dataSquare[0][t2] - maxfalloff; - } - else - { - dataSquare[0][t2] = datas.data1[t2]; - } - } - - /* some kinda random base i started out on - * turned out to be too big thats why i added scaling vars - */ - x1 = 7.5f; - y1 = 7.5f; - - for (t1 = 0; t1 < 15; t1++) - { - x1 = 7.5f; - for (t2 = 0; t2 < 15; t2++) - { - - glBegin (GL_TRIANGLES); - intensity = 0.75; - - /* triangle 1 */ - get_color (&red, &green, &blue, &dataSquare[t1 + 1][t2 + 1]); - glColor4f (red, green, blue, intensity); - glVertex3f ((x1 - 1) / scale, dataSquare[t1 + 1][t2 + 1] * scaleh, (y1 - 1) / scale); // Top Right Of The Quad (Bottom) - - get_color (&red, &green, &blue, &dataSquare[t1 + 1][t2]); - glColor4f (red, green, blue, intensity); - glVertex3f (x1 / scale, dataSquare[t1 + 1][t2] * scaleh, (y1 - 1) / scale); // Top Left Of The Quad (Bottom) - - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red, green, blue, intensity); - glVertex3f (x1 / scale, dataSquare[t1][t2] * scaleh, y1 / scale); // Bottom Left Of The Quad (Bottom) - - /* triangle 2 */ - get_color (&red, &green, &blue, &dataSquare[t1 + 1][t2 + 1]); - glColor4f (red, green, blue, intensity); - glVertex3f ((x1 - 1) / scale, dataSquare[t1 + 1][t2 + 1] * scaleh, (y1 - 1) / scale); // Top Right Of The Quad (Bottom) - - get_color (&red, &green, &blue, &dataSquare[t1][t2 + 1]); - glColor4f (red, green, blue, intensity); - glVertex3f ((x1 - 1) / scale, dataSquare[t1][t2 + 1] * scaleh, y1 / scale); // Bottom Right Of The Quad (Bottom) - - get_color (&red, &green, &blue, &dataSquare[t1][t2]); - glColor4f (red, green, blue, intensity); - glVertex3f (x1 / scale, dataSquare[t1][t2] * scaleh, y1 / scale); // Bottom Left Of The Quad (Bottom) - - glEnd (); - - x1 -= 1; - } - y1 -= 1; - } - - glEnd (); - -} diff -r 5783d6281431 -r ee81e087615c src/iris/transition.c --- a/src/iris/transition.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,184 +0,0 @@ -/* Iris - visualization plugin for XMMS - * Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr) - * - * 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. - */ - -/* Transitions on theme change - * TODO : transitions on song change - * new transitions are easy to add - */ - -#include -#include "iris.h" - -extern GLfloat y_angle; -extern GLfloat x_angle; -extern int max_transition_frames; -extern int transition_frames; -int transition = 0; - -void -trans_zoom_out (gboolean init) -{ - static GLfloat x, y, z; - //only init when starting transition - if (init) - { - x = 1.0; - y = 1.0; - z = 1.0; - return; - } - - if (max_transition_frames / 2 < transition_frames) - { - x -= 1.0 / (max_transition_frames / 2); - y -= 1.0 / (max_transition_frames / 2); - z -= 1.0 / (max_transition_frames / 2); - } - else - { - x += 1.0 / (max_transition_frames / 2); - y += 1.0 / (max_transition_frames / 2); - z += 1.0 / (max_transition_frames / 2); - } - - glScalef (x, y, z); -} - -void -trans_zoom_in (gboolean init) -{ - static GLfloat x, y, z; - //only init when starting transition - if (init) - { - x = 1.0; - y = 1.0; - z = 1.0; - return; - } - - if (max_transition_frames / 2 < transition_frames) - { - x += 5.0 / (max_transition_frames / 2); - y += 5.0 / (max_transition_frames / 2); - z += 5.0 / (max_transition_frames / 2); - } - else - { - x -= 5.0 / (max_transition_frames / 2); - y -= 5.0 / (max_transition_frames / 2); - z -= 5.0 / (max_transition_frames / 2); - } - - glScalef (x, y, z); -} - -/* move up to top down look */ -void -trans_vertical_view (gboolean init) -{ - static GLfloat x_angle_tmp; - if (init) - { - x_angle_tmp = x_angle; - } - if (max_transition_frames / 2 < transition_frames) - { - x_angle += (90.0 - x_angle_tmp) / (max_transition_frames / 2); - } - else - { - x_angle -= (90.0 - x_angle_tmp) / (max_transition_frames / 2); - } - -} - -void -trans_spin_half_and_back (gboolean cc) -{ - if (max_transition_frames / 2 < transition_frames) - { - if (cc) - y_angle -= 180.0 / (max_transition_frames / 2); - else - y_angle += 180.0 / (max_transition_frames / 2); - } - else - { - if (cc) - y_angle += 180.0 / (max_transition_frames / 2); - else - y_angle -= 180.0 / (max_transition_frames / 2); - } -} - -void -trans_spin_full (gboolean cc) -{ - if (cc) - y_angle -= 360.0 / max_transition_frames; - else - y_angle += 360.0 / max_transition_frames; -} - -/* called on themeswitch */ -void -init_theme_transition (void) -{ - /* don't forget to update after adding new transitions */ - transition = (int) ((gfloat) 6 * rand () / (RAND_MAX + 1.0)); - - /* init/reset transitions that need it */ - trans_zoom_in (TRUE); - trans_zoom_out (TRUE); - trans_vertical_view (TRUE); -} - -/* called every frame of a transition */ -void -theme_transition () -{ - switch (transition) - { - case 0: - trans_zoom_out (FALSE); - break; - case 1: - trans_zoom_out (FALSE); - trans_spin_half_and_back ((int) - ((gfloat) 1 * rand () / (RAND_MAX + 1.0))); - break; - case 2: - trans_zoom_in (FALSE); - break; - case 3: - trans_zoom_in (FALSE); - trans_spin_half_and_back ((int) - ((gfloat) 1 * rand () / (RAND_MAX + 1.0))); - break; - case 4: - trans_vertical_view (FALSE); - trans_zoom_in (FALSE); - break; - case 5: - trans_vertical_view (FALSE); - trans_zoom_in (FALSE); - trans_spin_full ((int) ((gfloat) 1 * rand () / (RAND_MAX + 1.0))); - break; - } -} diff -r 5783d6281431 -r ee81e087615c src/mplayer/AUTHORS --- a/src/mplayer/AUTHORS Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -Nandan Dixit -Aaron Sheldon diff -r 5783d6281431 -r ee81e087615c src/mplayer/Makefile --- a/src/mplayer/Makefile Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -include ../../mk/rules.mk -include ../../mk/init.mk - -OBJECTIVE_LIBS = libmplayer$(SHARED_SUFFIX) - -LIBDIR = $(plugindir)/$(INPUT_PLUGIN_DIR) - -LIBADD += $(GTK_LIBS) - -SOURCES = xmmsmplayer.c common.c interface.c - -CFLAGS += $(GTK_CFLAGS) $(PICFLAGS) -I../../intl -I../.. -CXXFLAGS += $(GTK_CFLAGS) $(PICFLAGS) -I../../intl -I../.. - -OBJECTS = ${SOURCES:.c=.o} - -include ../../mk/objective.mk diff -r 5783d6281431 -r ee81e087615c src/mplayer/README --- a/src/mplayer/README Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -XmmsMPlayer ------------ - -This an xmms plugin that allows you to use xmms as a front-end for -MPlayer. You'll need MPlayer properly installed and in the PATH. - -For more info, see http://www.cse.iitb.ac.in/nandan/xmmsmplayer/ - - diff -r 5783d6281431 -r ee81e087615c src/mplayer/README.audacious --- a/src/mplayer/README.audacious Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -This is a terrible port from XMMS to Audacious. - -It's a horrible hack, and the ./configure scripts do more damage than -good. Hopefully it will work for most, though patches for ./configure -are more than welcome! - -In fact, patches of any kind are welcome since it's a total hack and -magic that it works as-is. - -- Aaron Sheldon diff -r 5783d6281431 -r ee81e087615c src/mplayer/common.c --- a/src/mplayer/common.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -#include -#include -#include "xmmsmplayer.h" - -struct mplayer_cfg *mplayer_read_cfg(){ - ConfigDb *cfg; - struct mplayer_cfg *new_cfg; - new_cfg=(struct mplayer_cfg *)malloc(sizeof(struct mplayer_cfg)); - memset(new_cfg,0,sizeof(struct mplayer_cfg)); - cfg = bmp_cfg_db_open(); - bmp_cfg_db_get_int(cfg,"xmms-mplayer","vo",&(new_cfg->vo)); - bmp_cfg_db_get_int(cfg,"xmms-mplayer","ao",&(new_cfg->ao)); - bmp_cfg_db_get_bool(cfg,"xmms-mplayer","zoom",&(new_cfg->zoom)); - bmp_cfg_db_get_bool(cfg,"xmms-mplayer","framedrop",&(new_cfg->framedrop)); - bmp_cfg_db_get_bool(cfg,"xmms-mplayer","idx",&(new_cfg->idx)); - bmp_cfg_db_get_bool(cfg,"xmms-mplayer","onewin",&(new_cfg->onewin)); - bmp_cfg_db_get_bool(cfg,"xmms-mplayer","xmmsaudio",&(new_cfg->xmmsaudio)); - bmp_cfg_db_get_string(cfg,"xmms-mplayer","extra",&(new_cfg->extra)); - bmp_cfg_db_close(cfg); - return new_cfg; -} diff -r 5783d6281431 -r ee81e087615c src/mplayer/interface.c --- a/src/mplayer/interface.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,497 +0,0 @@ - - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "xmmsmplayer.h" - -static GtkWidget *vo_none; -static GtkWidget *vo_xv; -static GtkWidget *vo_x11; -static GtkWidget *vo_gl; -static GtkWidget *vo_sdl; -static GtkWidget *opt_zoom; -static GtkWidget *opt_framedrop; -static GtkWidget *opt_idx; -static GtkWidget *opt_onewin; -static GtkWidget *opt_xmmsaudio; -static GtkWidget *ao_none; -static GtkWidget *ao_oss; -static GtkWidget *ao_arts; -static GtkWidget *ao_esd; -static GtkWidget *ao_alsa; -static GtkWidget *ao_sdl; -static GtkWidget *entry_extra_opts; - -static GtkWidget *mplayer_configure_win = NULL; - -void mplayer_destroyed_conf_win(GtkWidget *widget, gpointer data) { - mplayer_configure_win = NULL; -} - - -void on_btn_cancel_clicked(GtkButton *button, gpointer user_data){ - gtk_widget_destroy(mplayer_configure_win); - mplayer_configure_win=NULL; -} - - -void on_btn_ok_clicked (GtkButton *button, gpointer user_data){ - ConfigDb *cfg; - struct mplayer_cfg new_cfg; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(vo_none))) - new_cfg.vo=MPLAYER_VO_NONE; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(vo_xv))) - new_cfg.vo=MPLAYER_VO_XV; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(vo_x11))) - new_cfg.vo=MPLAYER_VO_X11; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(vo_gl))) - new_cfg.vo=MPLAYER_VO_GL; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(vo_sdl))) - new_cfg.vo=MPLAYER_VO_SDL; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ao_none))) - new_cfg.ao=MPLAYER_AO_NONE; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ao_oss))) - new_cfg.ao=MPLAYER_AO_OSS; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ao_arts))) - new_cfg.ao=MPLAYER_AO_ARTS; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ao_esd))) - new_cfg.ao=MPLAYER_AO_ESD; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ao_alsa))) - new_cfg.ao=MPLAYER_AO_ALSA; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ao_sdl))) - new_cfg.ao=MPLAYER_AO_SDL; - new_cfg.zoom=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opt_zoom)); - new_cfg.framedrop= - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opt_framedrop)); - new_cfg.idx=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opt_idx)); - new_cfg.onewin=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opt_onewin)); - new_cfg.xmmsaudio=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opt_xmmsaudio)); - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opt_xmmsaudio))) - new_cfg.ao=MPLAYER_AO_XMMS; - new_cfg.extra=(gchar*)gtk_entry_get_text(GTK_ENTRY(entry_extra_opts)); - - cfg = bmp_cfg_db_open(); - bmp_cfg_db_set_int(cfg,"xmms-mplayer","vo",new_cfg.vo); - bmp_cfg_db_set_int(cfg,"xmms-mplayer","ao",new_cfg.ao); - bmp_cfg_db_set_bool(cfg,"xmms-mplayer","zoom",new_cfg.zoom); - bmp_cfg_db_set_bool(cfg,"xmms-mplayer","framedrop",new_cfg.framedrop); - bmp_cfg_db_set_bool(cfg,"xmms-mplayer","idx",new_cfg.idx); - bmp_cfg_db_set_bool(cfg,"xmms-mplayer","onewin",new_cfg.onewin); - bmp_cfg_db_set_bool(cfg,"xmms-mplayer","xmmsaudio",new_cfg.xmmsaudio); - bmp_cfg_db_set_string(cfg,"xmms-mplayer","extra",new_cfg.extra); - bmp_cfg_db_close(cfg); - - gtk_widget_destroy(mplayer_configure_win); - mplayer_configure_win=NULL; -} - - -GtkWidget* -mplayer_create_configure_win (void) -{ - GtkWidget *window1; - GtkWidget *scrolledwindow1; - GtkWidget *layout1; - GtkWidget *notebook1; - GtkWidget *scrolledwindow2; - GtkWidget *layout2; - GSList *layout2_group = NULL; - GtkWidget *label_vo; - GtkWidget *scrolledwindow3; - GtkWidget *layout3; - GSList *layout3_group = NULL; - GtkWidget *label_ao; - GtkWidget *scrolledwindow4; - GtkWidget *layout4; - GtkWidget *label_other; - GtkWidget *scrolledwindow5; - GtkWidget *layout5; - GtkWidget *label_extra_des; - GtkWidget *label_extra; - GtkWidget *btn_ok; - GtkWidget *btn_cancel; - - window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_object_set_data (GTK_OBJECT (window1), "window1", window1); - gtk_window_set_title (GTK_WINDOW (window1), "MPlayer"); - gtk_widget_set_usize (window1, 550, 430); - - - scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_ref (scrolledwindow1); - gtk_object_set_data_full (GTK_OBJECT (window1), "scrolledwindow1", scrolledwindow1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (scrolledwindow1); - gtk_container_add (GTK_CONTAINER (window1), scrolledwindow1); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - layout1 = gtk_layout_new (NULL, NULL); - gtk_widget_ref (layout1); - gtk_object_set_data_full (GTK_OBJECT (window1), "layout1", layout1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (layout1); - gtk_container_add (GTK_CONTAINER (scrolledwindow1), layout1); - gtk_layout_set_size (GTK_LAYOUT (layout1), 336, 235); - GTK_ADJUSTMENT (GTK_LAYOUT (layout1)->hadjustment)->step_increment = 10; - GTK_ADJUSTMENT (GTK_LAYOUT (layout1)->vadjustment)->step_increment = 10; - - notebook1 = gtk_notebook_new (); - gtk_widget_ref (notebook1); - gtk_object_set_data_full (GTK_OBJECT (window1), "notebook1", notebook1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (notebook1); - gtk_layout_put (GTK_LAYOUT (layout1), notebook1, 24, 24); - gtk_widget_set_usize (notebook1, 496, 336); - - scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_ref (scrolledwindow2); - gtk_object_set_data_full (GTK_OBJECT (window1), "scrolledwindow2", scrolledwindow2, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (scrolledwindow2); - gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow2); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - layout2 = gtk_layout_new (NULL, NULL); - gtk_widget_ref (layout2); - gtk_object_set_data_full (GTK_OBJECT (window1), "layout2", layout2, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (layout2); - gtk_container_add (GTK_CONTAINER (scrolledwindow2), layout2); - gtk_layout_set_size (GTK_LAYOUT (layout2), 384, 296); - GTK_ADJUSTMENT (GTK_LAYOUT (layout2)->hadjustment)->step_increment = 10; - GTK_ADJUSTMENT (GTK_LAYOUT (layout2)->vadjustment)->step_increment = 10; - - vo_none = gtk_radio_button_new_with_label (layout2_group, "Automatic (MPlayer Chooses)"); - layout2_group = gtk_radio_button_group (GTK_RADIO_BUTTON (vo_none)); - gtk_widget_ref (vo_none); - gtk_object_set_data_full (GTK_OBJECT (window1), "vo_none", vo_none, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (vo_none); - gtk_layout_put (GTK_LAYOUT (layout2), vo_none, 24, 32); - gtk_widget_set_usize (vo_none, 336, 24); - - vo_xv = gtk_radio_button_new_with_label (layout2_group, "Xvideo"); - layout2_group = gtk_radio_button_group (GTK_RADIO_BUTTON (vo_xv)); - gtk_widget_ref (vo_xv); - gtk_object_set_data_full (GTK_OBJECT (window1), "vo_xv", vo_xv, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (vo_xv); - gtk_layout_put (GTK_LAYOUT (layout2), vo_xv, 24, 64); - gtk_widget_set_usize (vo_xv, 96, 24); - - vo_x11 = gtk_radio_button_new_with_label (layout2_group, "X11"); - layout2_group = gtk_radio_button_group (GTK_RADIO_BUTTON (vo_x11)); - gtk_widget_ref (vo_x11); - gtk_object_set_data_full (GTK_OBJECT (window1), "vo_x11", vo_x11, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (vo_x11); - gtk_layout_put (GTK_LAYOUT (layout2), vo_x11, 24, 104); - gtk_widget_set_usize (vo_x11, 96, 24); - - vo_gl = gtk_radio_button_new_with_label (layout2_group, "GL"); - layout2_group = gtk_radio_button_group (GTK_RADIO_BUTTON (vo_gl)); - gtk_widget_ref (vo_gl); - gtk_object_set_data_full (GTK_OBJECT (window1), "vo_gl", vo_gl, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (vo_gl); - gtk_layout_put (GTK_LAYOUT (layout2), vo_gl, 24, 144); - gtk_widget_set_usize (vo_gl, 96, 24); - - vo_sdl = gtk_radio_button_new_with_label (layout2_group, "SDL"); - layout2_group = gtk_radio_button_group (GTK_RADIO_BUTTON (vo_sdl)); - gtk_widget_ref (vo_sdl); - gtk_object_set_data_full (GTK_OBJECT (window1), "vo_sdl", vo_sdl, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (vo_sdl); - gtk_layout_put (GTK_LAYOUT (layout2), vo_sdl, 24, 184); - gtk_widget_set_usize (vo_sdl, 96, 24); - - label_vo = gtk_label_new ("Video Out"); - gtk_widget_ref (label_vo); - gtk_object_set_data_full (GTK_OBJECT (window1), "label_vo", label_vo, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (label_vo); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), label_vo); - - scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_ref (scrolledwindow3); - gtk_object_set_data_full (GTK_OBJECT (window1), "scrolledwindow3", scrolledwindow3, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (scrolledwindow3); - gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow3); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - layout3 = gtk_layout_new (NULL, NULL); - gtk_widget_ref (layout3); - gtk_object_set_data_full (GTK_OBJECT (window1), "layout3", layout3, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (layout3); - gtk_container_add (GTK_CONTAINER (scrolledwindow3), layout3); - gtk_layout_set_size (GTK_LAYOUT (layout3), 382, 295); - GTK_ADJUSTMENT (GTK_LAYOUT (layout3)->hadjustment)->step_increment = 10; - GTK_ADJUSTMENT (GTK_LAYOUT (layout3)->vadjustment)->step_increment = 10; - - ao_none = gtk_radio_button_new_with_label (layout3_group, "Automatic (MPlayer Chooses)"); - layout3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (ao_none)); - gtk_widget_ref (ao_none); - gtk_object_set_data_full (GTK_OBJECT (window1), "ao_none", ao_none, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (ao_none); - gtk_layout_put (GTK_LAYOUT (layout3), ao_none, 24, 32); - gtk_widget_set_usize (ao_none, 272, 24); - - ao_oss = gtk_radio_button_new_with_label (layout3_group, "OSS"); - layout3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (ao_oss)); - gtk_widget_ref (ao_oss); - gtk_object_set_data_full (GTK_OBJECT (window1), "ao_oss", ao_oss, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (ao_oss); - gtk_layout_put (GTK_LAYOUT (layout3), ao_oss, 24, 64); - gtk_widget_set_usize (ao_oss, 96, 24); - - ao_arts = gtk_radio_button_new_with_label (layout3_group, "ARTS"); - layout3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (ao_arts)); - gtk_widget_ref (ao_arts); - gtk_object_set_data_full (GTK_OBJECT (window1), "ao_arts", ao_arts, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (ao_arts); - gtk_layout_put (GTK_LAYOUT (layout3), ao_arts, 24, 96); - gtk_widget_set_usize (ao_arts, 96, 24); - - ao_esd = gtk_radio_button_new_with_label (layout3_group, "ESD"); - layout3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (ao_esd)); - gtk_widget_ref (ao_esd); - gtk_object_set_data_full (GTK_OBJECT (window1), "ao_esd", ao_esd, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (ao_esd); - gtk_layout_put (GTK_LAYOUT (layout3), ao_esd, 24, 128); - gtk_widget_set_usize (ao_esd, 96, 24); - - ao_alsa = gtk_radio_button_new_with_label (layout3_group, "ALSA"); - layout3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (ao_alsa)); - gtk_widget_ref (ao_alsa); - gtk_object_set_data_full (GTK_OBJECT (window1), "ao_alsa", ao_alsa, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (ao_alsa); - gtk_layout_put (GTK_LAYOUT (layout3), ao_alsa, 24, 160); - gtk_widget_set_usize (ao_alsa, 103, 24); - - ao_sdl = gtk_radio_button_new_with_label (layout3_group, "SDL"); - layout3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (ao_sdl)); - gtk_widget_ref (ao_sdl); - gtk_object_set_data_full (GTK_OBJECT (window1), "ao_sdl", ao_sdl, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (ao_sdl); - gtk_layout_put (GTK_LAYOUT (layout3), ao_sdl, 24, 192); - gtk_widget_set_usize (ao_sdl, 103, 24); - - opt_xmmsaudio = gtk_radio_button_new_with_label (layout3_group, "XMMS Output Plugin (Experimental)"); - layout3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (opt_xmmsaudio)); - gtk_widget_ref (opt_xmmsaudio); - gtk_object_set_data_full (GTK_OBJECT (window1), "opt_xmmsaudio", opt_xmmsaudio, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (opt_xmmsaudio); - gtk_layout_put (GTK_LAYOUT (layout3), opt_xmmsaudio, 24, 224); - gtk_widget_set_usize (opt_xmmsaudio, 272, 24); - - label_ao = gtk_label_new ("Audio Out"); - gtk_widget_ref (label_ao); - gtk_object_set_data_full (GTK_OBJECT (window1), "label_ao", label_ao, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (label_ao); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label_ao); - - scrolledwindow4 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_ref (scrolledwindow4); - gtk_object_set_data_full (GTK_OBJECT (window1), "scrolledwindow4", scrolledwindow4, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (scrolledwindow4); - gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow4); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - layout4 = gtk_layout_new (NULL, NULL); - gtk_widget_ref (layout4); - gtk_object_set_data_full (GTK_OBJECT (window1), "layout4", layout4, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (layout4); - gtk_container_add (GTK_CONTAINER (scrolledwindow4), layout4); - gtk_layout_set_size (GTK_LAYOUT (layout4), 377, 272); - GTK_ADJUSTMENT (GTK_LAYOUT (layout4)->hadjustment)->step_increment = 10; - GTK_ADJUSTMENT (GTK_LAYOUT (layout4)->vadjustment)->step_increment = 10; - - opt_zoom = gtk_check_button_new_with_label ("Software Zoom"); - gtk_widget_ref (opt_zoom); - gtk_object_set_data_full (GTK_OBJECT (window1), "opt_zoom", opt_zoom, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (opt_zoom); - gtk_layout_put (GTK_LAYOUT (layout4), opt_zoom, 24, 32); - gtk_widget_set_usize (opt_zoom, 168, 24); - - opt_framedrop = gtk_check_button_new_with_label ("Frame Dropping"); - gtk_widget_ref (opt_framedrop); - gtk_object_set_data_full (GTK_OBJECT (window1), "opt_framedrop", opt_framedrop, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (opt_framedrop); - gtk_layout_put (GTK_LAYOUT (layout4), opt_framedrop, 24, 72); - gtk_widget_set_usize (opt_framedrop, 136, 24); - - opt_idx = gtk_check_button_new_with_label ("Build Index"); - gtk_widget_ref (opt_idx); - gtk_object_set_data_full (GTK_OBJECT (window1), "opt_idx", opt_idx, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (opt_idx); - gtk_layout_put (GTK_LAYOUT (layout4), opt_idx, 24, 112); - gtk_widget_set_usize (opt_idx, 102, 24); - - opt_onewin = gtk_check_button_new_with_label ("One Window (Experimental)"); - gtk_widget_ref (opt_onewin); - gtk_object_set_data_full (GTK_OBJECT (window1), "opt_onewin", opt_onewin, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (opt_onewin); - gtk_layout_put (GTK_LAYOUT (layout4), opt_onewin, 24, 152); - gtk_widget_set_usize (opt_onewin, 240, 24); - - label_other = gtk_label_new ("Other"); - gtk_widget_ref (label_other); - gtk_object_set_data_full (GTK_OBJECT (window1), "label_other", label_other, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (label_other); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label_other); - - scrolledwindow5 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_ref (scrolledwindow5); - gtk_object_set_data_full (GTK_OBJECT (window1), "scrolledwindow5", scrolledwindow5, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (scrolledwindow5); - gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow5); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - layout5 = gtk_layout_new (NULL, NULL); - gtk_widget_ref (layout5); - gtk_object_set_data_full (GTK_OBJECT (window1), "layout5", layout5, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (layout5); - gtk_container_add (GTK_CONTAINER (scrolledwindow5), layout5); - gtk_layout_set_size (GTK_LAYOUT (layout5), 346, 267); - GTK_ADJUSTMENT (GTK_LAYOUT (layout5)->hadjustment)->step_increment = 10; - GTK_ADJUSTMENT (GTK_LAYOUT (layout5)->vadjustment)->step_increment = 10; - - entry_extra_opts = gtk_entry_new (); - gtk_widget_ref (entry_extra_opts); - gtk_object_set_data_full (GTK_OBJECT (window1), "entry_extra_opts", entry_extra_opts, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (entry_extra_opts); - gtk_layout_put (GTK_LAYOUT (layout5), entry_extra_opts, 40, 192); - gtk_widget_set_usize (entry_extra_opts, 392, 24); - - label_extra_des = gtk_label_new ("Extra options for mplayer can be added here.\nParsing is done based on spaces.\nQuotes and escapes are not recognised yet."); - gtk_widget_ref (label_extra_des); - gtk_object_set_data_full (GTK_OBJECT (window1), "label_extra_des", label_extra_des, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (label_extra_des); - gtk_layout_put (GTK_LAYOUT (layout5), label_extra_des, 40, 48); - gtk_widget_set_usize (label_extra_des, 392, 128); - gtk_label_set_justify (GTK_LABEL (label_extra_des), GTK_JUSTIFY_LEFT); - gtk_misc_set_alignment (GTK_MISC (label_extra_des), 0.18, 1); - - label_extra = gtk_label_new ("Extra"); - gtk_widget_ref (label_extra); - gtk_object_set_data_full (GTK_OBJECT (window1), "label_extra", label_extra, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (label_extra); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 3), label_extra); - - btn_ok = gtk_button_new_with_label ("OK"); - gtk_widget_ref (btn_ok); - gtk_object_set_data_full (GTK_OBJECT (window1), "btn_ok", btn_ok, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (btn_ok); - gtk_layout_put (GTK_LAYOUT (layout1), btn_ok, 432, 376); - gtk_widget_set_usize (btn_ok, 88, 32); - - btn_cancel = gtk_button_new_with_label ("Cancel"); - gtk_widget_ref (btn_cancel); - gtk_object_set_data_full (GTK_OBJECT (window1), "btn_cancel", btn_cancel, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (btn_cancel); - gtk_layout_put (GTK_LAYOUT (layout1), btn_cancel, 24, 376); - gtk_widget_set_usize (btn_cancel, 88, 30); - - gtk_signal_connect(GTK_OBJECT(window1), - "destroy", - GTK_SIGNAL_FUNC(mplayer_destroyed_conf_win), - NULL); - - gtk_signal_connect (GTK_OBJECT (btn_ok), "clicked", - GTK_SIGNAL_FUNC (on_btn_ok_clicked), - NULL); - gtk_signal_connect (GTK_OBJECT (btn_cancel), "clicked", - GTK_SIGNAL_FUNC (on_btn_cancel_clicked), - NULL); - return window1; -} - -void mplayer_configure(){ - struct mplayer_cfg *cfg; - if (mplayer_configure_win) - return; - mplayer_configure_win=mplayer_create_configure_win(); - gtk_widget_show(mplayer_configure_win); - cfg=mplayer_read_cfg(); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (opt_zoom),cfg->zoom); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (opt_framedrop),cfg->framedrop); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (opt_idx),cfg->idx); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (opt_onewin),cfg->onewin); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (opt_xmmsaudio),cfg->xmmsaudio); - - switch(cfg->vo){ - case MPLAYER_VO_NONE: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vo_none), TRUE); - break; - case MPLAYER_VO_XV: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vo_xv), TRUE); - break; - case MPLAYER_VO_X11: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vo_x11), TRUE); - break; - case MPLAYER_VO_GL: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vo_gl), TRUE); - break; - case MPLAYER_VO_SDL: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vo_sdl), TRUE); - break; - } - switch(cfg->ao){ - case MPLAYER_AO_NONE: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ao_none), TRUE); - break; - case MPLAYER_AO_OSS: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ao_oss), TRUE); - break; - case MPLAYER_AO_ARTS: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ao_arts), TRUE); - break; - case MPLAYER_AO_ESD: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ao_esd), TRUE); - break; - case MPLAYER_AO_SDL: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ao_sdl), TRUE); - break; - case MPLAYER_AO_ALSA: - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ao_alsa), TRUE); - break; - } - gtk_entry_set_text(GTK_ENTRY(entry_extra_opts),cfg->extra); -} diff -r 5783d6281431 -r ee81e087615c src/mplayer/xmmsmplayer.c --- a/src/mplayer/xmmsmplayer.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,591 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - -#include "xmmsmplayer.h" -static Atom XA_WIN_LAYER; -static Atom XA_NET_WM_STATE; -static Atom XA_NET_WM_STATE_FULLSCREEN; -static Atom XA_NET_WM_STATE_ABOVE; -static Atom XA_NET_WM_STATE_STAYS_ON_TOP; -static Atom XA_NET_WM_STATE_BELOW; - -static Window mplayer_video = 0; -static gchar mplayer_wid[16]; - -static int mplayer_pipe[2]; /* Control mplayer thru this pipe */ -static pthread_t mplayer_tid; /* Thread id */ -static gchar *mplayer_file=NULL; /* filename */ -static struct mplayer_info *mplayer_current_info=NULL; -static gint mplayer_current_time=0; /* to be returned to xmms */ - -static char *mplayer_fifoname=NULL; -static InputPlugin *mplayer_ip=NULL; /* Information to be returned to xmms */ -static gint mplayer_playing=0; -static struct mplayer_cfg *mplayer_current_cfg=NULL; -static Display *dis = NULL; - -InputPlugin *get_iplugin_info(void){ - if(!mplayer_ip){ - mplayer_ip=(InputPlugin *) malloc(sizeof (InputPlugin)); - memset(mplayer_ip,0,sizeof (InputPlugin)); - mplayer_ip->description = strdup("Embedded MPlayer"); - mplayer_ip->init = mplayer_init; - mplayer_ip->is_our_file = mplayer_is_our_file; - mplayer_ip->play_file = mplayer_play_file; - mplayer_ip->stop = mplayer_stop; - mplayer_ip->pause = mplayer_pause; - mplayer_ip->seek = mplayer_seek; - mplayer_ip->get_time = mplayer_get_time; - mplayer_ip->get_song_info = mplayer_get_song_info; - mplayer_ip->set_info = NULL; - mplayer_ip->cleanup = mplayer_cleanup; - mplayer_ip->about = mplayer_about; - mplayer_ip->configure = mplayer_configure; - - } - return mplayer_ip; -} - -void mplayer_init(){ - /*Add read configure!! */ - - /*mplayer_playing=0;*/ -} -int mplayer_is_our_file(char *filename){ - gchar *ext; - ext = strrchr(filename, '.'); - if (ext){ - if((!strcasecmp(ext, ".mpg")) || - (!strcasecmp(ext, ".mpeg")) || - (!strcasecmp(ext, ".divx")) || - (!strcasecmp(ext, ".qt")) || - (!strcasecmp(ext, ".mov")) || - (!strcasecmp(ext, ".mp2")) || - (!strcasecmp(ext, ".mpa")) || - (!strcasecmp(ext, ".dat")) || - (!strcasecmp(ext, ".rm")) || - (!strcasecmp(ext, ".swf")) || - (!strcasecmp(ext, ".wma")) || - (!strcasecmp(ext, ".wmv")) || - (!strcasecmp(ext, ".wmp")) || - (!strcasecmp(ext, ".asf")) || - (!strcasecmp(ext, ".avi")) - ) return TRUE; - } - return FALSE; -} -void mplayer_play_file(char *filename){ - pthread_attr_t tattr; - void *arg; - int ret,pipe_ret; - gchar temp[10]; - gchar *username; - - mplayer_debugf("debug-play-in\n"); - mplayer_file=filename; - pipe_ret=pipe(mplayer_pipe); - - if(mplayer_current_info)g_free(mplayer_current_info); - mplayer_current_info = mplayer_read_file_info(filename); - mplayer_debugf("Setting info:\n%sTerm\n%i\n%i\n%i\n%i\n\n", - mplayer_current_info->caption, - mplayer_current_info->length * 1000, - mplayer_current_info->abr, - mplayer_current_info->rate, - mplayer_current_info->nch); - mplayer_debugf("debug-play-fileinfo-done\n"); - /* usleep(100000);*/ - mplayer_ip->set_info(mplayer_current_info->caption, - mplayer_current_info->length * 1000, - mplayer_current_info->abr, - mplayer_current_info->rate, - mplayer_current_info->nch); - mplayer_debugf("debug-play-sent-info\n"); - mplayer_debugf("debug- reading configfile\n"); - if (mplayer_current_cfg){ - g_free(mplayer_current_cfg->extra); - g_free(mplayer_current_cfg); - } - mplayer_current_cfg=mplayer_read_cfg(); - if(mplayer_current_cfg->onewin &&(!mplayer_video)){ -/* mplayer_video=gtk_window_new(GTK_WINDOW_DIALOG); - gtk_widget_set_usize(GTK_WIDGET(mplayer_video), 320, 240); - gtk_window_set_title(GTK_WINDOW(mplayer_video), "Audacious - MPlayer"); - gtk_signal_connect(GTK_OBJECT(mplayer_video), - "destroy", - GTK_SIGNAL_FUNC(mplayer_quitting_video), - NULL); - gtk_widget_show(mplayer_video); - sprintf(mplayer_wid,"%i",GDK_WINDOW_XWINDOW(mplayer_video->window)); -*/ - if(!dis) dis = XOpenDisplay(NULL); - assert(dis); - XEvent report; - int blackColor = BlackPixel(dis, DefaultScreen(dis)); - int whiteColor = WhitePixel(dis, DefaultScreen(dis)); - mplayer_video = XCreateSimpleWindow(dis, DefaultRootWindow(dis), 0, 0, - 320, 240, 0, blackColor, blackColor); - XMapWindow(dis,mplayer_video); - XFlush(dis); - XSelectInput (dis, mplayer_video, KeyPressMask); - sprintf(mplayer_wid,"%i",mplayer_video); - } - if((!mplayer_current_cfg->onewin) &&(mplayer_video)){ - XDestroyWindow(dis,mplayer_video); - mplayer_video=0; - mplayer_wid[0]='\0'; - } - if(mplayer_current_cfg->xmmsaudio){ - if(!mplayer_fifoname){ - username = getenv("LOGNAME"); - if(!username)username = getenv("USERNAME"); - if(!username)username = getenv("USER"); - sprintf(temp,"%i",getpid()); - if (!username)mplayer_fifoname=g_strconcat("/tmp/xmmsmplayer-",temp,(char*)0); - else mplayer_fifoname=g_strconcat("/tmp/xmmsmplayer-",username,"-",temp,(char*)0); - mkfifo(mplayer_fifoname,0600); - } - mplayer_ip->output->open_audio(FMT_S16_LE, - mplayer_current_info->rate, - mplayer_current_info->nch); - } - mplayer_debugf("debug- read configfile\n"); - if (mplayer_playing==1) mplayer_debugf("Duplicate call!! -- Panic \n"); - else mplayer_playing=1; - mplayer_debugf("debug-play-creating-thread\n"); - ret = pthread_create(&mplayer_tid, NULL, mplayer_play_loop, arg); - mplayer_debugf("debug-play-out\n\n"); -} - -void mplayer_stop(){ - int ret; - if (mplayer_playing==0) mplayer_debugf("Confusion: Restopped!\n"); - else { - mplayer_playing=0; - if(mplayer_current_cfg->xmmsaudio)mplayer_ip->output->close_audio(); - if (write(mplayer_pipe[1],"quit\n",5)==5){ - mplayer_debugf("debug-stop-if\n"); - }; - mplayer_debugf("debug-stop\n"); - ret = pthread_join(mplayer_tid, NULL); - mplayer_debugf("debug-stop\n\n"); - } -} - -void mplayer_cleanup(){ - if (mplayer_playing) mplayer_stop(); - if (mplayer_fifoname){ - remove(mplayer_fifoname); - g_free(mplayer_fifoname); - mplayer_fifoname=NULL; - } - -} - -void mplayer_pause(short p){ - write(mplayer_pipe[1],"pause\n",6); -} - -void mplayer_seek(int t){ - char buff[16]; - if(mplayer_playing){ - sprintf(buff,"seek %i\n",(t - mplayer_current_time)); - write(mplayer_pipe[1],buff,strlen(buff)); - } -} - -gint mplayer_get_time(){ - return (mplayer_current_time*1000) ; -} -void mplayer_get_song_info(char * filename, char ** title, int * length){ - struct mplayer_info *info; - char *temp,*name; - info = mplayer_read_file_info(filename); - *title = g_strdup(info->caption); - *length = (info->length * 1000); - g_free(info); -} - -void *mplayer_play_loop(void *arg){ - char buff[35]; - int mplayer_slave_pid; - int i,read_length,playtime,one_read; - int mplayer_status_pipe[2]; - int mplayer_error_stream; - int mplayer_fifo_fd; - int pipe_ret; - char **params; - char audio_buff[MPLAYER_AUDIO_SIZE]; - int audio_buff_read; - gboolean audio_flag, status_flag; - struct timespec nanotime; - nanotime.tv_sec=0; - nanotime.tv_nsec=1; - - - pipe_ret=pipe(mplayer_status_pipe); - - if ((mplayer_slave_pid=vfork())==0){ - //close(mplayer_pipe[1]); - mplayer_debugf("debug Pre-exec!\n"); - mplayer_error_stream=open("/dev/null",0); - mplayer_debugf("debug Making vector\n"); - params=mplayer_make_vector(); - mplayer_debugf("debug Made vector\n"); - close(0); - close(1); - close(2); - if(dup2(mplayer_pipe[0],0)!=0) mplayer_debugf("duplication error\n"); - if(dup2(mplayer_status_pipe[1],1)!=0) mplayer_debugf("duplication error\n"); - if(dup2(mplayer_error_stream,2)!=0) mplayer_debugf("duplication error\n"); - /*i=execlp("mplayer","mplayer","-vo","x11","-zoom","-sws","2","-framedrop","-slave","-wid",mplayer_wid,mplayer_file,(char *)0);*/ - i=execvp("mplayer",params); - mplayer_debugf("Fatal Error: Couldnt start MPlayer! exec returned %i\n",i); - _exit(-1); - } - else{ - close(mplayer_status_pipe[1]); /* EXTREMELY IMPORTANT, a little tricky! */ - close(mplayer_pipe[0]); - if(mplayer_current_cfg->xmmsaudio){ - mplayer_debugf("debug - Opening fifo...\n"); - mplayer_fifo_fd=open(mplayer_fifoname,O_RDONLY); - mplayer_debugf("debug - Opened fifo\n"); - fcntl(mplayer_status_pipe[0],F_SETFL,O_NDELAY); - } - audio_buff_read=-1; - read_length=-1; - one_read=-1; - while((wait3((union wait *)0,WNOHANG,(struct rusage *)0)!=mplayer_slave_pid)&&(mplayer_playing==1)){ - audio_flag=FALSE; - status_flag=FALSE; - /* Window event code here */ - if(mplayer_current_cfg->xmmsaudio){ - // do{ - - /* mplayer_debugf("debug - reading fifo...\n");*/ - audio_buff_read=read(mplayer_fifo_fd,audio_buff,MPLAYER_AUDIO_SIZE); - if (audio_buff_read==0) break; - if (audio_buff_read>0){ - mplayer_ip->output->write_audio(audio_buff,audio_buff_read); - /*mplayer_ip->add_vis_pcm();*/ - audio_flag=TRUE; - mplayer_debugf(" %i ",audio_buff_read); - } - //} - //while(audio_buff_read>0); - } - do{ - if(mplayer_current_cfg->onewin ){ - XEvent report; - if(XCheckWindowEvent(dis,mplayer_video,KeyPressMask, &report)){ - if (XLookupKeysym(&report.xkey, 0) == XK_f){ - fprintf (stdout, "The f was pressed.\n"); - XMoveResizeWindow(dis,mplayer_video,0,0,1280,1024); - XMapRaised(dis,mplayer_video); - XRaiseWindow(dis,mplayer_video); - XSetTransientForHint(dis,mplayer_video, RootWindow(dis,0)); - - XClientMessageEvent xev; - char *state; - - memset( &xev,0,sizeof( xev ) ); - xev.type=ClientMessage; - xev.message_type=XA_WIN_LAYER; - xev.display=dis; - xev.window=mplayer_video; - xev.format=32; - xev.data.l[0]=10; - xev.data.l[1]=CurrentTime; - XSendEvent( dis,RootWindow( dis,0),False,SubstructureRedirectMask,(XEvent*)&xev ); - - -fprintf(stdout,"Cleared 1\n"); -XSetWindowAttributes attr; - attr.override_redirect = True; - XChangeWindowAttributes(dis,mplayer_video, CWOverrideRedirect, &attr); - - XFlush(dis); - - } - } - } - one_read= read(mplayer_status_pipe[0],buff+read_length,1); - if (one_read==0) break; - if (one_read > 0) { - status_flag=TRUE; - if ((buff[read_length]==(char)13)||(buff[read_length]==(char)10)) read_length=0; - if (read_length < 32 ) read_length++; - if (read_length >= 16){ - sscanf(buff+3,"%i",&playtime); - mplayer_current_time=playtime; - } - } - } - while (one_read>0); - - /* - audio_buff_read=0; - if(mplayer_current_cfg->xmmsaudio){ - mplayer_debugf("debug - reading fifo...\n"); - - audio_buff_read=read(mplayer_fifo_fd,audio_buff,MPLAYER_AUDIO_SIZE); - if (audio_buff_read>0)mplayer_ip->output->write_audio(audio_buff,audio_buff_read); - } - read_length=read(mplayer_status_pipe[0],buff,1); - if(read_length>0){ - if ((buff[0]==(char)13)||(buff[0]==(char)10) ) { - one_read=1; - read_length=0; - while((read_length<16)&&(one_read>0)) { - audio_buff_read=0; - if(mplayer_current_cfg->xmmsaudio){ - mplayer_debugf("debug - readin fifo...\n"); - audio_buff_read=read(mplayer_fifo_fd,audio_buff,MPLAYER_AUDIO_SIZE); - mplayer_debugf("debug - read fifo...%i\n", audio_buff_read); - if (audio_buff_read>0)mplayer_ip->output->write_audio(audio_buff,audio_buff_read); - } - mplayer_debugf("debug - readin status...\n"); - one_read= read(mplayer_status_pipe[0],buff+read_length,16-read_length); - read_length += one_read; - if ((audio_buff_read <= 0)&&(one_read <= 0)) usleep(5); - } - sscanf(buff+3,"%i",&playtime); - mplayer_current_time=playtime;} - - } - else if ((audio_buff_read <= 0)&&(read_length <= 0)) usleep(5); - */ - - //else if (read_length == -1) break; - } - if (mplayer_playing==1){ - if(mplayer_current_cfg->xmmsaudio)mplayer_ip->output->close_audio(); - mplayer_playing=0; - xmms_remote_playlist_next(ctrlsocket_get_session_id()); - } - // if (mplayer_dont_spawn) mplayer_dont_spawn=0; - // else xmms_remote_playlist_next(ctrlsocket_get_session_id()); - pthread_exit(NULL); - } -} - - -struct mplayer_info *mplayer_read_file_info(char *filename){ - struct mplayer_info *info; - int datalength,done=0; - FILE *inquiry, *size_query; - char mplayer_command[256]; - char buff[4096]; - char *temp; - info=(struct mplayer_info *)malloc(sizeof(struct mplayer_info)); - memset((char *)info,0,sizeof(struct mplayer_info)); - sprintf(mplayer_command,"mplayer -slave -identify -vo null -ao null -frames 0 \"%s\" 2> /dev/null",filename); - inquiry=popen(mplayer_command,"r"); - done=0; - while((!feof(inquiry)) && (done <4000) ){ - fscanf(inquiry,"%c",(buff+done)); - done++; - } - buff[done]=(char)0; - pclose(inquiry); - mplayer_debugf("debug-id\n"); - temp=strstr(buff,"Name:"); - if (temp) mplayer_read_to_eol(info->title,temp+5); - mplayer_debugf("debug-id\n"); - temp=strstr(buff,"Artist:"); - if (temp) mplayer_read_to_eol(info->artist,temp+7); - mplayer_debugf("debug-id\n"); - temp=strstr(buff,"ID_VIDEO_BITRATE="); - if (temp) sscanf(temp+strlen("ID_VIDEO_BITRATE=") ,"%i",&(info->vbr)); - temp=strstr(buff,"ID_VIDEO_WIDTH="); - if (temp) sscanf(temp+strlen("ID_VIDEO_WIDTH=") ,"%i",&(info->x)); - temp=strstr(buff,"ID_VIDEO_HEIGHT="); - if (temp) sscanf(temp+strlen("ID_VIDEO_HEIGHT=") ,"%i",&(info->y)); - temp=strstr(buff,"ID_AUDIO_BITRATE="); - if (temp) sscanf(temp+strlen("ID_AUDIO_BITRATE="),"%i",&(info->abr)); - info->br = info->abr + info->vbr; - temp=strstr(buff,"ID_AUDIO_RATE="); - if (temp) sscanf(temp+strlen("ID_AUDIO_RATE="),"%i",&(info->rate)); - temp=strstr(buff,"ID_AUDIO_NCH="); - if (temp) sscanf(temp+strlen("ID_AUDIO_NCH="),"%i",&(info->nch)); - temp=strstr(buff,"ID_LENGTH="); - if (temp) sscanf(temp+strlen("ID_LENGTH="),"%i",&(info->length)); - else{ - sprintf(mplayer_command,"du -b \"%s\" ",filename); - size_query=popen(mplayer_command,"r"); - fscanf(size_query,"%i",&(info->filesize)); - pclose(size_query); - if (info->br > 0) info->length=((info->filesize * 8)/(info->br));} - mplayer_debugf("debug-id\n"); - info->filename=filename; - if((strlen(info->artist)+strlen(info->title)>0)){ - sprintf(info->caption,"%s - %s",info->artist,info->title);} - else{ - temp = g_strdup(g_basename(filename)); - strcpy(info->caption,temp); - free(temp); - if ((temp = strrchr(info->caption, '.')) != NULL) - *temp = '\0'; - } - mplayer_debugf("debug-id\n\n"); - return info; -} - -char **mplayer_make_vector(){ /*To be passed to exec*/ - char** vector; - char** temp; - int i=0; - vector =(char **)malloc(sizeof(char*)*MPLAYER_MAX_VECTOR); - memset(vector,0,sizeof(char*)*MPLAYER_MAX_VECTOR); - mplayer_vector_append(vector,"mplayer"); - mplayer_vector_append(vector,"-slave"); - if(mplayer_current_cfg->vo){ - mplayer_vector_append(vector,"-vo"); - switch(mplayer_current_cfg->vo){ - case MPLAYER_VO_XV: - mplayer_vector_append(vector,"xv"); - break; - case MPLAYER_VO_X11: - mplayer_vector_append(vector,"x11"); - break; - case MPLAYER_VO_GL: - mplayer_vector_append(vector,"gl"); - break; - case MPLAYER_VO_SDL: - mplayer_vector_append(vector,"sdl"); - break; - } - } - if(mplayer_current_cfg->ao){ - mplayer_vector_append(vector,"-ao"); - switch( mplayer_current_cfg->ao){ - case MPLAYER_AO_OSS: - mplayer_vector_append(vector,"oss"); - break; - case MPLAYER_AO_ARTS: - mplayer_vector_append(vector,"arts"); - break; - case MPLAYER_AO_ESD: - mplayer_vector_append(vector,"esd"); - break; - case MPLAYER_AO_ALSA: - mplayer_vector_append(vector,"alsa"); - break; - case MPLAYER_AO_SDL: - mplayer_vector_append(vector,"sdl"); - break; - } - } - if(mplayer_current_cfg->zoom) mplayer_vector_append(vector,"-zoom"); - if(mplayer_current_cfg->framedrop)mplayer_vector_append(vector,"-framedrop"); - if(mplayer_current_cfg->idx) mplayer_vector_append(vector,"-idx"); - if(mplayer_current_cfg->onewin){ - mplayer_vector_append(vector,"-wid"); - mplayer_vector_append(vector,mplayer_wid);} - if(mplayer_current_cfg->xmmsaudio){ - mplayer_vector_append(vector,"-ao"); - mplayer_vector_append(vector,"pcm"); - mplayer_vector_append(vector,"-aofile"); - mplayer_vector_append(vector,mplayer_fifoname); - mplayer_vector_append(vector,"-autosync"); - mplayer_vector_append(vector,"10000"); - mplayer_vector_append(vector,"-nowaveheader"); - mplayer_vector_append(vector,"-format"); - mplayer_vector_append(vector,"128"); - } - if(mplayer_current_cfg->extra){ - mplayer_debugf("debug - adding extra options\n"); - temp= g_strsplit(mplayer_current_cfg->extra," ",0); - while(temp[i]){ - mplayer_vector_append(vector,temp[i]); - i++; - } - g_strfreev(temp); - } - - mplayer_vector_append(vector,mplayer_file); - return vector; -} -void mplayer_vector_append(char**vector,char*param){ - int i=0; - while(vector[i])i++; - if(i >= (MPLAYER_MAX_VECTOR -1)) { - mplayer_debugf("Too many arguments to mplayer!!\n"); - mplayer_debugf("Ignoring parameter: %s\n",param); - return; - } - mplayer_debugf("Adding parameter: %s\n",param); - vector[i]=strdup(param); -} - -void mplayer_read_to_eol(char *str1,char *str2){ - /* copy str2 to str1 till \n is reached in str2 */ - int i=0,j=0; - while(!((str2[j]=='\n')||(str2[j]==(char)0)||(str2[j]==(char)10)||(j>32) )) - str1[i++]=str2[j++]; - str1[i]=(char)0; -} - - -static void mplayer_about(void) -{ - static GtkWidget *window = NULL; - if (window) - return; - - window = xmms_show_message( - "About " PACKAGE, - PACKAGE " " VERSION "\n" - "Author: " " Nandan Dixit " " " "\n" - "http://xmmsmplayer.sourceforge.net/" "\n" - "Ported to Audacious: " " Aaron Sheldon " "\n" - "http://audacious-media-player.org/" "\n" - "This library is free software; you can redistribute it and/or\n" - "modify it under the terms of the GNU Library General Public\n", - "Ok", FALSE, NULL, NULL); - - gtk_signal_connect(GTK_OBJECT(window), "destroy", - GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); - - gtk_widget_show(window); - -} -/* -void mplayer_quitting_video(GtkWidget *widget, gpointer data) { - mplayer_debugf("debug - entered quitting_video\n"); - if(widget==mplayer_video){ - mplayer_debugf("debug - correct widget\n"); - mplayer_video=NULL; - mplayer_wid[0]='\0'; - } -} -*/ diff -r 5783d6281431 -r ee81e087615c src/mplayer/xmmsmplayer.h --- a/src/mplayer/xmmsmplayer.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -#include -#include -#include -#include - -//#include -//#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MPLAYER_INFO_SIZE 128 -#define MPLAYER_TITLE_SIZE 260 -#define MPLAYER_AUDIO_SIZE 4096 -#define MPLAYER_MAX_VECTOR 64 - -/* For debugging output change the define below */ -#define mplayer_debugf -/* #define mplayer_debugf printf */ - - -enum mplayer_vo{ - MPLAYER_VO_NONE = 0, - MPLAYER_VO_XV, - MPLAYER_VO_X11, - MPLAYER_VO_GL, - MPLAYER_VO_SDL -}; - -enum mplayer_ao{ - MPLAYER_AO_NONE = 0, - MPLAYER_AO_OSS, - MPLAYER_AO_ARTS, - MPLAYER_AO_ESD, - MPLAYER_AO_ALSA, - MPLAYER_AO_SDL, - MPLAYER_AO_XMMS -}; -struct mplayer_info { /* Stores the info about a file */ - gchar *filename; - gint vbr,abr,br; /*Video, audio and total bitrates */ - gchar artist[MPLAYER_INFO_SIZE]; - gchar title[MPLAYER_INFO_SIZE]; - glong filesize; /* bytes */ - gint length; /* in seconds */ - gchar caption[MPLAYER_TITLE_SIZE]; - gint rate; /*sampling rate*/ - gint nch; /*no of channels */ - gint x,y; /*x,y resolution */ -} -; - -struct mplayer_cfg{ - gint vo,ao; - gboolean zoom,framedrop,idx,onewin,xmmsaudio; - gchar *extra; -}; - -void mplayer_read_to_eol(char *str1,char *str2); -char **mplayer_make_vector(); -void *mplayer_play_loop(void *arg); -void mplayer_vector_append(char**vector,char*param); - -struct mplayer_info *mplayer_read_file_info(char *filename); -gint mplayer_is_our_file(char *filename); -void mplayer_quitting_video(GtkWidget *widget, gpointer data); -void mplayer_play_file(char *filename); -void mplayer_stop(); -void mplayer_cleanup(); -void mplayer_pause(short p); -void mplayer_seek(int t); -gint mplayer_get_time(); -void mplayer_get_song_info(char * filename, char ** title, int * length); -void mplayer_init(); -InputPlugin *get_iplugin_info(void); - -void on_button_ok_clicked (GtkButton *button, gpointer user_data); -GtkWidget* mplayer_create_configure_win (void); -void mplayer_configure(); -static void mplayer_about(void); -struct mplayer_cfg *mplayer_read_cfg(); -void mplayer_quitting_video(GtkWidget *widget, gpointer data); diff -r 5783d6281431 -r ee81e087615c src/notify/Makefile --- a/src/notify/Makefile Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -include ../../mk/rules.mk -include ../../mk/init.mk - -OBJECTIVE_LIBS = libnotify$(SHARED_SUFFIX) - -LIBDIR = $(plugindir)/$(GENERAL_PLUGIN_DIR) - -SOURCES = notify.c - -OBJECTS = ${SOURCES:.c=.o} - -CFLAGS += $(PICFLAGS) $(GTK_CFLAGS) $(LIBNOTIFY_CFLAGS) $(ARCH_DEFINES) -I../../intl -I../.. -DDATA_DIR=\"$(datadir)\" - -CXXFLAGS = $(CFLAGS) - -LIBADD = $(GTK_LIBS) $(LIBNOTIFY_LIBS) - -include ../../mk/objective.mk diff -r 5783d6281431 -r ee81e087615c src/notify/notify.c --- a/src/notify/notify.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,346 +0,0 @@ -/* - * libnotify plugin for audacious 1.1+ - * http://nenolod.net/code/audacious-notify - * - * See `COPYING' in the directory root for license details. - */ -#include -#include -#include -#include - -#include -#include "audacious/plugin.h" -#include "audacious/playlist.h" -#include "audacious/input.h" -#include "audacious/configdb.h" - -#include "config.h" - -static void init(void); -static void cleanup(void); -static void configure_gui(void); -static void configure_load(void); -static void configure_save(void); -static gboolean watchdog_func(gpointer unused); -static gint timeout_tag = 0; - -static gint notify_playlist_pos = -1; -static gchar *previous_title = NULL; -static gboolean was_playing = FALSE; - -typedef struct -{ - gint notif_timeout; - gboolean notif_neverexpire; - gboolean notif_skipnf; -} -audcfg_t; - -static audcfg_t audcfg = { 5000 , FALSE , TRUE }; - -/* our API. */ -static void do_notification(gchar *summary, gchar *message, gchar *icon_uri); - -GeneralPlugin notify_gp = -{ - NULL, /* handle */ - NULL, /* filename */ - -1, /* xmms_session */ - NULL, /* Description */ - init, - NULL, - configure_gui, - cleanup -}; - -GeneralPlugin *get_gplugin_info(void) -{ - notify_gp.description = g_strdup_printf(_("libnotify Plugin %s"), PACKAGE_VERSION); - return ¬ify_gp; -} - -static void init(void) -{ - /* load configuration */ - configure_load(); - - /* Initialise libnotify */ - notify_init(PACKAGE); - - /* - TODO: I assume 100 means 100ms checking interval? Why not 200? - It would be twice as efficient and the user shouldn't notice any difference. - */ - timeout_tag = g_timeout_add(100, watchdog_func, NULL); -} - -static void cleanup(void) -{ - if ( timeout_tag > 0 ) - { - g_source_remove(timeout_tag); - timeout_tag = 0; - } - - if (previous_title != NULL) - { - g_free(previous_title); - previous_title = NULL; - } - - /* Uninitialise libnotify */ - if ( notify_is_initted() == TRUE ) - notify_uninit(); -} - -static gboolean watchdog_func(gpointer unused) -{ - gint pos = playlist_get_position(); - gchar *title = playlist_get_songtitle(pos); - - /* - Trigger a notice if a song is now playing and one of the following is true: - 1. it has a different title from the last time this ran - 2. there is no title but it's a different playlist position - 3. the player was stopped the last time this ran - (listed in the order they are checked) - - FIXME: The same song twice in a row will only get announced once. - Proposed Remedy: Add a check for playback progress. - */ - if (ip_data.playing && - ((title != NULL && previous_title != NULL && - g_strcasecmp(title, previous_title)) || - (title == NULL && pos != notify_playlist_pos) || (! was_playing))) - { - gchar *tmpbuf, *filename, *songtitle; - TitleInput *tuple; - - tuple = playlist_get_tuple(pos); - - if (tuple == NULL) - return TRUE; - - if (tuple->performer || tuple->album_name || tuple->track_name) { - filename = playlist_get_filename(pos); - - tmpbuf = g_markup_printf_escaped("%s\n%s\n%s", - (tuple->performer ? tuple->performer : ( audcfg.notif_skipnf == FALSE ? _("Unknown Artist") : "" )), - (tuple->album_name ? tuple->album_name : ( audcfg.notif_skipnf == FALSE ? _("Unknown Album") : "" )), - (tuple->track_name ? - tuple->track_name : - (filename ? - (strrchr(filename, '/') ? (strrchr(filename, '/') + 1) : filename) : - _("Unknown Track") - ) - ) - ); - } else { - songtitle = playlist_get_songtitle(pos); - - tmpbuf = g_markup_printf_escaped("%s", (songtitle ? songtitle : _("Unknown Track"))); - } - - do_notification("Audacious", tmpbuf, DATA_DIR "/pixmaps/audacious.png"); - g_free(tmpbuf); - } - - notify_playlist_pos = pos; - - if (previous_title != NULL) - { - g_free(previous_title); - previous_title = NULL; - } - - previous_title = g_strdup(title); - was_playing = ip_data.playing; - - return TRUE; -} - -static void do_notification(gchar *summary, gchar *message, gchar *icon_uri) -{ - NotifyNotification *n; - gint ret; - - n = notify_notification_new(summary, - message, - NULL, NULL); - - /* make sure we have a notify object before continuing, - * for paranoia's sake anyhow. -nenolod - */ - if (n == NULL) - return; - - if ( audcfg.notif_neverexpire == FALSE ) - notify_notification_set_timeout(n, audcfg.notif_timeout); - else - notify_notification_set_timeout(n, NOTIFY_EXPIRES_NEVER); - - if (icon_uri != NULL) - { - GdkPixbuf *gp = gdk_pixbuf_new_from_file(icon_uri, NULL); - - if (gp != NULL) - { - notify_notification_set_icon_from_pixbuf(n, GDK_PIXBUF(gp)); - g_object_unref(G_OBJECT(gp)); - } - } - - ret = notify_notification_show(n, NULL); - -#if 0 - /* rainy day: handle this condition below -nenolod */ - if (ret == 0) - { - /* do something */ - } -#endif - - g_object_unref(G_OBJECT(n)); -} - - -/* ABOUTBOX - TODO -> complete me with credits info! - -static void about_gui(void) -{ - static GtkWidget *aboutwin = NULL; - gchar *aboutstr; - - if ( aboutwin != NULL ) - return; - - aboutstr = g_strdup_printf( _("Audacious libnotify Plugin\n\n...") ); - aboutwin = xmms_show_message( _("About libnotify Plugin"), _(aboutstr), _("Ok"), FALSE, NULL, NULL); - g_free( aboutstr ); - g_signal_connect( G_OBJECT(aboutwin) , "destroy", G_CALLBACK(gtk_widget_destroyed), &aboutwin ); -} -*/ - - -/* CONFIGURATION */ - -static void configure_load(void) -{ - ConfigDb *db; - - db = bmp_cfg_db_open(); - bmp_cfg_db_get_bool(db, "libnotify", "notif_skipnf", &audcfg.notif_skipnf); - bmp_cfg_db_get_int(db, "libnotify", "notif_timeout", &audcfg.notif_timeout); - bmp_cfg_db_get_bool(db, "libnotify", "notif_neverexpire", &audcfg.notif_neverexpire); - bmp_cfg_db_close(db); -} - -static void configure_save(void) -{ - ConfigDb *db = bmp_cfg_db_open(); - bmp_cfg_db_set_bool(db, "libnotify", "notif_skipnf", audcfg.notif_skipnf); - bmp_cfg_db_set_int(db, "libnotify", "notif_timeout", audcfg.notif_timeout); - bmp_cfg_db_set_bool(db, "libnotify", "notif_neverexpire", audcfg.notif_neverexpire); - bmp_cfg_db_close(db); -} - - -static void configure_ev_notiftimeout_toggle( GtkToggleButton *togglebt , gpointer hbox ) -{ - gtk_widget_set_sensitive( GTK_WIDGET(hbox) , !gtk_toggle_button_get_active( togglebt ) ); -} - -static void configure_ev_notifskipnf_commit( gpointer togglebt ) -{ - audcfg.notif_skipnf = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(togglebt) ); -} - -static void configure_ev_notiftimeout_commit( gpointer spinbt ) -{ - audcfg.notif_timeout = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbt) ); -} - -static void configure_ev_notifexpire_commit( gpointer togglebt ) -{ - audcfg.notif_neverexpire = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(togglebt) ); -} - -static void configure_ev_bok( gpointer configwin ) -{ - configure_save(); - gtk_widget_destroy( GTK_WIDGET(configwin) ); -} - -static void configure_gui(void) -{ - static GtkWidget *configwin = NULL; - GtkWidget *configwin_vbox; - GtkWidget *notif_info_frame, *notif_info_vbox, *notif_info_skipnf_cbt; - GtkWidget *notif_timeout_frame, *notif_timeout_hbox, *notif_timeout_vbox; - GtkWidget *notif_timeout_spinbt, *notif_timeout_cbt; - GtkWidget *hbuttonbox, *button_ok, *button_cancel; - - if ( configwin != NULL ) - return; - - configwin = gtk_window_new( GTK_WINDOW_TOPLEVEL ); - gtk_window_set_type_hint( GTK_WINDOW(configwin), GDK_WINDOW_TYPE_HINT_DIALOG ); - gtk_window_set_title( GTK_WINDOW(configwin), _("libnotify plugin") ); - gtk_container_set_border_width( GTK_CONTAINER(configwin), 10 ); - g_signal_connect( G_OBJECT(configwin) , "destroy" , G_CALLBACK(gtk_widget_destroyed) , &configwin ); - configwin_vbox = gtk_vbox_new( FALSE , 6 ); - gtk_container_add( GTK_CONTAINER(configwin) , configwin_vbox ); - button_ok = gtk_button_new_from_stock( GTK_STOCK_OK ); - - /* notification info */ - notif_info_frame = gtk_frame_new( _("Notification details") ); - gtk_box_pack_start( GTK_BOX(configwin_vbox) , notif_info_frame , TRUE , TRUE , 0 ); - notif_info_vbox = gtk_vbox_new( FALSE , 4 ); - gtk_container_set_border_width( GTK_CONTAINER(notif_info_vbox), 4 ); - gtk_container_add( GTK_CONTAINER(notif_info_frame) , notif_info_vbox ); - notif_info_skipnf_cbt = gtk_check_button_new_with_label( _("Skip empty fields") ); - g_signal_connect_swapped( G_OBJECT(button_ok) , "clicked" , - G_CALLBACK(configure_ev_notifskipnf_commit) , notif_info_skipnf_cbt ); - gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(notif_info_skipnf_cbt) , audcfg.notif_skipnf ); - gtk_box_pack_start( GTK_BOX(notif_info_vbox) , notif_info_skipnf_cbt , FALSE , FALSE , 0 ); - - /* notification timeout */ - notif_timeout_frame = gtk_frame_new( _("Notification timeout") ); - gtk_box_pack_start( GTK_BOX(configwin_vbox) , notif_timeout_frame , TRUE , TRUE , 0 ); - notif_timeout_vbox = gtk_vbox_new( FALSE , 4 ); - gtk_container_set_border_width( GTK_CONTAINER(notif_timeout_vbox), 4 ); - gtk_container_add( GTK_CONTAINER(notif_timeout_frame) , notif_timeout_vbox ); - notif_timeout_hbox = gtk_hbox_new( FALSE , 2 ); - notif_timeout_spinbt = gtk_spin_button_new_with_range( 1 , 20000 , 100 ); - gtk_spin_button_set_value( GTK_SPIN_BUTTON(notif_timeout_spinbt) , (gdouble)audcfg.notif_timeout ); - g_signal_connect_swapped( G_OBJECT(button_ok) , "clicked" , - G_CALLBACK(configure_ev_notiftimeout_commit) , notif_timeout_spinbt ); - gtk_box_pack_start( GTK_BOX(notif_timeout_hbox) , - gtk_label_new( _("Expire time:") ) , FALSE , FALSE , 0 ); - gtk_box_pack_start( GTK_BOX(notif_timeout_hbox) , notif_timeout_spinbt , FALSE , FALSE , 0 ); - gtk_box_pack_start( GTK_BOX(notif_timeout_hbox) , - gtk_label_new( _("ms") ) , FALSE , FALSE , 0 ); - gtk_box_pack_start( GTK_BOX(notif_timeout_vbox) , notif_timeout_hbox , FALSE , FALSE , 0 ); - notif_timeout_cbt = gtk_check_button_new_with_label( _("Notification never expires") ); - g_signal_connect( G_OBJECT(notif_timeout_cbt) , "toggled" , - G_CALLBACK(configure_ev_notiftimeout_toggle) , notif_timeout_hbox ); - g_signal_connect_swapped( G_OBJECT(button_ok) , "clicked" , - G_CALLBACK(configure_ev_notifexpire_commit) , notif_timeout_cbt ); - gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(notif_timeout_cbt) , audcfg.notif_neverexpire ); - gtk_box_pack_start( GTK_BOX(notif_timeout_vbox) , notif_timeout_cbt , FALSE , FALSE , 0 ); - - /* buttons */ - hbuttonbox = gtk_hbutton_box_new(); - gtk_button_box_set_layout( GTK_BUTTON_BOX(hbuttonbox) , GTK_BUTTONBOX_END ); - button_cancel = gtk_button_new_from_stock( GTK_STOCK_CANCEL ); - g_signal_connect_swapped( G_OBJECT(button_cancel) , "clicked" , - G_CALLBACK(gtk_widget_destroy) , configwin ); - gtk_container_add( GTK_CONTAINER(hbuttonbox) , button_cancel ); - g_signal_connect_swapped( G_OBJECT(button_ok) , "clicked" , - G_CALLBACK(configure_ev_bok) , configwin ); - gtk_container_add( GTK_CONTAINER(hbuttonbox) , button_ok ); - gtk_box_pack_start( GTK_BOX(configwin_vbox) , hbuttonbox , FALSE , FALSE , 0 ); - - gtk_widget_show_all( configwin ); -} diff -r 5783d6281431 -r ee81e087615c src/sap/Makefile --- a/src/sap/Makefile Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -include ../../mk/rules.mk -include ../../mk/init.mk - -OBJECTIVE_LIBS = libsapplug$(SHARED_SUFFIX) -SUBDIRS = saplib - -LIBDIR = $(plugindir)/$(INPUT_PLUGIN_DIR) - -LIBADD += $(GTK_LIBS) ./saplib/libsap.a - -SOURCES = fileinfo.c sapfile.c sap_plug.c - -CFLAGS += $(GTK_CFLAGS) $(PICFLAGS) -I../../intl -I../.. -CXXFLAGS += $(GTK_CFLAGS) $(PICFLAGS) -I../../intl -I../.. - -OBJECTS = ${SOURCES:.c=.o} - -include ../../mk/objective.mk diff -r 5783d6281431 -r ee81e087615c src/sap/doc/CHANGES --- a/src/sap/doc/CHANGES Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -0.1 - first release (nothing works except "play" :)) - -0.2 - added vis_plugin hooks (spectrum analyzer works now) ;-) - - some fixes - -0.3 - compiler optimizations - - Fixed some compiler warnings in saplib - - Makefile has install target now :) - - Made saplib-exported routines callable from within C code. - - No sapPlaySong on SAP load (sapEngine.cpp), caller should initialize song - - Corrected title display - - Can skip to subsongs if they exist. - - File info box - - Can edit and write SAP tags - - sourcetree reorganisation :) - - fixed compilation problems with gcc 3.x - - should compile on FreeBSD - -0.3f - merged a fix from Miloslaw Smyk for a bug with Crossfade output plugin - (song played twice as fast after some time, not seen using OSS output) - -0.31 - fix for segfault crash with file info (ctrl+3) - - works on FreeBSD out of the box - \ No newline at end of file diff -r 5783d6281431 -r ee81e087615c src/sap/doc/COMPILATION --- a/src/sap/doc/COMPILATION Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -COMPILATION REQUIREMENTS ------------------------- - -To compile the plugin you need: - - - gcc/g++ and at least libc6 2.1.x with POSIX pthreads - and a linux or *BSD system - - TESTED: - linux/x86 (gcc 2.95.2 and glibc 2.1.3) - compiles cleanly, works OK - linux/x86 (gcc 2.95.4 and glibc 2.2.5) - compiles cleanly, works OK - linux/alpha (gcc 3.2.2 and glibc 2.2.5) - compiles cleanly, works OK - - - xmms (of course :)), libxmms,libxmms-devel - - TESTED: - xmms 1.2.7 - OK - REPORTED: - xmms 1.2.8 - OK - - - gtk,gtk-devel, glib,glib-devel - - TESTED: - gtk+ 1.2.10 glib 1.2.10 - OK - REPORTED - gtk+ 1.2.8 glib 1.2.8 - OK - - -COMPILATION INSTRUCTIONS ------------------------- - -NOTE: Since I cannot have access to as many platforms as linux runs on, I need the -information about copilation issues on different machines/oses/architectures. -Just compile it! If it fails drop me a line with info on your system, -compiler and glibc versions. -If it compiles OK, and you use something different than the software / platform -mentioned above as TESTED, I need the info even more. Please be helpful ;) - -To compile just do a 'make && make install' in the plugin source dir. -That's it. Enjoy! diff -r 5783d6281431 -r ee81e087615c src/sap/doc/CREDITS --- a/src/sap/doc/CREDITS Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -AUTHORS -------- -Michal Szwaczko (mikey@scene.pl) - -This plugin wouldn't be possible without the work of -Adam 'SoTe' Bienias. Adam wrote saplib, a portable POKEY+6502 emulator library -that is used extensively by the plugin. Thanks Adam!. - -CONTRIBUTORS ------------- -Azbest (azbest@plasma.ath.cx) - bugreports, FTP space. -Miloslaw Smyk (thorgal@wfmh.org.pl) - bugfix for Crossfade output plugin. -Mattias Fenner (informix@web.de) - bugreports, XMMS pluginpack maintainer. -Daniel Kozminski (dely@scene.pl) - media support :) - -[This space is for you] diff -r 5783d6281431 -r ee81e087615c src/sap/doc/README --- a/src/sap/doc/README Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -SAPPLUG - an XMMS plugin for POKEY tunes ----------------------------------------- - -Sapplug is a POKEY tunes player plugin for X Multimedia System (xmms) -This is a beta release, after first alpha versions seem to work fine. - -This, however means that it's still a work-in-progress software, some -features are missing. If you find some bugs - firs look in TODO list -to check if I am already working on them, same with new features requests. - -!!! Check TODO before sending me hate-mail. !!! - -USAGE ------ - -Just fire up xmms as you would normally and load some SAP tunes. -In case of not being able to play check in the preferences if -the plugin is installed and active!!! -Do not hesitate to mail me if you have problems compiling the plugin, -hovewer, due to limited amount of time, I will not be able to answer any -mail concerning general use of xmms or general plugin installation. -Report problems with *compiling* or *using* *this* plugin !!! - -Some notes: - -The seekbar is used to switch subsongs within a multi-song SAP. -Just click on it and the player plays next subsong! -The number of songs in a SAP file is displayed in the main xmms window -as X kHz (where X is the number of songs within the SAP file) -This info is also available in the sapfile info box. - -File info box is brought up when you click "View file info" in XMMS :) -It gives you general information about SAP file and presents so called -SAP tag. It's a set of name, author and date of the song, similar to an mp3 tag. -You can also edit this SAP tag, i.e. change author, name or date of the song. -Click "Save" and the new tag gets written to the file. Also, you can remove -the tag from the SAPfile by clicking "Remove Tag" - -Enjoy!! --- -mikey -New Generation // WireLabs - \ No newline at end of file diff -r 5783d6281431 -r ee81e087615c src/sap/doc/README.audacious --- a/src/sap/doc/README.audacious Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -Audacious sapplug-xmms Port 0.31 - -Copyright (c) 2006 Aaron Sheldon - -This is a port of sapplug-xmms, an atari SAP music player. - -Refer to the README for more information diff -r 5783d6281431 -r ee81e087615c src/sap/doc/TODO --- a/src/sap/doc/TODO Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -TODO list for SAP plugin. - -- Make plugin jump to next song in playlist when finished -- Seek within a song - diff -r 5783d6281431 -r ee81e087615c src/sap/fileinfo.c --- a/src/sap/fileinfo.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,326 +0,0 @@ -/* - * SAP xmms plug-in. - * Copyright 2002/2003 by Michal 'Mikey' Szwaczko - * - * SAP Library ver. 1.56 by Adam Bienias - * - * This is free software. You can modify it and distribute it under the terms - * of the GNU General Public License. The verbatim text of the license can - * be found in file named COPYING in the source directory. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - */ -#include -#include -#include -#include -#include -#include - -#include "fileinfo.h" -#include "saplib/sapLib.h" - -static void fail (gchar *error) { - - gchar *errorstring; - - errorstring = g_strdup_printf("An error occured:\n%s", error); - xmms_show_message("Error!",errorstring, "Ok", FALSE, NULL, NULL); - g_free(errorstring); - return; -} - - -static void write_tag (GtkWidget *w , gpointer data) { - - - gchar *author, *title, *date, *tmpfn, *original_filename; - FILE *outf; - - int ofd; - - /* tags taken from info_box (edited or not) */ - author = (gchar*)gtk_entry_get_text(GTK_ENTRY(performer_entry)); - title = (gchar*)gtk_entry_get_text(GTK_ENTRY(title_entry)); - date = (gchar*)gtk_entry_get_text(GTK_ENTRY(date_entry)); - original_filename = (gchar*)gtk_entry_get_text(GTK_ENTRY(filename_entry)); - - // prepare tmp file - tmpfn = g_strdup_printf("/tmp/sapplugXXXXXX"); - - if ((ofd = mkstemp( tmpfn )) < 0 ) { - - fail("Can't make tempfile"); - g_free(tmpfn); - return; - - } - - if ((outf = fdopen(ofd,"wb")) == NULL ) { - - g_free(tmpfn); - fail("Cant write to file"); - close(ofd); - return; - - } - - /* start writing header */ - - fprintf(outf,"SAP\r\n"); - - if (strlen(author) != 0) - - fprintf(outf, "AUTHOR \"%s\"\r\n",author); - - if (strlen(title) != 0) - - fprintf(outf,"NAME \"%s\"\r\n",title); - - if (strlen(date) != 0) - - fprintf(outf,"DATE \"%s\"\r\n",date); - - /* save original songtype */ - - fprintf(outf,"TYPE %c\r\n",type_h); - - /* save original TAGS */ - - if (is_stereo == 1) - - fprintf(outf,"STEREO\r\n"); - - if (fastplay != -1) - - fprintf(outf,"FASTPLAY %d\r\n",fastplay); - - if (songs != -1) - - fprintf(outf,"SONGS %d\r\n",songs); - - if (defsong != -1) - - fprintf(outf,"DEFSONG %d\r\n",defsong); - - if (ini_address != -1) - - fprintf(outf,"INIT %.4X\r\n",ini_address); - - if (msx_address != -1) - - fprintf(outf,"MUSIC %.4X\r\n",msx_address); - - if (plr_address != -1) - - fprintf(outf,"PLAYER %.4X\r\n",plr_address); - - /* header written - now append original SAP data */ - - fwrite(&buffer+headersize, 1, filesize-headersize,outf); - fclose(outf); - - /* and rename it */ - if (rename(tmpfn,original_filename) < 0) { - - remove(tmpfn); - g_free(tmpfn); - fail("Failed to write!"); - return; - } - - remove(tmpfn); - g_free(tmpfn); - gtk_widget_destroy(window); - -} - -static void remove_tag (void) { - - gtk_entry_set_text(GTK_ENTRY(performer_entry),""); - gtk_entry_set_text(GTK_ENTRY(title_entry),""); - gtk_entry_set_text(GTK_ENTRY(date_entry),""); - -} - -void sap_file_info_box(char *filename) { - - gchar *tmp; - gchar *info_text; - - static GtkWidget *info_frame, *info_box, *sap_info_label; - static GtkWidget *tag_frame; - - GtkWidget *hbox, *label, *filename_hbox, *vbox, *left_vbox; - GtkWidget *table, *bbox, *cancel_button; - GtkWidget *save_button, *remove_button; - - - if (filename != NULL) { - - /* dig info from the sapfile */ - if ((load_sap(filename)) < 0) return; - - if (!window) { - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE); - gtk_signal_connect(GTK_OBJECT(window), "destroy", - GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); - gtk_container_set_border_width(GTK_CONTAINER(window), 10); - - vbox = gtk_vbox_new(FALSE, 10); - gtk_container_add(GTK_CONTAINER(window), vbox); - - filename_hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(vbox), filename_hbox, FALSE, TRUE, 0); - - label = gtk_label_new("Filename:"); - gtk_box_pack_start(GTK_BOX(filename_hbox), label, FALSE, TRUE, 0); - filename_entry = gtk_entry_new(); - gtk_editable_set_editable(GTK_EDITABLE(filename_entry), FALSE); - gtk_box_pack_start(GTK_BOX(filename_hbox), filename_entry,TRUE, TRUE, 0); - - hbox = gtk_hbox_new(FALSE, 10); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); - - left_vbox = gtk_vbox_new(FALSE, 10); - gtk_box_pack_start(GTK_BOX(hbox), left_vbox, FALSE, FALSE, 0); - - tag_frame = gtk_frame_new("SAP Tag:"); - gtk_box_pack_start(GTK_BOX(left_vbox), tag_frame, FALSE, FALSE, 0); - - table = gtk_table_new(5, 5, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_container_add(GTK_CONTAINER(tag_frame), table); - - label = gtk_label_new("Title:"); - gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, - GTK_FILL, GTK_FILL, 5, 5); - - title_entry = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), title_entry, 1, 4, 0, 1, - GTK_FILL | GTK_EXPAND | GTK_SHRINK, - GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); - - label = gtk_label_new("Artist:"); - gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, - GTK_FILL, GTK_FILL, 5, 5); - - performer_entry = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), performer_entry, 1, 4, 1, 2, - GTK_FILL | GTK_EXPAND | GTK_SHRINK, - GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); - - label = gtk_label_new("Date:"); - gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5, - GTK_FILL, GTK_FILL, 5, 5); - - date_entry = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), date_entry, 1, 2, 4, 5, - GTK_FILL | GTK_EXPAND | GTK_SHRINK, - GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); - - - bbox = gtk_hbutton_box_new(); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), - GTK_BUTTONBOX_END); - gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); - gtk_box_pack_start(GTK_BOX(left_vbox), bbox, FALSE, FALSE, 0); - - save_button = gtk_button_new_with_label("Save"); - gtk_signal_connect(GTK_OBJECT(save_button), "clicked", - GTK_SIGNAL_FUNC(write_tag), NULL); - - GTK_WIDGET_SET_FLAGS(save_button, GTK_CAN_DEFAULT); - - gtk_box_pack_start(GTK_BOX(bbox), save_button, TRUE, TRUE, 0); - gtk_widget_grab_default(save_button); - - remove_button = gtk_button_new_with_label("Remove Tag"); - gtk_signal_connect_object(GTK_OBJECT(remove_button), - "clicked", - GTK_SIGNAL_FUNC(remove_tag), NULL); - - GTK_WIDGET_SET_FLAGS(remove_button, GTK_CAN_DEFAULT); - gtk_box_pack_start(GTK_BOX(bbox),remove_button, TRUE, TRUE, 0); - - cancel_button = gtk_button_new_with_label("Cancel"); - gtk_signal_connect_object(GTK_OBJECT(cancel_button), - "clicked", - GTK_SIGNAL_FUNC(gtk_widget_destroy), - GTK_OBJECT(window)); - GTK_WIDGET_SET_FLAGS(cancel_button, GTK_CAN_DEFAULT); - gtk_box_pack_start(GTK_BOX(bbox),cancel_button, TRUE, TRUE, 0); - - /* info frame */ - info_frame = gtk_frame_new("SAP Info:"); - gtk_box_pack_start(GTK_BOX(hbox), info_frame, FALSE, FALSE, 0); - - info_box = gtk_vbox_new(FALSE, 5); - gtk_container_add(GTK_CONTAINER(info_frame), info_box); - gtk_container_set_border_width(GTK_CONTAINER(info_box), 5); - gtk_box_set_spacing(GTK_BOX(info_box), 0); - - sap_info_label = gtk_label_new(""); - gtk_misc_set_alignment(GTK_MISC(sap_info_label), 0, 0); - gtk_label_set_justify(GTK_LABEL(sap_info_label), - GTK_JUSTIFY_LEFT); - gtk_box_pack_start(GTK_BOX(info_box), sap_info_label, FALSE, - FALSE, 0); - /* end info frame */ - - gtk_widget_show_all(window); - - } else - - gdk_window_raise(window->window); - gtk_widget_set_sensitive(tag_frame, TRUE); - - /* window drawn and displayed ... now - the code - - clear up entries */ - remove_tag(); - - /* show filename in the entrybox */ - gtk_entry_set_text(GTK_ENTRY(filename_entry),filename); - /* and in the window title ... */ - tmp = g_strdup_printf("File Info - [%s]", g_basename(filename)); - gtk_window_set_title(GTK_WINDOW(window), tmp); - - /* fill up entries with what we dug out from the sapfile */ - gtk_entry_set_text(GTK_ENTRY(performer_entry),author); - gtk_entry_set_position(GTK_ENTRY(performer_entry),0); - gtk_entry_set_text(GTK_ENTRY(title_entry),name); - gtk_entry_set_position(GTK_ENTRY(title_entry),0); - gtk_entry_set_text(GTK_ENTRY(date_entry),date); - gtk_entry_set_position(GTK_ENTRY(date_entry),0); - /* fill in sap_info_frame; */ - info_text = g_strdup_printf( - "Type: %s\nStereo: %s\nSpeed: %d / Frame\nSongs: %d\n\nSize: %ld\n", - - type, - (is_stereo > 0) ? "Yes" : "No", - times_per_frame, - (songs > 0) ? songs : 1, - filesize ); - - gtk_label_set_text(GTK_LABEL(sap_info_label),info_text); - - /* cleanup */ - g_free(info_text); - g_free(tmp); - - } - -} diff -r 5783d6281431 -r ee81e087615c src/sap/fileinfo.h --- a/src/sap/fileinfo.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/* - * SAP xmms plug-in. - * Copyright 2002/2003 by Michal 'Mikey' Szwaczko - * - * SAP Library ver. 1.56 by Adam Bienias - * - * This is free software. You can modify it and distribute it under the terms - * of the GNU General Public License. The verbatim text of the license can - * be found in file named COPYING in the source directory. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - */ - -static GtkWidget *title_entry, *performer_entry; -static GtkWidget *date_entry; -static GtkWidget *filename_entry; -static GtkWidget *window = NULL; - -extern int load_sap (char *); -extern unsigned char buffer; - -extern long filesize; -extern int headersize; -extern char author[]; -extern char name[]; -extern char date[]; -extern int is_stereo; -extern int fastplay; -extern char type_h; /* type as seen in SAP header; */ -extern char type[]; /* type in ascii; */ -extern int plr_address; -extern int msx_address; -extern int ini_address; -extern int songs; -extern int defsong; -extern int times_per_frame; diff -r 5783d6281431 -r ee81e087615c src/sap/sap_plug.c --- a/src/sap/sap_plug.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -/* - * SAP xmms plug-in. - * Copyright 2002/2003 by Michal 'Mikey' Szwaczko - * - * SAP Library ver. 1.56 by Adam Bienias - * - * This is free software. You can modify it and distribute it under the terms - * of the GNU General Public License. The verbatim text of the license can - * be found in file named COPYING in the source directory. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - */ -#include -#include -#include -#include -#include -#include -#include - -#include "sap_plug.h" - -InputPlugin sap_ip = { - - NULL, - NULL, - "SAP Plugin " VERSION, - NULL, - sap_about, - NULL, - sap_is_our_file, - NULL, - sap_play_file, - sap_stop, - sap_pause, - sap_seek, - NULL, - sap_get_time, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - sap_file_info_box, - NULL -}; - -InputPlugin *get_iplugin_info (void) { - return &sap_ip; -} - -static int sap_is_our_file (char *filename) { - - char *ext; - - ext = strrchr(filename, '.'); - - if (ext) - { - if (!strcmp(ext, ".SAP")) - return 1; - if (!strcmp(ext, ".sap")) - return 1; - } - - return 0; -} - -static void *play_loop (gpointer arg) -{ - while (going) - { - sapRenderBuffer(play_buf,N_RENDER); - - /* for spectrum analyser */ - produce_audio(sap_ip.output->written_time(), FMT_S16_NE, 2, N_RENDER<<2, play_buf, &going); - } - - sap_ip.output->buffer_free(); - sap_ip.output->buffer_free(); - g_thread_exit(NULL); -} - -static void sap_play_file (char *filename) -{ - GString *titstr; - - if ((currentFile = sapLoadMusicFile(filename)) == NULL) return; - - /* for tunes */ - tunes = currentFile->numOfSongs; - - if (tunes < 0) tunes = 1; - - /* we always start with 1st tune */ - currentSong = 0; - - sapPlaySong(currentSong); - - going = TRUE; - audio_error = FALSE; - - if (sap_ip.output->open_audio(FMT_S16_LE, OUTPUT_FREQ, 2) == 0) { - - audio_error = TRUE; - going = FALSE; - - return; - } - /* delete '.sap' from filename to display */ - titstr = g_string_new(g_basename(filename)); - g_string_truncate(titstr,titstr->len - 4); - - sap_ip.set_info(titstr->str, tunes, tunes*1024, OUTPUT_FREQ, 2); - - g_string_free(titstr,TRUE); - - play_thread = g_thread_create(play_loop, NULL, TRUE, NULL); -} - -static void sap_stop (void) -{ - if (going) - { - going = FALSE; - g_thread_join(play_thread); - sap_ip.output->close_audio(); - } -} - -static void sap_seek(int time) { - - if (currentSong != tunes) { - - currentSong = (currentSong+1) % currentFile->numOfSongs; - sapPlaySong(currentSong); - sap_ip.output->flush(currentSong * 1000); - - } -} - -static void sap_pause(short paused) { - - sap_ip.output->pause(paused); - -} - -static int sap_get_time(void) { - - return sap_ip.output->output_time(); -} - -static void sap_about (void) { - - static GtkWidget *aboutbox; - - if (aboutbox != NULL) - return; - - aboutbox = xmms_show_message( - "About SAP Plugin", - "SAP Player plug-in v"VERSION"\nby Michal Szwaczko \n SAP library ver 0.3F by Adam Bienias\n\n" - "Get more POKEY sound from ASMA at:\n[http://asma.musichall.cz]\n\nEnjoy!", - "Ok", FALSE, NULL, NULL); - - gtk_signal_connect(GTK_OBJECT(aboutbox), "destroy", - GTK_SIGNAL_FUNC(gtk_widget_destroyed), &aboutbox); -} diff -r 5783d6281431 -r ee81e087615c src/sap/sap_plug.h --- a/src/sap/sap_plug.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* - * SAP xmms plug-in. - * Copyright 2002/2003 by Michal 'Mikey' Szwaczko - * - * SAP Library ver. 1.56 by Adam Bienias - * - * This is free software. You can modify it and distribute it under the terms - * of the GNU General Public License. The verbatim text of the license can - * be found in file named COPYING in the source directory. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - */ -#include "saplib/sapLib.h" - -/* Default frequency */ -#define OUTPUT_FREQ 44100 -/* how many samples per one saprender() */ -#define N_RENDER 1024 - -/* functions */ -static int sap_is_our_file (char *); -static void sap_play_file(gchar *); -static void sap_stop(void); -static void sap_pause(short); -static void sap_seek(int); -static int sap_get_time(void); -static void sap_about(void); - -extern void sap_file_info_box(char *); - -static gboolean going; -static gboolean audio_error; -GThread *play_thread; - -int currentSong; -static int tunes; - -sapMUSICstrc *currentFile; - -signed short play_buf[N_RENDER << 2]; diff -r 5783d6281431 -r ee81e087615c src/sap/sapfile.c --- a/src/sap/sapfile.c Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,363 +0,0 @@ -/* - * SAP xmms plug-in. - * Copyright 2002/2003 by Michal 'Mikey' Szwaczko - * - * SAP Library ver. 1.56 by Adam Bienias - * - * This is free software. You can modify it and distribute it under the terms - * of the GNU General Public License. The verbatim text of the license can - * be found in file named COPYING in the source directory. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - */ -#include -#include -#include -#include -#include -#include -#include - -#include "sapfile.h" - -int load_sap (char *fname) { - - struct stat st; - int i, k; - - FILE *f; - - /* flush static buffers */ - - memset(author, 0, 2048); - memset(name, 0, 2048); - memset(date, 0, 2048); - memset(type, 0, 20); - - /* get filesize */ - - if (stat(fname, &st) < 0) - - return -1; - - filesize = st.st_size; - - /* open & read file into buffer */ - - f = fopen(fname, "rb"); - - if ( !f ) - - return -1; - - fread(buffer, 1, filesize, f); - - fclose(f); - - /* check if it is a sap file */ - - if (strncmp(buffer, "SAP", 3) != 0 ) - - return -1; - - /* set headersize */ - - for (i = 0; i < filesize; i++) { - - if (buffer[i] == '\xFF' ) { - - headersize = i; - break; - } - - if (buffer[i] != '\xFF' && i == filesize-1) - - return -1; - } - - /* sanity checking done - parse the info tags - please someone rewrite this !!! :) - this code sux0r ... */ - - /* check for author */ - - k = 0; - - for (i = 0;i < headersize; i++) { - - if (strncmp(buffer + i, "AUTHOR", 6) == 0 ) { - - i = i + 8; - - while (buffer[i] != '"' && buffer[i] != 0x0D && buffer[i] != 0x0A) { - - author[k] = buffer[i]; - k++; i++; - } - break; - } - /* notfound */ - sprintf(author, "%s", ""); - } - - /* check for name */ - - k = 0; - - for (i = 0;i < headersize; i++) { - - if ( strncmp(buffer + i, "NAME", 4) == 0 ) { - - i = i + 6; - - while (buffer[i] != '"' && buffer[i] != 0x0D && buffer[i] != 0x0A) { - - name[k] = buffer[i]; - k++; i++; - } - break; - } - /* notfound */ - sprintf(name, "%s", ""); - } - - /* check for date */ - - k = 0; - - for(i = 0;i < headersize; i++) { - - if (strncmp(buffer + i, "DATE", 4) == 0 ) { - - i = i + 6; - - while (buffer[i] != '"' && buffer[i] != 0x0D && buffer[i] != 0x0A) { - - date[k] = buffer[i]; - k++; i++; - } - break; - } - /* notfound */ - sprintf(date, "%s", ""); - } - - - /* check for stereo */ - - for (i = 0; i < headersize; i++) { - - if (strncmp(buffer + i, "STEREO", 6) == 0 ) { - - is_stereo = 1; - break; - } - /* notfound */ - is_stereo = -1; - } - - /* check fastplay; */ - - for (i = 0; i < headersize; i++) { - - if (strncmp(buffer + i, "FASTPLAY", 8) == 0 ) { - - k = strtol(&buffer[i + 1 + 8], NULL, 10); - - if ( k == 0 || k > 312 ) - - /* illegal fastplay value */ - return -1; - - else - - fastplay = k; - - switch (k) { - - case 156: - - times_per_frame = 2; - break; - - case 104: - - times_per_frame = 3; - break; - - case 78: - - times_per_frame = 4; - break; - - } - break; - } - /* notfound */ - fastplay = -1; - times_per_frame = 1; - } - - /* check songs */ - for (i = 0; i < headersize; i++) { - - if (strncmp(buffer + i, "SONGS", 5) == 0) { - - k = strtol(&buffer[i + 1 + 5], NULL, 10); - - if ( (k == 0) || (k > 0xffff) ) - /* illegal songs value */ - return -1; - else - - songs = k; - break; - } - /* notfound */ - songs = -1; - } - - /* check defsong */ - for (i = 0;i < headersize; i++) { - - if (strncmp(buffer + i, "DEFSONG", 7) == 0 ) { - - k = strtol(&buffer[i + 1 + 7], NULL, 10); - - if ( (k < 0) || (k > 0xffff) ) - /* illegal defsong value */ - return -1; - - else - - defsong = k; - break; - } - /* notfound */ - defsong = -1; - } - - - /* check songtype */ - for (i = 0;i < headersize; i++) { - - if (strncmp(buffer + i, "TYPE", 4) == 0 ) { - - i = i + 5; - - if (buffer[i] == 'B') { - /* SAP documentation says - "any player" */ - sprintf(type, "Standard"); - type_h = 'B'; - break; - } - - if (buffer[i] == 'S') { - - sprintf(type, "SoftSynth"); - type_h = 'S'; - break; - } - - if (buffer[i] == 'D') { - - sprintf(type, "DigiSynth"); - type_h = 'D'; - break; - } - - if (buffer[i] == 'C') { - - sprintf(type, "CMC Synth"); - type_h= 'C'; - break; - } - - if (buffer[i] == 'M') { - /* unsupported (?) */ - sprintf(type, "M-Type"); - type_h = 'M'; - break; - } - - if (buffer[i] == 'R') { - /* this is unsupported - perhaps we */ - /* should return -1 as for now */ - sprintf(type, "Regs"); - type_h = 'R'; - break; - } - /* unsupported songtype */ - return -1; - } - /* no type specified */ - if (i == headersize - 1) return -1; - - } - - /* msx_address */ - for (i = 0;i < headersize; i++) { - - if (strncmp(buffer + i, "MUSIC", 5) == 0 ) { - - k = strtol(&buffer[i + 1 + 5], NULL, 16); - - if ( (k == 0) || (k > 0xffff) ) - /* illegal address */ - return -1; - else - - msx_address = k; - break; - } - /* notfound */ - msx_address = -1; - } - - /* ini address */ - for (i = 0;i < headersize; i++) { - - if (strncmp(buffer + i, "INIT", 4) == 0 ) { - - k = strtol(&buffer[i + 1 + 4], NULL, 16); - - if ( (k == 0) || (k > 0xffff) ) - /* illegal address */ - return -1; - else - - ini_address = k; - break; - } - /* notfound */ - ini_address = -1; - } - /* player */ - for (i = 0; i < headersize; i++) { - - if (strncmp(buffer + i,"PLAYER", 6) == 0 ) { - - k = strtol(&buffer[i + 1 + 6], NULL, 16); - - if ( (k == 0) || (k > 0xffff) ) - /* illegal */ - return -1; - else - - plr_address = k; - break; - } - /* notfound */ - plr_address = -1; - } - - return 1; -} diff -r 5783d6281431 -r ee81e087615c src/sap/sapfile.h --- a/src/sap/sapfile.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* - * SAP xmms plug-in. - * Copyright 2002/2003 by Michal 'Mikey' Szwaczko - * - * SAP Library ver. 1.56 by Adam Bienias - * - * This is free software. You can modify it and distribute it under the terms - * of the GNU General Public License. The verbatim text of the license can - * be found in file named COPYING in the source directory. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - */ - -char buffer[0x10000]; - -char author[2048]; -char name[2048]; -char date[2048]; -char type[20]; /* type in ascii */ -char type_h; /* type as seen in SAP header; */ - -long filesize; - -int headersize; -int is_stereo; -int fastplay; -int plr_address; -int msx_address; -int ini_address; -int songs; -int defsong; -int times_per_frame; /* times per frame */ diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/Makefile --- a/src/sap/saplib/Makefile Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -include ../../../mk/rules.mk -include ../../../mk/init.mk - -CFLAGS += $(PICFLAGS) -I../../intl -I../.. -CXXFLAGS += $(PICFLAGS) -I../../intl -I../.. - -OBJECTIVE_LIBS_NOINST = libsap.a -SOURCES = pokey0.cxx pokey1.cxx sapCpu.cxx sapEngine.cxx sapPokey.cxx - -OBJECTS = ${SOURCES:.cxx=.o} - -include ../../../mk/objective.mk - -libsap.a: $(OBJECTS) - $(AR) cq $@ $(OBJECTS) diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/legal.txt --- a/src/sap/saplib/legal.txt Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ - - Disclaimer. - -I, Adam Bienias, author of the SAP Library, I'm not responsible -for any kind of hardware or software damage caused by this library. -Use it on your risk. SAP Library is distributed as FREEWARE but -any changes in the library must be approved by me. If You use SAP -Library in Your program, then You must include information about -SAP library: "SAP Library ver.x.xx by Adam Bienias". - - For contact send email to: adam@nautilus.com.pl diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/pokey.png Binary file src/sap/saplib/pokey.png has changed diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/pokey0.cxx --- a/src/sap/saplib/pokey0.cxx Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -#include -#include -#include -#include -#include - -#include "sapGlobals.h" - -#define NAMESPACENAME POKEY0_NAMESPACE -#define POKEY_INIT_FUNC void pokeyInit0( void ) -#define POKEY_RESET_FUNC void pokeyReset0( void ) -#define POKEY_UPDATESOUND_FUNC void pokeyUpdateSound0( int n ) -#define POKEY_UPDATECOUNT_FUNC void pokeyUpdateSoundCounters0( void ) -#define POKEY_WRITE_FUNC void pokeyWriteByte0( short unsigned int address, BYTE value ) -#define POKEY_WRITE_2FUNC(a,v) pokeyWriteByte0(a,v) - -#include "pokeyNamespace.h" - -bool *generateIRQ0 = &POKEY0_NAMESPACE::generateIRQ0; - -POKEY_WRITE_FUNC -{ - address&=0x0F; - - switch( address ) - { - case 0x00: - divideByN_Latch[0] = value; - SetupChannels01; - break; - case 0x01: - audioControl_Latch[0] = value; - audioControl_Latch2[0] = value&15; - audioControl_Latch_Digi[0] = (value>>4)&1 ? 15:0; - Channel0Distortion = channelsDistorionTable0[ (value>>4)&15 ]; - if( !(value&0x10) ) - SetupChannels01; - break; - case 0x02: - divideByN_Latch[1] = value; - SetupChannels01; - break; - case 0x03: - audioControl_Latch[1] = value; - audioControl_Latch2[1] = value&15; - audioControl_Latch_Digi[1] = (value>>4)&1 ? 15:0; - Channel1Distortion = channelsDistorionTable1[ (value>>4)&15 ]; - if( !(value&0x10) ) - SetupChannels01; - break; - case 0x04: - divideByN_Latch[2] = value; - SetupChannels23; - break; - case 0x05: - audioControl_Latch[2] = value; - audioControl_Latch2[2] = value&15; - audioControl_Latch_Digi[2] = (value>>4)&1 ? 15:0; - Channel2Distortion = channelsDistorionTable2[ (value>>4)&15 ]; - if( !(value&0x10) ) - SetupChannels23; - break; - case 0x06: - divideByN_Latch[3] = value; - SetupChannels23; - break; - case 0x07: - audioControl_Latch[3] = value; - audioControl_Latch2[3] = value&15; - audioControl_Latch_Digi[3] = (value>>4)&1 ? 15:0; - Channel3Distortion = channelsDistorionTable3[ (value>>4)&15 ]; - if( !(value&0x10) ) - SetupChannels23; - break; - case 0x08: - { - BYTE prevAUDCTL; - prevAUDCTL = AUDCTL; - AUDCTL = value; - pcc1564 = value & 1 ? 112:28; - - noiseAND = AUDCTL & 128 ? 0x1FF:0x1FFFF; - - switch_J3_Q_stateAND[0] = AUDCTL&4 ? 15:0; - switch_J3_Q_stateAND[1] = AUDCTL&2 ? 15:0; - - SetupChannels01; - SetupChannels23; - - if( (prevAUDCTL^AUDCTL)&0x10 ) - divideByN[1] = 2; - if( (prevAUDCTL^AUDCTL)&0x8 ) - divideByN[3] = 2; - - break; - } - case 0x0D: - break; - case 0x0E: - // najpierw czyscimy status przerwan IRQ_ST. Tam gdzie we wpisywanej wartosci jest 0, - // status tego przerwania jest zerowany - IRQ_ST = IRQ_ST&value; - IRQ_EN = value; - // teraz sprawdzamy czy musimy ustawic linie IRQ - IRQ_line = ((IRQ_ST&IRQ_EN)!=0x00) ? 0x01:0x00; - break; - case 0x0F: - break; - } -} - -void pokeyGenerateCheckIRQline( void ) -{ - if( ((cpuFlag_I&1)==0) && IRQ_line ) - { - BYTE fl,lsb,msb; - atariMem[0x100 + cpuReg_S] = (cpuReg_PC>>8)&0xFF; cpuReg_S--; - atariMem[0x100 + cpuReg_S] = cpuReg_PC&0xFF; cpuReg_S--; - atariMem[0x100 + cpuReg_S] = fl = cpuGetFlags(); cpuReg_S--; - lsb = atariMem[0xFFFE]; msb = atariMem[0xFFFF]; - cpuReg_PC = ((WORD)lsb) + ((WORD)msb)*256; - } -} - -void pokeyGenerateIRQ( BYTE irqMask ) -{ - IRQ_ST |= irqMask; - IRQ_line = ((IRQ_ST&IRQ_EN)!=0x00) ? 0x01:0x00; - pokeyGenerateCheckIRQline(); -} - - diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/pokey1.cxx --- a/src/sap/saplib/pokey1.cxx Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -#include -#include -#include -#include -#include - -#include "sapGlobals.h" - -#define NAMESPACENAME POKEY1_NAMESPACE -#define POKEY_INIT_FUNC void pokeyInit1( void ) -#define POKEY_RESET_FUNC void pokeyReset1( void ) -#define POKEY_UPDATESOUND_FUNC void pokeyUpdateSound1( int n ) -#define POKEY_UPDATECOUNT_FUNC void pokeyUpdateSoundCounters1( void ) -#define POKEY_WRITE_FUNC void pokeyWriteByte1( short unsigned int address, BYTE value ) -#define POKEY_WRITE_2FUNC(a,v) pokeyWriteByte1(a,v) - -#include "pokeyNamespace.h" - -POKEY_WRITE_FUNC -{ - address&=0x0F; - - switch( address ) - { - case 0x00: - divideByN_Latch[0] = value; - SetupChannels01; - break; - case 0x01: - audioControl_Latch[0] = value; - audioControl_Latch2[0] = value&15; - audioControl_Latch_Digi[0] = (value>>4)&1 ? 15:0; - Channel0Distortion = channelsDistorionTable0[ (value>>4)&15 ]; - if( !(value&0x10) ) - SetupChannels01; - break; - case 0x02: - divideByN_Latch[1] = value; - SetupChannels01; - break; - case 0x03: - audioControl_Latch[1] = value; - audioControl_Latch2[1] = value&15; - audioControl_Latch_Digi[1] = (value>>4)&1 ? 15:0; - Channel1Distortion = channelsDistorionTable1[ (value>>4)&15 ]; - if( !(value&0x10) ) - SetupChannels01; - break; - case 0x04: - divideByN_Latch[2] = value; - SetupChannels23; - break; - case 0x05: - audioControl_Latch[2] = value; - audioControl_Latch2[2] = value&15; - audioControl_Latch_Digi[2] = (value>>4)&1 ? 15:0; - Channel2Distortion = channelsDistorionTable2[ (value>>4)&15 ]; - if( !(value&0x10) ) - SetupChannels23; - break; - case 0x06: - divideByN_Latch[3] = value; - SetupChannels23; - break; - case 0x07: - audioControl_Latch[3] = value; - audioControl_Latch2[3] = value&15; - audioControl_Latch_Digi[3] = (value>>4)&1 ? 15:0; - Channel3Distortion = channelsDistorionTable3[ (value>>4)&15 ]; - if( !(value&0x10) ) - SetupChannels23; - break; - case 0x08: - { - BYTE prevAUDCTL; - prevAUDCTL = AUDCTL; - AUDCTL = value; - pcc1564 = value & 1 ? 112:28; - - noiseAND = AUDCTL & 128 ? 0x1FF:0x1FFFF; - - switch_J3_Q_stateAND[0] = AUDCTL&4 ? 15:0; - switch_J3_Q_stateAND[1] = AUDCTL&2 ? 15:0; - - SetupChannels01; - SetupChannels23; - - if( (prevAUDCTL^AUDCTL)&0x10 ) - divideByN[1] = 2; - if( (prevAUDCTL^AUDCTL)&0x8 ) - divideByN[3] = 2; - - break; - } - case 0x0D: - break; - case 0x0E: - break; - case 0x0F: - break; - } -} diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/pokeyNamespace.h --- a/src/sap/saplib/pokeyNamespace.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,665 +0,0 @@ -// This is very funny piece of code :)). This is a "fake" pokey template. - -namespace NAMESPACENAME { - -BYTE IRQ_EN; -BYTE IRQ_ST; -BYTE IRQ_line; -bool generateIRQ0; - -const double cutFreq = 24000.0 / 44100.0; // cutoff frequency = 20000, sampling frequency = 44100 -const int samplerRate = 0x2836D6; // (1773447 / 44100) * 65536; -const int samplerRateOver = 0xA0DB5/2; // (1773447 / 176400) * 65536; - -//const double cutFreq2 = 26000.0 / 1773447.0; // cutoff frequency = 20000, sampling frequency = 44100 -const double cutFreq2 = 28000.0 / 176400; // cutoff frequency = 20000, sampling frequency = 44100 - -const int cutFreq2i = 650; - -#define MAKESAMPLE\ - {\ - ss-=0x10000;\ - if( ss<0 )\ - {\ - ss += samplerRateOver;\ - DWORD pomd; int pomi;\ - pomd = ((DWORD*)&switch_J3_Q_state[0])[0];\ - pomd &= ((DWORD*)&switch_J3_Q_stateAND[0])[0];\ - pomd ^= ((DWORD*)&signal_state_out[0])[0];\ - pomd &= ((DWORD*)&freq_sequre[0])[0];\ - pomd |= ((DWORD*)&audioControl_Latch_Digi[0])[0];\ - pomd &= ((DWORD*)&audioControl_Latch2[0])[0];\ - pomd = pomd + (pomd>>16);\ - pomi = (int)( pomd + (pomd>>8) ) & 255;\ - oldValI = oldValI + ((cutFreq2i*((pomi<<12) - oldValI))>>12);\ - delay++; if( (delay&7)==0 )\ - {\ - pomi = oldValI>>3;\ - if( pomi<-16384 ) pomi = -16384; else if( pomi>32767 ) pomi = 32767;\ - sndBuf[sndBufPtr] = (WORD)pomi;\ - sndBufPtr = (sndBufPtr+sampleStep)&16383;\ - }\ - }\ - } - -int sndBufPtrUpp; - -int oldValI = 0; -double oldVal=0.0; -int delay = 0; - -BYTE AUDCTL; -int pcc1564,noiseAND,pokeyClockCounter64k; - -DWORD pokeyClockCounter; -DWORD poly4Counter,poly5Counter,poly4_5Counter; - -BYTE poly17[0x20000]; -BYTE poly4_b[36000]; // minimum size is 312*114+15 -BYTE poly5_b[36000]; // minimum size is 312*114+31 -BYTE poly4_5_b[37000]; // minimum size is 312*114+465 - -BYTE poly4[15] = { -15, 15, 15, 15, 0, 0, 0, 15, 0, 0, 15, 15, 0, 15, 0 -}; - -BYTE poly5[31] = { -15, 15, 15, 15, 0, 15, 15, 0, 15, 0, 0, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, 0, 0, 15, 0, 0, 0, 15, 0, 15, 0 -}; - -int divideByN[4]; -int divideByN_Latch[4]; -int divideByN_Latch2[4]; -BYTE switch_J2_signal_Q[4]; -BYTE signal_state_out[4]; -BYTE switch_J3_Q_state[4]; -BYTE switch_J3_Q_stateAND[4]; -BYTE audioControl_Latch[4]; -BYTE audioControl_Latch2[4]; -BYTE audioControl_Latch_Digi[4]; -BYTE freq_sequre[4]; - -void (*Channel0Distortion)(void); -void (*Channel1Distortion)(void); -void (*Channel2Distortion)(void); -void (*Channel3Distortion)(void); - -//--- -void channel0_0( void ) -{ - if( poly5_b[ poly5Counter + pokeyClockCounter ]!=0 ) - signal_state_out[0] = poly17[ pokeyClockCounter & noiseAND ]; -} -void channel0_2( void ) -{ - signal_state_out[0] = signal_state_out[0] ^ poly5_b[ poly5Counter + pokeyClockCounter ]; -} -void channel0_4( void ) -{ - if( poly5_b[ poly5Counter + pokeyClockCounter ]!=0 ) - signal_state_out[0] = poly4_b[ poly4Counter + pokeyClockCounter ]; -} -void channel0_8( void ) -{ - signal_state_out[0] = poly17[ pokeyClockCounter & noiseAND ]; -} -void channel0_A( void ) -{ - signal_state_out[0] = signal_state_out[0] ^ 15; -} -void channel0_C( void ) -{ - signal_state_out[0] = poly4_b[ pokeyClockCounter + poly4Counter ]; -} -//--- -void channel1_0( void ) -{ - if( poly5_b[ poly5Counter + pokeyClockCounter ]!=0 ) - signal_state_out[1] = poly17[ pokeyClockCounter & noiseAND ]; -} -void channel1_2( void ) -{ - signal_state_out[1] = signal_state_out[1] ^ poly5_b[ poly5Counter + pokeyClockCounter ]; -} -void channel1_4( void ) -{ - if( poly5_b[ poly5Counter + pokeyClockCounter ]!=0 ) - signal_state_out[1] = poly4_b[ poly4Counter + pokeyClockCounter ]; -} -void channel1_8( void ) -{ - signal_state_out[1] = poly17[ pokeyClockCounter & noiseAND ]; -} -void channel1_A( void ) -{ - signal_state_out[1] = signal_state_out[1] ^ 15; -} -void channel1_C( void ) -{ - signal_state_out[1] = poly4_b[ pokeyClockCounter + poly4Counter ]; -} -//--- -void channel2_0( void ) -{ - if( poly5_b[ poly5Counter + pokeyClockCounter ]!=0 ) - signal_state_out[2] = poly17[ pokeyClockCounter & noiseAND ]; -} -void channel2_2( void ) -{ - signal_state_out[2] = signal_state_out[2] ^ poly5_b[ poly5Counter + pokeyClockCounter ]; -} -void channel2_4( void ) -{ - if( poly5_b[ poly5Counter + pokeyClockCounter ]!=0 ) - signal_state_out[2] = poly4_b[ poly4Counter + pokeyClockCounter ]; -} -void channel2_8( void ) -{ - signal_state_out[2] = poly17[ pokeyClockCounter & noiseAND ]; -} -void channel2_A( void ) -{ - signal_state_out[2] = signal_state_out[2] ^ 15; -} -void channel2_C( void ) -{ - signal_state_out[2] = poly4_b[ pokeyClockCounter + poly4Counter ]; -} -//--- -void channel3_0( void ) -{ - if( poly5_b[ poly5Counter + pokeyClockCounter ]!=0 ) - signal_state_out[3] = poly17[ pokeyClockCounter & noiseAND ]; -} -void channel3_2( void ) -{ - signal_state_out[3] = signal_state_out[3] ^ poly5_b[ poly5Counter + pokeyClockCounter ]; -} -void channel3_4( void ) -{ - if( poly5_b[ poly5Counter + pokeyClockCounter ]!=0 ) - signal_state_out[3] = poly4_b[ poly4Counter + pokeyClockCounter ]; -} -void channel3_8( void ) -{ - signal_state_out[3] = poly17[ pokeyClockCounter & noiseAND ]; -} -void channel3_A( void ) -{ - signal_state_out[3] = signal_state_out[3] ^ 15; -} -void channel3_C( void ) -{ - signal_state_out[3] = poly4_b[ pokeyClockCounter + poly4Counter ]; -} - -void channel0_1( void ) -{ - signal_state_out[0] = 15; -} -void channel1_1( void ) -{ - signal_state_out[1] = 15; -} -void channel2_1( void ) -{ - signal_state_out[2] = 15; -} -void channel3_1( void ) -{ - signal_state_out[3] = 15; -} - -typedef void (*funcPoint)(void); -funcPoint channelsDistorionTable0[16]= - { &channel0_0, &channel0_1, &channel0_2, &channel0_1, &channel0_4, &channel0_1, &channel0_2, &channel0_1, &channel0_8, &channel0_1, &channel0_A, &channel0_1, &channel0_C, &channel0_1, &channel0_A, &channel0_1 }; -funcPoint channelsDistorionTable1[16]= - { &channel1_0, &channel1_1, &channel1_2, &channel1_1, &channel1_4, &channel1_1, &channel1_2, &channel1_1, &channel1_8, &channel1_1, &channel1_A, &channel1_1, &channel1_C, &channel1_1, &channel1_A, &channel1_1 }; -funcPoint channelsDistorionTable2[16]= - { &channel2_0, &channel2_1, &channel2_2, &channel2_1, &channel2_4, &channel2_1, &channel2_2, &channel2_1, &channel2_8, &channel2_1, &channel2_A, &channel2_1, &channel2_C, &channel2_1, &channel2_A, &channel2_1 }; -funcPoint channelsDistorionTable3[16]= - { &channel3_0, &channel3_1, &channel3_2, &channel3_1, &channel3_4, &channel3_1, &channel3_2, &channel3_1, &channel3_8, &channel3_1, &channel3_A, &channel3_1, &channel3_C, &channel3_1, &channel3_A, &channel3_1 }; - -void pus_zero( int n ) -{ -unsigned int i; -unsigned int ch; -DWORD pp; -int ss; - - pp = pokeyClockCounter + (pcc1564 - pokeyClockCounter64k); - ss = sndBufPtrUpp; - - i = n; - do - { - pokeyClockCounter++; - if( pokeyClockCounter>=pp ) - { - pp = pokeyClockCounter + pcc1564; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; - pokeyClockCounter64k = pcc1564 + pokeyClockCounter - pp ; - -} - -void pus_2h( int n ) -{ -unsigned int i; -unsigned int ch; -DWORD pp; int ss; - - pp = pokeyClockCounter + (pcc1564 - pokeyClockCounter64k); - ss = sndBufPtrUpp; - i = n; - do - { - pokeyClockCounter++; - if( pokeyClockCounter>=pp ) - { - pp = pokeyClockCounter + pcc1564; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - } - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; - pokeyClockCounter64k = pcc1564 + pokeyClockCounter - pp ; -} - -void pus_23h( int n ) -{ -unsigned int i; -unsigned int ch; -DWORD pp; -int ss; - - pp = pokeyClockCounter + (pcc1564 - pokeyClockCounter64k); - ss = sndBufPtrUpp; - i = n; - do - { - pokeyClockCounter++; - if( pokeyClockCounter>=pp ) - { - pp = pokeyClockCounter + pcc1564; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - } - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; - pokeyClockCounter64k = pcc1564 + pokeyClockCounter - pp ; -} - -void pus_0h( int n ) -{ -unsigned int i; -unsigned int ch; -DWORD pp; -int ss; - - pp = pokeyClockCounter + (pcc1564 - pokeyClockCounter64k); - ss = sndBufPtrUpp; - i = n; - do - { - pokeyClockCounter++; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - if( pokeyClockCounter>=pp ) - { - pp = pokeyClockCounter + pcc1564; - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; - pokeyClockCounter64k = pcc1564 + pokeyClockCounter - pp ; -} - -void pus_01h( int n ) -{ -unsigned int i; -unsigned int ch; -DWORD pp; -int ss; - - pp = pokeyClockCounter + (pcc1564 - pokeyClockCounter64k); - ss = sndBufPtrUpp; - i = n; - do - { - pokeyClockCounter++; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - if( pokeyClockCounter>=pp ) - { - pp = pokeyClockCounter + pcc1564; - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; - pokeyClockCounter64k = pcc1564 + pokeyClockCounter - pp ; - -} - -void pus_02h( int n ) -{ -unsigned int i; -unsigned int ch; -DWORD pp; -int ss; - - pp = pokeyClockCounter + (pcc1564 - pokeyClockCounter64k); - ss = sndBufPtrUpp; - i = n; - do - { - pokeyClockCounter++; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - if( pokeyClockCounter>=pp ) - { - pp = pokeyClockCounter + pcc1564; - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - } - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; - pokeyClockCounter64k = pcc1564 + pokeyClockCounter - pp ; -} - -void pus_012h( int n ) -{ -unsigned int i; -unsigned int ch; -DWORD pp; -int ss; - - pp = pokeyClockCounter + (pcc1564 - pokeyClockCounter64k); - ss = sndBufPtrUpp; - i = n; - do - { - pokeyClockCounter++; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - if( pokeyClockCounter>=pp ) - { - pp = pokeyClockCounter + pcc1564; - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - } - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; - pokeyClockCounter64k = pcc1564 + pokeyClockCounter - pp ; -} - -void pus_023h( int n ) -{ -unsigned int i; -unsigned int ch; -DWORD pp; -int ss; - - pp = pokeyClockCounter + (pcc1564 - pokeyClockCounter64k); - ss = sndBufPtrUpp; - i = n; - do - { - pokeyClockCounter++; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - if( pokeyClockCounter>=pp ) - { - pp = pokeyClockCounter + pcc1564; - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - } - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; - pokeyClockCounter64k = pcc1564 + pokeyClockCounter - pp ; -} - -void pus_0123h( int n ) -{ -unsigned int i; -unsigned int ch; -int ss; - - ss = sndBufPtrUpp; - i = n; - do - { - pokeyClockCounter++; - ch = 0; { if( --divideByN[ch]==0 ) { generateIRQ0=true; divideByN[ch] = divideByN_Latch2[ch]; Channel0Distortion(); } } - ch = 1; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel1Distortion(); } } - ch = 2; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel2Distortion(); switch_J3_Q_state[0] = signal_state_out[0]; } } - ch = 3; { if( --divideByN[ch]==0 ) { divideByN[ch] = divideByN_Latch2[ch]; Channel3Distortion(); switch_J3_Q_state[1] = signal_state_out[1]; } } - MAKESAMPLE - } while(--i); - sndBufPtrUpp = ss; -} - -typedef void (*funcPoint2)(int n); - -funcPoint2 channelsGeneration[16]={ - &pus_zero, &pus_zero, &pus_zero, &pus_zero, - &pus_2h, &pus_23h, &pus_2h, &pus_23h, - &pus_0h, &pus_0h, &pus_01h, &pus_01h, - &pus_02h, &pus_023h, &pus_012h, &pus_0123h -}; - -}; // end of namespace POKEY_NAMESPACE - -using namespace NAMESPACENAME; - -POKEY_INIT_FUNC -{ -unsigned int i; -DWORD pol; -BYTE old; - - pol = 0x1FFFF; - for( i=0; i<0x20000; i++ ) - { - poly17[i] = (BYTE)(pol&1 ? 15:0); - pol = pol | (((pol&1) ^ ((pol>>5)&1)) << 17); - pol>>=1; - } - - for( i=0; i>3)&15 ](n); - -} - - -POKEY_UPDATECOUNT_FUNC -{ - - pokeyClockCounter = pokeyClockCounter & 0x7FFFFFFF; - poly4Counter = (int)(((DWORD)(poly4Counter+pokeyClockCounter)) % 15) - pokeyClockCounter; - poly5Counter = (int)(((DWORD)(poly5Counter+pokeyClockCounter)) % 31) - pokeyClockCounter; - poly4_5Counter = (int)(((DWORD)(poly4_5Counter+pokeyClockCounter)) % 465) - pokeyClockCounter; - -} - -#undef SetupChannels01 -#undef SetupChannels23 - -#define SetupChannels01\ - switch( AUDCTL&0x50 )\ - {\ - case 0x00:\ - divideByN_Latch2[0] = divideByN_Latch[0]+1;\ - if( ((audioControl_Latch[0]&0xA0)==0xA0) && (divideByN_Latch2[0]<3) )\ - freq_sequre[0] = 0;\ - else\ - freq_sequre[0] = 15;\ - divideByN_Latch2[1] = divideByN_Latch[1]+1;\ - if( ((audioControl_Latch[1]&0xA0)==0xA0) && (divideByN_Latch2[1]<3) )\ - freq_sequre[1] = 0;\ - else\ - freq_sequre[1] = 15;\ - break;\ - case 0x10:\ - divideByN_Latch2[0] = divideByN_Latch[0]+1;\ - if( ((audioControl_Latch[0]&0xA0)==0xA0) && (divideByN_Latch2[0]<3) )\ - freq_sequre[0] = 0;\ - else\ - freq_sequre[0] = 15;\ - divideByN_Latch2[1] = divideByN_Latch[1]*256+divideByN_Latch2[0];\ - if( ((audioControl_Latch[1]&0xA0)==0xA0) && (divideByN_Latch2[1]<3) )\ - freq_sequre[1] = 0;\ - else\ - freq_sequre[1] = 15;\ - break;\ - case 0x40:\ - divideByN_Latch2[0] = divideByN_Latch[0]+4;\ - if( ((audioControl_Latch[0]&0xA0)==0xA0) && (divideByN_Latch2[0]<0x50) )\ - freq_sequre[0] = 0;\ - else\ - freq_sequre[0] = 15;\ - divideByN_Latch2[1] = divideByN_Latch[1]+1;\ - if( ((audioControl_Latch[1]&0xA0)==0xA0) && (divideByN_Latch2[1]<3) )\ - freq_sequre[1] = 0;\ - else\ - freq_sequre[1] = 15;\ - break;\ - case 0x50:\ - divideByN_Latch2[0] = divideByN_Latch[0]+7;\ - freq_sequre[0] = 0;\ - divideByN_Latch2[1] = divideByN_Latch[1]*256+divideByN_Latch2[0];\ - if( ((audioControl_Latch[1]&0xA0)==0xA0) && (divideByN_Latch2[1]<0x50) )\ - freq_sequre[1] = 0;\ - else\ - freq_sequre[1] = 15;\ - break;\ - } - -#define SetupChannels23\ - switch( AUDCTL&0x28 )\ - {\ - case 0x00:\ - divideByN_Latch2[2] = divideByN_Latch[2]+1;\ - if( ((audioControl_Latch[2]&0xA0)==0xA0) && (divideByN_Latch2[2]<3) )\ - freq_sequre[2] = 0;\ - else\ - freq_sequre[2] = 15;\ - divideByN_Latch2[3] = divideByN_Latch[3]+1;\ - if( ((audioControl_Latch[3]&0xA0)==0xA0) && (divideByN_Latch2[3]<3) )\ - freq_sequre[3] = 0;\ - else\ - freq_sequre[3] = 15;\ - break;\ - case 0x08:\ - divideByN_Latch2[2] = divideByN_Latch[2]+1;\ - if( ((audioControl_Latch[2]&0xA0)==0xA0) && (divideByN_Latch2[2]<3) )\ - freq_sequre[2] = 0;\ - else\ - freq_sequre[2] = 15;\ - divideByN_Latch2[3] = divideByN_Latch[3]*256+divideByN_Latch2[2];\ - if( ((audioControl_Latch[3]&0xA0)==0xA0) && (divideByN_Latch2[3]<3) )\ - freq_sequre[3] = 0;\ - else\ - freq_sequre[3] = 15;\ - break;\ - case 0x20:\ - divideByN_Latch2[2] = divideByN_Latch[2]+4;\ - if( ((audioControl_Latch[2]&0xA0)==0xA0) && (divideByN_Latch2[2]<0x50) )\ - freq_sequre[2] = 0;\ - else\ - freq_sequre[2] = 15;\ - divideByN_Latch2[3] = divideByN_Latch[3]+1;\ - if( ((audioControl_Latch[3]&0xA0)==0xA0) && (divideByN_Latch2[3]<3) )\ - freq_sequre[3] = 0;\ - else\ - freq_sequre[3] = 15;\ - break;\ - case 0x28:\ - divideByN_Latch2[2] = divideByN_Latch[2]+7;\ - freq_sequre[2] = 0;\ - divideByN_Latch2[3] = divideByN_Latch[3]*256+divideByN_Latch2[2];\ - if( ((audioControl_Latch[3]&0xA0)==0xA0) && (divideByN_Latch2[3]<0x50) )\ - freq_sequre[3] = 0;\ - else\ - freq_sequre[3] = 15;\ - break;\ - } diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/sapCpu.cxx --- a/src/sap/saplib/sapCpu.cxx Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1581 +0,0 @@ -#include -#include -#include -#include - -#include "sapGlobals.h" - -void cpuInit( void ) -{ - cpuReg_PC = 0xFFFF; - cpuReg_S = 0xFF; - cpuReg_A = 0x00; - cpuReg_X = 0x00; - cpuReg_Y = 0x00; - cpuSetFlags( 0x20 ); -} - - -void cpuSetFlags( BYTE flags ) -{ - cpuFlag_N = flags; - cpuFlag_V = (flags>>6)&1; - cpuFlag_B = (flags>>4)&1; - cpuFlag_D = (flags>>3)&1; - cpuFlag_I = (flags>>2)&1; - cpuFlag_Z = (flags&2)==0 ? 1:0; - cpuFlag_C = flags&1; -} - - -BYTE cpuGetFlags( void ) -{ -BYTE flags; - - flags = (cpuFlag_N&0x80) | ((cpuFlag_V&1)<<6) | 0x20 | ((cpuFlag_B&1)<<4) | ((cpuFlag_D&1)<<3) | ((cpuFlag_I&1)<<2) | (cpuFlag_Z==0 ? 2:0) | (cpuFlag_C&1); - return flags; -} - -#define CPY {\ - cB ^= 255;\ - int cpuIntValue2;\ - cpuIntValue2 = ((int)cpuReg_Y) + ((int)cB) + 1;\ - cpuFlag_N = cpuFlag_Z = (BYTE)cpuIntValue2; cpuFlag_C = (BYTE)(cpuIntValue2>>8);\ - cpuFlag_V = (( ((cpuReg_Y^cB)^0x80) & (cpuReg_Y^cpuIntValue2) & 0x80))&0x80 ? 1:0;\ - } -#define CMP {\ - cB ^= 255;\ - int cpuIntValue2;\ - cpuIntValue2 = ((int)cpuReg_A) + ((int)cB) + 1;\ - cpuFlag_N = cpuFlag_Z = (BYTE)cpuIntValue2; cpuFlag_C = (BYTE)(cpuIntValue2>>8);\ - cpuFlag_V = (( ((cpuReg_A^cB)^0x80) & (cpuReg_A^cpuIntValue2) & 0x80))&0x80 ? 1:0;\ - } -#define CPX {\ - cB ^= 255;\ - int cpuIntValue2;\ - cpuIntValue2 = ((int)cpuReg_X) + ((int)cB) + 1;\ - cpuFlag_N = cpuFlag_Z = (BYTE)cpuIntValue2; cpuFlag_C = (BYTE)(cpuIntValue2>>8);\ - cpuFlag_V = (( ((cpuReg_X^cB)^0x80) & (cpuReg_X^cpuIntValue2) & 0x80))&0x80 ? 1:0;\ - } - -#define DECCMP {\ - cB--;\ - int cpuIntValue2;\ - cpuIntValue2 = ((int)cpuReg_A) + ((int)cB^255) + 1;\ - cpuFlag_N = cpuFlag_Z = (BYTE)cpuIntValue2; cpuFlag_C = (BYTE)(cpuIntValue2>>8);\ - cpuFlag_V = (( ((cpuReg_A^cB^255)^0x80) & (cpuReg_A^cpuIntValue2) & 0x80))&0x80 ? 1:0;\ - } -#define DEC { cB--; cpuFlag_N = cpuFlag_Z = cB; } -#define INC { cB++; cpuFlag_N = cpuFlag_Z = cB; } -#define AND { cpuReg_A &= cB; cpuFlag_N = cpuFlag_Z = cpuReg_A; } -#define ASL { cpuFlag_C = cB>>7; cB<<=1; cpuFlag_N = cpuFlag_Z = cB; } -#define EOR { cpuReg_A ^= cB; cpuFlag_N = cpuFlag_Z = cpuReg_A; } -#define ORA { cpuReg_A |= cB; cpuFlag_N = cpuFlag_Z = cpuReg_A; } -#define ADC {\ - if( cpuFlag_D&1 )\ - {\ - BYTE al,ah;\ - al = (cpuReg_A & 0x0f) + (cB & 0x0f) + (cpuFlag_C&1);\ - if (al > 9) al += 6;\ - ah = ((cpuReg_A >> 4)&0x0F) + ((cB >> 4)&0x0F); if (al > 0x0f) ah++;\ - cpuFlag_N = cpuFlag_Z = cpuReg_A + cB + (cpuFlag_C&1);\ - cpuFlag_V = (((ah << 4) ^ cpuReg_A) & 0x80) && !((cpuReg_A ^ cB) & 0x80) ? 1:0;\ - if (ah > 9) ah += 6; cpuFlag_C = (ah > 0x0f) ? 1:0; cpuReg_A = (ah << 4) | (al & 0x0f);\ - }\ - else\ - {\ - WORD te;\ - te = cpuReg_A + cB + (cpuFlag_C&1);\ - cpuFlag_C = (BYTE)(te>>8);\ - cpuFlag_V = (( ((cpuReg_A^cB)^0x80) & (cpuReg_A^te) & 0x80)) ? 1:0;\ - cpuFlag_N = cpuFlag_Z = cpuReg_A = (BYTE)te;\ - }\ - } -#define SBC {\ - if( cpuFlag_D&1 )\ - {\ - BYTE al,ah; unsigned int tmp; tmp = (DWORD)cpuReg_A - (DWORD)cB - (WORD)((cpuFlag_C&1)^1);\ - al = (cpuReg_A & 0x0f) - (cB & 0x0f) - ((cpuFlag_C&1)^1);\ - ah = ((cpuReg_A >> 4)&0x0F) - ((cB >> 4)&0x0F); if (al & 0x10) { al -= 6; ah--; } if (ah & 0x10) ah -= 6;\ - cpuFlag_C = (tmp < (unsigned int)0x100) ? 1:0; cpuFlag_N = cpuFlag_Z = (BYTE)tmp;\ - cpuFlag_V = (((cpuReg_A ^ tmp) & 0x80) && ((cpuReg_A ^ cB) & 0x80) ) ? 1:0;\ - cpuReg_A = (ah << 4) | (al & 0x0f);\ - }\ - else\ - {\ - WORD te;\ - te = cpuReg_A + (cB^255) + (cpuFlag_C&1);\ - cpuFlag_C = (BYTE)(te>>8);\ - cpuFlag_V = (( ((cpuReg_A^cB^255)^0x80) & (cpuReg_A^te) & 0x80)) ? 1:0;\ - cpuFlag_N = cpuFlag_Z = cpuReg_A = (BYTE)te;\ - }\ - } -#define INCSBC {\ - cB++;\ - if( cpuFlag_D&1 )\ - {\ - BYTE al,ah; unsigned int tmp; tmp = (DWORD)cpuReg_A - (DWORD)cB - (WORD)((cpuFlag_C&1)^1);\ - al = (cpuReg_A & 0x0f) - (cB & 0x0f) - ((cpuFlag_C&1)^1);\ - ah = ((cpuReg_A >> 4)&0x0F) - ((cB >> 4)&0x0F); if (al & 0x10) { al -= 6; ah--; } if (ah & 0x10) ah -= 6;\ - cpuFlag_C = (tmp < (unsigned int)0x100) ? 1:0; cpuFlag_N = cpuFlag_Z = (BYTE)tmp;\ - cpuFlag_V = (((cpuReg_A ^ tmp) & 0x80) && ((cpuReg_A ^ cB) & 0x80) ) ? 1:0;\ - cpuReg_A = (ah << 4) | (al & 0x0f);\ - }\ - else\ - {\ - WORD te;\ - te = cpuReg_A + (cB^255) + (cpuFlag_C&1);\ - cpuFlag_C = (BYTE)(te>>8);\ - cpuFlag_V = (( ((cpuReg_A^cB^255)^0x80) & (cpuReg_A^te) & 0x80)) ? 1:0;\ - cpuFlag_N = cpuFlag_Z = cpuReg_A = (BYTE)te;\ - }\ - } - -#define ROL { BYTE cFlag; cFlag = cB>>7; cB = (cB<<1) + (cpuFlag_C&1); cpuFlag_C = cFlag; cpuFlag_N = cpuFlag_Z = cB; } -#define ROR { BYTE cFlag; cFlag = cB; cB = (cB>>1) + (cpuFlag_C<<7); cpuFlag_C = cFlag; cpuFlag_N = cpuFlag_Z = cB; } -#define LSR { cpuFlag_C = cB; cB>>=1; cpuFlag_N = cpuFlag_Z = cB; } -#define ASLORA { cpuFlag_C = cB>>7; cB<<=1; cpuReg_A |= cB; cpuFlag_N = cpuFlag_Z = cpuReg_A; } -#define ROLAND { BYTE cFlag; cFlag = cB>>7; cB = (cB<<1) + (cpuFlag_C&1); cpuFlag_C = cFlag; cpuReg_A &= cB; cpuFlag_N = cpuFlag_Z = cpuReg_A; } -#define LSREOR { cpuFlag_C = cB; cB>>=1; cpuReg_A ^= cB; cpuFlag_N = cpuFlag_Z = cpuReg_A; } -#define RORADC {\ - BYTE cC = cB; cB = (cB>>1) + (cpuFlag_C<<7); cpuFlag_C = cC;\ - if( cpuFlag_D&1 )\ - {\ - BYTE al,ah;\ - al = (cpuReg_A & 0x0f) + (cB & 0x0f) + (cpuFlag_C&1);\ - if (al > 9) al += 6;\ - ah = ((cpuReg_A >> 4)&0x0F) + ((cB >> 4)&0x0F); if (al > 0x0f) ah++;\ - cpuFlag_N = cpuFlag_Z = cpuReg_A + cB + (cpuFlag_C&1);\ - cpuFlag_V = (((ah << 4) ^ cpuReg_A) & 0x80) && !((cpuReg_A ^ cB) & 0x80) ? 1:0;\ - if (ah > 9) ah += 6; cpuFlag_C = (ah > 0x0f) ? 1:0; cpuReg_A = (ah << 4) | (al & 0x0f);\ - }\ - else\ - {\ - WORD te;\ - te = cpuReg_A + cB + (cpuFlag_C&1);\ - cpuFlag_C = (BYTE)(te>>8);\ - cpuFlag_V = (( ((cpuReg_A^cB)^0x80) & (cpuReg_A^te) & 0x80)) ? 1:0;\ - cpuFlag_N = cpuFlag_Z = cpuReg_A = (BYTE)te;\ - }\ - } - -#define CondJump( a ) cpuReg_PC += (a) ? (WORD)(signed short int)(signed char)atariMem[cpuReg_PC+1]+2:2; - -//------- - -#define FREDDIEWRITEBYTE(ad,val)\ - {\ - if( (ad&0xFF00)==0xD200 )\ - {\ - if( isStereo==false )\ - pokeyWriteByte0( ad, val );\ - else if( (ad&0x10)==0 )\ - pokeyWriteByte0( ad, val );\ - else\ - pokeyWriteByte1( ad, val );\ - }\ - else if( ad==0xD40A )\ - holded = true;\ - else atariMem[ad] = val;\ - } - -#define Load_IMD(a) BYTE cB; { cB = atariMem[cpuReg_PC+1]; cpuReg_PC+=2; a; } -#define Load_ZP(a) BYTE cB; { BYTE cA=atariMem[cpuReg_PC+1]; cB = atariMem[cA]; cpuReg_PC+=2; a; } -#define Load_ZPX(a) BYTE cB; { BYTE cA=atariMem[cpuReg_PC+1]+cpuReg_X; cB = atariMem[cA]; cpuReg_PC+=2; a; } -#define Load_ZPY(a) BYTE cB; { BYTE cA=atariMem[cpuReg_PC+1]+cpuReg_Y; cB = atariMem[cA]; cpuReg_PC+=2; a; } -#define Load_ABS(a) BYTE cB; { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0]; cB = freddieReadByte(cWA); cpuReg_PC+=3; a; } -#define Load_ABSX(a) BYTE cB; { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0] + (WORD)cpuReg_X; cB = freddieReadByte(cWA); cpuReg_PC+=3; a; } -#define Load_ABSY(a) BYTE cB; { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0] + (WORD)cpuReg_Y; cB = freddieReadByte(cWA); cpuReg_PC+=3; a; } -#define Load_PreX(a) BYTE cB; { BYTE cA=(atariMem[cpuReg_PC+1]+cpuReg_X)&255; WORD cWA = ((WORD*)&atariMem[cA])[0]; cB = freddieReadByte(cWA); cpuReg_PC+=2; a; } -#define Load_PostY(a) BYTE cB; { BYTE cA=atariMem[cpuReg_PC+1]; WORD cWA = ((WORD*)&atariMem[cA])[0] + (WORD)cpuReg_Y; cB = freddieReadByte(cWA); cpuReg_PC+=2; a; } - -#define LoadReg_IMD(a) { a = cpuFlag_N = cpuFlag_Z = atariMem[cpuReg_PC+1]; cpuReg_PC+=2; } -#define LoadReg_ZP(a) { BYTE cA=atariMem[cpuReg_PC+1]; a = cpuFlag_N = cpuFlag_Z = atariMem[cA]; cpuReg_PC+=2; } -#define LoadReg_ZPX(a) { BYTE cA=atariMem[cpuReg_PC+1]+cpuReg_X; a = cpuFlag_N = cpuFlag_Z = atariMem[cA]; cpuReg_PC+=2; } -#define LoadReg_ZPY(a) { BYTE cA=atariMem[cpuReg_PC+1]+cpuReg_Y; a = cpuFlag_N = cpuFlag_Z = atariMem[cA]; cpuReg_PC+=2; } -#define LoadReg_ABS(a) { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0]; a = cpuFlag_N = cpuFlag_Z = freddieReadByte(cWA); cpuReg_PC+=3; } -#define LoadReg_ABSX(a) { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0] + (WORD)cpuReg_X; a = cpuFlag_N = cpuFlag_Z = freddieReadByte(cWA); cpuReg_PC+=3; } -#define LoadReg_ABSY(a) { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0] + (WORD)cpuReg_Y; a = cpuFlag_N = cpuFlag_Z = freddieReadByte(cWA); cpuReg_PC+=3; } -#define LoadReg_PreX(a) { BYTE cA=(atariMem[cpuReg_PC+1]+cpuReg_X)&255; WORD cWA = ((WORD*)&atariMem[cA])[0]; a = cpuFlag_N = cpuFlag_Z = freddieReadByte(cWA); cpuReg_PC+=2; } -#define LoadReg_PostY(a) { BYTE cA=atariMem[cpuReg_PC+1]; WORD cWA = ((WORD*)&atariMem[cA])[0] + (WORD)cpuReg_Y; a = cpuFlag_N = cpuFlag_Z = freddieReadByte(cWA); cpuReg_PC+=2; } - -#define Modify_ZP(a) BYTE cB; { BYTE cA=atariMem[cpuReg_PC+1]; cB = atariMem[cA]; cpuReg_PC+=2; a; atariMem[cA] = cB; } -#define Modify_ZPX(a) BYTE cB; { BYTE cA=atariMem[cpuReg_PC+1]+cpuReg_X; cB = atariMem[cA]; cpuReg_PC+=2; a; atariMem[cA] = cB; } -#define Modify_ABS(a) BYTE cB; { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0]; cB = freddieReadByte(cWA); cpuReg_PC+=3; a; FREDDIEWRITEBYTE(cWA,cB); } -#define Modify_ABSX(a) BYTE cB; { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0] + (WORD)cpuReg_X; cB = freddieReadByte(cWA); cpuReg_PC+=3; a; FREDDIEWRITEBYTE(cWA,cB); } -#define Modify_ABSY(a) BYTE cB; { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0] + (WORD)cpuReg_Y; cB = freddieReadByte(cWA); cpuReg_PC+=3; a; FREDDIEWRITEBYTE(cWA,cB); } -#define Modify_PreX(a) BYTE cB; { BYTE cA=(atariMem[cpuReg_PC+1]+cpuReg_X)&255; WORD cWA = ((WORD*)&atariMem[cA])[0]; cB = freddieReadByte(cWA); cpuReg_PC+=2; a; FREDDIEWRITEBYTE(cWA,cB); } -#define Modify_PostY(a) BYTE cB; { BYTE cA=atariMem[cpuReg_PC+1]; WORD cWA = ((WORD*)&atariMem[cA])[0] + (WORD)cpuReg_Y; cB = freddieReadByte(cWA); cpuReg_PC+=2; a; FREDDIEWRITEBYTE(cWA,cB); } - -#define Store_ZP(a) { BYTE cA=atariMem[cpuReg_PC+1]; cpuReg_PC+=2; atariMem[cA] = a; } -#define Store_ZPX(a) { BYTE cA=atariMem[cpuReg_PC+1]+cpuReg_X; cpuReg_PC+=2; atariMem[cA] = a; } -#define Store_ABS(a) { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0]; cpuReg_PC+=3; FREDDIEWRITEBYTE(cWA,a); } -#define Store_ABSX(a) { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0] + (WORD)cpuReg_X; cpuReg_PC+=3; FREDDIEWRITEBYTE(cWA,a); } -#define Store_ABSY(a) { WORD cWA = ((WORD*)&atariMem[cpuReg_PC+1])[0] + (WORD)cpuReg_Y; cpuReg_PC+=3; FREDDIEWRITEBYTE(cWA,a); } -#define Store_PreX(a) { BYTE cA=(atariMem[cpuReg_PC+1]+cpuReg_X)&255; WORD cWA = ((WORD*)&atariMem[cA])[0]; cpuReg_PC+=2; FREDDIEWRITEBYTE(cWA,a); } -#define Store_PostY(a) { BYTE cA=atariMem[cpuReg_PC+1]; WORD cWA = ((WORD*)&atariMem[cA])[0] + (WORD)cpuReg_Y; cpuReg_PC+=2; FREDDIEWRITEBYTE(cWA,a); } - -int opcode_0x00(bool &holded) /* 0x00 - BRK 7 cycles */ -{ - cpuReg_PC++; - return 20; -} -int opcode_0x01(bool &holded) /* 0x01 - ORA (,X) 6 cycles */ -{ - Load_PreX( ORA ); - return 6; -} -int opcode_0x02(bool &holded) /* 0x02 - ... hang */ -{ - return 20; -} -int opcode_0x03(bool &holded) /* 0x03 - ASL:ORA (,X) 8 cycles */ -{ - Modify_PreX( ASLORA ); - return 8; -} -int opcode_0x04(bool &holded) /* 0x04 - NOP2 3 cycles */ -{ - cpuReg_PC+=2; - return 3; -} -int opcode_0x05(bool &holded) /* 0x05 - ORA ZP 3 cycles */ -{ - Load_ZP( ORA ); - return 3; -} -int opcode_0x06(bool &holded) /* 0x06 - ASL ZP 5 cycles */ -{ - Modify_ZP( ASL ) - return 5; -} -int opcode_0x07(bool &holded) /* 0x07 - ASL:ORA ZP 5 cycles */ -{ - Modify_ZP( ASLORA ) - return 5; -} -int opcode_0x08(bool &holded) /* 0x08 - PHP 3 cycles */ -{ -BYTE te; - cpuReg_PC++; - te = (cpuFlag_N&0x80) | ((cpuFlag_V&1)<<6) | 0x20 | ((cpuFlag_B&1)<<4) | ((cpuFlag_D&1)<<3) | ((cpuFlag_I&1)<<2) | (cpuFlag_Z==0 ? 2:0) | (cpuFlag_C&1); - atariMem[0x100 + cpuReg_S] = te; cpuReg_S--; - return 3; -} -int opcode_0x09(bool &holded) /* 0x09 - ORA # 2 cycles */ -{ - Load_IMD( ORA ); - return 2; -} -int opcode_0x0A(bool &holded) /* 0x0A - ASL @ 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_C = cpuReg_A>>7; cpuReg_A<<=1; cpuFlag_N = cpuFlag_Z = cpuReg_A; - return 2; -} -int opcode_0x0B(bool &holded) /* 0x0B - ???? */ -{ - return 20; -} -int opcode_0x0C(bool &holded) /* 0x0C - NOP3 4 cycles */ -{ - cpuReg_PC+=3; - return 4; -} -int opcode_0x0D(bool &holded) /* 0x0D - ORA ABS 4 cycles */ -{ - Load_ABS( ORA ); - return 4; -} -int opcode_0x0E(bool &holded) /* 0x0E - ASL ABS 6 cycles */ -{ - Modify_ABS( ASL ); - return 6; -} -int opcode_0x0F(bool &holded) /* 0x0F - ASL:ORA ABS 6 cycles */ -{ - Modify_ABS( ASLORA ); - return 6; -} -int opcode_0x10(bool &holded) /* 0x10 - BPL 2-4 cycles */ -{ - CondJump( (cpuFlag_N&0x80)==0 ); - return 3; -} -int opcode_0x11(bool &holded) /* 0x11 - ORA (),Y 5,6 cycles */ -{ - Load_PostY( ORA ); - return 5; -} -int opcode_0x12(bool &holded) /* 0x12 - ... hang */ -{ - return 20; -} -int opcode_0x13(bool &holded) /* 0x13 - ASL:ORA (),Y 8 cycles */ -{ - Modify_PostY( ASLORA ); - return 8; -} -int opcode_0x14(bool &holded) /* 0x14 - NOP2 */ -{ - cpuReg_PC+=2; - return 3; -} -int opcode_0x15(bool &holded) /* 0x15 - ORA ZP,X 4 cycles */ -{ - Load_ZPX( ORA ); - return 4; -} -int opcode_0x16(bool &holded) /* 0x16 - ASL ZP,X 6 cycles */ -{ - Modify_ZPX( ASL ); - return 6; -} -int opcode_0x17(bool &holded) /* 0x17 - ASL:ORA ZP,X 6 cycles */ -{ - Modify_ZPX( ASLORA ); - return 6; -} -int opcode_0x18(bool &holded) /* 0x18 - CLC 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_C = 0; - return 2; -} -int opcode_0x19(bool &holded) /* 0x19 - ORA ABS,Y 4,5 cycles */ -{ - Load_ABSY( ORA ); - return 4; -} -int opcode_0x1A(bool &holded) /* 0x1A - NOP1 2 cycles */ -{ - cpuReg_PC++; - return 2; -} -int opcode_0x1B(bool &holded) /* 0x1B - ASL:ORA ABS,Y 7 cycles */ -{ - Modify_ABSY( ASLORA ); - return 7; -} -int opcode_0x1C(bool &holded) /* 0x1C - NOP3 7 cycles */ -{ - cpuReg_PC+=3; - return 7; -} -int opcode_0x1D(bool &holded) /* 0x1D - ORA ABS,X 4,5 cycles */ -{ - Load_ABSX( ORA ); - return 4; -} -int opcode_0x1E(bool &holded) /* 0x1E - ASL ABS,X 7 cycles */ -{ - Modify_ABSX( ASL ); - return 7; -} -int opcode_0x1F(bool &holded) /* 0x1F - ASL:ORA ABS,X 7 cycles */ -{ - Modify_ABSX( ASLORA ); - return 7; -} -int opcode_0x20(bool &holded) /* 0x20 - JSR ABS 6 cycles */ -{ - cpuReg_PC+=2; - atariMem[0x100 + cpuReg_S] = (cpuReg_PC>>8)&0xFF; cpuReg_S--; - atariMem[0x100 + cpuReg_S] = cpuReg_PC&0xFF; cpuReg_S--; - cpuReg_PC = ((WORD*)&atariMem[cpuReg_PC-1])[0]; - return 6; -} -int opcode_0x21(bool &holded) /* 0x21 - AND (,X) 6 cycles */ -{ - Load_PreX( AND ); - return 6; -} -int opcode_0x22(bool &holded) /* 0x22 - ... hang */ -{ - return 20; -} -int opcode_0x23(bool &holded) /* 0x23 - ROL:AND (,X) 8 cycles */ -{ - Modify_PreX( ROLAND ); - return 8; -} -int opcode_0x24(bool &holded) /* 0x24 - BIT ZP 3 cycles */ -{ -BYTE cb; - cb = atariMem[cpuReg_PC+1]; - cpuFlag_Z = cb&cpuReg_A; cpuFlag_N = cb; cpuFlag_V = cb>>6; - cpuReg_PC+=2; - return 3; -} -int opcode_0x25(bool &holded) /* 0x25 - AND ZP 3 cycles */ -{ - Load_ZP( AND ); - return 3; -} -int opcode_0x26(bool &holded) /* 0x26 - ROL ZP 5 cycles */ -{ - Modify_ZP( ROL ); - return 5; -} -int opcode_0x27(bool &holded) /* 0x27 - ROL:AND ZP 5 cycles */ -{ - Modify_ZP( ROLAND ); - return 5; -} -int opcode_0x28(bool &holded) /* 0x28 - PLP 4 cycles */ -{ -BYTE te; - cpuReg_PC++; cpuReg_S++; te = atariMem[0x100 + cpuReg_S]; - cpuFlag_N = te; cpuFlag_V = (te>>6)&1; cpuFlag_B = (te>>4)&1; cpuFlag_D = (te>>3)&1; cpuFlag_I = (te>>2)&1; cpuFlag_Z = (te&2)^2; cpuFlag_C = te&1; - pokeyGenerateCheckIRQline(); - return 4; -} -int opcode_0x29(bool &holded) /* 0x29 - AND # 2 cycles */ -{ - Load_IMD( AND ); - return 2; -} -int opcode_0x2A(bool &holded) /* 0x2A - ROL @ 2 cycles */ -{ -BYTE cC; - cpuReg_PC++; - cC = cpuReg_A>>7; cpuReg_A = (cpuReg_A<<1) + (cpuFlag_C&1); cpuFlag_C = cC; cpuFlag_N = cpuFlag_Z = cpuReg_A; - return 2; -} -int opcode_0x2B(bool &holded) /* 0x2B - ???? */ -{ - return 20; -} -int opcode_0x2C(bool &holded) /* 0x2C - BIT ABS 4 cycles */ -{ -BYTE cb; - cb = atariMem[((WORD*)&atariMem[cpuReg_PC+1])[0]]; - cpuFlag_Z = cb&cpuReg_A; cpuFlag_N = cb; cpuFlag_V = cb>>6; - cpuReg_PC+=3; - return 4; -} -int opcode_0x2D(bool &holded) /* 0x2D - AND ABS 4 cycles */ -{ - Load_ABS( AND ); - return 4; -} -int opcode_0x2E(bool &holded) /* 0x2E - ROL ABS 6 cycles */ -{ - Modify_ABS( ROL ); - return 6; -} -int opcode_0x2F(bool &holded) /* 0x2F - ROL:AND ABS 6 cycles */ -{ - Modify_ABS( ROLAND ); - return 6; -} -int opcode_0x30(bool &holded) /* 0x30 - BMI 2-4 cycles */ -{ - CondJump( (cpuFlag_N&0x80) ); - return 2; -} -int opcode_0x31(bool &holded) /* 0x31 - AND (),Y 5,6 cycles */ -{ - Load_PostY( AND ); - return 5; -} -int opcode_0x32(bool &holded) /* 0x32 - ... hang */ -{ - return 20; -} -int opcode_0x33(bool &holded) /* 0x33 - ROL:AND (),Y 8 cycles */ -{ - Modify_PostY( ROLAND ); - return 8; -} -int opcode_0x34(bool &holded) /* 0x34 - NOP2 */ -{ - cpuReg_PC+=2; - return 8; -} -int opcode_0x35(bool &holded) /* 0x35 - AND ZP,X 4 cycles */ -{ - Load_ZPX( AND ); - return 4; -} -int opcode_0x36(bool &holded) /* 0x36 - ROL ZP,X 6 cycles */ -{ - Modify_ZPX( ROL ); - return 6; -} -int opcode_0x37(bool &holded) /* 0x37 - ROL:AND ZP,X 6 cycles */ -{ - Modify_ZPX( ROLAND ); - return 6; -} -int opcode_0x38(bool &holded) /* 0x38 - SEC 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_C = 1; - return 2; -} -int opcode_0x39(bool &holded) /* 0x39 - AND ABS,Y 4,5 cycles */ -{ - Load_ABSY( AND ); - return 4; -} -int opcode_0x3A(bool &holded) /* 0x3A - NOP1 */ -{ - cpuReg_PC++; - return 2; -} -int opcode_0x3B(bool &holded) /* 0x3B - ROL:AND ABS,Y 7 cycles */ -{ - Modify_ABSY( ROLAND ); - return 7; -} -int opcode_0x3C(bool &holded) /* 0x3C - NOP3 */ -{ - cpuReg_PC+=3; - return 4; -} -int opcode_0x3D(bool &holded) /* 0x3D - AND ABS,X 4,5 cycles */ -{ - Load_ABSX( AND ); - return 4; -} -int opcode_0x3E(bool &holded) /* 0x3E - ROL ABS,X 7 cycles */ -{ - Modify_ABSX( ROL ); - return 7; -} -int opcode_0x3F(bool &holded) /* 0x3F - ROL:AND ABS,X 7 cycles */ -{ - Modify_ABSX( ROLAND ); - return 7; -} -int opcode_0x40(bool &holded) /* 0x40 - RTI 6 cycles */ -{ -BYTE te; - cpuReg_PC++; - cpuReg_S++; te = atariMem[0x100 + cpuReg_S]; - cpuFlag_N = te; cpuFlag_V = (te>>6)&1; cpuFlag_B = (te>>4)&1; cpuFlag_D = (te>>3)&1; cpuFlag_I = (te>>2)&1; cpuFlag_Z = (te&2)^2; cpuFlag_C = te&1; - cpuReg_S++; cpuReg_PC = (WORD)atariMem[0x100 + cpuReg_S]; - cpuReg_S++; cpuReg_PC+= ((WORD)atariMem[0x100 + cpuReg_S])*256; - return 6; -} -int opcode_0x41(bool &holded) /* 0x41 - EOR (,X) 6 cycles */ -{ - Load_PreX( EOR ); - return 6; -} -int opcode_0x42(bool &holded) /* 0x42 - ... hang */ -{ - return 20; -} -int opcode_0x43(bool &holded) /* 0x43 - LSR:EOR (,X) 8 cycles */ -{ - Modify_PreX( LSREOR ); - return 8; -} -int opcode_0x44(bool &holded) /* 0x44 - NOP2 3 cycles */ -{ - cpuReg_PC+=2; - return 3; -} -int opcode_0x45(bool &holded) /* 0x45 - EOR ZP 3 cycles */ -{ - Load_ZP( EOR ); - return 3; -} -int opcode_0x46(bool &holded) /* 0x46 - LSR ZP 5 cycles */ -{ - Modify_ZP( LSR ); - return 5; -} -int opcode_0x47(bool &holded) /* 0x47 - LSR:EOR ZP 5 cycles */ -{ - Modify_ZP( LSREOR ); - return 5; -} -int opcode_0x48(bool &holded) /* 0x48 - PHA 3 cycles */ -{ - cpuReg_PC++; - atariMem[0x100 + cpuReg_S] = cpuReg_A; cpuReg_S--; - return 3; -} -int opcode_0x49(bool &holded) /* 0x49 - EOR # 2 cycles */ -{ - Load_IMD( EOR ); - return 2; -} -int opcode_0x4A(bool &holded) /* 0x4A - LSR @ 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_C = cpuReg_A; cpuReg_A>>=1; cpuFlag_N = cpuFlag_Z = cpuReg_A; - return 2; -} -int opcode_0x4B(bool &holded) /* 0x4B - ???? */ -{ - cpuReg_PC--; - return 20; -} -int opcode_0x4C(bool &holded) /* 0x4C - JMP 3 cycles */ -{ - cpuReg_PC = ((WORD*)&atariMem[cpuReg_PC+1])[0]; - return 3; -} -int opcode_0x4D(bool &holded) /* 0x4D - EOR ABS 4 cycles */ -{ - Load_ABS( EOR ); - return 4; -} -int opcode_0x4E(bool &holded) /* 0x4E - LSR ABS 6 cycles */ -{ - Modify_ABS( LSR ); - return 6; -} -int opcode_0x4F(bool &holded) /* 0x4F - LSR:EOR ABS 6 cycles */ -{ - Modify_ABS( LSREOR ); - return 6; -} - -int opcode_0x50(bool &holded) /* 0x50 - BVC 2-4 cycles */ -{ - CondJump( (cpuFlag_V&1)==0 ); - return 2; -} - -int opcode_0x51(bool &holded) /* 0x51 - EOR (),Y 5 cycles */ -{ - Load_PostY( EOR ); - return 5; -} -int opcode_0x52(bool &holded) /* 0x52 - ... hang */ -{ - return 20; -} -int opcode_0x53(bool &holded) /* 0x53 - LSR:EOR (),Y 8 cycles */ -{ - Modify_PostY( LSREOR ); - return 8; -} -int opcode_0x54(bool &holded) /* 0x54 - NOP2 */ -{ - cpuReg_PC+=2; - return 3; -} -int opcode_0x55(bool &holded) /* 0x55 - EOR ZP,X 4 cycles */ -{ - Load_ZPX( EOR ); - return 4; -} -int opcode_0x56(bool &holded) /* 0x56 - LSR ZP,X 6 cycles */ -{ - Modify_ZPX( LSR ); - return 6; -} -int opcode_0x57(bool &holded) /* 0x57 - LSR:EOR ZP,X 6 cycles */ -{ - Modify_ZPX( LSREOR ); - return 6; -} -int opcode_0x58(bool &holded) /* 0x58 - CLI 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_I = 0; - pokeyGenerateCheckIRQline(); - return 2; -} -int opcode_0x59(bool &holded) /* 0x59 - EOR ABS,Y 4,5 cycles */ -{ - Load_ABSY( EOR ); - return 4; -} -int opcode_0x5A(bool &holded) /* 0x5A - NOP1 2 cycles */ -{ - cpuReg_PC++; - return 2; -} -int opcode_0x5B(bool &holded) /* 0x5B - LSR:EOR ABS,Y 7 cycles */ -{ - Modify_ABSY( EOR ); - return 7; -} -int opcode_0x5C(bool &holded) /* 0x5C - NOP3 7 cycles */ -{ - cpuReg_PC+=3; - return 7; -} -int opcode_0x5D(bool &holded) /* 0x5D - EOR ABS,X 4,5 cycles */ -{ - Load_ABSX( EOR ); - return 4; -} -int opcode_0x5E(bool &holded) /* 0x5E - LSR ABS,X 7 cycles */ -{ - Modify_ABSX( EOR ); - return 7; -} -int opcode_0x5F(bool &holded) /* 0x5F - LSR:EOR ABS,X 7 cycles */ -{ - Modify_ABSX( LSREOR ); - return 7; -} - -int opcode_0x60(bool &holded) /* 0x60 - RTS 6 cycles */ -{ - cpuReg_S++; cpuReg_PC = (WORD)atariMem[0x100 + cpuReg_S]; - cpuReg_S++; cpuReg_PC+= ((WORD)atariMem[0x100 + cpuReg_S])*256 + 1; - return 6; -} -int opcode_0x61(bool &holded) /* 0x61 - ADC (,X) 6 cycles */ -{ - Load_PreX( ADC ); - return 6; -} -int opcode_0x62(bool &holded) /* 0x62 - ... hang */ -{ - return 20; -} -int opcode_0x63(bool &holded) /* 0x63 - ROR:ADC (,X) 8 cycles */ -{ - Modify_PreX( RORADC ); - return 8; -} -int opcode_0x64(bool &holded) /* 0x64 - NOP2 3 cycles */ -{ - cpuReg_PC+=2; - return 3; -} -int opcode_0x65(bool &holded) /* 0x65 - ADC ZP 3 cycles */ -{ - Load_ZP( ADC ); - return 3; -} -int opcode_0x66(bool &holded) /* 0x66 - ROR ZP 5 cycles */ -{ - Modify_ZP( ROR ); - return 5; -} -int opcode_0x67(bool &holded) /* 0x67 - ROR:ADC ZP 5 cycles */ -{ - Modify_ZP( RORADC ); - return 5; -} -int opcode_0x68(bool &holded) /* 0x68 - PLA 4 cycles */ -{ - cpuReg_PC++; - cpuReg_S++; cpuFlag_N = cpuFlag_Z = cpuReg_A = atariMem[0x100 + cpuReg_S]; - return 4; -} -int opcode_0x69(bool &holded) /* 0x69 - ADC # 2 cycles */ -{ - Load_IMD( ADC ); - return 2; -} -int opcode_0x6A(bool &holded) /* 0x6A - ROR @ 2 cycles */ -{ -BYTE cC; - cpuReg_PC++; - cC = cpuReg_A; cpuReg_A = (cpuReg_A>>1) + (cpuFlag_C<<7); cpuFlag_C = cC; cpuFlag_N = cpuFlag_Z = cpuReg_A; - return 2; -} -int opcode_0x6B(bool &holded) /* 0x6B - ???? */ -{ - return 20; -} -int opcode_0x6C(bool &holded) /* 0x6C - JMP ( ) 6 cycles */ -{ - WORD wA = ((WORD*)&atariMem[cpuReg_PC+1])[0]; - wA = ((WORD*)&atariMem[wA])[0]; - cpuReg_PC = wA; - return 6; -} -int opcode_0x6D(bool &holded) /* 0x6D - ADC ABS 4 cycles */ -{ - Load_ABS( ADC ); - return 4; -} -int opcode_0x6E(bool &holded) /* 0x6E - ROR ABS 6 cycles */ -{ - Modify_ABS( ROR ); - return 6; -} -int opcode_0x6F(bool &holded) /* 0x6F - ROR:ADC ABS 6 cycles */ -{ - Modify_ABS( RORADC ); - return 6; -} -int opcode_0x70(bool &holded) /* 0x70 - BVS 2-4 cycles */ -{ - CondJump( (cpuFlag_V&1) ); - return 2; -} -int opcode_0x71(bool &holded) /* 0x71 - ADC ( ),Y 5,6 cycles */ -{ - Load_PostY( ADC ); - return 5; -} -int opcode_0x72(bool &holded) /* 0x72 - ... hang */ -{ - return 20; -} -int opcode_0x73(bool &holded) /* 0x73 - ROR:ADC ( ),Y 8 cycles */ -{ - Modify_PostY( RORADC ); - return 8; -} -int opcode_0x74(bool &holded) /* 0x74 - NOP2 4 cycles */ -{ - return 4; -} -int opcode_0x75(bool &holded) /* 0x75 - ADC ZP,X 4 cycles */ -{ - Load_ZPX( ADC ); - return 4; -} -int opcode_0x76(bool &holded) /* 0x76 - ROR ZP,X 6 cycles */ -{ - Modify_ZPX( ROR ); - return 6; -} -int opcode_0x77(bool &holded) /* 0x77 - ROR:ADC ZP,X 6 cycles */ -{ - Modify_ZPX( RORADC ); - return 6; -} -int opcode_0x78(bool &holded) /* 0x78 - SEI 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_I = 1; - return 2; -} -int opcode_0x79(bool &holded) /* 0x79 - ADC ABS,Y 4,5 cycles */ -{ - Load_ABSY( ADC ); - return 4; -} -int opcode_0x7A(bool &holded) /* 0x7A - NOP1 2 cycles */ -{ - cpuReg_PC++; - return 2; -} -int opcode_0x7B(bool &holded) /* 0x7B - ROR:ADC ABS,Y 6 cycles */ -{ - Modify_ABSY( RORADC ); - return 6; -} -int opcode_0x7C(bool &holded) /* 0x7C - NOP3 7 cycles */ -{ - cpuReg_PC+=3; - return 7; -} -int opcode_0x7D(bool &holded) /* 0x7D - ADC ABS,X 4,5 cycles */ -{ - Load_ABSX( ADC ); - return 4; -} -int opcode_0x7E(bool &holded) /* 0x7E - ROR ABS,X 7 cycles */ -{ - Modify_ABSX( ROR ); - return 7; -} -int opcode_0x7F(bool &holded) /* 0x7F - ROR:ADC ABS,X 7 cycles */ -{ - Modify_ABSX( RORADC ); - return 7; -} - -int opcode_0x80(bool &holded) /* 0x80 - NOP2 2 cycles */ -{ - cpuReg_PC+=2; - return 2; -} -int opcode_0x81(bool &holded) /* 0x81 - STA ( ,X) 6 cycles */ -{ - Store_PreX( cpuReg_A ); - return 6; -} -int opcode_0x82(bool &holded) /* 0x82 - NOP2 2 cycles */ -{ - cpuReg_PC+=2; - return 2; -} -int opcode_0x83(bool &holded) /* 0x83 - STORE(A&X) (,X) 6 cycles */ -{ - Store_PreX( (cpuReg_A&cpuReg_X) ); - return 6; -} -int opcode_0x84(bool &holded) /* 0x84 - STY ZP 3 cycles */ -{ - atariMem[atariMem[cpuReg_PC+1]] = cpuReg_Y; - cpuReg_PC+=2; - return 3; -} -int opcode_0x85(bool &holded) /* 0x85 - STA ZP 3 cycles */ -{ - atariMem[atariMem[cpuReg_PC+1]] = cpuReg_A; - cpuReg_PC+=2; - return 3; -} -int opcode_0x86(bool &holded) /* 0x86 - STX ZP 3 cycles */ -{ - atariMem[atariMem[cpuReg_PC+1]] = cpuReg_X; - cpuReg_PC+=2; - return 3; -} -int opcode_0x87(bool &holded) /* 0x87 - STORE(A&X) ZP 3 cycles */ -{ - atariMem[atariMem[cpuReg_PC+1]] = cpuReg_A&cpuReg_X; - cpuReg_PC+=2; - return 3; -} -int opcode_0x88(bool &holded) /* 0x88 - DEY 2 cycles */ -{ - cpuReg_PC++; - cpuReg_Y--; - cpuFlag_N = cpuFlag_Z = cpuReg_Y; - return 2; -} -int opcode_0x89(bool &holded) /* 0x89 - NOP2 2 cycles */ -{ - cpuReg_PC+=2; - return 2; -} -int opcode_0x8A(bool &holded) /* 0x8A - TXA 2 cycles */ -{ - cpuReg_PC+=1; - cpuFlag_N = cpuFlag_Z = cpuReg_A = cpuReg_X; - return 2; -} -int opcode_0x8B(bool &holded) /* 0x8B - TXA:AND # 2 cycles */ -{ - cpuReg_A = cpuReg_X; - cpuFlag_N = cpuFlag_Z = cpuReg_A = cpuReg_A & atariMem[cpuReg_PC+1]; - cpuReg_PC+=2; - return 2; -} -int opcode_0x8C(bool &holded) /* 0x8C - STY ABS 4 cycles */ -{ - Store_ABS( cpuReg_Y ); - return 4; -} -int opcode_0x8D(bool &holded) /* 0x8D - STA ABS 4 cycles */ -{ - Store_ABS( cpuReg_A ); - return 4; -} -int opcode_0x8E(bool &holded) /* 0x8E - STX ABS 4 cycles */ -{ - Store_ABS( cpuReg_X ); - return 4; -} -int opcode_0x8F(bool &holded) /* 0x8F - STORE(A&X) ABS 4 cycles */ -{ - Store_ABS( (cpuReg_A&cpuReg_X) ); - return 4; -} -int opcode_0x90(bool &holded) /* 0x90 - BCC 2-4 cycles */ -{ - CondJump( (cpuFlag_C&1)==0 ); - return 2; -} -int opcode_0x91(bool &holded) /* 0x91 - STA ( ),Y 6 cycles */ -{ - Store_PostY( cpuReg_A ); - return 6; -} -int opcode_0x92(bool &holded) /* 0x92 - ... hang */ -{ - return 20; -} -int opcode_0x93(bool &holded) /* 0x93 - STORE(A&X) (),Y 4,5 cycles */ -{ - Store_PostY( (cpuReg_A&cpuReg_X) ); - return 6; -} -int opcode_0x94(bool &holded) /* 0x94 - STY ZP,X 4 cycles */ -{ - atariMem[(atariMem[cpuReg_PC+1]+cpuReg_X)&0xFF] = cpuReg_Y; - cpuReg_PC+=2; - return 4; -} -int opcode_0x95(bool &holded) /* 0x95 - STA ZP,X 4 cycles */ -{ - atariMem[(atariMem[cpuReg_PC+1]+cpuReg_X)&0xFF] = cpuReg_A; - cpuReg_PC+=2; - return 4; -} -int opcode_0x96(bool &holded) /* 0x96 - STX ZP,Y 4 cycles */ -{ - atariMem[(atariMem[cpuReg_PC+1]+cpuReg_Y)&0xFF] = cpuReg_X; - cpuReg_PC+=2; - return 4; -} -int opcode_0x97(bool &holded) /* 0x97 - STORE(A&X) ZP,Y 4 cycles */ -{ - atariMem[(atariMem[cpuReg_PC+1]+cpuReg_Y)&0xFF] = cpuReg_X&cpuReg_A; - cpuReg_PC+=2; - return 4; -} -int opcode_0x98(bool &holded) /* 0x98 - TYA 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_N = cpuFlag_Z = cpuReg_A = cpuReg_Y; - return 2; -} -int opcode_0x99(bool &holded) /* 0x99 - STA ABS,Y 5 cycles */ -{ - Store_ABSY( cpuReg_A ); - return 5; -} -int opcode_0x9A(bool &holded) /* 0x9A - TXS 2 cycles */ -{ - cpuReg_PC++; - cpuReg_S = cpuReg_X; - return 2; -} -int opcode_0x9B(bool &holded) /* 0x9B - ???? */ -{ - return 20; -} -int opcode_0x9C(bool &holded) /* 0x9C - ???? */ -{ - return 20; -} -int opcode_0x9D(bool &holded) /* 0x9D - STA ABS,X 5 cycles */ -{ - Store_ABSX( cpuReg_A ); - return 5; -} -int opcode_0x9E(bool &holded) /* 0x9E - ???? */ -{ - return 20; -} -int opcode_0x9F(bool &holded) /* 0x9F - ???? */ -{ - return 20; -} -int opcode_0xA0(bool &holded) /* 0xA0 - LDY # 2 cycles */ -{ - LoadReg_IMD( cpuReg_Y ); - return 2; -} -int opcode_0xA1(bool &holded) /* 0xA1 - LDA (,X) 6 cycles */ -{ - LoadReg_PreX( cpuReg_A ); - return 6; -} -int opcode_0xA2(bool &holded) /* 0xA2 - LDX # 2 cycles */ -{ - LoadReg_IMD( cpuReg_X ); - return 2; -} -int opcode_0xA3(bool &holded) /* 0xA3 - LDA:TAX (,X) 6 cycles */ -{ - LoadReg_IMD( cpuReg_A ); - cpuReg_X = cpuReg_A; - return 6; -} -int opcode_0xA4(bool &holded) /* 0xA4 - LDY ZP 3 cycles */ -{ - LoadReg_ZP( cpuReg_Y ); - return 3; -} -int opcode_0xA5(bool &holded) /* 0xA5 - LDA ZP 3 cycles */ -{ - LoadReg_ZP( cpuReg_A ); - return 3; -} -int opcode_0xA6(bool &holded) /* 0xA6 - LDX ZP 3 cycles */ -{ - LoadReg_ZP( cpuReg_X ); - return 3; -} -int opcode_0xA7(bool &holded) /* 0xA7 - LDA:TAX ZP 3 cycles */ -{ - LoadReg_ZP( cpuReg_A ); - cpuReg_X = cpuReg_A; - return 3; -} -int opcode_0xA8(bool &holded) /* 0xA8 - TAY 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_N = cpuFlag_Z = cpuReg_Y = cpuReg_A; - return 2; -} -int opcode_0xA9(bool &holded) /* 0xA9 - LDA # 2 cycles */ -{ - LoadReg_IMD( cpuReg_A ); - return 2; -} -int opcode_0xAA(bool &holded) /* 0xAA - TAX 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_N = cpuFlag_Z = cpuReg_X = cpuReg_A; - return 2; -} -int opcode_0xAB(bool &holded) /* 0xAB - AND #:TAX 2 cycles */ -{ - cpuFlag_N = cpuFlag_Z = cpuReg_A = cpuReg_X = cpuReg_A & atariMem[cpuReg_PC+1]; - cpuReg_PC+=2; - return 2; -} -int opcode_0xAC(bool &holded) /* 0xAC - LDY ABS 4 cycles */ -{ - LoadReg_ABS( cpuReg_Y ); - return 4; -} -int opcode_0xAD(bool &holded) /* 0xAD - LDA ABS 4 cycles */ -{ - LoadReg_ABS( cpuReg_A ); - return 4; -} -int opcode_0xAE(bool &holded) /* 0xAE - LDX ABS 4 cycles */ -{ - LoadReg_ABS( cpuReg_X ); - return 4; -} -int opcode_0xAF(bool &holded) /* 0xAF - LDA:TAX ABS 4 cycles */ -{ - LoadReg_ABS( cpuReg_A ); - cpuReg_X = cpuReg_A; - return 4; -} -int opcode_0xB0(bool &holded) /* 0xB0 - BCS 2-4 cycles */ -{ - CondJump( (cpuFlag_C&1) ); - return 2; -} -int opcode_0xB1(bool &holded) /* 0xB1 - LDA ( ),Y 5,6 cycles */ -{ - LoadReg_PostY( cpuReg_A ); - return 5; -} -int opcode_0xB2(bool &holded) /* 0xB2 - ... hang */ -{ - return 20; -} -int opcode_0xB3(bool &holded) /* 0xB3 - LDA:TAX ( ),Y 5,6 cycles */ -{ - LoadReg_PostY( cpuReg_A ); - cpuReg_X = cpuReg_A; - return 5; -} -int opcode_0xB4(bool &holded) /* 0xB4 - LDY ZP,X 4 cycles */ -{ - LoadReg_ZPX( cpuReg_Y ); - return 4; -} -int opcode_0xB5(bool &holded) /* 0xB5 - LDA ZP,X 4 cycles */ -{ - LoadReg_ZPX( cpuReg_A ); - return 4; -} -int opcode_0xB6(bool &holded) /* 0xB6 - LDX ZP,Y 4 cycles */ -{ - LoadReg_ZPY( cpuReg_X ); - return 4; -} -int opcode_0xB7(bool &holded) /* 0xB7 - LDA:TAX ZP,Y 4 cycles */ -{ - LoadReg_ZPY( cpuReg_X ); - cpuReg_A = cpuReg_X; - return 4; -} -int opcode_0xB8(bool &holded) /* 0xB8 - CLV 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_V = 0; - return 2; -} -int opcode_0xB9(bool &holded) /* 0xB9 - LDA ABS,Y 4,5 cycles */ -{ - LoadReg_ABSY( cpuReg_A ); - return 4; -} -int opcode_0xBA(bool &holded) /* 0xBA - TSX 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_N = cpuFlag_Z = cpuReg_X = cpuReg_S; - return 2; -} -int opcode_0xBB(bool &holded) /* 0xBB - ???? */ -{ - return 20; -} -int opcode_0xBC(bool &holded) /* 0xBC - LDY ABS,X 4,5 cycles */ -{ - LoadReg_ABSX( cpuReg_Y ); - return 4; -} -int opcode_0xBD(bool &holded) /* 0xBD - LDA ABS,X 4,5 cycles */ -{ - LoadReg_ABSX( cpuReg_A ); - return 4; -} -int opcode_0xBE(bool &holded) /* 0xBE - LDX ABS,Y 4,5 cycles */ -{ - LoadReg_ABSY( cpuReg_X ); - return 4; -} -int opcode_0xBF(bool &holded) /* 0xBF - LDA:TAX ABS,Y 4,5 cycles */ -{ - LoadReg_ABSY( cpuReg_X ); - cpuReg_A = cpuReg_X; - return 4; -} -int opcode_0xC0(bool &holded) /* 0xC0 - CPY # 2 cycles */ -{ - Load_IMD( CPY ); - return 2; -} -int opcode_0xC1(bool &holded) /* 0xC1 - CMP (,X) 6 cycles */ -{ - Load_PreX( CMP ); - return 6; -} -int opcode_0xC2(bool &holded) /* 0xC2 - NOP2 2 cycles */ -{ - cpuReg_PC+=2; - return 2; -} -int opcode_0xC3(bool &holded) /* 0xC3 - DEC:CMP (,X) 8 cycles */ -{ - Modify_PreX( DECCMP ); - return 8; -} -int opcode_0xC4(bool &holded) /* 0xC4 - CPY ZP 3 cycles */ -{ - Load_ZP( CPY ); - return 3; -} -int opcode_0xC5(bool &holded) /* 0xC5 - CMP ZP 3 cycles */ -{ - Load_ZP( CMP ); - return 3; -} -int opcode_0xC6(bool &holded) /* 0xC6 - DEC ZP 5 cycles */ -{ - Modify_ZP( DEC ); - return 5; -} -int opcode_0xC7(bool &holded) /* 0xC7 - DEC:CMP ZP 5 cycles */ -{ - Modify_ZP( DECCMP ); - return 8; -} -int opcode_0xC8(bool &holded) /* 0xC8 - INY 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_N = cpuFlag_Z = cpuReg_Y = cpuReg_Y+1; - return 2; -} -int opcode_0xC9(bool &holded) /* 0xC9 - CMP # 2 cycles */ -{ - Load_IMD( CMP ); - return 2; -} -int opcode_0xCA(bool &holded) /* 0xCA - DEX 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_N = cpuFlag_Z = cpuReg_X = cpuReg_X-1; - return 2; -} -int opcode_0xCB(bool &holded) /* 0xCB - ???? */ -{ - return 20; -} -int opcode_0xCC(bool &holded) /* 0xCC - CPY ABS 4 cycles */ -{ - Load_ABS( CPY ); - return 4; -} -int opcode_0xCD(bool &holded) /* 0xCD - CMP ABS 4 cycles */ -{ - Load_ABS( CMP ); - return 4; -} -int opcode_0xCE(bool &holded) /* 0xCE - DEC ABS 6 cycles */ -{ - Modify_ABS( DEC ); - return 6; -} -int opcode_0xCF(bool &holded) /* 0xCF - DEC:CMP ABS 6 cycles */ -{ - Modify_ABS( DECCMP ); - return 6; -} -int opcode_0xD0(bool &holded) /* 0xD0 - BNE 2-4 cycles */ -{ - CondJump( cpuFlag_Z ); - return 2; -} -int opcode_0xD1(bool &holded) /* 0xD1 - CMP (),Y 5,6 cycles */ -{ - Load_PostY( CMP ); - return 5; -} -int opcode_0xD2(bool &holded) /* 0xD2 - ... hang */ -{ - return 20; -} -int opcode_0xD3(bool &holded) /* 0xD3 - DEC:CMP (),Y 8 cycles */ -{ - Modify_PostY( DECCMP ); - return 8; -} -int opcode_0xD4(bool &holded) /* 0xD4 - NOP2 4 cycles */ -{ - cpuReg_PC+=2; - return 4; -} -int opcode_0xD5(bool &holded) /* 0xD5 - CMP ZP,X 4 cycles */ -{ - Load_ZPX( CMP ); - return 4; -} -int opcode_0xD6(bool &holded) /* 0xD6 - DEC ZP,X 6 cycles */ -{ - Modify_ZPX( DEC ); - return 6; -} -int opcode_0xD7(bool &holded) /* 0xD7 - DEC:CMP ZP,X 6 cycles */ -{ - Modify_ZPX( DECCMP ); - return 6; -} -int opcode_0xD8(bool &holded) /* 0xD8 - CLD 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_D = 0; - return 2; -} -int opcode_0xD9(bool &holded) /* 0xD9 - CMP ABS,Y 4,5 cycles */ -{ - Load_ABSY( CMP ); - return 4; -} -int opcode_0xDA(bool &holded) /* 0xDA - NOP1 2 cycles */ -{ - cpuReg_PC++; - return 2; -} -int opcode_0xDB(bool &holded) /* 0xDB - DEC:CMP ABS,Y 7 cycles */ -{ - Modify_ABSY( DECCMP ); - return 7; -} -int opcode_0xDC(bool &holded) /* 0xDC - NOP3 4 cycles */ -{ - cpuReg_PC+=3; - return 4; -} -int opcode_0xDD(bool &holded) /* 0xDD - CMP ABS,X 4,5 cycles */ -{ - Load_ABSX( CMP ); - return 4; -} -int opcode_0xDE(bool &holded) /* 0xDE - DEC ABS,X 7 cycles */ -{ - Modify_ABSX( DEC ); - return 7; -} -int opcode_0xDF(bool &holded) /* 0xDF - DEC:CMP ABS,X 7 cycles */ -{ - Modify_ABSX( DECCMP ); - return 7; -} -int opcode_0xE0(bool &holded) /* 0xE0 - CPX # 2 cycles */ -{ - Load_IMD( CPX ); - return 2; -} -int opcode_0xE1(bool &holded) /* 0xE1 - SBC (,X) 6 cycles */ -{ - Load_PreX( SBC ); - return 6; -} -int opcode_0xE2(bool &holded) /* 0xE2 - NOP2 2 cycles */ -{ - cpuReg_PC+=2; - return 2; -} -int opcode_0xE3(bool &holded) /* 0xE3 - INC:SBC (,X) 8 cycles */ -{ - Modify_PreX( INCSBC ); - return 8; -} -int opcode_0xE4(bool &holded) /* 0xE4 - CPX ZP 3 cycles */ -{ - Load_ZP( CPX ); - return 3; -} -int opcode_0xE5(bool &holded) /* 0xE5 - SBC ZP 3 cycles */ -{ - Load_ZP( SBC ); - return 3; -} -int opcode_0xE6(bool &holded) /* 0xE6 - INC ZP 5 cycles */ -{ - Modify_ZP( INC ); - return 5; -} -int opcode_0xE7(bool &holded) /* 0xE7 - INC:SBC ZP 5 cycles */ -{ - Modify_ZP( INCSBC ); - return 5; -} -int opcode_0xE8(bool &holded) /* 0xE8 - INX 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_N = cpuFlag_Z = cpuReg_X = cpuReg_X+1; - return 2; -} -int opcode_0xE9(bool &holded) /* 0xE9 - SBC # 2 cycles */ -{ - Load_IMD( SBC ); - return 2; -} -int opcode_0xEA(bool &holded) /* 0xEA - NOP 2 cycles */ -{ - cpuReg_PC++; - return 2; -} -int opcode_0xEB(bool &holded) /* 0xEB - ???? */ -{ - return 20; -} -int opcode_0xEC(bool &holded) /* 0xEC - CPX ABS 4 cycles */ -{ - Load_ABS( CPX ); - return 4; -} -int opcode_0xED(bool &holded) /* 0xED - SBC ABS 4 cycles */ -{ - Load_ABS( SBC ); - return 4; -} -int opcode_0xEE(bool &holded) /* 0xEE - INC ABS 6 cycles */ -{ - Modify_ABS( INC ); - return 6; -} -int opcode_0xEF(bool &holded) /* 0xEF - INC:SBC ABS 6 cycles */ -{ - Modify_ABS( INCSBC ); - return 6; -} -int opcode_0xF0(bool &holded) /* 0xF0 - BEQ 2-4 cycles */ -{ - CondJump( (cpuFlag_Z==0) ); - return 2; -} -int opcode_0xF1(bool &holded) /* 0xF1 - SBC (),Y 5,6 cycles */ -{ - Load_PostY( SBC ); - return 5; -} -int opcode_0xF2(bool &holded) /* 0xF2 - ... hang */ -{ - return 20; -} -int opcode_0xF3(bool &holded) /* 0xF3 - INC:SBC (),Y 8 cycles */ -{ - Modify_PostY( INCSBC ); - return 8; -} -int opcode_0xF4(bool &holded) /* 0xF4 - NOP2 4 cycles */ -{ - cpuReg_PC+=2; - return 4; -} -int opcode_0xF5(bool &holded) /* 0xF5 - SBC ZP,X 4 cycles */ -{ - Load_ZPX( SBC ); - return 4; -} -int opcode_0xF6(bool &holded) /* 0xF6 - INC ZP,X 6 cycles */ -{ - Modify_ZPX( INC ); - return 6; -} -int opcode_0xF7(bool &holded) /* 0xF7 - INC:SBC ZP,X 6 cycles */ -{ - Modify_ZPX( INCSBC ); - return 6; -} -int opcode_0xF8(bool &holded) /* 0xF8 - SED 2 cycles */ -{ - cpuReg_PC++; - cpuFlag_D = 1; - return 2; -} -int opcode_0xF9(bool &holded) /* 0xF9 - SBC ABS,Y 4,5 cycles */ -{ - Load_ABSY( SBC ); - return 4; -} -int opcode_0xFA(bool &holded) /* 0xFA - NOP1 2 cycles */ -{ - cpuReg_PC++; - return 2; -} -int opcode_0xFB(bool &holded) /* 0xFB - INC:SBC ABS,Y 7 cycles */ -{ - Modify_ABSY( INCSBC ); - return 7; -} -int opcode_0xFC(bool &holded) /* 0xDC - NOP3 4 cycles */ -{ - cpuReg_PC+=3; - return 4; -} -int opcode_0xFD(bool &holded) /* 0xFD - SBC ABS,X 4,5 cycles */ -{ - Load_ABSX( SBC ); - return 4; -} -int opcode_0xFE(bool &holded) /* 0xFE - INC ABS,X 7 cycles */ -{ - Modify_ABSX( INC ); - return 7; -} -int opcode_0xFF(bool &holded) /* 0xDF - INC:SBC ABS,X 7 cycles */ -{ - Modify_ABSX( INCSBC ); - return 7; -} - -opcodeFunc opcodes_0x00_0xFF[256]={ - &opcode_0x00, &opcode_0x01, &opcode_0x02, &opcode_0x03, &opcode_0x04, &opcode_0x05, &opcode_0x06, &opcode_0x07, - &opcode_0x08, &opcode_0x09, &opcode_0x0A, &opcode_0x0B, &opcode_0x0C, &opcode_0x0D, &opcode_0x0E, &opcode_0x0F, - &opcode_0x10, &opcode_0x11, &opcode_0x12, &opcode_0x13, &opcode_0x14, &opcode_0x15, &opcode_0x16, &opcode_0x17, - &opcode_0x18, &opcode_0x19, &opcode_0x1A, &opcode_0x1B, &opcode_0x1C, &opcode_0x1D, &opcode_0x1E, &opcode_0x1F, - &opcode_0x20, &opcode_0x21, &opcode_0x22, &opcode_0x23, &opcode_0x24, &opcode_0x25, &opcode_0x26, &opcode_0x27, - &opcode_0x28, &opcode_0x29, &opcode_0x2A, &opcode_0x2B, &opcode_0x2C, &opcode_0x2D, &opcode_0x2E, &opcode_0x2F, - &opcode_0x30, &opcode_0x31, &opcode_0x32, &opcode_0x33, &opcode_0x34, &opcode_0x35, &opcode_0x36, &opcode_0x37, - &opcode_0x38, &opcode_0x39, &opcode_0x3A, &opcode_0x2B, &opcode_0x3C, &opcode_0x3D, &opcode_0x3E, &opcode_0x3F, - &opcode_0x40, &opcode_0x41, &opcode_0x42, &opcode_0x43, &opcode_0x44, &opcode_0x45, &opcode_0x46, &opcode_0x47, - &opcode_0x48, &opcode_0x49, &opcode_0x4A, &opcode_0x4B, &opcode_0x4C, &opcode_0x4D, &opcode_0x4E, &opcode_0x4F, - &opcode_0x50, &opcode_0x51, &opcode_0x52, &opcode_0x53, &opcode_0x54, &opcode_0x55, &opcode_0x56, &opcode_0x57, - &opcode_0x58, &opcode_0x59, &opcode_0x5A, &opcode_0x5B, &opcode_0x5C, &opcode_0x5D, &opcode_0x5E, &opcode_0x5F, - &opcode_0x60, &opcode_0x61, &opcode_0x62, &opcode_0x63, &opcode_0x64, &opcode_0x65, &opcode_0x66, &opcode_0x67, - &opcode_0x68, &opcode_0x69, &opcode_0x6A, &opcode_0x6B, &opcode_0x6C, &opcode_0x6D, &opcode_0x6E, &opcode_0x6F, - &opcode_0x70, &opcode_0x71, &opcode_0x72, &opcode_0x73, &opcode_0x74, &opcode_0x75, &opcode_0x76, &opcode_0x77, - &opcode_0x78, &opcode_0x79, &opcode_0x7A, &opcode_0x7B, &opcode_0x7C, &opcode_0x7D, &opcode_0x7E, &opcode_0x7F, - &opcode_0x80, &opcode_0x81, &opcode_0x82, &opcode_0x83, &opcode_0x84, &opcode_0x85, &opcode_0x86, &opcode_0x87, - &opcode_0x88, &opcode_0x89, &opcode_0x8A, &opcode_0x8B, &opcode_0x8C, &opcode_0x8D, &opcode_0x8E, &opcode_0x8F, - &opcode_0x90, &opcode_0x91, &opcode_0x92, &opcode_0x93, &opcode_0x94, &opcode_0x95, &opcode_0x96, &opcode_0x97, - &opcode_0x98, &opcode_0x99, &opcode_0x9A, &opcode_0x9B, &opcode_0x9C, &opcode_0x9D, &opcode_0x9E, &opcode_0x9F, - &opcode_0xA0, &opcode_0xA1, &opcode_0xA2, &opcode_0xA3, &opcode_0xA4, &opcode_0xA5, &opcode_0xA6, &opcode_0xA7, - &opcode_0xA8, &opcode_0xA9, &opcode_0xAA, &opcode_0xAB, &opcode_0xAC, &opcode_0xAD, &opcode_0xAE, &opcode_0xAF, - &opcode_0xB0, &opcode_0xB1, &opcode_0xB2, &opcode_0xB3, &opcode_0xB4, &opcode_0xB5, &opcode_0xB6, &opcode_0xB7, - &opcode_0xB8, &opcode_0xB9, &opcode_0xBA, &opcode_0xBB, &opcode_0xBC, &opcode_0xBD, &opcode_0xBE, &opcode_0xBF, - &opcode_0xC0, &opcode_0xC1, &opcode_0xC2, &opcode_0xC3, &opcode_0xC4, &opcode_0xC5, &opcode_0xC6, &opcode_0xC7, - &opcode_0xC8, &opcode_0xC9, &opcode_0xCA, &opcode_0xCB, &opcode_0xCC, &opcode_0xCD, &opcode_0xCE, &opcode_0xCF, - &opcode_0xD0, &opcode_0xD1, &opcode_0xD2, &opcode_0xD3, &opcode_0xD4, &opcode_0xD5, &opcode_0xD6, &opcode_0xD7, - &opcode_0xD8, &opcode_0xD9, &opcode_0xDA, &opcode_0xDB, &opcode_0xDC, &opcode_0xDD, &opcode_0xDE, &opcode_0xDF, - &opcode_0xE0, &opcode_0xE1, &opcode_0xE2, &opcode_0xE3, &opcode_0xE4, &opcode_0xE5, &opcode_0xE6, &opcode_0xE7, - &opcode_0xE8, &opcode_0xE9, &opcode_0xEA, &opcode_0xEB, &opcode_0xEC, &opcode_0xED, &opcode_0xEE, &opcode_0xEF, - &opcode_0xF0, &opcode_0xF1, &opcode_0xF2, &opcode_0xF3, &opcode_0xF4, &opcode_0xF5, &opcode_0xF6, &opcode_0xF7, - &opcode_0xF8, &opcode_0xF9, &opcode_0xFA, &opcode_0xFB, &opcode_0xFC, &opcode_0xFD, &opcode_0xFE, &opcode_0xFF, -}; - diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/sapEngine.cxx --- a/src/sap/saplib/sapEngine.cxx Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,657 +0,0 @@ -#include -#include -#include -#include - -#define __MAIN_DECLARATIONS__ - -#include "sapGlobals.h" - -#include "sapLib.h" - -namespace _SAP_internals_ { - -void playerCallSubroutine( WORD address ); -void playerProcessOneFrame( void ); - -volatile int prSbp; -volatile int musicAddress,playerAddress,playerInit,playerType,defSong,fastPlay; -volatile BOOL fileLoadStatus=FALSE; - -char inputBuffer[65536]; -char commentBuffer[65536]; - -sapMUSICstrc currentMusic; - -BYTE emulEmptyLine[]={ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -} - -using namespace _SAP_internals_; - -sapMUSICstrc *sapLoadMusicFile( char *fname ) -{ -BOOL formatKnown,binaryFile; int i; -int numOfSongs; - - fileLoadStatus = FALSE; - if( fname==NULL ) - return NULL; - - cpuInit( ); - pokeyInit( ); - pokeyReset( ); - prSbp = 0; - sndBufPtr = 0; - memset( sndBuf, 0, sizeof(sndBuf) ); - commentBuffer[0] = 0; - memset( atariMem, 0, sizeof(atariMem) ); - atariMem[0x0000] = 0xFF; // CMC bug. - atariMem[0xFEFF] = 0xFF; // CMC bug. -// atariMem[0xFFFE] = 0xFF; // CMC bug. -// atariMem[0xFFFF] = 0xFF; // CMC bug. - - isStereo = false; - sampleStep = 1; - formatKnown = FALSE; binaryFile = FALSE; - musicAddress = playerAddress = playerType = numOfSongs = defSong = fastPlay = -1; - FILE *inpf; - inpf = fopen( fname, "rb" ); - if( inpf!=NULL ) - { - BYTE blkHead[4]; WORD blkBegin = 0,blkEnd = 0; int blk; - - blk = 0; i = 0; - while( 1 ) - { - int val; val = fgetc( inpf ); - if( formatKnown==FALSE ) - { - if( (val==EOF) || (i>=4) ) - { - // error - break; - } - if( (val==0x0A) || (val==0x0D) ) - { - inputBuffer[i] = 0; - if( strcmp( inputBuffer, "SAP" )!=0 ) - { - // error - break; - } - // headerID is OK - i = 0; - formatKnown = TRUE; - continue;; - } - inputBuffer[i++] = (char)val; - } - else if( binaryFile==FALSE ) - { - if( val==EOF ) - { - // error - break; - } - if( val==0xFF ) - { - if( i!=0 ) - { - // error. There wasn't EOL in this line - break; - } - // so this is the end of header - binaryFile = TRUE; - blkHead[blk++] = (BYTE)val; - continue; - } - if( (val==0x0A) || (val==0x0D) ) - { - if( i==0 ) - continue; - inputBuffer[i++] = 0; - char *codes[]={ "PLAYER", "MUSIC", "INIT", "TYPE", "SONGS", "DEFSONG", "FASTPLAY", "STEREO", "TIME", NULL }; - int j,k,a; - for( j=0;; j++ ) - { - if( codes[j]==NULL ) - break; - k = 0; - while( 1 ) - { - if( k>=i ) - { - // not this code - i = 0; - break; - } - if( (codes[j][k]==0) && ((inputBuffer[k]==' ') || (inputBuffer[k]==0)) ) - { - // found - switch( j ) - { - case 0: // player address - a = strtol( &inputBuffer[k], NULL, 16 ); - if( (a==0) || (a>0xFFFF) ) - { - // error - i = 0; - goto cont; - } - playerAddress = a; - i = 0; - goto cont; - break; - case 1: // music address - a = strtol( &inputBuffer[k], NULL, 16 ); - if( (a==0) || (a>0xFFFF) ) - { - // error - i = 0; - goto cont; - } - musicAddress = a; - i = 0; - goto cont; - break; - case 2: // binary player init - a = strtol( &inputBuffer[k], NULL, 16 ); - if( (a==0) || (a>0xFFFF) ) - { - // error - i = 0; - goto cont; - } - playerInit = a; - i = 0; - goto cont; - break; - case 3: // player type - while( inputBuffer[k]!=0 ) - { - if( (inputBuffer[k]=='B') || (inputBuffer[k]=='b') ) - { - playerType = 'b'; - break; - } - if( (inputBuffer[k]=='C') || (inputBuffer[k]=='c') ) - { - playerType = 'c'; - break; - } - if( (inputBuffer[k]=='D') || (inputBuffer[k]=='d') ) - { - playerType = 'd'; - break; - } - if( (inputBuffer[k]=='S') || (inputBuffer[k]=='s') ) - { - playerType = 's'; - break; - } - if( !isspace(inputBuffer[k]) ) - { - i = 0; - goto cont; - } - k++; - } - i = 0; - goto cont; - break; - case 4: // num of songs - a = strtol( &inputBuffer[k], NULL, 10 ); - if( (a==0) || (a>0xFFFF) ) - { - // error - i = 0; - goto cont; - } - numOfSongs = a; - sprintf( &commentBuffer[ strlen(commentBuffer) ], "Number of songs = %d\n", numOfSongs ); - i = 0; - goto cont; - break; - case 5: // default songs - a = strtol( &inputBuffer[k], NULL, 10 ); - if( (a==0) || (a>0xFFFF) ) - { - // error - i = 0; - goto cont; - } - defSong = a; - i = 0; - goto cont; - break; - case 6: // fastPlay - a = strtol( &inputBuffer[k], NULL, 10 ); - if( (a==0) || (a>0xFFFF) ) - { - // error - i = 0; - goto cont; - } - fastPlay = a; - i = 0; - goto cont; - break; - case 7: // Stereo - isStereo = true; - sampleStep = 2; - sprintf( &commentBuffer[ strlen(commentBuffer) ], "In Stereo!\n" ); - i = 0; - goto cont; - break; - case 8: // Time - { - int min,sec; - min = sec = -1; - sscanf( &inputBuffer[k], "%d:%d", &min, &sec ); - if( min==-1 || sec==-1 ) - { - i = 0; - goto cont; - } - sprintf( &commentBuffer[ strlen(commentBuffer) ], "Time in sec %d\n", min*60+sec ); - i = 0; - goto cont; - break; - } - } - i = 0; - goto cont; - } - if( codes[j][k]==0 ) - break; // not this code - if( codes[j][k]!=inputBuffer[k] ) - break; // not this code - k++; - } - } - sprintf( &commentBuffer[ strlen(commentBuffer) ], "%s\n", inputBuffer ); - // not found - i = 0; - continue; - } - inputBuffer[i++] = (char)val; - } - else if( binaryFile==TRUE ) - { - if( val==EOF ) - { - if( blk==0 ) - { - fileLoadStatus = TRUE; - break; // OK - } - // error - break; - } - if( blk<4 ) - { - blkHead[blk++] = (BYTE)val; - if( blk==2 ) - { - if( (blkHead[0]&blkHead[1])==255 ) - blk = 0; - } - if( blk==4 ) - { - blkBegin = ((WORD)blkHead[0]) + ((WORD)blkHead[1])*256; - blkEnd = ((WORD)blkHead[2]) + ((WORD)blkHead[3])*256; - } - } - else - { - atariMem[blkBegin] = (BYTE)val; - if( blkBegin==blkEnd ) - { - blk = 0; - } - blkBegin++; - } - } - cont:; - - } - fclose( inpf ); - - } - if( playerType==-1 ) - return NULL; - fileLoadStatus = TRUE; - - currentMusic.defSong = defSong; - currentMusic.numOfSongs = numOfSongs; - - - currentMusic.commentBuffer = &commentBuffer[0]; - currentMusic.currentTimeIn50Sec = 0; - -// sapPlaySong( defSong ); - return ¤tMusic; -} - - -void sapPlaySong( int numOfSong ) -{ - - if( fileLoadStatus==FALSE ) - return; - - if( numOfSong==-1 ) - numOfSong = 0; - numOfSong &= 0xFF; - numOfSong = numOfSong % currentMusic.numOfSongs; - - sndBufPtr = prSbp = 0; - switch( playerType ) - { - case 'c': - if( (playerAddress==-1) || (musicAddress==-1) ) - { - fileLoadStatus = FALSE; - break; - } - cpuReg_S = 0xFF; - cpuReg_A = 0x70; - cpuReg_X = (musicAddress&0xFF); - cpuReg_Y = (musicAddress>>8)&0xFF; - playerCallSubroutine( playerAddress+3 ); - cpuReg_S = 0xFF; - cpuReg_A = 0x00; - cpuReg_X = numOfSong; - playerCallSubroutine( playerAddress+3 ); - break; - case 'b': - case 'm': - if( (playerInit==-1) || (playerAddress==-1) ) - { - fileLoadStatus = FALSE; - break; - } - cpuReg_S = 0xFF; - cpuReg_A = numOfSong; - playerCallSubroutine( playerInit ); - break; - case 'd': - if( (playerInit==-1) || (playerAddress==-1) ) - { - fileLoadStatus = FALSE; - break; - } - cpuReg_S = 0xFF; - cpuReg_PC = 0xFFFF; - cpuReg_PC--; - atariMem[0x100 + cpuReg_S] = (cpuReg_PC>>8)&0xFF; cpuReg_S--; - atariMem[0x100 + cpuReg_S] = cpuReg_PC&0xFF; cpuReg_S--; - cpuReg_PC = playerInit; - cpuReg_A = numOfSong; - cpuReg_X = 0; - cpuReg_Y = 0; - cpuSetFlags( 0x20 ); - break; - case 's': - if( (playerInit==-1) || (playerAddress==-1) ) - { - fileLoadStatus = FALSE; - break; - } - cpuReg_S = 0xFF; - cpuReg_PC = playerInit; - cpuReg_A = 0; - cpuReg_X = 0; - cpuReg_Y = 0; - cpuSetFlags( 0x20 ); - break; - } -} - - -void _SAP_internals_::playerCallSubroutine( WORD address ) -{ -int i,k; - - cpuReg_PC = 0xFFFF; - cpuReg_PC--; - atariMem[0x100 + cpuReg_S] = (cpuReg_PC>>8)&0xFF; cpuReg_S--; - atariMem[0x100 + cpuReg_S] = cpuReg_PC&0xFF; cpuReg_S--; - cpuReg_PC = address; - k = 0; - bool holded; - while(k<1000000) - { - BYTE opcode = atariMem[ cpuReg_PC ]; - i = opcodes_0x00_0xFF[opcode](holded); - k+=i; - if( i>10 ) - return; - if( cpuReg_PC==0xFFFF ) - break; - } - k++; -} - -extern bool *generateIRQ0; -int numsPerFrame; - -void _SAP_internals_::playerProcessOneFrame( void ) -{ -int ilp = 0; -BYTE oldFlags = 0,oldA = 0,oldX = 0,oldY = 0,oldS = 0; -WORD oldPC = 0; -BOOL notRestored = 0; -bool holded; -int cycleInLine,lineInFrame; - - numsPerFrame = 0; - - if( playerType=='d' ) - { - oldFlags = cpuGetFlags(); - oldA = cpuReg_A; - oldX = cpuReg_X; - oldY = cpuReg_Y; - oldPC = cpuReg_PC; - oldS = cpuReg_S; - notRestored = TRUE; - } - if( playerType=='s' ) - { - - } - - if( playerType!='s' ) - { - cpuReg_S = 0x8F; - cpuReg_PC = 0xFFFF; - cpuReg_PC--; - atariMem[0x100 + cpuReg_S] = (cpuReg_PC>>8)&0xFF; cpuReg_S--; - atariMem[0x100 + cpuReg_S] = cpuReg_PC&0xFF; cpuReg_S--; - } - - switch( playerType ) - { - case 'c': - cpuReg_PC = playerAddress+6; - break; - case 'b': - case 'd': - case 'm': - cpuReg_PC = playerAddress; - break; - } - cycleInLine = 0; - if( fastPlay!=-1 ) - lineInFrame = 0; - else if( playerType=='s' ) - lineInFrame = 0; - else - lineInFrame = 248; - holded = false; - pokeyUpdateSoundCounters(); - - while(1) - { - if( cpuReg_PC!=0xFFFF ) - { - BYTE opcode = atariMem[ cpuReg_PC ]; - ilp = opcodes_0x00_0xFF[opcode](holded); - if( ilp>10 ) - return; // not supported instruction has been executed - if( (playerType=='b') || (playerType=='c') ) - ilp = 1; - } - else - { - if( playerType=='d' ) - { - if( notRestored==TRUE ) - { - notRestored = FALSE; - cpuReg_PC = oldPC; - cpuReg_A = oldA; - cpuReg_X = oldX; - cpuReg_Y = oldY; - cpuSetFlags( oldFlags ); - cpuReg_S = oldS; - } - } - else - { - do { - pokeyUpdateSound(114); - lineInFrame++; - currentMusic.currentTimeIn50Sec++; - if( fastPlay!=-1 ) - { - if( lineInFrame==fastPlay ) - { - pokeyUpdateSoundCounters(); - goto bre; - } - } - else - { - if( lineInFrame==248 ) - { - pokeyUpdateSoundCounters(); - goto bre; - } - if( lineInFrame==312 ) - { - lineInFrame=0; - pokeyUpdateSoundCounters(); - } - } - } while(1); - } - } - again: - for(;ilp>0;ilp--) - { - if( cycleInLine>=103-9 ) - { - if( cycleInLine==103-9 ) - { - if( holded ) - { - ilp = 0; - holded = false; - } - } - if( cycleInLine==113-9 ) - { - pokeyUpdateSound(114); - cycleInLine = -1; - lineInFrame++; - currentMusic.currentTimeIn50Sec++; - if( fastPlay!=-1 ) - { - if( lineInFrame==fastPlay ) - { - pokeyUpdateSoundCounters(); - goto bre; - } - } - else if( playerType=='s' ) - { - if( lineInFrame==78 ) - { - pokeyUpdateSoundCounters(); - atariMem[0x45]--; - if( atariMem[0x45]==0 ) - atariMem[0xB07B]++; - goto bre; - } - } - else - { - if( lineInFrame==248 ) - { - pokeyUpdateSoundCounters(); - goto bre; - } - if( lineInFrame==312 ) - { - lineInFrame=0; - pokeyUpdateSoundCounters(); - } - } - ANTIC_VCOUNT_D40B = (BYTE)(lineInFrame / 2); - } - } - cycleInLine++; - } - if( holded ) - { - ilp=114-9; - goto again; - } - if( generateIRQ0[0] ) - { - generateIRQ0[0] = false; - pokeyGenerateIRQ(1); - numsPerFrame++; - } - } - bre:; -} - - -void sapRenderBuffer( short int *buffer, int number_of_samples ) -{ -int i; - - if( fileLoadStatus==FALSE ) - return; - - i = 0; - number_of_samples *= sampleStep; - while( i=number_of_samples ) - break; - i++; - } - } -} - diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/sapGlobals.h --- a/src/sap/saplib/sapGlobals.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -#ifdef __MAIN_DECLARATIONS__ -#define axeEXTERN -#else -#define axeEXTERN extern -#endif - -#ifndef BYTE -#define BYTE unsigned char -#endif -#ifndef WORD -#define WORD unsigned short int -#endif -#ifndef DWORD -#define DWORD unsigned long int -#endif -#ifndef BOOL -#define BOOL int -#endif -#define TRUE 1 -#define FALSE 0 - -axeEXTERN bool isStereo; -axeEXTERN int sampleStep; - -extern void pokeyGenerateCheckIRQline(void); -extern void pokeyGenerateIRQ( BYTE irqMask ); - -axeEXTERN BYTE atariMem[ 0x10000 ]; -axeEXTERN WORD sndBuf[16384]; -axeEXTERN int sndBufPtr; - -axeEXTERN BYTE ANTIC_VCOUNT_D40B; - -axeEXTERN WORD cpuReg_PC; -axeEXTERN BYTE cpuFlag_N,cpuFlag_Z,cpuFlag_C,cpuFlag_D,cpuFlag_B,cpuFlag_I,cpuFlag_V,cpuReg_A,cpuReg_X,cpuReg_Y,cpuReg_S; -// cpuFlag_N is valid only in last bit-7 -// cpuFlag_Z is set if whole cpuFlag_Z is not zero -// cpuFlag_C is valid only in first bit-0 -// cpuFlag_D is valid only in first bit-0 -// cpuFlag_B is valid only in first bit-0 -// cpuFlag_I is valid only in first bit-0 -// cpuFlag_V is valid only in first bit-0 - - -extern void cpuInit( void ); -extern int cpuExecuteOneOpcode( void ); -extern BYTE cpuGetFlags( void ); -extern void cpuSetFlags( BYTE flags ); - -extern void pokeyInit( void ); -extern void pokeyReset( void ); -extern BYTE pokeyReadByte( short unsigned int address ); -extern void pokeyWriteByte0( short unsigned int address, BYTE value ); -extern void pokeyWriteByte1( short unsigned int address, BYTE value ); -extern void pokeyUpdateSound( int n ); -extern void pokeyUpdateSoundCounters( void ); - -inline BYTE freddieReadByte( WORD ad ) -{ - if( (ad&0xF800)==0xD000 ) - { - if( (ad&0xFF00)==0xD200 ) - { - return pokeyReadByte( ad ); - } - if( (ad&0xFF0F)==0xD40B ) - return ANTIC_VCOUNT_D40B; - } - return atariMem[ad]; -} -inline BYTE freddieCPUReadByte( WORD ad ) -{ - return atariMem[ad]; -} - -inline void freddieWriteByte( WORD ad, BYTE val ) -{ - if( (ad&0xFF00)==0xD200 ) - { - if( ((ad&0x10)==0) || (isStereo==false) ) pokeyWriteByte0( ad, val ); - else pokeyWriteByte1( ad, val ); - return; - } - atariMem[ad] = val; -} - -typedef int (*opcodeFunc)(bool &holded); - -extern opcodeFunc opcodes_0x00_0xFF[256]; diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/sapLib.h --- a/src/sap/saplib/sapLib.h Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - int numOfSongs; - int defSong; - char *commentBuffer; - int currentTimeIn50Sec; -} sapMUSICstrc; - -sapMUSICstrc *sapLoadMusicFile( char *fname ); -void sapPlaySong( int numOfSong ); -void sapRenderBuffer( short int *buffer, int number_of_samples ); - -#ifdef __cplusplus -} -#endif - diff -r 5783d6281431 -r ee81e087615c src/sap/saplib/sapPokey.cxx --- a/src/sap/saplib/sapPokey.cxx Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -#include -#include -#include -#include -#include - -#include "sapGlobals.h" - -extern void pokeyInit0( void ); -extern void pokeyInit1( void ); -extern void pokeyReset0( void ); -extern void pokeyReset1( void ); -extern void pokeyUpdateSound0( int n ); -extern void pokeyUpdateSound1( int n ); -extern void pokeyUpdateSoundCounters0( void ); -extern void pokeyUpdateSoundCounters1( void ); - -void pokeyInit( void ) -{ - pokeyInit0(); - pokeyInit1(); -} -void pokeyReset( void ) -{ - pokeyReset0(); - pokeyReset1(); -} - -void pokeyUpdateSound( int n ) -{ -int oldBufPtr = sndBufPtr; - pokeyUpdateSound0( n ); - if( isStereo ) - { - sndBufPtr = (oldBufPtr+1)&16383; - pokeyUpdateSound1( n ); - sndBufPtr = (sndBufPtr-1)&16383; - } -} - -void pokeyUpdateSoundCounters( void ) -{ - pokeyUpdateSoundCounters0(); - pokeyUpdateSoundCounters1(); -} - -BYTE pokeyReadByte( short unsigned int address) -{ -BYTE retVal; - - switch( address&0x0F ) - { - case 0x09: - return 0xFF; - case 0x0A: - retVal = (BYTE)((255*rand())/RAND_MAX); - return retVal; - case 0x0E: - return 0xFF; - case 0x0F: - return 0xFF; - } - return 0xFF; -} diff -r 5783d6281431 -r ee81e087615c src/sap/scripts/gen_symbols --- a/src/sap/scripts/gen_symbols Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -#! /bin/sh -/usr/bin/nm -B $1 | sed -n -e 's/^.*[ ]\([ABCDGISTW][ABCDGISTW]*\)[ ][ ]*\(\)\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2\3 \3/p' | sed 's/.* //' | sort | uniq > symbols -egrep -e "get_.plugin_info" "symbols" > syms -rm -f symbols \ No newline at end of file diff -r 5783d6281431 -r ee81e087615c src/sap/syms --- a/src/sap/syms Mon Nov 06 15:04:13 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -get_iplugin_info