gosu 0.15.1 → 1.1.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/COPYING +1 -1
  4. data/dependencies/SDL/include/SDL.h +138 -0
  5. data/dependencies/SDL/include/SDL_assert.h +293 -0
  6. data/dependencies/SDL/include/SDL_atomic.h +295 -0
  7. data/dependencies/SDL/include/SDL_audio.h +859 -0
  8. data/dependencies/SDL/include/SDL_bits.h +121 -0
  9. data/dependencies/SDL/include/SDL_blendmode.h +123 -0
  10. data/dependencies/SDL/include/SDL_clipboard.h +71 -0
  11. data/dependencies/SDL/include/SDL_config.h +55 -0
  12. data/dependencies/SDL/include/SDL_config_android.h +182 -0
  13. data/dependencies/SDL/include/SDL_config_iphoneos.h +207 -0
  14. data/dependencies/SDL/include/SDL_config_macosx.h +266 -0
  15. data/dependencies/SDL/include/SDL_config_minimal.h +85 -0
  16. data/dependencies/SDL/include/SDL_config_os2.h +188 -0
  17. data/dependencies/SDL/include/SDL_config_pandora.h +135 -0
  18. data/dependencies/SDL/include/SDL_config_psp.h +165 -0
  19. data/dependencies/SDL/include/SDL_config_windows.h +288 -0
  20. data/dependencies/SDL/include/SDL_config_winrt.h +243 -0
  21. data/dependencies/SDL/include/SDL_config_wiz.h +149 -0
  22. data/dependencies/SDL/include/SDL_copying.h +20 -0
  23. data/dependencies/SDL/include/SDL_cpuinfo.h +299 -0
  24. data/dependencies/SDL/include/SDL_egl.h +1676 -0
  25. data/dependencies/SDL/include/SDL_endian.h +263 -0
  26. data/dependencies/SDL/include/SDL_error.h +112 -0
  27. data/dependencies/SDL/include/SDL_events.h +827 -0
  28. data/dependencies/SDL/include/SDL_filesystem.h +136 -0
  29. data/dependencies/SDL/include/SDL_gamecontroller.h +541 -0
  30. data/dependencies/SDL/include/SDL_gesture.h +87 -0
  31. data/dependencies/SDL/include/SDL_haptic.h +1247 -0
  32. data/dependencies/SDL/include/SDL_hints.h +1578 -0
  33. data/dependencies/SDL/include/SDL_joystick.h +499 -0
  34. data/dependencies/SDL/include/SDL_keyboard.h +217 -0
  35. data/dependencies/SDL/include/SDL_keycode.h +351 -0
  36. data/dependencies/SDL/include/SDL_loadso.h +81 -0
  37. data/dependencies/SDL/include/SDL_locale.h +101 -0
  38. data/dependencies/SDL/include/SDL_log.h +211 -0
  39. data/dependencies/SDL/include/SDL_main.h +180 -0
  40. data/dependencies/SDL/include/SDL_messagebox.h +146 -0
  41. data/dependencies/SDL/include/SDL_metal.h +117 -0
  42. data/dependencies/SDL/include/SDL_misc.h +75 -0
  43. data/dependencies/SDL/include/SDL_mouse.h +302 -0
  44. data/dependencies/SDL/include/SDL_mutex.h +251 -0
  45. data/dependencies/SDL/include/SDL_name.h +33 -0
  46. data/dependencies/SDL/include/SDL_opengl.h +2183 -0
  47. data/dependencies/SDL/include/SDL_opengl_glext.h +11180 -0
  48. data/dependencies/SDL/include/SDL_opengles.h +39 -0
  49. data/dependencies/SDL/include/SDL_opengles2.h +52 -0
  50. data/dependencies/SDL/include/SDL_opengles2_gl2.h +621 -0
  51. data/dependencies/SDL/include/SDL_opengles2_gl2ext.h +2050 -0
  52. data/dependencies/SDL/include/SDL_opengles2_gl2platform.h +30 -0
  53. data/dependencies/SDL/include/SDL_opengles2_khrplatform.h +282 -0
  54. data/dependencies/SDL/include/SDL_pixels.h +479 -0
  55. data/dependencies/SDL/include/SDL_platform.h +198 -0
  56. data/dependencies/SDL/include/SDL_power.h +75 -0
  57. data/dependencies/SDL/include/SDL_quit.h +58 -0
  58. data/dependencies/SDL/include/SDL_rect.h +174 -0
  59. data/dependencies/SDL/include/SDL_render.h +1158 -0
  60. data/dependencies/SDL/include/SDL_revision.h +2 -0
  61. data/dependencies/SDL/include/SDL_rwops.h +283 -0
  62. data/dependencies/SDL/include/SDL_scancode.h +413 -0
  63. data/dependencies/SDL/include/SDL_sensor.h +267 -0
  64. data/dependencies/SDL/include/SDL_shape.h +144 -0
  65. data/dependencies/SDL/include/SDL_stdinc.h +647 -0
  66. data/dependencies/SDL/include/SDL_surface.h +563 -0
  67. data/dependencies/SDL/include/SDL_system.h +325 -0
  68. data/dependencies/SDL/include/SDL_syswm.h +354 -0
  69. data/dependencies/SDL/include/SDL_test.h +69 -0
  70. data/dependencies/SDL/include/SDL_test_assert.h +105 -0
  71. data/dependencies/SDL/include/SDL_test_common.h +218 -0
  72. data/dependencies/SDL/include/SDL_test_compare.h +69 -0
  73. data/dependencies/SDL/include/SDL_test_crc32.h +124 -0
  74. data/dependencies/SDL/include/SDL_test_font.h +81 -0
  75. data/dependencies/SDL/include/SDL_test_fuzzer.h +384 -0
  76. data/dependencies/SDL/include/SDL_test_harness.h +134 -0
  77. data/dependencies/SDL/include/SDL_test_images.h +78 -0
  78. data/dependencies/SDL/include/SDL_test_log.h +67 -0
  79. data/dependencies/SDL/include/SDL_test_md5.h +129 -0
  80. data/dependencies/SDL/include/SDL_test_memory.h +63 -0
  81. data/dependencies/SDL/include/SDL_test_random.h +115 -0
  82. data/dependencies/SDL/include/SDL_thread.h +366 -0
  83. data/dependencies/SDL/include/SDL_timer.h +115 -0
  84. data/dependencies/SDL/include/SDL_touch.h +102 -0
  85. data/dependencies/SDL/include/SDL_types.h +29 -0
  86. data/dependencies/SDL/include/SDL_version.h +162 -0
  87. data/dependencies/SDL/include/SDL_video.h +1282 -0
  88. data/dependencies/SDL/include/SDL_vulkan.h +276 -0
  89. data/dependencies/SDL/include/begin_code.h +166 -0
  90. data/dependencies/SDL/include/close_code.h +40 -0
  91. data/dependencies/SDL/lib/x64/libSDL2.dll.a +0 -0
  92. data/dependencies/SDL/lib/x86/libSDL2.dll.a +0 -0
  93. data/dependencies/SDL_sound/SDL_sound.c +795 -0
  94. data/dependencies/SDL_sound/SDL_sound.h +725 -0
  95. data/dependencies/SDL_sound/SDL_sound_aiff.c +537 -0
  96. data/dependencies/SDL_sound/SDL_sound_au.c +352 -0
  97. data/dependencies/SDL_sound/SDL_sound_coreaudio.c +747 -0
  98. data/dependencies/SDL_sound/SDL_sound_flac.c +182 -0
  99. data/dependencies/SDL_sound/SDL_sound_internal.h +304 -0
  100. data/dependencies/SDL_sound/SDL_sound_modplug.c +228 -0
  101. data/dependencies/SDL_sound/SDL_sound_mp3.c +184 -0
  102. data/dependencies/SDL_sound/SDL_sound_raw.c +164 -0
  103. data/dependencies/SDL_sound/SDL_sound_shn.c +1309 -0
  104. data/dependencies/SDL_sound/SDL_sound_voc.c +550 -0
  105. data/dependencies/SDL_sound/SDL_sound_vorbis.c +223 -0
  106. data/dependencies/SDL_sound/SDL_sound_wav.c +783 -0
  107. data/dependencies/SDL_sound/dr_flac.h +5906 -0
  108. data/dependencies/SDL_sound/dr_mp3.h +2832 -0
  109. data/dependencies/SDL_sound/libmodplug/fastmix.c +1748 -0
  110. data/dependencies/SDL_sound/libmodplug/libmodplug.h +1001 -0
  111. data/dependencies/SDL_sound/libmodplug/load_669.c +188 -0
  112. data/dependencies/SDL_sound/libmodplug/load_abc.c +4725 -0
  113. data/dependencies/SDL_sound/libmodplug/load_amf.c +403 -0
  114. data/dependencies/SDL_sound/libmodplug/load_ams.c +587 -0
  115. data/dependencies/SDL_sound/libmodplug/load_dbm.c +357 -0
  116. data/dependencies/SDL_sound/libmodplug/load_dmf.c +531 -0
  117. data/dependencies/SDL_sound/libmodplug/load_dsm.c +232 -0
  118. data/dependencies/SDL_sound/libmodplug/load_far.c +253 -0
  119. data/dependencies/SDL_sound/libmodplug/load_it.c +796 -0
  120. data/dependencies/SDL_sound/libmodplug/load_mdl.c +488 -0
  121. data/dependencies/SDL_sound/libmodplug/load_med.c +757 -0
  122. data/dependencies/SDL_sound/libmodplug/load_mid.c +1405 -0
  123. data/dependencies/SDL_sound/libmodplug/load_mod.c +269 -0
  124. data/dependencies/SDL_sound/libmodplug/load_mt2.c +546 -0
  125. data/dependencies/SDL_sound/libmodplug/load_mtm.c +142 -0
  126. data/dependencies/SDL_sound/libmodplug/load_okt.c +192 -0
  127. data/dependencies/SDL_sound/libmodplug/load_pat.c +1143 -0
  128. data/dependencies/SDL_sound/libmodplug/load_pat.h +25 -0
  129. data/dependencies/SDL_sound/libmodplug/load_psm.c +350 -0
  130. data/dependencies/SDL_sound/libmodplug/load_ptm.c +204 -0
  131. data/dependencies/SDL_sound/libmodplug/load_s3m.c +325 -0
  132. data/dependencies/SDL_sound/libmodplug/load_stm.c +180 -0
  133. data/dependencies/SDL_sound/libmodplug/load_ult.c +206 -0
  134. data/dependencies/SDL_sound/libmodplug/load_umx.c +51 -0
  135. data/dependencies/SDL_sound/libmodplug/load_xm.c +554 -0
  136. data/dependencies/SDL_sound/libmodplug/mmcmp.c +382 -0
  137. data/dependencies/SDL_sound/libmodplug/modplug.c +170 -0
  138. data/dependencies/SDL_sound/libmodplug/modplug.h +90 -0
  139. data/dependencies/SDL_sound/libmodplug/snd_dsp.c +301 -0
  140. data/dependencies/SDL_sound/libmodplug/snd_flt.c +63 -0
  141. data/dependencies/SDL_sound/libmodplug/snd_fx.c +2350 -0
  142. data/dependencies/SDL_sound/libmodplug/sndfile.c +1169 -0
  143. data/dependencies/SDL_sound/libmodplug/sndmix.c +1034 -0
  144. data/dependencies/SDL_sound/libmodplug/tables.h +371 -0
  145. data/{src/stb_vorbis.c → dependencies/SDL_sound/stb_vorbis.h} +143 -78
  146. data/dependencies/al_soft/AL/al.h +655 -0
  147. data/dependencies/al_soft/AL/alc.h +270 -0
  148. data/dependencies/al_soft/AL/alext.h +585 -0
  149. data/dependencies/al_soft/AL/efx-creative.h +3 -0
  150. data/dependencies/al_soft/AL/efx-presets.h +402 -0
  151. data/dependencies/al_soft/AL/efx.h +762 -0
  152. data/dependencies/al_soft/x64/libOpenAL32.dll.a +0 -0
  153. data/dependencies/al_soft/x86/libOpenAL32.dll.a +0 -0
  154. data/{src → dependencies/stb}/stb_image.h +330 -127
  155. data/{src → dependencies/stb}/stb_image_write.h +156 -85
  156. data/{src → dependencies/stb}/stb_truetype.h +192 -69
  157. data/{src → dependencies/utf8proc}/utf8proc.c +0 -0
  158. data/{src → dependencies/utf8proc}/utf8proc.h +0 -0
  159. data/{src → dependencies/utf8proc}/utf8proc_data.h +0 -0
  160. data/ext/gosu/extconf.rb +53 -39
  161. data/{Gosu → include/Gosu}/Audio.hpp +6 -8
  162. data/include/Gosu/Bitmap.hpp +100 -0
  163. data/{Gosu → include/Gosu}/Buttons.hpp +104 -44
  164. data/{Gosu → include/Gosu}/Color.hpp +0 -0
  165. data/{Gosu → include/Gosu}/Directories.hpp +0 -0
  166. data/{Gosu → include/Gosu}/Font.hpp +1 -1
  167. data/{Gosu → include/Gosu}/Fwd.hpp +0 -5
  168. data/{Gosu → include/Gosu}/Gosu.hpp +0 -0
  169. data/{Gosu → include/Gosu}/Graphics.hpp +0 -0
  170. data/{Gosu → include/Gosu}/GraphicsBase.hpp +0 -0
  171. data/{Gosu → include/Gosu}/IO.hpp +0 -0
  172. data/{Gosu → include/Gosu}/Image.hpp +7 -6
  173. data/{Gosu → include/Gosu}/ImageData.hpp +0 -0
  174. data/{Gosu → include/Gosu}/Input.hpp +39 -51
  175. data/{Gosu → include/Gosu}/Inspection.hpp +0 -0
  176. data/{Gosu → include/Gosu}/Math.hpp +0 -0
  177. data/{Gosu → include/Gosu}/Platform.hpp +0 -0
  178. data/{Gosu → include/Gosu}/Text.hpp +0 -0
  179. data/{Gosu → include/Gosu}/TextInput.hpp +0 -0
  180. data/{Gosu → include/Gosu}/Timing.hpp +0 -0
  181. data/{Gosu → include/Gosu}/Utility.hpp +15 -4
  182. data/{Gosu → include/Gosu}/Version.hpp +3 -3
  183. data/{Gosu → include/Gosu}/Window.hpp +46 -34
  184. data/lib/OpenAL32.dll +0 -0
  185. data/lib/SDL2.dll +0 -0
  186. data/lib/gosu.rb +0 -3
  187. data/lib/gosu/patches.rb +0 -23
  188. data/lib/gosu/preview.rb +1 -3
  189. data/lib/gosu/swig_patches.rb +6 -8
  190. data/lib64/OpenAL32.dll +0 -0
  191. data/lib64/SDL2.dll +0 -0
  192. data/rdoc/gosu.rb +112 -23
  193. data/src/Audio.cpp +50 -224
  194. data/src/AudioFile.hpp +20 -37
  195. data/src/AudioFileAudioToolbox.cpp +237 -0
  196. data/src/AudioFileSDLSound.cpp +147 -0
  197. data/src/AudioImpl.cpp +3 -12
  198. data/src/AudioImpl.hpp +3 -1
  199. data/src/Bitmap.cpp +85 -83
  200. data/src/BitmapIO.cpp +52 -58
  201. data/src/Font.cpp +4 -1
  202. data/src/Graphics.cpp +7 -4
  203. data/src/Image.cpp +13 -16
  204. data/src/Input.cpp +412 -164
  205. data/src/LargeImageData.cpp +2 -1
  206. data/src/MarkupParser.cpp +2 -1
  207. data/src/Resolution.cpp +8 -8
  208. data/src/RubyGosu.cxx +1184 -352
  209. data/src/RubyGosu.h +3 -2
  210. data/src/TexChunk.cpp +1 -1
  211. data/src/Text.cpp +1 -0
  212. data/src/TextBuilder.cpp +3 -1
  213. data/src/Texture.cpp +1 -1
  214. data/src/TrueTypeFont.cpp +2 -1
  215. data/src/TrueTypeFontWin.cpp +3 -3
  216. data/src/Utility.cpp +11 -7
  217. data/src/Window.cpp +90 -62
  218. data/src/WindowUIKit.cpp +21 -9
  219. metadata +195 -46
  220. data/Gosu/AutoLink.hpp +0 -14
  221. data/Gosu/Bitmap.hpp +0 -113
  222. data/lib/gosu/zen.rb +0 -89
  223. data/src/AudioToolboxFile.hpp +0 -210
  224. data/src/MPEGFile.hpp +0 -90
  225. data/src/OggFile.hpp +0 -92
  226. data/src/SndFile.hpp +0 -174
  227. data/src/WinMain.cpp +0 -64
