ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/Client.xs
(Generate patch)

Comparing deliantra/Deliantra-Client/Client.xs (file contents):
Revision 1.212 by root, Sun Jul 29 03:58:26 2007 UTC vs.
Revision 1.224 by root, Sat Aug 11 11:21:46 2007 UTC

17#include "perl.h" 17#include "perl.h"
18#include "XSUB.h" 18#include "XSUB.h"
19 19
20#ifdef _WIN32 20#ifdef _WIN32
21# undef pipe 21# undef pipe
22// microsoft vs. C
23# define sqrtf(x) sqrt(x)
24# define roundf(x) (int)(x)
25# define atan2f(x,y) atan2(x,y)
26# define M_PI 3.14159265f
22#endif 27#endif
23 28
24#include <assert.h> 29#include <assert.h>
25#include <math.h> 30#include <math.h>
26#include <string.h> 31#include <string.h>
109 av_push (texture_av, (SV *)(size_t)name); 114 av_push (texture_av, (SV *)(size_t)name);
110 glDeleteTextures (1, &name); 115 glDeleteTextures (1, &name);
111} 116}
112 117
113#include "texcache.c" 118#include "texcache.c"
119#include "rendercache.c"
114 120
115#include "pango-font.c" 121#include "pango-font.c"
116#include "pango-fontmap.c" 122#include "pango-fontmap.c"
117#include "pango-render.c" 123#include "pango-render.c"
118 124
804 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1)))); 810 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1))));
805 } 811 }
806} 812}
807 813
808int 814int
809Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 815Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 1024)
810 POSTCALL: 816 POSTCALL:
811 Mix_HookMusicFinished (music_finished); 817 Mix_HookMusicFinished (music_finished);
812 Mix_ChannelFinished (channel_finished); 818 Mix_ChannelFinished (channel_finished);
813 819
814void 820void
815Mix_CloseAudio () 821Mix_CloseAudio ()
816 822
817int 823int
818Mix_AllocateChannels (int numchans = -1) 824Mix_AllocateChannels (int numchans = -1)
825
826const char *
827Mix_GetError ()
819 828
820void 829void
821lowdelay (int fd, int val = 1) 830lowdelay (int fd, int val = 1)
822 CODE: 831 CODE:
823 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val)); 832 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val));
1347 HV *hv = (HV *)SvRV (self); 1356 HV *hv = (HV *)SvRV (self);
1348 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 1357 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
1349 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 1358 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
1350 int name = SvIV (*hv_fetch (hv, "name", 4, 1)); 1359 int name = SvIV (*hv_fetch (hv, "name", 4, 1));
1351 1360
1361 if (name <= 0)
1362 XSRETURN_EMPTY;
1363
1352 if (items < 5) 1364 if (items < 5)
1353 { 1365 {
1354 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 1366 w = SvNV (*hv_fetch (hv, "w", 1, 1));
1355 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 1367 h = SvNV (*hv_fetch (hv, "h", 1, 1));
1356 } 1368 }
1544 self->rows += MAP_EXTEND_Y; 1556 self->rows += MAP_EXTEND_Y;
1545 self->y += MAP_EXTEND_Y; 1557 self->y += MAP_EXTEND_Y;
1546 } 1558 }
1547} 1559}
1548 1560
1549void 1561SV *
1550map1a_update (CFPlus::Map self, SV *data_, int extmap) 1562map1a_update (CFPlus::Map self, SV *data_, int extmap)
1551 CODE: 1563 CODE:
1552{ 1564{
1553 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 1565 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1554 uint8_t *data_end = (uint8_t *)SvEND (data_); 1566 uint8_t *data_end = (uint8_t *)SvEND (data_);
1555 mapcell *cell; 1567 mapcell *cell;
1556 int x, y, flags; 1568 int x, y, z, flags;
1569 AV *missing = newAV ();
1570 RETVAL = newRV_noinc ((SV *)missing);
1557 1571
1558 while (data < data_end - 1) 1572 while (data < data_end - 1)
1559 { 1573 {
1560 flags = (data [0] << 8) + data [1]; data += 2; 1574 flags = (data [0] << 8) + data [1]; data += 2;
1561 1575
1612 } 1626 }
1613 else 1627 else
1614 cell->darkness = *data++ + 1; 1628 cell->darkness = *data++ + 1;
1615 } 1629 }
1616 1630
1631 for (z = 0; z <= 2; ++z)
1617 if (flags & 4) 1632 if (flags & (4 >> z))
1618 { 1633 {
1619 faceid face = (data [0] << 8) + data [1]; data += 2; 1634 faceid face = (data [0] << 8) + data [1]; data += 2;
1620 need_facenum (self, face); 1635 need_facenum (self, face);
1621 cell->tile [0] = self->face2tile [face]; 1636 cell->tile [z] = self->face2tile [face];
1637
1638 if (cell->tile [z])
1639 {
1640 maptex *tex = self->tex + cell->tile [z];
1641 if (!tex->name)
1642 av_push (missing, newSViv (cell->tile [z]));
1643
1644 if (tex->smoothtile)
1645 {
1646 maptex *smooth = self->tex + tex->smoothtile;
1647 if (!smooth->name)
1648 av_push (missing, newSViv (tex->smoothtile));
1649 }
1650 }
1622 } 1651 }
1623
1624 if (flags & 2)
1625 {
1626 faceid face = (data [0] << 8) + data [1]; data += 2;
1627 need_facenum (self, face);
1628 cell->tile [1] = self->face2tile [face];
1629 }
1630
1631 if (flags & 1)
1632 {
1633 faceid face = (data [0] << 8) + data [1]; data += 2;
1634 need_facenum (self, face);
1635 cell->tile [2] = self->face2tile [face];
1636 }
1637 } 1652 }
1638 else 1653 else
1639 cell->darkness = 0; 1654 cell->darkness = 0;
1640 } 1655 }
1641} 1656}
1657 OUTPUT:
1658 RETVAL
1642 1659
1643SV * 1660SV *
1644mapmap (CFPlus::Map self, int x0, int y0, int w, int h) 1661mapmap (CFPlus::Map self, int x0, int y0, int w, int h)
1645 CODE: 1662 CODE:
1646{ 1663{
1697 1714
1698void 1715void
1699draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T) 1716draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T)
1700 CODE: 1717 CODE:
1701{ 1718{
1719 int x, y, z;
1720
1702 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1721 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1703 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 1722 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1704 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k) 1723 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k)
1705 smooth_key skey; 1724 smooth_key skey;
1706 int x, y, z; 1725
1707 int last_name; 1726 rc_t *rc = rc_alloc ();
1727 rc_key_t key;
1728 rc_array_t *arr;
1708 1729
1709 // thats current max. sorry. 1730 // thats current max. sorry.
1710 if (sw > 255) sw = 255; 1731 if (sw > 255) sw = 255;
1711 if (sh > 255) sh = 255; 1732 if (sh > 255) sh = 255;
1712 1733
1713 // clear key, in case of extra padding 1734 // clear key, in case of extra padding
1714 memset (&skey, 0, sizeof (skey)); 1735 memset (&skey, 0, sizeof (skey));
1715 1736
1716 glColor4ub (255, 255, 255, 255); 1737 memset (&key, 0, sizeof (key));
1717 1738 key.r = 255;
1718 glEnable (GL_BLEND); 1739 key.g = 255;
1719 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 1740 key.b = 255;
1720 glEnable (GL_TEXTURE_2D); 1741 key.a = 255;
1721 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1742 key.mode = GL_QUADS;
1722 1743 key.format = GL_T2F_V3F;
1723 glBegin (GL_QUADS); 1744 key.texname = -1;
1724
1725 last_name = 0;
1726 1745
1727 mx += self->x; 1746 mx += self->x;
1728 my += self->y; 1747 my += self->y;
1729 1748
1730 // first pass: determine smooth_max 1749 // first pass: determine smooth_max
1746 MAX (self->tex [cell->tile [0]].smoothlevel, 1765 MAX (self->tex [cell->tile [0]].smoothlevel,
1747 MAX (self->tex [cell->tile [1]].smoothlevel, 1766 MAX (self->tex [cell->tile [1]].smoothlevel,
1748 self->tex [cell->tile [2]].smoothlevel)); 1767 self->tex [cell->tile [2]].smoothlevel));
1749 } 1768 }
1750 } 1769 }
1770
1771 glEnable (GL_BLEND);
1772 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1773 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1751 1774
1752 for (z = 0; z <= 2; z++) 1775 for (z = 0; z <= 2; z++)
1753 { 1776 {
1754 memset (smooth_level, 0, sizeof (smooth_level)); 1777 memset (smooth_level, 0, sizeof (smooth_level));
1755 1778
1765 tileid tile = cell->tile [z]; 1788 tileid tile = cell->tile [z];
1766 1789
1767 if (tile) 1790 if (tile)
1768 { 1791 {
1769 maptex tex = self->tex [tile]; 1792 maptex tex = self->tex [tile];
1770 int px = (x + 1) * T - tex.w; 1793 int px, py;
1771 int py = (y + 1) * T - tex.h;
1772 1794
1773 // suppressing texture state switches here 1795 // suppressing texture state switches here
1774 // is only moderately effective, but worth the extra effort 1796 // is only moderately effective, but worth the extra effort
1775 if (last_name != tex.name) 1797 if (key.texname != tex.name)
1776 { 1798 {
1777 if (!tex.name) 1799 if (!tex.name)
1778 tex = self->tex [2]; /* missing, replace by noface */ 1800 tex = self->tex [2]; /* missing, replace by noface */
1779 1801
1780 glEnd (); 1802 key.texname = tex.name;
1781 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1803 arr = rc_array (rc, &key);
1782 glBegin (GL_QUADS);
1783 } 1804 }
1784 1805
1785 glTexCoord2f (0 , 0 ); glVertex2f (px , py ); 1806 px = (x + 1) * T - tex.w;
1807 py = (y + 1) * T - tex.h;
1808
1809 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1786 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h); 1810 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
1787 glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h); 1811 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
1788 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); 1812 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
1789 1813
1790 if (cell->flags && z == 2) 1814 if (cell->flags && z == 2)
1791 { 1815 {
1816 // overlays such as the speech bubble, probably more to come
1792 if (cell->flags & 1) 1817 if (cell->flags & 1)
1793 { 1818 {
1794 maptex tex = self->tex [1]; 1819 maptex tex = self->tex [1];
1795 int px = x * T + T * 2 / 32; 1820 int px = x * T + T * 2 / 32;
1796 int py = y * T - T * 6 / 32; 1821 int py = y * T - T * 6 / 32;
1797 1822
1823 if (tex.name)
1798 glEnd (); 1824 {
1799 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1825 if (key.texname != tex.name)
1826 {
1827 key.texname = tex.name;
1828 arr = rc_array (rc, &key);
1829 }
1830
1831 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1832 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
1833 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
1834 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
1800 glBegin (GL_QUADS); 1835 }
1801
1802 glTexCoord2f (0 , 0 ); glVertex2f (px , py );
1803 glTexCoord2f (0 , tex.t); glVertex2f (px , py + T);
1804 glTexCoord2f (tex.s, tex.t); glVertex2f (px + T, py + T);
1805 glTexCoord2f (tex.s, 0 ); glVertex2f (px + T, py );
1806 } 1836 }
1807 } 1837 }
1808 1838
1809 // update smooth hash 1839 // update smooth hash
1810 if (tex.smoothtile) 1840 if (tex.smoothtile)
1845 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800); 1875 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800);
1846 } 1876 }
1847 } 1877 }
1848 } 1878 }
1849 } 1879 }
1880
1881 rc_draw (rc);
1882 rc_clear (rc);
1850 1883
1851 // go through all smoothlevels, lowest to highest, then draw. 1884 // go through all smoothlevels, lowest to highest, then draw.
1852 // this is basically counting sort 1885 // this is basically counting sort
1853 { 1886 {
1854 int w, b; 1887 int w, b;
1879 int border = bits & 15; 1912 int border = bits & 15;
1880 int corner = (bits >> 8) & ~(bits >> 4) & 15; 1913 int corner = (bits >> 8) & ~(bits >> 4) & 15;
1881 float dx = tex.s * .0625f; // 16 images/row 1914 float dx = tex.s * .0625f; // 16 images/row
1882 float dy = tex.t * .5f ; // 2 images/column 1915 float dy = tex.t * .5f ; // 2 images/column
1883 1916
1884 // this time naively avoiding texture state changes
1885 // save gobs of state changes.
1886 if (last_name != tex.name) 1917 if (tex.name)
1887 { 1918 {
1919 // this time avoiding texture state changes
1920 // save gobs of state changes.
1888 if (!tex.name) 1921 if (key.texname != tex.name)
1889 continue; // smoothing not yet available
1890
1891 glEnd (); 1922 {
1892 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1923 key.texname = tex.name;
1893 glBegin (GL_QUADS); 1924 arr = rc_array (rc, &key);
1894 } 1925 }
1895 1926
1896 if (border) 1927 if (border)
1897 { 1928 {
1898 float ox = border * dx; 1929 float ox = border * dx;
1899 1930
1900 glTexCoord2f (ox , 0.f ); glVertex2f (px , py ); 1931 rc_t2f_v3f (arr, ox , 0.f , px , py , 0);
1901 glTexCoord2f (ox , dy ); glVertex2f (px , py + T); 1932 rc_t2f_v3f (arr, ox , dy , px , py + T, 0);
1902 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py + T); 1933 rc_t2f_v3f (arr, ox + dx, dy , px + T, py + T, 0);
1903 glTexCoord2f (ox + dx, 0.f ); glVertex2f (px + T, py ); 1934 rc_t2f_v3f (arr, ox + dx, 0.f , px + T, py , 0);
1904 } 1935 }
1905 1936
1906 if (corner) 1937 if (corner)
1907 { 1938 {
1908 float ox = corner * dx; 1939 float ox = corner * dx;
1909 1940
1910 glTexCoord2f (ox , dy ); glVertex2f (px , py ); 1941 rc_t2f_v3f (arr, ox , dy , px , py , 0);
1911 glTexCoord2f (ox , dy * 2.f); glVertex2f (px , py + T); 1942 rc_t2f_v3f (arr, ox , dy * 2.f, px , py + T, 0);
1912 glTexCoord2f (ox + dx, dy * 2.f); glVertex2f (px + T, py + T); 1943 rc_t2f_v3f (arr, ox + dx, dy * 2.f, px + T, py + T, 0);
1913 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py ); 1944 rc_t2f_v3f (arr, ox + dx, dy , px + T, py , 0);
1945 }
1914 } 1946 }
1915 } 1947 }
1916 } 1948 }
1917 } 1949 }
1918 } 1950 }
1919 } 1951 }
1920 1952
1921 hv_clear (smooth); 1953 hv_clear (smooth);
1954 rc_draw (rc);
1955 rc_clear (rc);
1922 } 1956 }
1923 1957
1924 glEnd ();
1925
1926 glDisable (GL_TEXTURE_2D);
1927 glDisable (GL_BLEND); 1958 glDisable (GL_BLEND);
1959 rc_free (rc);
1928 1960
1929 // top layer: overlays such as the health bar 1961 // top layer: overlays such as the health bar
1930 for (y = 0; y < sh; y++) 1962 for (y = 0; y < sh; y++)
1931 if (0 <= y + my && y + my < self->rows) 1963 if (0 <= y + my && y + my < self->rows)
1932 { 1964 {
2257 CODE: 2289 CODE:
2258 RETVAL = SDL_RWFromFile (path, mode); 2290 RETVAL = SDL_RWFromFile (path, mode);
2259 OUTPUT: 2291 OUTPUT:
2260 RETVAL 2292 RETVAL
2261 2293
2294# fails on win32:
2295# CFPlus.xs(2268) : error C2059: syntax error : '('
2262void 2296#void
2263close (CFPlus::RW self) 2297#close (CFPlus::RW self)
2264 CODE: 2298# CODE:
2265 SDL_RWclose (self); 2299# (self->(close)) (self);
2266 2300
2267MODULE = CFPlus PACKAGE = CFPlus::Channel 2301MODULE = CFPlus PACKAGE = CFPlus::Channel
2268 2302
2269PROTOTYPES: DISABLE 2303PROTOTYPES: DISABLE
2304
2305CFPlus::Channel
2306find ()
2307 CODE:
2308{
2309 RETVAL = Mix_GroupAvailable (-1);
2310
2311 if (RETVAL < 0)
2312 {
2313 RETVAL = Mix_GroupOldest (-1);
2314
2315 if (RETVAL < 0)
2316 XSRETURN_UNDEF;
2317
2318 Mix_HaltChannel (RETVAL);
2319 }
2320
2321 Mix_UnregisterAllEffects (RETVAL);
2322 Mix_Volume (RETVAL, 128);
2323}
2324 OUTPUT:
2325 RETVAL
2326
2327void
2328halt (CFPlus::Channel self)
2329 CODE:
2330 Mix_HaltChannel (self);
2331
2332void
2333expire (CFPlus::Channel self, int ticks = -1)
2334 CODE:
2335 Mix_ExpireChannel (self, ticks);
2336
2337void
2338fade_out (CFPlus::Channel self, int ticks = -1)
2339 CODE:
2340 Mix_FadeOutChannel (self, ticks);
2270 2341
2271int 2342int
2272volume (CFPlus::Channel self, int volume) 2343volume (CFPlus::Channel self, int volume)
2273 CODE: 2344 CODE:
2274 RETVAL = Mix_Volume (self, volume); 2345 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2275 OUTPUT: 2346 OUTPUT:
2276 RETVAL 2347 RETVAL
2277 2348
2278int 2349void
2279unregister_all_effects (CFPlus::Channel self) 2350unregister_all_effects (CFPlus::Channel self)
2280 CODE: 2351 CODE:
2281 RETVAL = Mix_UnregisterAllEffects (self); 2352 Mix_UnregisterAllEffects (self);
2282 OUTPUT:
2283 RETVAL
2284 2353
2285int 2354void
2286set_panning (CFPlus::Channel self, int left, int right) 2355set_panning (CFPlus::Channel self, int left, int right)
2287 CODE: 2356 CODE:
2357 left = CLAMP (left , 0, 255);
2358 right = CLAMP (right, 0, 255);
2288 RETVAL = Mix_SetPanning (self, left, right); 2359 Mix_SetPanning (self, left, right);
2289 OUTPUT:
2290 RETVAL
2291 2360
2292int 2361void
2293set_distance (CFPlus::Channel self, int distance) 2362set_distance (CFPlus::Channel self, int distance)
2294 CODE: 2363 CODE:
2295 RETVAL = Mix_SetDistance (self, distance); 2364 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2296 OUTPUT:
2297 RETVAL
2298 2365
2299int 2366void
2300set_position (CFPlus::Channel self, int angle, int distance) 2367set_position (CFPlus::Channel self, int angle, int distance)
2301 CODE: 2368 CODE:
2369
2370void
2371set_position_r (CFPlus::Channel self, int dx, int dy, int maxdistance)
2372 CODE:
2373{
2374 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2375 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI);
2302 RETVAL = Mix_SetPosition (self, angle, distance); 2376 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2303 OUTPUT: 2377}
2304 RETVAL
2305 2378
2306int 2379void
2307set_reverse_stereo (CFPlus::Channel self, int flip) 2380set_reverse_stereo (CFPlus::Channel self, int flip)
2308 CODE: 2381 CODE:
2309 RETVAL = Mix_SetReverseStereo (self, flip); 2382 Mix_SetReverseStereo (self, flip);
2310 OUTPUT:
2311 RETVAL
2312 2383
2313MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2384MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2314 2385
2315PROTOTYPES: DISABLE 2386PROTOTYPES: DISABLE
2316 2387
2327 Mix_FreeChunk (self); 2398 Mix_FreeChunk (self);
2328 2399
2329int 2400int
2330volume (CFPlus::MixChunk self, int volume = -1) 2401volume (CFPlus::MixChunk self, int volume = -1)
2331 CODE: 2402 CODE:
2403 if (items > 1)
2404 volume = CLAMP (volume, 0, 128);
2332 RETVAL = Mix_VolumeChunk (self, volume); 2405 RETVAL = Mix_VolumeChunk (self, volume);
2333 OUTPUT: 2406 OUTPUT:
2334 RETVAL 2407 RETVAL
2335 2408
2336CFPlus::Channel 2409CFPlus::Channel
2337play (CFPlus::MixChunk self, int channel = -1, int loops = 0, int ticks = -1) 2410play (CFPlus::MixChunk self, CFPlus::Channel channel = -1, int loops = 0, int ticks = -1)
2338 CODE: 2411 CODE:
2412{
2339 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2413 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2414
2415 if (RETVAL < 0)
2416 XSRETURN_UNDEF;
2417
2418 if (channel < 0)
2419 {
2340 Mix_UnregisterAllEffects (RETVAL); 2420 Mix_UnregisterAllEffects (RETVAL);
2421 Mix_Volume (RETVAL, 128);
2422 }
2423}
2341 OUTPUT: 2424 OUTPUT:
2342 RETVAL 2425 RETVAL
2343 2426
2344MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2427MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2345 2428
2346int 2429int
2347volume (int volume = -1) 2430volume (int volume = -1)
2348 PROTOTYPE: ;$ 2431 PROTOTYPE: ;$
2349 CODE: 2432 CODE:
2433 if (items > 0)
2434 volume = CLAMP (volume, 0, 128);
2350 RETVAL = Mix_VolumeMusic (volume); 2435 RETVAL = Mix_VolumeMusic (volume);
2351 OUTPUT: 2436 OUTPUT:
2352 RETVAL 2437 RETVAL
2353 2438
2354int 2439void
2355fade_out (int ms) 2440fade_out (int ms)
2356 CODE: 2441 CODE:
2357 RETVAL = Mix_FadeOutMusic (ms); 2442 Mix_FadeOutMusic (ms);
2358 OUTPUT:
2359 RETVAL
2360 2443
2361void 2444void
2362halt () 2445halt ()
2363 CODE: 2446 CODE:
2364 Mix_HaltMusic (); 2447 Mix_HaltMusic ();
2380 CODE: 2463 CODE:
2381 RETVAL = Mix_PlayMusic (self, loops); 2464 RETVAL = Mix_PlayMusic (self, loops);
2382 OUTPUT: 2465 OUTPUT:
2383 RETVAL 2466 RETVAL
2384 2467
2385int 2468void
2386fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2469fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2387 CODE: 2470 CODE:
2388 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position); 2471 Mix_FadeInMusicPos (self, loops, ms, position);
2389 OUTPUT:
2390 RETVAL
2391 2472
2392MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2473MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2393 2474
2394PROTOTYPES: ENABLE 2475PROTOTYPES: ENABLE
2395 2476

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines