freesci-develop
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freesci-develop] r1577 - in freesci/branches/glutton: . src/engine src/


From: freesci
Subject: [freesci-develop] r1577 - in freesci/branches/glutton: . src/engine src/include src/scicore src/sfx
Date: Wed, 01 Nov 2006 20:25:03 +0100

Author: skovmanden
Date: 2006-11-01 20:24:50 +0100 (Wed, 01 Nov 2006)
New Revision: 1577

Modified:
   freesci/branches/glutton/ChangeLog
   freesci/branches/glutton/src/engine/ksound.c
   freesci/branches/glutton/src/engine/scriptdebug.c
   freesci/branches/glutton/src/include/vm.h
   freesci/branches/glutton/src/scicore/script.c
   freesci/branches/glutton/src/sfx/iterator.c
Log:
More sound stuff. Remember the changelog this time.

Lars


Modified: freesci/branches/glutton/ChangeLog
===================================================================
--- freesci/branches/glutton/ChangeLog  2006-11-01 15:24:40 UTC (rev 1576)
+++ freesci/branches/glutton/ChangeLog  2006-11-01 19:24:50 UTC (rev 1577)
@@ -1,3 +1,8 @@
+2006-11-01  Lars Skovlund  <address@hidden>
+
+       * src/sfx/iterator.c,
+       src/engine/ksound.c: Beginnings of a fade mechanism.
+
 2006-07-17  Walter van Niftrik  <address@hidden>
 
        * src/gfx/drivers/sdl_driver.c: Removed double buffering code.

Modified: freesci/branches/glutton/src/engine/ksound.c
===================================================================
--- freesci/branches/glutton/src/engine/ksound.c        2006-11-01 15:24:40 UTC 
(rev 1576)
+++ freesci/branches/glutton/src/engine/ksound.c        2006-11-01 19:24:50 UTC 
(rev 1577)
@@ -81,19 +81,32 @@
 #define _K_SCI1_SOUND_UPDATE_VOL_PRI 20
 
 
+#define SCI1_SOUND_FLAG_MAY_PAUSE        1 /* Only here for completeness; The 
interpreter doesn't touch this bit */
+#define SCI1_SOUND_FLAG_SCRIPTED_PRI     2 /* but does touch this */
+
 #define FROBNICATE_HANDLE(reg) ((reg).segment << 16 | (reg).offset)
 #define DEFROBNICATE_HANDLE(handle) (make_reg((handle >> 16) & 0xffff, handle 
& 0xffff))
 #define SCRIPT_ASSERT_ZERO(fun) if (fun) script_debug_flag = script_error_flag 
