From: Toni Wilen Date: Sun, 9 Aug 2009 11:37:01 +0000 (+0300) Subject: imported winuaesrc1620b6.zip X-Git-Tag: 2100~67 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=188f23f81b18808141d2a187cfaef424e8be30dd;p=francis%2Fwinuae.git imported winuaesrc1620b6.zip --- diff --git a/audio.c b/audio.c index 10f0107b..cf6e0144 100644 --- a/audio.c +++ b/audio.c @@ -94,7 +94,9 @@ struct audio_channel_data { }; static int samplecnt; +#if SOUNDSTUFF > 0 static int extrasamples, outputsample, doublesample; +#endif int sampleripper_enabled; struct ripped_sample @@ -1545,7 +1547,7 @@ void update_audio (void) if (rounded == best_evtime) { /* Before the following addition, next_sample_evtime is in range [-0.5, 0.5) */ next_sample_evtime += scaled_sample_evtime; -#if 0 +#if SOUNDSTUFF > 0 doublesample = 0; if (--samplecounter <= 0) { samplecounter = currprefs.sound_freq / 1000; @@ -1561,7 +1563,7 @@ void update_audio (void) } #endif (*sample_handler) (); -#if 0 +#if SOUNDSTUFF > 0 if (outputsample == 0) outputsample = -1; else if (outputsample < 0) @@ -1881,7 +1883,7 @@ uae_u8 *save_audio (int i, int *len, uae_u8 *dstptr) void audio_vsync (void) { -#if 0 +#if SOUNDSTUFF > 0 int i, max, min; static int lastdir; diff --git a/disk.c b/disk.c index 8033e96f..949e0d51 100644 --- a/disk.c +++ b/disk.c @@ -3456,7 +3456,7 @@ static uae_u32 getadfcrc (drive *drv) return crc32; } -uae_u8 *save_disk(int num, int *len, uae_u8 *dstptr) +uae_u8 *save_disk (int num, int *len, uae_u8 *dstptr) { uae_u8 *dstbak,*dst; drive *drv; @@ -3465,7 +3465,7 @@ uae_u8 *save_disk(int num, int *len, uae_u8 *dstptr) if (dstptr) dstbak = dst = dstptr; else - dstbak = dst = (uae_u8*)malloc (2+1+1+1+1+4+4+256); + dstbak = dst = malloc (2+1+1+1+1+4+4+256); save_u32 (drv->drive_id); /* drive type ID */ save_u8 ((drv->motoroff ? 0:1) | ((disabled & (1 << num)) ? 2 : 0) | (drv->idbit ? 4 : 0) | (drv->dskchange ? 8 : 0)); save_u8 (drv->cyl); /* cylinder */ @@ -3481,7 +3481,7 @@ uae_u8 *save_disk(int num, int *len, uae_u8 *dstptr) /* internal floppy controller variables */ -uae_u8 *restore_floppy(uae_u8 *src) +uae_u8 *restore_floppy (uae_u8 *src) { word = restore_u16(); bitoffset = restore_u8(); diff --git a/gencpu.c b/gencpu.c index 565cb80e..fb4b7e65 100644 --- a/gencpu.c +++ b/gencpu.c @@ -1828,6 +1828,7 @@ static void gen_opcode (unsigned long int opcode) case i_STOP: if (using_prefetch) { printf ("\tregs->sr = regs->irc;\n"); + m68k_pc_offset += 2; } else { genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0); printf ("\tregs->sr = src;\n"); diff --git a/od-win32/posixemu.c b/od-win32/posixemu.c index fd2730e4..5528aeeb 100644 --- a/od-win32/posixemu.c +++ b/od-win32/posixemu.c @@ -295,20 +295,31 @@ int uae_start_thread (TCHAR *name, void *(*f)(void *), void *arg, uae_thread_id int uae_start_thread_fast (void *(*f)(void *), void *arg, uae_thread_id *tid) { - return uae_start_thread (NULL, f, arg, tid); + int v = uae_start_thread (NULL, f, arg, tid); + if (*tid) + SetThreadPriority (*tid, THREAD_PRIORITY_HIGHEST); + return v; } DWORD_PTR cpu_affinity = 1, cpu_paffinity = 1; void uae_set_thread_priority (uae_thread_id *tid, int pri) { - int pri2 = GetThreadPriority (NULL); + int pri2; + HANDLE th; + if (tid) + th = *tid; + else + th = GetCurrentThread (); + pri2 = GetThreadPriority (th); + if (pri2 == THREAD_PRIORITY_ERROR_RETURN) + pri2 = 0; pri2 += pri; if (pri2 > 1) pri2 = 1; if (pri2 < -1) pri2 = -1; - SetThreadPriority (tid ? *tid : NULL, pri2); + SetThreadPriority (th, pri2); } diff --git a/od-win32/sounddep/sound.c b/od-win32/sounddep/sound.c index c1cd412b..1cd7a936 100644 --- a/od-win32/sounddep/sound.c +++ b/od-win32/sounddep/sound.c @@ -92,11 +92,12 @@ struct sound_dp IAudioClient *pAudioClient; IAudioRenderClient *pRenderClient; IMMDeviceEnumerator *pEnumerator; +#if 0 IAudioClock *pAudioClock; + UINT64 wasapiclock; +#endif REFERENCE_TIME hnsRequestedDuration; - HANDLE wasapihandle; int bufferFrameCount; - UINT64 wasapiclock; UINT64 wasapiframes; int wasapiexclusive; int framecounter; @@ -208,14 +209,10 @@ static void resume_audio_wasapi (struct sound_data *sd) BYTE *pData; int framecnt; - ResetEvent (s->wasapihandle); hr = s->pAudioClient->lpVtbl->Reset (s->pAudioClient); if (FAILED (hr)) write_log (L"WASAPI: Reset() %08X\n", hr); - if (s->wasapiexclusive) - framecnt = s->bufferFrameCount; - else - framecnt = s->wasapigoodsize; + framecnt = s->wasapigoodsize; hr = s->pRenderClient->lpVtbl->GetBuffer (s->pRenderClient, framecnt, &pData); if (FAILED (hr)) return; @@ -223,12 +220,6 @@ static void resume_audio_wasapi (struct sound_data *sd) hr = s->pAudioClient->lpVtbl->Start (s->pAudioClient); if (FAILED (hr)) write_log (L"WASAPI: Start() %08X\n", hr); - if (s->wasapiexclusive) { - WaitForSingleObject (s->wasapihandle, 5 * 1000); - hr = s->pRenderClient->lpVtbl->GetBuffer (s->pRenderClient, framecnt, &pData); - if (SUCCEEDED (hr)) - hr = s->pRenderClient->lpVtbl->ReleaseBuffer (s->pRenderClient, framecnt, AUDCLNT_BUFFERFLAGS_SILENT); - } s->wasapiframes = 0; s->framecounter = 0; s->sndbuf = 0; @@ -681,16 +672,16 @@ static void close_audio_wasapi (struct sound_data *sd) if (s->pRenderClient) s->pRenderClient->lpVtbl->Release (s->pRenderClient); +#if 0 if (s->pAudioClock) s->pAudioClock->lpVtbl->Release (s->pAudioClock); +#endif if (s->pAudioClient) s->pAudioClient->lpVtbl->Release (s->pAudioClient); if (s->pDevice) s->pDevice->lpVtbl->Release (s->pDevice); if (s->pEnumerator) s->pEnumerator->lpVtbl->Release (s->pEnumerator); - if (s->wasapihandle) - CloseHandle (s->wasapihandle); } const static GUID XIID_IAudioClient = {0x1CB9AD4C,0xDBFA,0x4c32,{0xB1,0x78,0xC2,0xF5,0x68,0xA7,0x03,0xB2}}; @@ -709,7 +700,7 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) LPWSTR name = NULL; int rn[4], rncnt; AUDCLNT_SHAREMODE sharemode; - int size; + int size, v; sd->devicetype = SOUND_DEVICE_WASAPI; s->wasapiexclusive = exclusive; @@ -825,14 +816,10 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) sd->freq = pwfx->nSamplesPerSec; } - if (!s->wasapiexclusive) { - size = sd->sndbufsize * sd->channels * 16 / 8; - s->snd_configsize = size; - sd->sndbufsize = size / 32; - size /= (sd->channels * 16 / 8); - } else { - s->hnsRequestedDuration *= sd->sndbufsize / 512; - } + size = sd->sndbufsize * sd->channels * 16 / 8; + s->snd_configsize = size; + sd->sndbufsize = size / 32; + size /= (sd->channels * 16 / 8); s->bufferFrameCount = (UINT32)( // frames = 1.0 * s->hnsRequestedDuration * // hns * @@ -841,22 +828,20 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) 10000 // (hns / s) / + 0.5); // rounding - if (!s->wasapiexclusive) { - if (s->bufferFrameCount < size) { - s->bufferFrameCount = size; - s->hnsRequestedDuration = // hns = - (REFERENCE_TIME)( - 10000.0 * // (hns / ms) * - 1000 * // (ms / s) * - s->bufferFrameCount / // frames / - wavfmt.Format.nSamplesPerSec // (frames / s) - + 0.5 // rounding - ); - } + if (s->bufferFrameCount < size) { + s->bufferFrameCount = size; + s->hnsRequestedDuration = // hns = + (REFERENCE_TIME)( + 10000.0 * // (hns / ms) * + 1000 * // (ms / s) * + s->bufferFrameCount / // frames / + wavfmt.Format.nSamplesPerSec // (frames / s) + + 0.5 // rounding + ); } hr = s->pAudioClient->lpVtbl->Initialize (s->pAudioClient, - sharemode, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + sharemode, AUDCLNT_STREAMFLAGS_NOPERSIST, s->hnsRequestedDuration, s->wasapiexclusive ? s->hnsRequestedDuration : 0, pwfx ? pwfx : &wavfmt.Format, NULL); if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) { hr = s->pAudioClient->lpVtbl->GetBufferSize (s->pAudioClient, &s->bufferFrameCount); @@ -880,21 +865,14 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) goto error; } hr = s->pAudioClient->lpVtbl->Initialize (s->pAudioClient, - sharemode, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, - s->hnsRequestedDuration, s->wasapiexclusive ? s->hnsRequestedDuration : 0, &wavfmt.Format, NULL); + sharemode, AUDCLNT_STREAMFLAGS_NOPERSIST, + s->hnsRequestedDuration, s->wasapiexclusive ? s->hnsRequestedDuration : 0, pwfx ? pwfx : &wavfmt.Format, NULL); } if (FAILED (hr)) { write_log (L"WASAPI: Initialize() %08X\n", hr); goto error; } - s->wasapihandle = CreateEvent(NULL, FALSE, FALSE, NULL); - hr = s->pAudioClient->lpVtbl->SetEventHandle (s->pAudioClient, s->wasapihandle); - if (FAILED (hr)) { - write_log (L"WASAPI: SetEventHandle() %08X\n", hr); - goto error; - } - hr = s->pAudioClient->lpVtbl->GetBufferSize (s->pAudioClient, &s->bufferFrameCount); if (FAILED (hr)) { write_log (L"WASAPI: GetBufferSize() %08X\n", hr); @@ -915,7 +893,7 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) write_log (L"WASAPI: GetService(IID_IAudioRenderClient) %08X\n", hr); goto error; } - +#if 0 hr = s->pAudioClient->lpVtbl->GetService (s->pAudioClient, &XIID_IAudioClock, (void**)&s->pAudioClock); if (FAILED (hr)) { write_log (L"WASAPI: GetService(IID_IAudioClock) %08X\n", hr); @@ -925,16 +903,12 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) write_log (L"WASAPI: GetFrequency() %08X\n", hr); } } - - if (s->wasapiexclusive) { - sd->sndbufsize = s->bufferFrameCount * sd->channels * 16 / 8; - } else { - int v = s->bufferFrameCount * sd->channels * 16 / 8; - v /= 2; - if (sd->sndbufsize > v) - sd->sndbufsize = v; - s->wasapigoodsize =s->bufferFrameCount / 2; - } +#endif + v = s->bufferFrameCount * sd->channels * 16 / 8; + v /= 2; + if (sd->sndbufsize > v) + sd->sndbufsize = v; + s->wasapigoodsize =s->bufferFrameCount / 2; s->sndbufframes = sd->sndbufsize / (sd->channels * 16 / 8); write_log(L"WASAPI: '%s'\nWASAPI: EX=%d CH=%d FREQ=%d BUF=%d (%d)\n", @@ -1267,6 +1241,13 @@ static void disable_sound (void) currprefs.produce_sound = changed_prefs.produce_sound = 1; } +static void reopen_sound (void) +{ + close_sound (); + open_sound (); +} + + #ifdef JIT extern uae_u8* compiled_code; #else @@ -1500,8 +1481,8 @@ int blocking_sound_device (struct sound_data *sd) } else if (sd->devicetype == SOUND_DEVICE_WASAPI) { - if (WaitForSingleObject (s->wasapihandle, 0) == WAIT_TIMEOUT) - return 0; +// if (WaitForSingleObject (s->wasapihandle, 0) == WAIT_TIMEOUT) +// return 0; return 1; } @@ -1568,6 +1549,9 @@ static void finish_sound_buffer_wasapi (struct sound_data *sd, uae_u16 *sndbuffe BYTE *pData; DWORD v; double skipmode; + int numFramesPadding, avail; + int stuck = 2000; + int oldpadding = 0; if (sd->paused) return; @@ -1577,93 +1561,38 @@ static void finish_sound_buffer_wasapi (struct sound_data *sd, uae_u16 *sndbuffe s->sndbuf = s->sndbuf / s->framecounter; s->framecounter = 2; } - if (s->wasapiexclusive) { - - v = WaitForSingleObject (s->wasapihandle, 0); - if (v == WAIT_OBJECT_0) { - gui_data.sndbuf_status = -1; - statuscnt = SND_STATUSCNT; - pause_audio_wasapi (sd); - resume_audio_wasapi (sd); - return; - } else if (v == WAIT_TIMEOUT) { - if (WaitForSingleObject (s->wasapihandle, 2000) != WAIT_OBJECT_0) { - write_log (L"WASAPI: event timed out\n"); - return; - } - } else { - return; - } - - if (s->wasapiclock) { - - double v, v2; - UINT64 pos; - hr = s->pAudioClock->lpVtbl->GetPosition (s->pAudioClock, &pos, NULL); - if (FAILED (hr)) - return; - v = (double)pos; - v /= s->wasapiclock; - v2 = s->wasapiframes / (double)sd->freq; - v = v2 - v; - v2 = v * 10000.0 / ((double)s->bufferFrameCount / (double)sd->freq); - s->sndbuf += v2 + 10000.0; - gui_data.sndbuf = s->sndbuf / s->framecounter; - if ((s->framecounter & 7) == 7) { - skipmode = sync_sound (gui_data.sndbuf / 70.0); - sound_setadjust (skipmode); - } - - } - - hr = s->pRenderClient->lpVtbl->GetBuffer (s->pRenderClient, s->bufferFrameCount, &pData); + + for (;;) { + hr = s->pAudioClient->lpVtbl->GetCurrentPadding (s->pAudioClient, &numFramesPadding); if (FAILED (hr)) { - write_log (L"WASAPI: GetBuffer() %08X\n", hr); + write_log (L"WASAPI: GetCurrentPadding() %08X\n", hr); return; } - memcpy (pData, sndbuffer, s->bufferFrameCount * sd->channels * 16 / 8); - hr = s->pRenderClient->lpVtbl->ReleaseBuffer (s->pRenderClient, s->bufferFrameCount, 0); - s->wasapiframes += s->bufferFrameCount; - - } else { - - int numFramesPadding, avail; - int stuck = 2000; - int oldpadding = 0; - - for (;;) { - hr = s->pAudioClient->lpVtbl->GetCurrentPadding (s->pAudioClient, &numFramesPadding); - if (FAILED (hr)) { - write_log (L"WASAPI: GetCurrentPadding() %08X\n", hr); + avail = s->bufferFrameCount - numFramesPadding; + if (avail >= s->sndbufframes) + break; + gui_data.sndbuf_status = 1; + statuscnt = SND_STATUSCNT; + sleep_millis (1); + if (oldpadding == numFramesPadding) { + if (stuck-- < 0) { + write_log (L"WASAPI: sound stuck %d %d %d !?\n", s->bufferFrameCount, numFramesPadding, s->sndbufframes); + reopen_sound (); return; } - avail = s->bufferFrameCount - numFramesPadding; - if (avail >= s->sndbufframes) - break; - gui_data.sndbuf_status = 1; - statuscnt = SND_STATUSCNT; - sleep_millis (1); - if (oldpadding == numFramesPadding) { - if (stuck-- < 0) { - write_log (L"WASAPI: sound stuck %d %d %d !?\n", s->bufferFrameCount, numFramesPadding, s->sndbufframes); - disable_sound (); - return; - } - } - oldpadding = numFramesPadding; - } - s->sndbuf += (s->wasapigoodsize - avail) * 1000 / s->wasapigoodsize; - gui_data.sndbuf = s->sndbuf / s->framecounter; - if (s->framecounter == 2) { - skipmode = sync_sound (gui_data.sndbuf / 70.0); - sound_setadjust (skipmode); } - hr = s->pRenderClient->lpVtbl->GetBuffer (s->pRenderClient, s->sndbufframes, &pData); - if (SUCCEEDED (hr)) { - memcpy (pData, sndbuffer, sd->sndbufsize); - s->pRenderClient->lpVtbl->ReleaseBuffer (s->pRenderClient, s->sndbufframes, 0); - } - + oldpadding = numFramesPadding; + } + s->sndbuf += (s->wasapigoodsize - avail) * 1000 / s->wasapigoodsize; + gui_data.sndbuf = s->sndbuf / s->framecounter; + if (s->framecounter == 2) { + skipmode = sync_sound (gui_data.sndbuf / 70.0); + sound_setadjust (skipmode); + } + hr = s->pRenderClient->lpVtbl->GetBuffer (s->pRenderClient, s->sndbufframes, &pData); + if (SUCCEEDED (hr)) { + memcpy (pData, sndbuffer, sd->sndbufsize); + s->pRenderClient->lpVtbl->ReleaseBuffer (s->pRenderClient, s->sndbufframes, 0); } } @@ -1803,7 +1732,7 @@ static void finish_sound_buffer_ds (struct sound_data *sd, uae_u16 *sndbuffer) if (counter < 0) { write_log (L"DSSOUND: sound system got stuck!?\n"); restore_ds (sd, DSERR_BUFFERLOST); - disable_sound (); + reopen_sound (); return; } continue; diff --git a/od-win32/sounddep/sound.h b/od-win32/sounddep/sound.h index 215af0d4..ffd0f248 100644 --- a/od-win32/sounddep/sound.h +++ b/od-win32/sounddep/sound.h @@ -6,6 +6,8 @@ * Copyright 1997 Bernd Schmidt */ +#define SOUNDSTUFF 1 + extern uae_u16 paula_sndbuffer[]; extern uae_u16 *paula_sndbufpt; extern int paula_sndbufsize; @@ -50,11 +52,15 @@ void set_volume_sound_device (struct sound_data *sd, int volume, int mute); int get_offset_sound_device (struct sound_data *sd); int blocking_sound_device (struct sound_data *sd); +#if SOUNDSTUFF > 0 +extern int outputsample, doublesample; +#endif + static uae_u16 *paula_sndbufpt_prev, *paula_sndbufpt_start; STATIC_INLINE void set_sound_buffers (void) { -#if 0 +#if SOUNDSTUFF > 0 paula_sndbufpt_prev = paula_sndbufpt_start; paula_sndbufpt_start = paula_sndbufpt; #endif @@ -62,7 +68,7 @@ STATIC_INLINE void set_sound_buffers (void) STATIC_INLINE void check_sound_buffers (void) { -#if 0 +#if SOUNDSTUFF > 0 int len; #endif @@ -80,7 +86,7 @@ STATIC_INLINE void check_sound_buffers (void) p[1] = sum >> 3; paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 4 * 2); } -#if 0 +#if SOUNDSTUFF > 0 if (outputsample == 0) return; len = paula_sndbufpt - paula_sndbufpt_start; @@ -98,7 +104,7 @@ STATIC_INLINE void check_sound_buffers (void) finish_sound_buffer (); paula_sndbufpt = paula_sndbuffer; } -#if 0 +#if SOUNDSTUFF > 0 while (doublesample-- > 0) { memcpy (paula_sndbufpt, paula_sndbufpt_start, len * 2); paula_sndbufpt += len; diff --git a/od-win32/win32.c b/od-win32/win32.c index e3b65987..39fb24e3 100644 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -652,10 +652,12 @@ static void winuae_active (HWND hWnd, int minimized) lcd_priority (1); #endif clipboard_active (hAmigaWnd, 1); +#if 0 if (os_vista && AVTask == NULL) { DWORD taskIndex = 0; - AVTask = AvSetMmThreadCharacteristics (TEXT("Pro Audio"), &taskIndex); + AVTask = AvSetMmThreadCharacteristics (TEXT("Games"), &taskIndex); } +#endif } static void winuae_inactive (HWND hWnd, int minimized) @@ -664,9 +666,11 @@ static void winuae_inactive (HWND hWnd, int minimized) int wasfocus = focus; write_log (L"winuae_inactive(%d)\n", minimized); +#if 0 if (AVTask) AvRevertMmThreadCharacteristics (AVTask); AVTask = NULL; +#endif if (minimized) exit_gui (0); focus = 0; diff --git a/od-win32/win32.h b/od-win32/win32.h index d674d7d6..6d0d51a5 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -17,8 +17,8 @@ #define WINUAEPUBLICBETA 1 -#define WINUAEBETA L"5" -#define WINUAEDATE MAKEBD(2009, 8, 6) +#define WINUAEBETA L"6" +#define WINUAEDATE MAKEBD(2009, 8, 9) #define WINUAEEXTRA L"" #define WINUAEREV L"" diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index bf1c2732..c69b2fd4 100644 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -608,7 +608,7 @@ static int popupmenu (HWND hwnd, TCHAR **items) HMENU menu; POINT pt; - menu = CreatePopupMenu(); + menu = CreatePopupMenu (); i = 0; while (items[i]) { MENUITEMINFO mii = { 0 }; diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index aecf226c..59eb664e 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,14 @@ +Beta 6: + +- STOP increased PC only by 2 if trace was active (copy protections..) +- WASAPI exclusive mode improved (final Windows 7 SDK had much better + examples than RC or Vista versions) +- restart sound (close and open) if sound gets stuck instead of killing + sound completely +- thread priority updates and fixes (perhaps this fixes reported slow + filesystem emulation) + Beta 5: Biggest A500 cycle-exact updates should be done now.