@@ -0,0 +1,325 @@
1
+ /*
2
+ * This source code is public domain.
3
+ *
4
+ * Authors: Olivier Lapicque <olivierl@jps.net>,
5
+ * Adam Goode <adam@evdebs.org> (endian and char fixes for PPC)
6
+ */
7
+
8
+ #include "libmodplug.h"
9
+ #include "tables.h"
10
+
11
+ //////////////////////////////////////////////////////
12
+ // ScreamTracker S3M file support
13
+
14
+ #pragma pack(1)
15
+ typedef struct tagS3MSAMPLESTRUCT
16
+ {
17
+ BYTE type;
18
+ CHAR dosname[12];
19
+ BYTE hmem;
20
+ WORD memseg;
21
+ DWORD length;
22
+ DWORD loopbegin;
23
+ DWORD loopend;
24
+ BYTE vol;
25
+ BYTE bReserved;
26
+ BYTE pack;
27
+ BYTE flags;
28
+ DWORD finetune;
29
+ DWORD dwReserved;
30
+ WORD intgp;
31
+ WORD int512;
32
+ DWORD lastused;
33
+ CHAR name[28];
34
+ CHAR scrs[4];
35
+ } S3MSAMPLESTRUCT;
36
+
37
+
38
+ typedef struct tagS3MFILEHEADER
39
+ {
40
+ CHAR name[28];
41
+ BYTE b1A;
42
+ BYTE type;
43
+ WORD reserved1;
44
+ WORD ordnum;
45
+ WORD insnum;
46
+ WORD patnum;
47
+ WORD flags;
48
+ WORD cwtv;
49
+ WORD version;
50
+ DWORD scrm; // "SCRM" = 0x4D524353
51
+ BYTE globalvol;
52
+ BYTE speed;
53
+ BYTE tempo;
54
+ BYTE mastervol;
55
+ BYTE ultraclicks;
56
+ BYTE panning_present;
57
+ BYTE reserved2[8];
58
+ WORD special;
59
+ BYTE channels[32];
60
+ } S3MFILEHEADER;
61
+
62
+
63
+ void CSoundFile_S3MConvert(MODCOMMAND *m, BOOL bIT)
64
+ //--------------------------------------------------------
65
+ {
66
+ UINT command = m->command;
67
+ UINT param = m->param;
68
+ switch (command + 0x40)
69
+ {
70
+ case 'A': command = CMD_SPEED; break;
71
+ case 'B': command = CMD_POSITIONJUMP; break;
72
+ case 'C': command = CMD_PATTERNBREAK; if (!bIT) param = (param >> 4) * 10 + (param & 0x0F); break;
73
+ case 'D': command = CMD_VOLUMESLIDE; break;
74
+ case 'E': command = CMD_PORTAMENTODOWN; break;
75
+ case 'F': command = CMD_PORTAMENTOUP; break;
76
+ case 'G': command = CMD_TONEPORTAMENTO; break;
77
+ case 'H': command = CMD_VIBRATO; break;
78
+ case 'I': command = CMD_TREMOR; break;
79
+ case 'J': command = CMD_ARPEGGIO; break;
80
+ case 'K': command = CMD_VIBRATOVOL; break;
81
+ case 'L': command = CMD_TONEPORTAVOL; break;
82
+ case 'M': command = CMD_CHANNELVOLUME; break;
83
+ case 'N': command = CMD_CHANNELVOLSLIDE; break;
84
+ case 'O': command = CMD_OFFSET; break;
85
+ case 'P': command = CMD_PANNINGSLIDE; break;
86
+ case 'Q': command = CMD_RETRIG; break;
87
+ case 'R': command = CMD_TREMOLO; break;
88
+ case 'S': command = CMD_S3MCMDEX; break;
89
+ case 'T': command = CMD_TEMPO; break;
90
+ case 'U': command = CMD_FINEVIBRATO; break;
91
+ case 'V': command = CMD_GLOBALVOLUME; break;
92
+ case 'W': command = CMD_GLOBALVOLSLIDE; break;
93
+ case 'X': command = CMD_PANNING8; break;
94
+ case 'Y': command = CMD_PANBRELLO; break;
95
+ case 'Z': command = CMD_MIDI; break;
96
+ default: command = 0;
97
+ }
98
+ m->command = command;
99
+ m->param = param;
100
+ }
101
+
102
+ static DWORD boundInput(DWORD input, DWORD smin, DWORD smax)
103
+ {
104
+ if (input > smax) input = smax;
105
+ else if (input < smin) input = 0;
106
+ return(input);
107
+ }
108
+
109
+
110
+ BOOL CSoundFile_ReadS3M(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLength)
111
+ //---------------------------------------------------------------
112
+ {
113
+ UINT insnum,patnum,nins,npat;
114
+ DWORD insfile[MAX_SAMPLES];
115
+ WORD ptr[256];
116
+ DWORD dwMemPos;
117
+ BYTE insflags[MAX_SAMPLES], inspack[MAX_SAMPLES];
118
+
119
+ if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return FALSE;
120
+ S3MFILEHEADER psfh;
121
+ SDL_memcpy(&psfh, lpStream, sizeof (psfh));
122
+
123
+ psfh.reserved1 = bswapLE16(psfh.reserved1);
124
+ psfh.ordnum = bswapLE16(psfh.ordnum);
125
+ psfh.insnum = bswapLE16(psfh.insnum);
126
+ psfh.patnum = bswapLE16(psfh.patnum);
127
+ psfh.flags = bswapLE16(psfh.flags);
128
+ psfh.cwtv = bswapLE16(psfh.cwtv);
129
+ psfh.version = bswapLE16(psfh.version);
130
+ psfh.scrm = bswapLE32(psfh.scrm);
131
+ psfh.special = bswapLE16(psfh.special);
132
+
133
+ if (psfh.scrm != 0x4D524353) return FALSE;
134
+ dwMemPos = 0x60;
135
+ _this->m_nType = MOD_TYPE_S3M;
136
+ // Speed
137
+ _this->m_nDefaultSpeed = psfh.speed;
138
+ if (_this->m_nDefaultSpeed < 1) _this->m_nDefaultSpeed = 6;
139
+ if (_this->m_nDefaultSpeed > 0x1F) _this->m_nDefaultSpeed = 0x1F;
140
+ // Tempo
141
+ _this->m_nDefaultTempo = psfh.tempo;
142
+ if (_this->m_nDefaultTempo < 40) _this->m_nDefaultTempo = 40;
143
+ if (_this->m_nDefaultTempo > 240) _this->m_nDefaultTempo = 240;
144
+ // Global Volume
145
+ _this->m_nDefaultGlobalVolume = psfh.globalvol << 2;
146
+ if ((!_this->m_nDefaultGlobalVolume) || (_this->m_nDefaultGlobalVolume > 256)) _this->m_nDefaultGlobalVolume = 256;
147
+ _this->m_nSongPreAmp = psfh.mastervol & 0x7F;
148
+ // Channels
149
+ _this->m_nChannels = 4;
150
+ for (UINT ich=0; ich<32; ich++)
151
+ {
152
+ _this->ChnSettings[ich].nPan = 128;
153
+ _this->ChnSettings[ich].nVolume = 64;
154
+
155
+ _this->ChnSettings[ich].dwFlags = CHN_MUTE;
156
+ if (psfh.channels[ich] != 0xFF)
157
+ {
158
+ _this->m_nChannels = ich+1;
159
+ UINT b = psfh.channels[ich] & 0x0F;
160
+ _this->ChnSettings[ich].nPan = (b & 8) ? 0xC0 : 0x40;
161
+ _this->ChnSettings[ich].dwFlags = 0;
162
+ }
163
+ }
164
+ if (_this->m_nChannels < 4) _this->m_nChannels = 4;
165
+ if ((psfh.cwtv < 0x1320) || (psfh.flags & 0x40)) _this->m_dwSongFlags |= SONG_FASTVOLSLIDES;
166
+ // Reading pattern order
167
+ UINT iord = psfh.ordnum;
168
+ if (iord<1) iord = 1;
169
+ if (iord > MAX_ORDERS) iord = MAX_ORDERS;
170
+ if (iord)
171
+ {
172
+ SDL_memcpy(_this->Order, lpStream+dwMemPos, iord);
173
+ dwMemPos += iord;
174
+ }
175
+ if ((iord & 1) && (lpStream[dwMemPos] == 0xFF)) dwMemPos++;
176
+ // Reading file pointers
177
+ insnum = nins = psfh.insnum;
178
+ if (insnum >= MAX_SAMPLES) insnum = MAX_SAMPLES-1;
179
+ _this->m_nSamples = insnum;
180
+ patnum = npat = psfh.patnum;
181
+ if (patnum > MAX_PATTERNS) patnum = MAX_PATTERNS;
182
+ SDL_memset(ptr, 0, sizeof(ptr));
183
+
184
+ // Ignore file if it has a corrupted header.
185
+ if (nins+npat > 256) return FALSE;
186
+
187
+ if (nins+npat)
188
+ {
189
+ SDL_memcpy(ptr, lpStream+dwMemPos, 2*(nins+npat));
190
+ dwMemPos += 2*(nins+npat);
191
+ for (UINT j = 0; j < (nins+npat); ++j) {
192
+ ptr[j] = bswapLE16(ptr[j]);
193
+ }
194
+ if (psfh.panning_present == 252)
195
+ {
196
+ const BYTE *chnpan = lpStream+dwMemPos;
197
+ for (UINT i=0; i<32; i++) if (chnpan[i] & 0x20)
198
+ {
199
+ _this->ChnSettings[i].nPan = ((chnpan[i] & 0x0F) << 4) + 8;
200
+ }
201
+ }
202
+ }
203
+ if (!_this->m_nChannels) return TRUE;
204
+ // Reading instrument headers
205
+ SDL_memset(insfile, 0, sizeof(insfile));
206
+ for (UINT iSmp=1; iSmp<=insnum; iSmp++)
207
+ {
208
+ UINT nInd = ((DWORD)ptr[iSmp-1])*16;
209
+ if ((!nInd) || (nInd + 0x50 > dwMemLength)) {
210
+ // initialize basic variables.
211
+ insflags[iSmp-1] = 0;
212
+ inspack[iSmp-1] = 0;
213
+ continue;
214
+ }
215
+ S3MSAMPLESTRUCT pSmp;
216
+ SDL_memcpy(&pSmp, lpStream+nInd, 0x50);
217
+ insflags[iSmp-1] = pSmp.flags;
218
+ inspack[iSmp-1] = pSmp.pack;
219
+ if ((pSmp.type==1) && (pSmp.scrs[2]=='R') && (pSmp.scrs[3]=='S'))
220
+ {
221
+ _this->Ins[iSmp].nLength = boundInput(bswapLE32(pSmp.length), 4, MAX_SAMPLE_LENGTH);
222
+ _this->Ins[iSmp].nLoopStart = boundInput(bswapLE32(pSmp.loopbegin), 4, _this->Ins[iSmp].nLength - 1);
223
+ _this->Ins[iSmp].nLoopEnd = boundInput(bswapLE32(pSmp.loopend), 4, _this->Ins[iSmp].nLength);
224
+ _this->Ins[iSmp].nVolume = boundInput(pSmp.vol, 0, 64) << 2;
225
+ _this->Ins[iSmp].nGlobalVol = 64;
226
+ if (pSmp.flags&1) _this->Ins[iSmp].uFlags |= CHN_LOOP;
227
+ UINT j = bswapLE32(pSmp.finetune);
228
+ if (!j) j = 8363;
229
+ if (j < 1024) j = 1024;
230
+ _this->Ins[iSmp].nC4Speed = j;
231
+ insfile[iSmp] = (pSmp.hmem << 20) + (bswapLE16(pSmp.memseg) << 4);
232
+ // offset is invalid - ignore this sample.
233
+ if (insfile[iSmp] > dwMemLength) insfile[iSmp] = 0;
234
+ else if (insfile[iSmp]) {
235
+ // ignore duplicate samples.
236
+ for (int z=iSmp-1; z>=0; z--)
237
+ if (insfile[iSmp] == insfile[z])
238
+ insfile[iSmp] = 0;
239
+ }
240
+ if ((_this->Ins[iSmp].nLoopStart >= _this->Ins[iSmp].nLoopEnd) || (_this->Ins[iSmp].nLoopEnd - _this->Ins[iSmp].nLoopStart < 8))
241
+ _this->Ins[iSmp].nLoopStart = _this->Ins[iSmp].nLoopEnd = 0;
242
+ _this->Ins[iSmp].nPan = 0x80;
243
+ }
244
+ }
245
+ // Reading patterns
246
+ for (UINT iPat=0; iPat<patnum; iPat++)
247
+ {
248
+ UINT nInd = ((DWORD)ptr[nins+iPat]) << 4;
249
+ if (nInd + 0x40 > dwMemLength) continue;
250
+ WORD len = bswapLE16(*((WORD *)(lpStream+nInd)));
251
+ nInd += 2;
252
+ _this->PatternSize[iPat] = 64;
253
+ if ((!len) || (nInd + len > dwMemLength - 6)
254
+ || ((_this->Patterns[iPat] = CSoundFile_AllocatePattern(64, _this->m_nChannels)) == NULL)) continue;
255
+ LPBYTE src = (LPBYTE)(lpStream+nInd);
256
+ // Unpacking pattern
257
+ MODCOMMAND *p = _this->Patterns[iPat];
258
+ UINT row = 0;
259
+ UINT j = 0;
260
+ while (j < len)
261
+ {
262
+ BYTE b = src[j++];
263
+ if (!b)
264
+ {
265
+ if (++row >= 64) break;
266
+ } else
267
+ {
268
+ UINT chn = b & 0x1F;
269
+ if (chn < _this->m_nChannels)
270
+ {
271
+ MODCOMMAND *m = &p[row*_this->m_nChannels+chn];
272
+ if (b & 0x20)
273
+ {
274
+ m->note = src[j++];
275
+ if (m->note < 0xF0) m->note = (m->note & 0x0F) + 12*(m->note >> 4) + 13;
276
+ else if (m->note == 0xFF) m->note = 0;
277
+ m->instr = src[j++];
278
+ }
279
+ if (b & 0x40)
280
+ {
281
+ UINT vol = src[j++];
282
+ if ((vol >= 128) && (vol <= 192))
283
+ {
284
+ vol -= 128;
285
+ m->volcmd = VOLCMD_PANNING;
286
+ } else
287
+ {
288
+ if (vol > 64) vol = 64;
289
+ m->volcmd = VOLCMD_VOLUME;
290
+ }
291
+ m->vol = vol;
292
+ }
293
+ if (b & 0x80)
294
+ {
295
+ m->command = src[j++];
296
+ m->param = src[j++];
297
+ if (m->command) CSoundFile_S3MConvert(m, FALSE);
298
+ }
299
+ } else
300
+ {
301
+ if (b & 0x20) j += 2;
302
+ if (b & 0x40) j++;
303
+ if (b & 0x80) j += 2;
304
+ }
305
+ if (j >= len) break;
306
+ }
307
+ }
308
+ }
309
+ // Reading samples
310
+ for (UINT iRaw=1; iRaw<=insnum; iRaw++) if ((_this->Ins[iRaw].nLength) && (insfile[iRaw]))
311
+ {
312
+ UINT flags = (psfh.version == 1) ? RS_PCM8S : RS_PCM8U;
313
+ if (insflags[iRaw-1] & 4) flags += 5;
314
+ if (insflags[iRaw-1] & 2) flags |= RSF_STEREO;
315
+ if (inspack[iRaw-1] == 4) flags = RS_ADPCM4;
316
+ dwMemPos = insfile[iRaw];
317
+ if (dwMemPos < dwMemLength)
318
+ dwMemPos += CSoundFile_ReadSample(_this, &_this->Ins[iRaw], flags, (LPSTR)(lpStream + dwMemPos), dwMemLength - dwMemPos);
319
+ }
320
+ _this->m_nMinPeriod = 64;
321
+ _this->m_nMaxPeriod = 32767;
322
+ if (psfh.flags & 0x10) _this->m_dwSongFlags |= SONG_AMIGALIMITS;
323
+ return TRUE;
324
+ }
325
+
@@ -0,0 +1,180 @@
1
+ /*
2
+ * This source code is public domain.
3
+ *
4
+ * Authors: Olivier Lapicque <olivierl@jps.net>
5
+ */
6
+
7
+ #include "libmodplug.h"
8
+
9
+ #pragma pack(1)
10
+
11
+ typedef struct tagSTMNOTE
12
+ {
13
+ BYTE note;
14
+ BYTE insvol;
15
+ BYTE volcmd;
16
+ BYTE cmdinf;
17
+ } STMNOTE;
18
+
19
+
20
+ // Raw STM sampleinfo struct:
21
+ typedef struct tagSTMSAMPLE
22
+ {
23
+ CHAR filename[14]; // Can't have long comments - just filename comments :)
24
+ WORD reserved; // ISA in memory when in ST 2
25
+ WORD length; // Sample length
26
+ WORD loopbeg; // Loop start point
27
+ WORD loopend; // Loop end point
28
+ BYTE volume; // Volume
29
+ BYTE reserved2; // More reserved crap
30
+ WORD c2spd; // Good old c2spd
31
+ BYTE reserved3[6]; // Yet more of PSi's reserved crap
32
+ } STMSAMPLE;
33
+
34
+
35
+ // Raw STM header struct:
36
+ typedef struct tagSTMHEADER
37
+ {
38
+ char songname[20]; // changed from CHAR
39
+ char trackername[8]; // !SCREAM! for ST 2.xx // changed from CHAR
40
+ CHAR unused; // 0x1A
41
+ CHAR filetype; // 1=song, 2=module (only 2 is supported, of course) :)
42
+ CHAR ver_major; // Like 2
43
+ CHAR ver_minor; // "ditto"
44
+ BYTE inittempo; // initspeed= stm inittempo>>4
45
+ BYTE numpat; // number of patterns
46
+ BYTE globalvol; // <- WoW! a RiGHT TRiANGLE =8*)
47
+ BYTE reserved[13]; // More of PSi's internal crap
48
+ STMSAMPLE sample[31]; // STM sample data
49
+ BYTE patorder[128]; // Docs say 64 - actually 128
50
+ } STMHEADER;
51
+
52
+ #pragma pack()
53
+
54
+
55
+
56
+ BOOL CSoundFile_ReadSTM(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLength)
57
+ //---------------------------------------------------------------
58
+ {
59
+ const STMHEADER *phdr = (STMHEADER *)lpStream;
60
+ DWORD dwMemPos = 0;
61
+
62
+ if ((!lpStream) || (dwMemLength < sizeof(STMHEADER))) return FALSE;
63
+ if ((phdr->filetype != 2) || (phdr->unused != 0x1A)
64
+ || ((SDL_strncasecmp(phdr->trackername, "!SCREAM!", 8))
65
+ && (SDL_strncasecmp(phdr->trackername, "BMOD2STM", 8)))) return FALSE;
66
+ // Read STM header
67
+ _this->m_nType = MOD_TYPE_STM;
68
+ _this->m_nSamples = 31;
69
+ _this->m_nChannels = 4;
70
+ _this->m_nInstruments = 0;
71
+ _this->m_nMinPeriod = 64;
72
+ _this->m_nMaxPeriod = 0x7FFF;
73
+ _this->m_nDefaultSpeed = phdr->inittempo >> 4;
74
+ if (_this->m_nDefaultSpeed < 1) _this->m_nDefaultSpeed = 1;
75
+ _this->m_nDefaultTempo = 125;
76
+ _this->m_nDefaultGlobalVolume = phdr->globalvol << 2;
77
+ if (_this->m_nDefaultGlobalVolume > 256) _this->m_nDefaultGlobalVolume = 256;
78
+ SDL_memcpy(_this->Order, phdr->patorder, 128);
79
+ // Setting up channels
80
+ for (UINT nSet=0; nSet<4; nSet++)
81
+ {
82
+ _this->ChnSettings[nSet].dwFlags = 0;
83
+ _this->ChnSettings[nSet].nVolume = 64;
84
+ _this->ChnSettings[nSet].nPan = (nSet & 1) ? 0x40 : 0xC0;
85
+ }
86
+ // Reading samples
87
+ for (UINT nIns=0; nIns<31; nIns++)
88
+ {
89
+ MODINSTRUMENT *pIns = &_this->Ins[nIns+1];
90
+ const STMSAMPLE *pStm = &phdr->sample[nIns]; // STM sample data
91
+ pIns->nC4Speed = bswapLE16(pStm->c2spd);
92
+ pIns->nGlobalVol = 64;
93
+ pIns->nVolume = pStm->volume << 2;
94
+ if (pIns->nVolume > 256) pIns->nVolume = 256;
95
+ pIns->nLength = bswapLE16(pStm->length);
96
+ if ((pIns->nLength < 4) || (!pIns->nVolume)) pIns->nLength = 0;
97
+ pIns->nLoopStart = bswapLE16(pStm->loopbeg);
98
+ pIns->nLoopEnd = bswapLE16(pStm->loopend);
99
+ if ((pIns->nLoopEnd > pIns->nLoopStart) && (pIns->nLoopEnd != 0xFFFF)) pIns->uFlags |= CHN_LOOP;
100
+ }
101
+ dwMemPos = sizeof(STMHEADER);
102
+ for (UINT nOrd=0; nOrd<MAX_ORDERS; nOrd++) if (_this->Order[nOrd] >= 99) _this->Order[nOrd] = 0xFF;
103
+ UINT nPatterns = phdr->numpat;
104
+ for (UINT nPat=0; nPat<nPatterns; nPat++)
105
+ {
106
+ if (dwMemPos + 64*4*4 > dwMemLength) return TRUE;
107
+ _this->PatternSize[nPat] = 64;
108
+ if ((_this->Patterns[nPat] = CSoundFile_AllocatePattern(64, _this->m_nChannels)) == NULL) return TRUE;
109
+ MODCOMMAND *m = _this->Patterns[nPat];
110
+ const STMNOTE *p = (const STMNOTE *)(lpStream + dwMemPos);
111
+ for (UINT n=0; n<64*4; n++, p++, m++)
112
+ {
113
+ UINT note,ins,vol,cmd;
114
+ // extract the various information from the 4 bytes that
115
+ // make up a single note
116
+ note = p->note;
117
+ ins = p->insvol >> 3;
118
+ vol = (p->insvol & 0x07) + (p->volcmd >> 1);
119
+ cmd = p->volcmd & 0x0F;
120
+ if ((ins) && (ins < 32)) m->instr = ins;
121
+ // special values of [SBYTE0] are handled here ->
122
+ // we have no idea if these strange values will ever be encountered
123
+ // but it appears as though stms sound correct.
124
+ if ((note == 0xFE) || (note == 0xFC)) m->note = 0xFE; else
125
+ // if note < 251, then all three bytes are stored in the file
126
+ if (note < 0xFC) m->note = (note >> 4)*12 + (note&0xf) + 37;
127
+ if (vol <= 64) { m->volcmd = VOLCMD_VOLUME; m->vol = vol; }
128
+ m->param = p->cmdinf;
129
+ switch(cmd)
130
+ {
131
+ // Axx set speed to xx
132
+ case 1: m->command = CMD_SPEED; m->param >>= 4; break;
133
+ // Bxx position jump
134
+ case 2: m->command = CMD_POSITIONJUMP; break;
135
+ // Cxx patternbreak to row xx
136
+ case 3: m->command = CMD_PATTERNBREAK; m->param = (m->param & 0xF0) * 10 + (m->param & 0x0F); break;
137
+ // Dxy volumeslide
138
+ case 4: m->command = CMD_VOLUMESLIDE; break;
139
+ // Exy toneslide down
140
+ case 5: m->command = CMD_PORTAMENTODOWN; break;
141
+ // Fxy toneslide up
142
+ case 6: m->command = CMD_PORTAMENTOUP; break;
143
+ // Gxx Tone portamento,speed xx
144
+ case 7: m->command = CMD_TONEPORTAMENTO; break;
145
+ // Hxy vibrato
146
+ case 8: m->command = CMD_VIBRATO; break;
147
+ // Ixy tremor, ontime x, offtime y
148
+ case 9: m->command = CMD_TREMOR; break;
149
+ // Jxy arpeggio
150
+ case 10: m->command = CMD_ARPEGGIO; break;
151
+ // Kxy Dual command H00 & Dxy
152
+ case 11: m->command = CMD_VIBRATOVOL; break;
153
+ // Lxy Dual command G00 & Dxy
154
+ case 12: m->command = CMD_TONEPORTAVOL; break;
155
+ // Xxx amiga command 8xx
156
+ case 0x18: m->command = CMD_PANNING8; break;
157
+ default:
158
+ m->command = m->param = 0;
159
+ }
160
+ }
161
+ dwMemPos += 64*4*4;
162
+ }
163
+ // Reading Samples
164
+ for (UINT nSmp=1; nSmp<=31; nSmp++)
165
+ {
166
+ MODINSTRUMENT *pIns = &_this->Ins[nSmp];
167
+ dwMemPos = (dwMemPos + 15) & (~15);
168
+ if (pIns->nLength)
169
+ {
170
+ UINT nPos = ((UINT)phdr->sample[nSmp-1].reserved) << 4;
171
+ if ((nPos >= sizeof(STMHEADER)) && (nPos+pIns->nLength <= dwMemLength)) dwMemPos = nPos;
172
+ if (dwMemPos < dwMemLength)
173
+ {
174
+ dwMemPos += CSoundFile_ReadSample(_this, pIns, RS_PCM8S, (LPSTR)(lpStream+dwMemPos),dwMemLength-dwMemPos);
175
+ }
176
+ }
177
+ }
178
+ return TRUE;
179
+ }
180
+