= 1;
 
 
-static int
-get_builtin_priority(state_t *s, int song_nr)
+static void
+script_set_priority(state_t *s, reg_t obj, int priority)
 {
+       int song_nr = GET_SEL32V(obj, number);
        resource_t *song = scir_find_resource(s->resmgr, sci_sound, song_nr, 0);
+       int flags = GET_SEL32V(obj, flags);
 
-       if (song->data[0] == 0xf0)
-         return song->data[1]; else
-           return 50;
+       if (priority == -1)
+       {
+               if (song->data[0] == 0xf0)
+                       priority = song->data[1]; else
+                       SCIkdebug(SCIkWARNING, "Attempt to unset song priority 
when there is no built-in value!\n");
+
+               flags &= ~SCI1_SOUND_FLAG_SCRIPTED_PRI;
+       } else flags |= SCI1_SOUND_FLAG_SCRIPTED_PRI;
+
+       sfx_song_renice(&s->sound, FROBNICATE_HANDLE(obj), priority);
+       PUT_SEL32V(obj, flags, flags);
 }
 
 static song_iterator_t *
@@ -167,6 +180,9 @@
        reg_t obj = KP_ALT(1, NULL_REG);
        word command = UKPV(0);
        song_handle_t handle = FROBNICATE_HANDLE(obj);
+       int number = obj.segment ? 
+         GET_SEL32V(obj, number) : 
+         -1; /* We were not going to use it anyway */
 
        if (s->debug_mode & (1 << SCIkSOUNDCHK_NR)) {
                int i;
@@ -204,7 +220,7 @@
                if (obj.segment) {
                        sciprintf("Initializing song number %d\n", 
GET_SEL32V(obj, number));
                        SCRIPT_ASSERT_ZERO(sfx_add_song(&s->sound,
-                                                       build_iterator(s, 
GET_SEL32V(obj, number),
+                                                       build_iterator(s, 
number,
                                                                       
SCI_SONG_ITERATOR_TYPE_SCI0,
                                                                       handle),
                                                        0, handle));
@@ -284,8 +300,7 @@
                if (obj.segment) {
                        sfx_song_set_loops(&s->sound,
                                           handle, GET_SEL32V(obj, loop));
-                       sfx_song_renice(&s->sound,
-                                       handle, GET_SEL32V(obj, priority));
+                       script_set_priority(s, obj, GET_SEL32V(obj, pri));
                }
                break;
 
@@ -323,7 +338,10 @@
 {
        word command = UKPV(0);
        reg_t obj = KP_ALT(1, NULL_REG);
-       song_handle_t handle = FROBNICATE_HANDLE(obj);
+       song_handle_t handle = FROBNICATE_HANDLE(obj);  
+       int number = obj.segment ? 
+         GET_SEL32V(obj, number) : 
+         -1; /* We were not going to use it anyway */
 
        if ((s->debug_mode & (1 << SCIkSOUNDCHK_NR))
            && command != _K_SCI01_SOUND_UPDATE_CUES) {
@@ -411,19 +429,15 @@
        }
        case _K_SCI01_SOUND_INIT_HANDLE :
        {
-               int number = GET_SEL32V(obj, number);
-
                int looping = GET_SEL32V(obj, loop);
                int vol = GET_SEL32V(obj, vol);
                int pri = GET_SEL32V(obj, pri);
 
-               if (number == 886) break;
-
                if (obj.segment && (scir_test_resource(s->resmgr, sci_sound, 
number)))
                {
-                       sciprintf("Initializing song number %d\n", 
GET_SEL32V(obj, number));
+                       sciprintf("Initializing song number %d\n", number);
                        SCRIPT_ASSERT_ZERO(sfx_add_song(&s->sound,
-                                                       build_iterator(s, 
GET_SEL32V(obj, number),
+                                                       build_iterator(s, 
number,
                                                                       
SCI_SONG_ITERATOR_TYPE_SCI1,
                                                                       handle),
                                                        0, handle));    
@@ -456,8 +470,7 @@
 
                sfx_song_set_loops(&s->sound,
                                   handle, looping);
-               sfx_song_renice(&s->sound,
-                               handle, pri);
+               sfx_song_renice(&s->sound, handle, pri);
 
                SCIkdebug(SCIkSOUND, "[sound01-update-handle] -- CUE "PREG);
 
@@ -608,6 +621,9 @@
        word command = UKPV(0);
        reg_t obj = KP_ALT(1, NULL_REG);
        song_handle_t handle = FROBNICATE_HANDLE(obj);
+       int number = obj.segment ? 
+         GET_SEL32V(obj, number) : 
+         -1; /* We were not going to use it anyway */
 
        CHECK_THIS_KERNEL_FUNCTION;
 
@@ -706,8 +722,6 @@
        }
        case _K_SCI1_SOUND_INIT_HANDLE :
        {
-               int number = GET_SEL32V(obj, number);
-
                int looping = GET_SEL32V(obj, loop);
                int vol = GET_SEL32V(obj, vol);
                int pri = GET_SEL32V(obj, pri);
@@ -720,9 +734,9 @@
                }
 
                if (obj.segment && (scir_test_resource(s->resmgr, sci_sound, 
number))) {
-                       sciprintf("Initializing song number %d\n", 
GET_SEL32V(obj, number));
+                       sciprintf("Initializing song number %d\n", number);
                        SCRIPT_ASSERT_ZERO(sfx_add_song(&s->sound,
-                                                        build_iterator(s, 
GET_SEL32V(obj, number),
+                                                        build_iterator(s, 
number,
                                                                        
SCI_SONG_ITERATOR_TYPE_SCI1,
                                                                        handle),
                                                         0, handle));
@@ -799,6 +813,9 @@
        }
        case _K_SCI1_SOUND_SET_HANDLE_PRIORITY :
        {
+               int value = SKPV(2);
+
+               script_set_priority(s, obj, value);
                break;
        }
        case _K_SCI1_SOUND_SET_HANDLE_LOOP :

Modified: freesci/branches/glutton/src/engine/scriptdebug.c
===================================================================
--- freesci/branches/glutton/src/engine/scriptdebug.c   2006-11-01 15:24:40 UTC 
(rev 1576)
+++ freesci/branches/glutton/src/engine/scriptdebug.c   2006-11-01 19:24:50 UTC 
(rev 1577)
@@ -2720,6 +2720,7 @@
 }
 
 #define SFX_DEBUG_MODES 2
+#define FROBNICATE_HANDLE(reg) ((reg).segment << 16 | (reg).offset)
 
 static int
 c_sfx_debuglog(state_t *s)
@@ -2734,6 +2735,21 @@
                                      &(s->sound.debug));
 }
 
+static int
+c_sfx_remove(state_t *s)
+{
+       reg_t id = cmd_params[0].reg;
+       int handle = FROBNICATE_HANDLE(id);
+
+       if (id.segment) {
+               sfx_song_set_status(&s->sound,
+                                   handle, SOUND_STATUS_STOPPED);
+               sfx_remove_song(&s->sound, handle);
+               }
+
+       return 0;
+}
+
 #define GFX_DEBUG_MODES 4
 
 int
@@ -3436,6 +3452,8 @@
 
                        _debug_commands_not_hooked = 0;
 
+                       con_hook_command(c_sfx_remove, "sfx_remove", "!a", 
+                                        "Kills a playing sound.");
                        con_hook_command(c_debuginfo, "registers", "", 
"Displays all current register values");
                        con_hook_command(c_vmvars, "vmvars", "!sia*", "Displays 
or changes variables in the VM\n\nFirst parameter is either g(lobal), l(ocal), 
t(emp) or p(aram).\nSecond parameter is the var number\nThird parameter (if 
specified) is the value to set the variable to");
                        con_hook_command(c_sci_version, "sci_version", "", 
"Prints the SCI version currently being emulated");
@@ -3707,6 +3725,7 @@
                                     "  0x0002: Break on warnings\n  \0x0004: 
Print VM warnings\n");
                        con_hook_int(&_weak_validations, "weak_validations", 
"Set != 0 to turn some validation errors\n"
                                     "  into warnings\n");
+
                        con_hook_int(&script_gc_interval, "gc-interval", 
"Number of kernel calls in between gcs");
 
                        con_hook_page("codebugging",

Modified: freesci/branches/glutton/src/include/vm.h
===================================================================
--- freesci/branches/glutton/src/include/vm.h   2006-11-01 15:24:40 UTC (rev 
1576)
+++ freesci/branches/glutton/src/include/vm.h   2006-11-01 19:24:50 UTC (rev 
1577)
@@ -334,6 +334,7 @@
        selector_t palette;
        selector_t cantBeHere;
        selector_t nodePtr;
+       selector_t flags;
 
        selector_t points; /* Used by AvoidPath() */
 } selector_map_t; /* Contains selector IDs for a few selected selectors */

Modified: freesci/branches/glutton/src/scicore/script.c
===================================================================
--- freesci/branches/glutton/src/scicore/script.c       2006-11-01 15:24:40 UTC 
(rev 1576)
+++ freesci/branches/glutton/src/scicore/script.c       2006-11-01 19:24:50 UTC 
(rev 1577)
@@ -207,6 +207,7 @@
   FIND_SELECTOR(moveSpeed, "moveSpeed");
   FIND_SELECTOR(cantBeHere, "cantBeHere");
   FIND_SELECTOR(nodePtr, "nodePtr");
+  FIND_SELECTOR(flags, "flags");
   FIND_SELECTOR(points, "points");
 }
 

Modified: freesci/branches/glutton/src/sfx/iterator.c
===================================================================
--- freesci/branches/glutton/src/sfx/iterator.c 2006-11-01 15:24:40 UTC (rev 
1576)
+++ freesci/branches/glutton/src/sfx/iterator.c 2006-11-01 19:24:50 UTC (rev 
1577)
@@ -67,6 +67,7 @@
 static void
 _common_init(base_song_iterator_t *self)
 {
+       self->fade.action = FADE_ACTION_NONE;
        self->resetflag = 0;
        self->loops = 0;
 }
@@ -259,6 +260,8 @@
                        break;
 
                case SCI_MIDI_SET_VELOCITY:
+                       BREAKPOINT();
+                       printf("%d is setting velocity to %d\n", self->ID, 
buf[2]);
                        break;
 
                case SCI_MIDI_HOLD:
@@ -548,6 +551,16 @@
                                self->channel.playmask |= (1 << 
MIDI_RHYTHM_CHANNEL);
                        break;
 
+               case _SIMSG_BASEMSG_SET_FADE:
+               {
+                       fade_params_t *fp = (struct fade_params_t *) 
msg.args[0];
+                       self->fade.action = fp->action;
+                       self->fade.final_volume = fp->final_volume;
+                       self->fade.ticks_per_step = fp->ticks_per_step;
+                       self->fade.step_size = fp->step_size;
+                       break;
+               }
+
                default:
                        return NULL;
                }
@@ -688,10 +701,10 @@
        {
                int priority = SONGDATA(1);
 
-               // FIXME: Do something with this! 
-               // sciprintf("Song has priority %d\n", priority);
+               // Code to take care of this is in src/engine/ksound.c
                offset += 8;
        }
+
        while (SONGDATA(0) != 0xff
               && SONGDATA(0) != self->device_id) {
                offset++;
@@ -1133,6 +1146,16 @@
                        /* Ignore */
                        break;
 
+               case _SIMSG_BASEMSG_SET_FADE:
+               {
+                       fade_params_t *fp = (struct fade_params_t *) 
msg.args[0];
+                       self->fade.action = fp->action;
+                       self->fade.final_volume = fp->final_volume;
+                       self->fade.ticks_per_step = fp->ticks_per_step;
+                       self->fade.step_size = fp->step_size;
+                       break;
+               }
+
                default:
                        fprintf(stderr, SIPFX "Unsupported command %d to"
                                " SCI1 iterator", msg.type);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]