Revision | d914323331c13b5b0c4a43482138bec2ae615f79 (tree) |
---|---|
Time | 2020-09-26 16:29:30 |
Author | Starg <starg@user...> |
Commiter | Starg |
Merge branch 'dev41' into unicode
@@ -5834,13 +5834,23 @@ void w32g_show_console(void) | ||
5834 | 5834 | // |
5835 | 5835 | // GDI アクセスを単一スレッドに限定するためのロック機構 |
5836 | 5836 | |
5837 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
5838 | +static SRWLOCK w32g_gdi_lock = SRWLOCK_INIT; | |
5839 | +#else | |
5837 | 5840 | static HANDLE volatile hMutexGDI = NULL; |
5841 | +#endif | |
5838 | 5842 | // static int volatile lock_num = 0; |
5839 | 5843 | int gdi_lock_ex ( DWORD timeout ) |
5840 | 5844 | { |
5841 | 5845 | // lock_num++; |
5842 | 5846 | // ctl->cmsg(CMSG_INFO, VERB_VERBOSE, |
5843 | 5847 | // "gdi_lock<%d %d>", GetCurrentThreadId(),lock_num ); |
5848 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
5849 | + if (timeout == INFINITE) | |
5850 | + AcquireSRWLockExclusive(&w32g_gdi_lock); | |
5851 | + else | |
5852 | + return TryAcquireSRWLockExclusive(&w32g_gdi_lock) ? 0 : -1; | |
5853 | +#else | |
5844 | 5854 | if(hMutexGDI==NULL){ |
5845 | 5855 | hMutexGDI = CreateMutex(NULL,FALSE,NULL); |
5846 | 5856 | if(hMutexGDI==NULL) |
@@ -5849,6 +5859,7 @@ int gdi_lock_ex ( DWORD timeout ) | ||
5849 | 5859 | if(WaitForSingleObject(hMutexGDI,timeout)==WAIT_FAILED){ |
5850 | 5860 | return -1; |
5851 | 5861 | } |
5862 | +#endif | |
5852 | 5863 | return 0; |
5853 | 5864 | } |
5854 | 5865 | int gdi_lock(void) |
@@ -5861,8 +5872,12 @@ extern int gdi_unlock(void) | ||
5861 | 5872 | //lock_num--; |
5862 | 5873 | //ctl->cmsg(CMSG_INFO, VERB_VERBOSE, |
5863 | 5874 | // "gdi_unlock<%d %d>", GetCurrentThreadId(),lock_num ); |
5875 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
5876 | + ReleaseSRWLockExclusive(&w32g_gdi_lock); | |
5877 | +#else | |
5864 | 5878 | if(hMutexGDI!=NULL){ |
5865 | 5879 | ReleaseMutex(hMutexGDI); |
5866 | 5880 | } |
5881 | +#endif | |
5867 | 5882 | return 0; |
5868 | 5883 | } |
@@ -170,9 +170,27 @@ static void wrd_text_update ( int x_from, int y_from, int x_to, int y_to, int lo | ||
170 | 170 | |
171 | 171 | static int volatile wrd_graphic_pal_init_flag = 0; |
172 | 172 | |
173 | +#define TIMW32G_USE_USERMODE_LOCKS | |
174 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
175 | +static CRITICAL_SECTION *w32g_wrd_wnd_lock = NULL; | |
176 | +#else | |
173 | 177 | static HANDLE volatile hMutexWrd = NULL; |
178 | +#endif | |
179 | + | |
174 | 180 | static BOOL wrd_wnd_lock_ex ( DWORD timeout ) |
175 | 181 | { |
182 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
183 | + static CRITICAL_SECTION cs; | |
184 | + | |
185 | + if (w32g_wrd_wnd_lock == NULL) { | |
186 | + InitializeCriticalSection(&cs); | |
187 | + w32g_wrd_wnd_lock = &cs; | |
188 | + } | |
189 | + if (timeout == INFINITE) | |
190 | + EnterCriticalSection(w32g_wrd_wnd_lock); | |
191 | + else | |
192 | + return TryEnterCriticalSection(w32g_wrd_wnd_lock); | |
193 | +#else | |
176 | 194 | if ( hMutexWrd == NULL ) { |
177 | 195 | hMutexWrd = CreateMutex ( NULL, FALSE, NULL ); |
178 | 196 | if ( hMutexWrd == NULL ) |
@@ -181,6 +199,7 @@ static BOOL wrd_wnd_lock_ex ( DWORD timeout ) | ||
181 | 199 | if ( WaitForSingleObject ( hMutexWrd, timeout )== WAIT_FAILED ) { |
182 | 200 | return FALSE; |
183 | 201 | } |
202 | +#endif | |
184 | 203 | return TRUE; |
185 | 204 | } |
186 | 205 | static BOOL wrd_wnd_lock (void) |
@@ -189,7 +208,11 @@ static BOOL wrd_wnd_lock (void) | ||
189 | 208 | } |
190 | 209 | static void wrd_wnd_unlock (void) |
191 | 210 | { |
211 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
212 | + LeaveCriticalSection(w32g_wrd_wnd_lock); | |
213 | +#else | |
192 | 214 | ReleaseMutex ( hMutexWrd ); |
215 | +#endif | |
193 | 216 | } |
194 | 217 | |
195 | 218 |
@@ -251,9 +251,25 @@ static int tracer_lock_result; | ||
251 | 251 | #define TRACER_UNLOCK() { tracer_wnd_unlock(); } |
252 | 252 | #endif |
253 | 253 | |
254 | +#define TIMW32G_USE_USERMODE_LOCKS | |
255 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
256 | +static CRITICAL_SECTION *w32g_tracer_wnd_lock = NULL; | |
257 | +#else | |
254 | 258 | static HANDLE volatile hMutexWrd = NULL; |
259 | +#endif | |
255 | 260 | static BOOL tracer_wnd_lock_ex(DWORD timeout) |
256 | 261 | { |
262 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
263 | + static CRITICAL_SECTION cs; | |
264 | + if (!w32g_tracer_wnd_lock) { | |
265 | + InitializeCriticalSection(&cs); | |
266 | + w32g_tracer_wnd_lock = &cs; | |
267 | + } | |
268 | + if (timeout == INFINITE) | |
269 | + EnterCriticalSection(w32g_tracer_wnd_lock); | |
270 | + else | |
271 | + return TryEnterCriticalSection(w32g_tracer_wnd_lock); | |
272 | +#else | |
257 | 273 | if (!hMutexWrd) { |
258 | 274 | hMutexWrd = CreateMutex(NULL, FALSE, NULL); |
259 | 275 | if (!hMutexWrd) |
@@ -262,6 +278,7 @@ static BOOL tracer_wnd_lock_ex(DWORD timeout) | ||
262 | 278 | if (WaitForSingleObject(hMutexWrd, timeout) == WAIT_FAILED) { |
263 | 279 | return FALSE; |
264 | 280 | } |
281 | +#endif | |
265 | 282 | return TRUE; |
266 | 283 | } |
267 | 284 | static BOOL tracer_wnd_lock(void) |
@@ -270,7 +287,11 @@ static BOOL tracer_wnd_lock(void) | ||
270 | 287 | } |
271 | 288 | static void tracer_wnd_unlock(void) |
272 | 289 | { |
290 | +#ifdef TIMW32G_USE_USERMODE_LOCKS | |
291 | + LeaveCriticalSection(w32g_tracer_wnd_lock); | |
292 | +#else | |
273 | 293 | ReleaseMutex(hMutexWrd); |
294 | +#endif | |
274 | 295 | } |
275 | 296 | |
276 | 297 | // **************************************************************************** |
@@ -313,12 +313,47 @@ static FLAC__StreamDecoderWriteStatus flac_write_callback(const FLAC__StreamDeco | ||
313 | 313 | for (int i = 0; i < sdr->channels; i++) { |
314 | 314 | switch (sdr->data_type) { |
315 | 315 | case SAMPLE_TYPE_INT32: |
316 | - memcpy(((FLAC__int32 *)sdr->data[i]) + context->current_size_in_samples, buffer[i], frame->header.blocksize * sizeof(FLAC__int32)); | |
316 | + { | |
317 | + // MSVC can't figure out this does not change during the loop. | |
318 | + int s = 32 - frame->header.bits_per_sample; | |
319 | + int32 *src = buffer[i]; | |
320 | + int32 *dest = (int32 *)sdr->data[i] + context->current_size_in_samples; | |
321 | + int n = frame->header.blocksize; | |
322 | + | |
323 | + // This loop should be auto-vectorized. | |
324 | + for (int j = 0; j < n; j++) { | |
325 | + dest[j] = src[j] << s; | |
326 | + } | |
327 | + } | |
317 | 328 | break; |
318 | 329 | |
319 | 330 | case SAMPLE_TYPE_INT16: |
320 | - for (unsigned int j = 0; j < frame->header.blocksize; j++) { | |
321 | - sdr->data[i][context->current_size_in_samples + j] = (FLAC__int16)buffer[i][j]; | |
331 | + { | |
332 | + int s = 16 - frame->header.bits_per_sample; | |
333 | + int32 *src = buffer[i]; | |
334 | + int16 *dest = (int16 *)sdr->data[i] + context->current_size_in_samples; | |
335 | + int n = frame->header.blocksize; | |
336 | + | |
337 | + int j = 0; | |
338 | + | |
339 | +#if USE_X86_EXT_INTRIN >= 3 | |
340 | + int n8 = n & ~7; | |
341 | + __m128i vs = _mm_cvtsi32_si128(s); | |
342 | + | |
343 | + while (j < n8) { | |
344 | + __m128i v0 = _mm_loadu_si128((const __m128i *)(src + j)); | |
345 | + __m128i v1 = _mm_loadu_si128((const __m128i *)(src + j + 4)); | |
346 | + __m128i v01 = _mm_packs_epi32(v0, v1); | |
347 | + v01 = _mm_sll_epi16(v01, vs); | |
348 | + _mm_storeu_si128((__m128i *)(dest + j), v01); | |
349 | + j += 8; | |
350 | + } | |
351 | +#endif | |
352 | + | |
353 | + while (j < n) { | |
354 | + dest[j] = (int16)(src[j] << s); | |
355 | + j++; | |
356 | + } | |
322 | 357 | } |
323 | 358 | break; |
324 | 359 | } |
@@ -1194,8 +1194,13 @@ fail: | ||
1194 | 1194 | sp->modenv_rate[4] = to_rate(64); |
1195 | 1195 | sp->modenv_offset[5] = 0; |
1196 | 1196 | sp->modenv_rate[5] = to_rate(64); |
1197 | - | |
1197 | + | |
1198 | 1198 | sp->offset = 0; |
1199 | + sp->seq_length = 0; | |
1200 | + sp->seq_position = 0; | |
1201 | + sp->lorand = -1; | |
1202 | + sp->hirand = -1; | |
1203 | + sp->rt_decay = 0; | |
1199 | 1204 | READ_LONG(sp->data_length); |
1200 | 1205 | READ_LONG(sp->loop_start); |
1201 | 1206 | READ_LONG(sp->loop_end); |
@@ -4273,7 +4273,12 @@ static void init_sample_param(Sample *sample) | ||
4273 | 4273 | sample->modenv_velf[2] = 0; |
4274 | 4274 | sample->modenv_velf[3] = 0; |
4275 | 4275 | sample->modenv_velf[4] = 0; |
4276 | - sample->modenv_velf[5] = 0; | |
4276 | + sample->modenv_velf[5] = 0; | |
4277 | + sample->seq_length = 0; | |
4278 | + sample->seq_position = 0; | |
4279 | + sample->lorand = -1; | |
4280 | + sample->hirand = -1; | |
4281 | + sample->rt_decay = 0; | |
4277 | 4282 | } |
4278 | 4283 | |
4279 | 4284 |
@@ -738,7 +738,13 @@ void load_module_samples (SAMPLE * s, int numsamples, int ntsc) | ||
738 | 738 | sp->sample_type = SF_SAMPLETYPE_MONO; |
739 | 739 | sp->sf_sample_link = -1; |
740 | 740 | sp->sf_sample_index = 0; |
741 | - | |
741 | + sp->offset = 0; | |
742 | + sp->seq_length = 0; | |
743 | + sp->seq_position = 0; | |
744 | + sp->lorand = -1; | |
745 | + sp->hirand = -1; | |
746 | + sp->rt_decay = 0; | |
747 | + | |
742 | 748 | sp->data_length <<= FRACTION_BITS; |
743 | 749 | sp->loop_start <<= FRACTION_BITS; |
744 | 750 | sp->loop_end <<= FRACTION_BITS; |
@@ -1271,6 +1271,8 @@ static void initialize_controllers(int c) | ||
1271 | 1271 | /* Process the Reset All Controllers event CC#121 */ |
1272 | 1272 | static void reset_controllers(int c) |
1273 | 1273 | { |
1274 | + int i; | |
1275 | + | |
1274 | 1276 | channel[c].expression = 127; /* SCC-1 does this. */ |
1275 | 1277 | channel[c].sustain = 0; |
1276 | 1278 | channel[c].sostenuto = 0; |
@@ -1283,12 +1285,12 @@ static void reset_controllers(int c) | ||
1283 | 1285 | channel[c].lastlrpn = channel[c].lastmrpn = 0; |
1284 | 1286 | channel[c].nrpn = -1; |
1285 | 1287 | channel[c].rpn_7f7f_flag = 1; |
1286 | - | |
1288 | + | |
1287 | 1289 | memset(channel[c].key_pressed, 0, sizeof(channel[c].key_pressed)); |
1288 | 1290 | memset(channel[c].key_history, 0, sizeof(channel[c].key_history)); |
1289 | 1291 | channel[c].last_key_history_index = 0; |
1290 | 1292 | |
1291 | - for (int i = 0; i < MAX_ELEMENT; i++) { | |
1293 | + for (i = 0; i < MAX_ELEMENT; i++) { | |
1292 | 1294 | safe_free(channel[c].seq_counters[i]); |
1293 | 1295 | channel[c].seq_counters[i] = NULL; |
1294 | 1296 | channel[c].seq_num_counters[i] = 0; |
@@ -1624,6 +1624,8 @@ static void set_sample_info(SFInfo *sf, SampleList *vp, LayerTable *tbl) | ||
1624 | 1624 | |
1625 | 1625 | vp->v.offset = 0; |
1626 | 1626 | |
1627 | + vp->v.offset = 0; | |
1628 | + | |
1627 | 1629 | /* set loop position */ |
1628 | 1630 | vp->v.loop_start = sp->startloop; |
1629 | 1631 | vp->v.loop_end = sp->endloop; |
@@ -1744,6 +1746,12 @@ static void set_sample_info(SFInfo *sf, SampleList *vp, LayerTable *tbl) | ||
1744 | 1746 | vp->v.pitch_envelope[6] = 0; // 125ms dcy3 |
1745 | 1747 | vp->v.pitch_envelope[7] = 0; // 0cent rls |
1746 | 1748 | vp->v.pitch_envelope[8] = 0; // 125ms rls |
1749 | + vp->v.offset = 0; | |
1750 | + vp->v.seq_length = 0; | |
1751 | + vp->v.seq_position = 0; | |
1752 | + vp->v.lorand = -1; | |
1753 | + vp->v.hirand = -1; | |
1754 | + vp->v.rt_decay = 0; | |
1747 | 1755 | } |
1748 | 1756 | |
1749 | 1757 | /*----------------------------------------------------------------*/ |