A few miscellaneous cleanups. (PR #1355)

Move DSXXX function to a more specific location.
. DSAvailable() is not implemented in SoundCore.
. DSInit() & DSUninit(); are only meaningful in Windows.
SoundBuffer: use plain C++ to clean it up as opposed to COM interfaces.
. which are only relevant to the Win32 implementation.
Remove 2 obsolete FMT macros.
NTSC: load bitmaps by resource id.
SoundBuffer: make creation of a SoundBuffer an atomic operation.
Fix 2019 solution.
This commit is contained in:
Andrea
2025-01-02 21:08:55 +00:00
committed by GitHub
parent 80af06db77
commit d7918d9ac9
17 changed files with 81 additions and 59 deletions
+7
View File
@@ -107,6 +107,7 @@
<ClInclude Include="source\SaveState.h" />
<ClInclude Include="source\SerialComms.h" />
<ClInclude Include="source\SNESMAX.h" />
<ClInclude Include="source\SoundBuffer.h" />
<ClInclude Include="source\SoundCore.h" />
<ClInclude Include="source\Speaker.h" />
<ClInclude Include="source\Speech.h" />
@@ -134,6 +135,7 @@
<ClInclude Include="source\W5100.h" />
<ClInclude Include="source\Windows\AppleWin.h" />
<ClInclude Include="source\Windows\DirectInput.h" />
<ClInclude Include="source\Windows\DXSoundBuffer.h" />
<ClInclude Include="source\Windows\HookFilter.h" />
<ClInclude Include="source\Windows\Win32Frame.h" />
<ClInclude Include="source\YamlHelper.h" />
@@ -264,6 +266,7 @@
<ClCompile Include="Source\VidHD.cpp" />
<ClCompile Include="source\Windows\AppleWin.cpp" />
<ClCompile Include="source\Windows\DirectInput.cpp" />
<ClCompile Include="source\Windows\DXSoundBuffer.cpp" />
<ClCompile Include="source\Windows\HookFilter.cpp" />
<ClCompile Include="source\Windows\Win32Frame.cpp" />
<ClCompile Include="source\Windows\WinFrame.cpp" />
@@ -298,14 +301,18 @@
<None Include="resource\Apple2.rom" />
<None Include="resource\Apple2e.rom" />
<None Include="resource\Apple2e_Enhanced.rom" />
<None Include="resource\Apple2e_Enhanced_Video.rom" />
<None Include="resource\Apple2_JPlus.rom" />
<None Include="resource\Apple2_JPlus_Video.rom" />
<None Include="resource\Apple2_Plus.rom" />
<None Include="resource\Apple2_Video.rom" />
<None Include="resource\Base64A.rom" />
<None Include="resource\Base64A_German_Video.rom" />
<None Include="resource\Disk2-13sector.rom" />
<None Include="resource\DISK2.rom" />
<None Include="resource\Freezes_Non-autostart_F8_Rom.rom" />
<None Include="resource\HDC-SmartPort.bin" />
<None Include="resource\Hddrvr-v2.bin" />
<None Include="resource\Hddrvr.bin" />
<None Include="resource\Mockingboard-D.rom" />
<None Include="resource\MouseInterface.rom" />
+13
View File
@@ -274,6 +274,9 @@
<ClCompile Include="source\MockingboardCardManager.cpp">
<Filter>Source Files\Emulator</Filter>
</ClCompile>
<ClCompile Include="source\Windows\DXSoundBuffer.cpp">
<Filter>Source Files\Windows</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="source\CommonVICE\6510core.h">
@@ -621,6 +624,12 @@
<ClInclude Include="source\MemoryDefs.h">
<Filter>Source Files\Emulator</Filter>
</ClInclude>
<ClInclude Include="source\SoundBuffer.h">
<Filter>Source Files\Emulator</Filter>
</ClInclude>
<ClInclude Include="source\Windows\DXSoundBuffer.h">
<Filter>Source Files\Windows</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="resource\Applewin.bmp">
@@ -808,6 +817,10 @@
<None Include="resource\Disk2-13sector.rom">
<Filter>Resource Files</Filter>
</None>
<None Include="resource\Hddrvr-v2.bin" />
<None Include="resource\HDC-SmartPort.bin" />
<None Include="resource\Apple2_Video.rom" />
<None Include="resource\Apple2e_Enhanced_Video.rom" />
</ItemGroup>
<ItemGroup>
<Text Include="docs\CodingConventions.txt">
+9 -9
View File
@@ -70,9 +70,9 @@ LED_CAPSOFF_P8_BITMAP BITMAP "LED_CAPS_OFF_P8.BMP"
LED_CAPSON_P8_BITMAP BITMAP "LED_CAPS_ON_P8.BMP"
LED_LATOFF_BITMAP BITMAP "LED_CAPS_OFF_LAT.BMP"
LED_LATON_BITMAP BITMAP "LED_CAPS_ON_LAT.BMP"
CHARSET82 BITMAP "CHARSET82.BMP"
CHARSET8M BITMAP "CHARSET8M.BMP"
CHARSET8C BITMAP "CHARSET8C.BMP"
IDB_CHARSET82 BITMAP "CHARSET82.bmp"
IDB_CHARSET8M BITMAP "CHARSET8M.bmp"
IDB_CHARSET8C BITMAP "CHARSET8C.bmp"
HELP_BUTTON BITMAP "HELP.BMP"
DRIVESWAP_BUTTON BITMAP "DRIVESWAP.BMP"
IDB_APPLEWIN BITMAP "ApplewinLogo.bmp"
@@ -327,8 +327,8 @@ END
// FIRMWARE
//
IDR_DISK2_13SECTOR_FW FIRMWARE "Disk2-13sector.rom"
IDR_DISK2_16SECTOR_FW FIRMWARE "Disk2.rom"
IDR_DISK2_13SECTOR_FW FIRMWARE "DISK2-13sector.rom"
IDR_DISK2_16SECTOR_FW FIRMWARE "DISK2.rom"
IDR_SSC_FW FIRMWARE "SSC.rom"
IDR_HDDRVR_FW FIRMWARE "Hddrvr.bin"
IDR_HDDRVR_V2_FW FIRMWARE "Hddrvr-v2.bin"
@@ -349,12 +349,12 @@ IDR_APPLE2_PLUS_ROM ROM "Apple2_Plus.rom"
IDR_APPLE2_JPLUS_ROM ROM "Apple2_JPlus.rom"
IDR_APPLE2E_ROM ROM "Apple2e.rom"
IDR_APPLE2E_ENHANCED_ROM ROM "Apple2e_Enhanced.rom"
IDR_PRAVETS_82_ROM ROM "Pravets82.rom"
IDR_PRAVETS_8M_ROM ROM "Pravets8M.rom"
IDR_PRAVETS_8C_ROM ROM "Pravets8C.rom"
IDR_PRAVETS_82_ROM ROM "PRAVETS82.ROM"
IDR_PRAVETS_8M_ROM ROM "PRAVETS8M.ROM"
IDR_PRAVETS_8C_ROM ROM "PRAVETS8C.ROM"
IDR_TK3000_2E_ROM ROM "TK3000e.rom"
IDR_BASE_64A_ROM ROM "Base64A.rom"
IDR_FREEZES_F8_ROM ROM "FREEZES_NON-AUTOSTART_F8_ROM.rom"
IDR_FREEZES_F8_ROM ROM "Freezes_Non-Autostart_F8_Rom.rom"
/////////////////////////////////////////////////////////////////////////////
//
+4 -1
View File
@@ -56,6 +56,9 @@
#define IDR_BASE64A_VIDEO_ROM 154
#define IDR_HDDRVR_V2_FW 155
#define IDR_HDC_SMARTPORT_FW 156
#define IDB_CHARSET8M 157
#define IDB_CHARSET82 158
#define IDB_CHARSET8C 159
#define IDC_KEYB_BUFFER_ENABLE 1005
#define IDC_SAVESTATE 1006
#define IDC_SAVESTATE_ON_EXIT 1007
@@ -138,7 +141,7 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 149
#define _APS_NEXT_RESOURCE_VALUE 160
#define _APS_NEXT_COMMAND_VALUE 40012
#define _APS_NEXT_CONTROL_VALUE 1083
#define _APS_NEXT_SYMED_VALUE 101
+2 -2
View File
@@ -43,14 +43,14 @@ public:
virtual int FrameMessageBox(LPCSTR lpText, LPCSTR lpCaption, UINT uType) = 0;
// this function merges LoadBitmap and GetBitmapBits from windows.h
virtual void GetBitmap(LPCSTR lpBitmapName, LONG cb, LPVOID lpvBits) = 0;
virtual void GetBitmap(WORD id, LONG cb, LPVOID lpvBits) = 0;
// create the network backed for Uthernet 1 and 2
// useful to use libslirp in Linux
virtual std::shared_ptr<NetworkBackend> CreateNetworkBackend(const std::string & interfaceName) = 0;
// create an object to write sound output to
virtual std::shared_ptr<SoundBuffer> CreateSoundBuffer() = 0;
virtual std::shared_ptr<SoundBuffer> CreateSoundBuffer(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate, int nChannels, LPCSTR pDevName) = 0;
// FindResource, MAKEINTRESOURCE, SizeofResource, LoadResource, LockResource
// Return pointer to resource if size is correct.
+6 -6
View File
@@ -71,12 +71,12 @@ static void get_csbits_xy(csbits_t csbits, UINT ch, UINT cx, UINT cy, const BYTE
}
}
static void get_csbits(csbits_t csbits, const char* resourceName, const UINT cy0)
static void get_csbits(csbits_t csbits, WORD id, const UINT cy0)
{
const UINT bufferSize = bitmapWidthBytes*bitmapHeight;
BYTE* pBuffer = new BYTE [bufferSize];
GetFrame().GetBitmap(resourceName, bufferSize, pBuffer);
GetFrame().GetBitmap(id, bufferSize, pBuffer);
for (UINT cy=cy0, ch=0; cy<cy0+16; cy++)
{
@@ -288,10 +288,10 @@ static void VideoRomForIIeEnhanced(void)
void make_csbits(void)
{
get_csbits(&csbits_pravets82[0], TEXT("CHARSET82"), 0); // Pravets 82
get_csbits(&csbits_pravets8M[0], TEXT("CHARSET8M"), 0); // Pravets 8M
get_csbits(&csbits_pravets8C[0], TEXT("CHARSET8C"), 0); // Pravets 8A / 8C: Alt char set off
get_csbits(&csbits_pravets8C[1], TEXT("CHARSET8C"), 16); // Pravets 8A / 8C: Alt char set on
get_csbits(&csbits_pravets82[0], IDB_CHARSET82, 0); // Pravets 82
get_csbits(&csbits_pravets8M[0], IDB_CHARSET8M, 0); // Pravets 8M
get_csbits(&csbits_pravets8C[0], IDB_CHARSET8C, 0); // Pravets 8A / 8C: Alt char set off
get_csbits(&csbits_pravets8C[1], IDB_CHARSET8C, 16); // Pravets 8A / 8C: Alt char set on
VideoRomForIIandIIPlus(); // GH#1308
VideoRomForIIeEnhanced(); // GH#1308
+3 -3
View File
@@ -5,9 +5,6 @@ class SoundBuffer
public:
virtual ~SoundBuffer() = default;
virtual HRESULT Init(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate, int nChannels, LPCSTR pDevName) = 0;
virtual HRESULT Release() = 0;
virtual HRESULT SetCurrentPosition(DWORD dwNewPosition) = 0;
virtual HRESULT GetCurrentPosition(LPDWORD lpdwCurrentPlayCursor, LPDWORD lpdwCurrentWriteCursor) = 0;
@@ -23,3 +20,6 @@ public:
virtual HRESULT GetStatus(LPDWORD lpdwStatus) = 0;
virtual HRESULT Restore() = 0;
};
// this must be reimplemented in each platform
bool DSAvailable();
+3 -7
View File
@@ -152,14 +152,10 @@ HRESULT DSGetSoundBuffer(VOICE* pVoice, uint32_t dwFlags, uint32_t dwBufferSize,
{
pVoice->name = pszDevName;
std::shared_ptr<SoundBuffer> soundBuffer = GetFrame().CreateSoundBuffer();
std::shared_ptr<SoundBuffer> soundBuffer = GetFrame().CreateSoundBuffer(dwFlags, dwBufferSize, nSampleRate, nChannels, pszDevName);
if (!soundBuffer)
return E_FAIL;
HRESULT hr = soundBuffer->Init(dwFlags, dwBufferSize, nSampleRate, nChannels, pszDevName);
if (FAILED(hr))
return hr;
pVoice->lpDSBvoice = soundBuffer;
_ASSERT(g_uNumVoices < uMAX_VOICES);
@@ -169,7 +165,7 @@ HRESULT DSGetSoundBuffer(VOICE* pVoice, uint32_t dwFlags, uint32_t dwBufferSize,
if(pVoice->bIsSpeaker)
g_pSpeakerVoice = pVoice;
return hr;
return DS_OK;
}
void DSReleaseSoundBuffer(VOICE* pVoice)
@@ -188,7 +184,7 @@ void DSReleaseSoundBuffer(VOICE* pVoice)
}
}
SAFE_RELEASE(pVoice->lpDSBvoice);
pVoice->lpDSBvoice.reset();
}
//-----------------------------------------------------------------------------
-4
View File
@@ -58,10 +58,6 @@ void SoundCore_SetErrorMax(const int nErrorMax);
void SoundCore_StopTimer();
bool DSInit();
void DSUninit();
bool DSAvailable();
LONG NewVolume(uint32_t dwVolume, uint32_t dwVolumeMax);
void SysClk_WaitTimer();
+2 -1
View File
@@ -996,7 +996,8 @@ bool Spkr_DSInit()
hr = SpeakerVoice.lpDSBvoice->GetCurrentPosition(&dwCurrentPlayCursor, &dwCurrentWriteCursor);
LogFileOutput("Spkr_DSInit: GetCurrentPosition kludge (%08X)\n", (uint32_t)hr);
LogOutput("[DSInit] PC=%08" DWORD_T_FMT ", WC=%08" DWORD_T_FMT ", Diff=%08" DWORD_T_FMT "\n", dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor);
LogOutput("[DSInit] PC=%08X, WC=%08X, Diff=%08X\n", (uint32_t)dwCurrentPlayCursor,
(uint32_t)dwCurrentWriteCursor, (uint32_t)(dwCurrentWriteCursor-dwCurrentPlayCursor));
}
return true;
-6
View File
@@ -59,15 +59,11 @@ typedef UINT64 uint64_t;
#if _MSC_VER < 1900
#ifdef _WIN64
#define SIZE_T_FMT "llu"
#define PTRDIFF_T_FMT "lld"
#else
#define SIZE_T_FMT "lu"
#define PTRDIFF_T_FMT "ld"
#endif
#else
#define SIZE_T_FMT "zu"
#define PTRDIFF_T_FMT "td"
#define DWORD_T_FMT "lX"
#endif
#else // !_WIN32
@@ -89,7 +85,5 @@ typedef UINT64 uint64_t;
//#define USE_SPEECH_API
#define SIZE_T_FMT "zu"
#define PTRDIFF_T_FMT "td"
#define DWORD_T_FMT "X"
#endif // _WIN32
+1 -1
View File
@@ -43,7 +43,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "Riff.h"
#include "SaveState.h"
#include "SerialComms.h"
#include "SoundCore.h"
#include "Speaker.h"
#include "LanguageCard.h"
#include "CardManager.h"
@@ -51,6 +50,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "Speech.h"
#endif
#include "Windows/Win32Frame.h"
#include "Windows/DXSoundBuffer.h"
#include "RGBMonitor.h"
#include "NTSC.h"
+17 -8
View File
@@ -48,10 +48,10 @@ static UINT g_uDSInitRefCount = 0;
//-----------------------------------------------------------------------------
HRESULT DXSoundBuffer::Init(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate, int nChannels, LPCSTR pDevName)
std::shared_ptr<SoundBuffer> DXSoundBuffer::create(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate, int nChannels)
{
if (!g_lpDS)
return E_FAIL;
return NULL;
WAVEFORMATEX wavfmt;
DSBUFFERDESC dsbdesc;
@@ -69,21 +69,30 @@ HRESULT DXSoundBuffer::Init(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate
dsbdesc.lpwfxFormat = &wavfmt;
dsbdesc.dwFlags = dwFlags | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS;
LPDIRECTSOUNDBUFFER pBuffer;
// Are buffers released when g_lpDS OR m_pBuffer is released?
// . From DirectX doc:
// "Buffer objects are owned by the device object that created them. When the
// device object is released, all buffers created by that object are also released..."
return g_lpDS->CreateSoundBuffer(&dsbdesc, &m_pBuffer, NULL);
HRESULT hr = g_lpDS->CreateSoundBuffer(&dsbdesc, &pBuffer, NULL);
if (FAILED(hr))
{
LogFileOutput("DXSoundBuffer: CreateSoundBuffer(), hr=0x%08X\n", (uint32_t)hr);
return NULL;
}
return std::make_shared<DXSoundBuffer>(pBuffer);
}
HRESULT DXSoundBuffer::Release()
DXSoundBuffer::DXSoundBuffer(LPDIRECTSOUNDBUFFER pBuffer) : m_pBuffer(pBuffer)
{
if (!m_pBuffer)
return DS_OK;
_ASSERT(m_pBuffer);
}
DXSoundBuffer::~DXSoundBuffer()
{
HRESULT hr = m_pBuffer->Release();
m_pBuffer = NULL;
return hr;
}
HRESULT DXSoundBuffer::SetCurrentPosition(DWORD dwNewPosition)
+7 -4
View File
@@ -5,10 +5,10 @@
class DXSoundBuffer : public SoundBuffer
{
public:
~DXSoundBuffer() { Release(); }
static std::shared_ptr<SoundBuffer> create(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate, int nChannels);
virtual HRESULT Init(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate, int nChannels, LPCSTR pDevName);
virtual HRESULT Release();
DXSoundBuffer(LPDIRECTSOUNDBUFFER pBuffer);
virtual ~DXSoundBuffer();
virtual HRESULT SetCurrentPosition(DWORD dwNewPosition);
virtual HRESULT GetCurrentPosition(LPDWORD lpdwCurrentPlayCursor, LPDWORD lpdwCurrentWriteCursor);
@@ -26,5 +26,8 @@ public:
virtual HRESULT Restore();
private:
LPDIRECTSOUNDBUFFER m_pBuffer = NULL;
const LPDIRECTSOUNDBUFFER m_pBuffer;
};
bool DSInit();
void DSUninit();
+4 -4
View File
@@ -587,9 +587,9 @@ int Win32Frame::FrameMessageBox(LPCSTR lpText, LPCSTR lpCaption, UINT uType)
return MessageBox(handle, lpText, lpCaption, uType);
}
void Win32Frame::GetBitmap(LPCSTR lpBitmapName, LONG cb, LPVOID lpvBits)
void Win32Frame::GetBitmap(WORD id, LONG cb, LPVOID lpvBits)
{
HBITMAP hBitmap = LoadBitmap(g_hInstance, lpBitmapName);
HBITMAP hBitmap = LoadBitmap(g_hInstance, MAKEINTRESOURCE(id));
GetBitmapBits(hBitmap, cb, lpvBits);
DeleteObject(hBitmap);
}
@@ -632,7 +632,7 @@ std::shared_ptr<NetworkBackend> Win32Frame::CreateNetworkBackend(const std::stri
return backend;
}
std::shared_ptr<SoundBuffer> Win32Frame::CreateSoundBuffer()
std::shared_ptr<SoundBuffer> Win32Frame::CreateSoundBuffer(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate, int nChannels, LPCSTR pDevName)
{
return std::make_shared<DXSoundBuffer>();
return DXSoundBuffer::create(dwFlags, dwBufferSize, nSampleRate, nChannels);
}
+2 -2
View File
@@ -53,14 +53,14 @@ public:
virtual void ResizeWindow(void);
virtual int FrameMessageBox(LPCSTR lpText, LPCSTR lpCaption, UINT uType);
virtual void GetBitmap(LPCSTR lpBitmapName, LONG cb, LPVOID lpvBits);
virtual void GetBitmap(WORD id, LONG cb, LPVOID lpvBits);
virtual BYTE* GetResource(WORD id, LPCSTR lpType, uint32_t expectedSize);
virtual void Restart();
virtual std::string Video_GetScreenShotFolder() const;
virtual std::shared_ptr<NetworkBackend> CreateNetworkBackend(const std::string& interfaceName);
virtual std::shared_ptr<SoundBuffer> CreateSoundBuffer();
virtual std::shared_ptr<SoundBuffer> CreateSoundBuffer(DWORD dwFlags, DWORD dwBufferSize, DWORD nSampleRate, int nChannels, LPCSTR pDevName);
bool GetFullScreenShowSubunitStatus(void);
bool GetWindowedModeShowDiskiiStatus(void);
+1 -1
View File
@@ -38,13 +38,13 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "Mockingboard.h"
#include "MouseInterface.h"
#include "Windows/DirectInput.h"
#include "Windows/DXSoundBuffer.h"
#include "NTSC.h"
#include "ParallelPrinter.h"
#include "Pravets.h"
#include "Registry.h"
#include "SaveState.h"
#include "SerialComms.h"
#include "SoundCore.h"
#include "Uthernet1.h"
#include "Uthernet2.h"
#include "Speaker.h"