mirror of https://github.com/OpenRCT2/OpenRCT2.git
remove windows-only code
Step 1 on road towards Linux. Remove windows-specific code, stub it out where needed and make sure we can still compile it the way it is. Take care of Travis' build matrix to include new build configuration. Install new packages.
This commit is contained in:
parent
30cccce98b
commit
4df8761831
|
@ -18,6 +18,9 @@ cache:
|
|||
env:
|
||||
- OPENRCT2_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt"
|
||||
- OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt"
|
||||
- OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt"
|
||||
- OPENRCT2_CMAKE_OPTS="-DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt"
|
||||
- OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8"
|
||||
|
||||
sudo: required
|
||||
|
||||
|
|
|
@ -26,8 +26,10 @@ project(${PROJECT})
|
|||
add_definitions(-DORCT2_RESOURCE_DIR="${ORCT2_RESOURCE_DIR}")
|
||||
add_definitions(-DHAVE_CONFIG_H)
|
||||
add_definitions(-DCURL_STATICLIB)
|
||||
#uncomment the line bellow if you don't want to build openrct2 with twitch integration
|
||||
#add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH)
|
||||
option(DISABLE_HTTP_TWITCH "Disable HTTP and Twitch support.")
|
||||
if (DISABLE_HTTP_TWITCH)
|
||||
add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH)
|
||||
endif (DISABLE_HTTP_TWITCH)
|
||||
|
||||
option(DISABLE_NETWORK "Disable multiplayer functionality. Mainly for testing.")
|
||||
if (DISABLE_NETWORK)
|
||||
|
@ -37,7 +39,7 @@ endif (DISABLE_NETWORK)
|
|||
set(ORCTLIBS_INCLUDE /usr/local/cross-tools/orctlibs/include)
|
||||
set(JANSSON_INCLUDE /usr/local/cross-tools/orctlibs/include/jansson)
|
||||
set(ORCTLIBS_LIB_DIR /usr/local/cross-tools/orctlibs/lib)
|
||||
set(ORCTLIBS_LIB jansson curl ssl crypto ws2_32)
|
||||
set(ORCTLIBS_LIB jansson curl ssl crypto)
|
||||
|
||||
# include lib
|
||||
include_directories("lib/")
|
||||
|
@ -75,6 +77,6 @@ set_target_properties(${PROJECT} PROPERTIES PREFIX "")
|
|||
TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB})
|
||||
|
||||
if (WIN32)
|
||||
target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound)
|
||||
target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound ws2_32)
|
||||
endif (WIN32)
|
||||
|
||||
|
|
63
Dockerfile
63
Dockerfile
|
@ -1,43 +1,60 @@
|
|||
FROM nfnty/arch-mini
|
||||
MAINTAINER s0r00t
|
||||
ENV DISPLAY :0
|
||||
|
||||
RUN pacman -Syyu --noconfirm
|
||||
RUN pacman -S --noconfirm git yajl cmake wget unzip wine
|
||||
RUN pacman -S --noconfirm git curl jshon expac
|
||||
RUN pacman -S --noconfirm --needed base-devel
|
||||
RUN pacman -S --noconfirm yajl
|
||||
|
||||
RUN useradd -mg root travis
|
||||
RUN usermod -aG wheel travis
|
||||
RUN sed -i 's/# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/g' /etc/sudoers
|
||||
|
||||
USER travis
|
||||
WORKDIR /tmp
|
||||
RUN curl -sL https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=package-query -o PKGBUILD
|
||||
USER travis
|
||||
RUN curl -sLO https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=package-query
|
||||
RUN mv PKGBUILD?h=package-query PKGBUILD
|
||||
RUN makepkg
|
||||
USER root
|
||||
RUN pacman --noconfirm -U *.pkg.tar.xz
|
||||
USER travis
|
||||
RUN curl -sL https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=yaourt -o PKGBUILD
|
||||
RUN curl -sLO https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=yaourt
|
||||
RUN mv PKGBUILD?h=yaourt PKGBUILD
|
||||
RUN makepkg
|
||||
USER root
|
||||
RUN pacman --noconfirm -U *.pkg.tar.xz
|
||||
|
||||
RUN pacman -R --noconfirm gcc
|
||||
RUN yes | pacman -S gcc-libs-multilib
|
||||
RUN pacman -S --noconfirm gcc-multilib cmake
|
||||
RUN pacman -S --noconfirm cmake
|
||||
USER travis
|
||||
RUN yaourt -S --noconfirm mingw-w64-headers
|
||||
RUN yaourt -S --noconfirm mingw-w64-gcc
|
||||
RUN yaourt -S --noconfirm wine
|
||||
RUN yaourt -S --noconfirm mingw-w64-zlib mingw-w64-pkg-config
|
||||
RUN gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys D9C4D26D0E604491 BB5869F064EA74AB 9D5EAAF69013B842 D605848ED7E69871 4DE8FF2A63C7CC90
|
||||
RUN yaourt -S --noconfirm mingw-w64-gcc mingw-w64-zlib mingw-w64-pkg-config mingw-w64-openssl mingw-w64-jansson mingw-w64-libtasn1 mingw-w64-gmp mingw-w64-nettle mingw-w64-libffi mingw-w64-p11-kit mingw-w64-readline mingw-w64-gnutls mingw-w64-libunistring mingw-w64-termcap mingw-w64-libidn mingw-w64-curl mingw-w64-expat mingw-w64-libdbus mingw-w64-sdl2 mingw-w64-sdl2_ttf mingw-w64-configure
|
||||
USER root
|
||||
RUN pacman --noconfirm -Rns $(pacman -Qttdq)
|
||||
RUN pacman -Scc --noconfirm
|
||||
WORKDIR /tmp
|
||||
RUN rm -r *
|
||||
WORKDIR /home/travis
|
||||
USER travis
|
||||
RUN git clone https://github.com/OpenRCT2/OpenRCT2
|
||||
WORKDIR OpenRCT2
|
||||
RUN ln -s /usr/i686-w64-mingw32/bin/libfreetype-6.dll
|
||||
RUN ln -s /usr/i686-w64-mingw32/bin/libwinpthread-1.dll
|
||||
RUN ln -s /usr/i686-w64-mingw32/bin/SDL2_ttf.dll
|
||||
RUN ln -s /usr/i686-w64-mingw32/bin/SDL2.dll
|
||||
RUN ln -s /usr/i686-w64-mingw32/bin/libbz2-1.dll
|
||||
RUN ./install.sh
|
||||
RUN ./build.sh
|
||||
RUN yaourt -S --noconfirm mingw-w64-openssl
|
||||
RUN yaourt -S --noconfirm mingw-w64-jansson
|
||||
RUN yaourt -S --noconfirm mingw-w64-libtasn1
|
||||
RUN yaourt -S --noconfirm mingw-w64-gmp
|
||||
RUN yaourt -S --noconfirm mingw-w64-nettle
|
||||
RUN yaourt -S --noconfirm mingw-w64-libffi
|
||||
RUN yaourt -S --noconfirm mingw-w64-p11-kit
|
||||
RUN yaourt -S --noconfirm mingw-w64-readline
|
||||
RUN yaourt -S --noconfirm mingw-w64-gnutls
|
||||
RUN yaourt -S --noconfirm mingw-w64-libunistring
|
||||
RUN yaourt -S --noconfirm mingw-w64-termcap
|
||||
RUN yaourt -S --noconfirm mingw-w64-gettext
|
||||
RUN yaourt -S --noconfirm mingw-w64-libidn
|
||||
RUN yaourt -S --noconfirm mingw-w64-curl
|
||||
RUN yaourt -S --noconfirm mingw-w64-expat
|
||||
RUN yaourt -S --noconfirm mingw-w64-libdbus
|
||||
RUN yaourt -S --noconfirm mingw-w64-sdl2
|
||||
RUN yaourt -S --noconfirm mingw-w64-sdl2_ttf
|
||||
RUN yaourt -S --noconfirm wget unzip
|
||||
RUN yaourt -S --noconfirm lib32-jansson lib32-curl lib32-sdl2 lib32-sdl2_ttf
|
||||
RUN yaourt -S --noconfirm lib32-speex
|
||||
#RUN git clone https://github.com/OpenRCT2/OpenRCT2
|
||||
#WORKDIR /tmp/OpenRCT2
|
||||
#RUN ./install.sh
|
||||
#RUN ./build.sh
|
||||
|
|
13
install.sh
13
install.sh
|
@ -74,7 +74,9 @@ if [[ `uname` == "Darwin" ]]; then
|
|||
popd
|
||||
fi
|
||||
elif [[ `uname` == "Linux" ]]; then
|
||||
sudo dpkg --add-architecture i386
|
||||
if [[ ! -z "$TRAVIS" ]]; then
|
||||
sudo dpkg --add-architecture i386
|
||||
fi
|
||||
sudo apt-get update
|
||||
if [[ -z "$TRAVIS" ]]; then
|
||||
sudo apt-get install -y binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake
|
||||
|
@ -85,7 +87,9 @@ elif [[ `uname` == "Linux" ]]; then
|
|||
apt-cache search libsdl2
|
||||
apt-cache policy libsdl2-dev:i386
|
||||
apt-cache policy libsdl2-dev
|
||||
sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386
|
||||
sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386
|
||||
export CC=gcc-4.8
|
||||
export CXX=g++-4.8
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -148,6 +152,11 @@ if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then
|
|||
echo -e "#!/bin/sh\nexport PKG_CONFIG_LIBDIR=/usr/local/cross-tools/i686-w64-mingw32/lib/pkgconfig\npkg-config \$@" > $cachedir/i686-w64-mingw32-pkg-config;
|
||||
fi
|
||||
|
||||
set -x
|
||||
dpkg -L libsdl2-dev
|
||||
dpkg -L libsdl2-ttf-dev
|
||||
set +x
|
||||
|
||||
chmod +x $cachedir/i686-w64-mingw32-pkg-config
|
||||
sudo cp $cachedir/i686-w64-mingw32-pkg-config /usr/local/bin/
|
||||
|
||||
|
|
|
@ -18,7 +18,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <dsound.h>
|
||||
#endif // _WIN32
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../config.h"
|
||||
|
@ -41,11 +43,13 @@ typedef struct {
|
|||
uint32 var_110;
|
||||
uint32 var_114;
|
||||
uint32 var_118;
|
||||
#ifdef _WIN32
|
||||
HGLOBAL hmem; // 0x11C
|
||||
HMMIO hmmio; // 0x120
|
||||
MMCKINFO mmckinfo1; // 0x124
|
||||
MMCKINFO mmckinfo2; // 0x138
|
||||
LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C
|
||||
#endif // _WIN32
|
||||
uint32 bufsize; // 0x150
|
||||
uint32 playpos; // 0x154
|
||||
uint32 var_158;
|
||||
|
@ -57,7 +61,9 @@ typedef struct {
|
|||
|
||||
struct rct_sound_effect {
|
||||
uint32 size;
|
||||
#ifdef _WIN32
|
||||
WAVEFORMATEX format;
|
||||
#endif // _WIN32
|
||||
uint8* data;
|
||||
};
|
||||
|
||||
|
@ -73,6 +79,7 @@ void *gCrowdSoundChannel = 0;
|
|||
void *gTitleMusicChannel = 0;
|
||||
bool gGameSoundsOff = false;
|
||||
|
||||
#ifdef _WIN32
|
||||
void audio_timefunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel);
|
||||
int sound_effect_loadvars(struct rct_sound_effect* sound_effect, LPWAVEFORMATEX* waveformat, char** data, DWORD* buffersize);
|
||||
MMRESULT mmio_open(const char* filename, HMMIO* hmmio, HGLOBAL* hmem, LPMMCKINFO mmckinfo);
|
||||
|
@ -86,6 +93,7 @@ int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size);
|
|||
void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem);
|
||||
LPVOID map_file(LPCWSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap);
|
||||
int unmap_file(LPCVOID base);
|
||||
#endif // _WIN32
|
||||
|
||||
void audio_init(int i)
|
||||
{
|
||||
|
@ -126,6 +134,7 @@ void audio_get_devices()
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00401000
|
||||
|
@ -329,6 +338,7 @@ int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DW
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -336,6 +346,7 @@ int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DW
|
|||
*/
|
||||
int sub_40153B(int channel)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel];
|
||||
if (sound_channel->var_4) {
|
||||
if (sound_channel->hmmio) {
|
||||
|
@ -354,6 +365,9 @@ int sub_40153B(int channel)
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -369,6 +383,7 @@ int sub_4015E7(int channel)
|
|||
int buf2size;
|
||||
int read;
|
||||
int zero = 0;
|
||||
#ifdef _WIN32
|
||||
rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel];
|
||||
LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel];
|
||||
int result = dsbuffer->lpVtbl->Lock(dsbuffer, 0, sound_channel->bufsize, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, (LPDWORD)&buf2size, 0);
|
||||
|
@ -401,6 +416,10 @@ int sub_4015E7(int channel)
|
|||
sound_channel->playpos = 0;
|
||||
}
|
||||
return result;
|
||||
#else
|
||||
STUB();
|
||||
return 0;
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -409,6 +428,7 @@ int sub_4015E7(int channel)
|
|||
*/
|
||||
int sound_channel_load_file(int channel, const char* filename, int offset)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel];
|
||||
sound_channel->hmem;
|
||||
sound_channel->hmmio;
|
||||
|
@ -441,9 +461,13 @@ int sound_channel_load_file(int channel, const char* filename, int offset)
|
|||
sub_4015E7(channel);
|
||||
sound_channel->var_158 = offset;
|
||||
sound_channel->stopped = 0;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00401822
|
||||
|
@ -467,6 +491,7 @@ int mmio_open_channel(int channel, char* filename, LONG offset)
|
|||
sound_channel->var_158 = offset;
|
||||
return 0;
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -474,6 +499,7 @@ int mmio_open_channel(int channel, char* filename, LONG offset)
|
|||
*/
|
||||
int audio_create_timer()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (RCT2_GLOBAL(0x009E1AA4, int)) {
|
||||
return 0;
|
||||
}
|
||||
|
@ -485,6 +511,9 @@ int audio_create_timer()
|
|||
if (!RCT2_GLOBAL(0x009E1AA0, MMRESULT)) {
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
RCT2_GLOBAL(0x009E1AA4, int) = 1;
|
||||
return 1;
|
||||
}
|
||||
|
@ -498,6 +527,7 @@ int audio_remove_timer()
|
|||
for (int i = 0; i < 4; i++) {
|
||||
sound_channel_stop(i);
|
||||
}
|
||||
#ifdef _WIN32
|
||||
if (RCT2_GLOBAL(0x009E1AA4, int)) {
|
||||
timeKillEvent(RCT2_GLOBAL(0x009E1AA0, MMRESULT));
|
||||
timeEndPeriod(50);
|
||||
|
@ -508,6 +538,9 @@ int audio_remove_timer()
|
|||
RCT2_GLOBAL(0x009E1AA4, int) = 0;
|
||||
return result;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -536,6 +569,7 @@ int sound_channel_load_file2(int channel, const char* filename, int offset)
|
|||
*/
|
||||
int sound_channel_play(int channel, int a2, int volume, int pan, int frequency)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel];
|
||||
sound_channel->var_164 = a2;
|
||||
sound_channel_set_frequency(channel, frequency);
|
||||
|
@ -545,6 +579,9 @@ int sound_channel_play(int channel, int a2, int volume, int pan, int frequency)
|
|||
dsbuffer->lpVtbl->SetCurrentPosition(dsbuffer, 0);
|
||||
dsbuffer->lpVtbl->Play(dsbuffer, 0, 0, DSBPLAY_LOOPING);
|
||||
sound_channel->playing = 1;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -554,6 +591,7 @@ int sound_channel_play(int channel, int a2, int volume, int pan, int frequency)
|
|||
*/
|
||||
int sound_channel_stop(int channel)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel];
|
||||
sound_channel->playing = 0;
|
||||
sound_channel->stopped = 1;
|
||||
|
@ -571,6 +609,9 @@ int sound_channel_stop(int channel)
|
|||
RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel] = 0;
|
||||
}
|
||||
_InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 0);
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -580,12 +621,16 @@ int sound_channel_stop(int channel)
|
|||
*/
|
||||
int sound_channel_set_frequency(int channel, int frequency)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel];
|
||||
if (dsbuffer) {
|
||||
if (SUCCEEDED(dsbuffer->lpVtbl->SetFrequency(dsbuffer, frequency)))
|
||||
return 1;
|
||||
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -595,12 +640,16 @@ int sound_channel_set_frequency(int channel, int frequency)
|
|||
*/
|
||||
int sound_channel_set_pan(int channel, int pan)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel];
|
||||
if (dsbuffer) {
|
||||
if (SUCCEEDED(dsbuffer->lpVtbl->SetPan(dsbuffer, pan)))
|
||||
return 1;
|
||||
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -610,12 +659,16 @@ int sound_channel_set_pan(int channel, int pan)
|
|||
*/
|
||||
int sound_channel_set_volume(int channel, int volume)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel];
|
||||
if (dsbuffer) {
|
||||
if (SUCCEEDED(dsbuffer->lpVtbl->SetVolume(dsbuffer, volume)))
|
||||
return 1;
|
||||
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -668,6 +721,7 @@ int sound_channel_is_playing(int channel)
|
|||
int audio_release()
|
||||
{
|
||||
sound_stop_all();
|
||||
#ifdef _WIN32
|
||||
if (RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)) {
|
||||
RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->Release(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER));
|
||||
RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER) = 0;
|
||||
|
@ -682,6 +736,10 @@ int audio_release()
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0;
|
||||
}
|
||||
return result;
|
||||
#else
|
||||
STUB();
|
||||
return 0;
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -690,6 +748,7 @@ int audio_release()
|
|||
*/
|
||||
int map_sound_effects(const char* filename)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)) {
|
||||
return 0;
|
||||
} else {
|
||||
|
@ -698,6 +757,10 @@ int map_sound_effects(const char* filename)
|
|||
free(wcFilename);
|
||||
return RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) != 0;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
return 0;
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -706,12 +769,16 @@ int map_sound_effects(const char* filename)
|
|||
*/
|
||||
int unmap_sound_effects()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)) {
|
||||
sound_stop_all();
|
||||
unmap_file(RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) = 0;
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -721,6 +788,7 @@ int unmap_sound_effects()
|
|||
*/
|
||||
int sound_prepare(int sound_id, rct_sound *sound, int channels, int software)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
DSBUFFERDESC bufferdesc;
|
||||
char* buffer = 0;
|
||||
memset(&bufferdesc, 0, sizeof(bufferdesc));
|
||||
|
@ -772,6 +840,9 @@ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software)
|
|||
sound->dsbuffer = 0;
|
||||
}
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -781,6 +852,7 @@ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software)
|
|||
*/
|
||||
int sound_duplicate(rct_sound* newsound, rct_sound* sound)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->DuplicateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), sound->dsbuffer, &newsound->dsbuffer))) {
|
||||
return 0;
|
||||
} else {
|
||||
|
@ -790,6 +862,10 @@ int sound_duplicate(rct_sound* newsound, rct_sound* sound)
|
|||
sound_add(newsound);
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
return 1;
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -798,11 +874,15 @@ int sound_duplicate(rct_sound* newsound, rct_sound* sound)
|
|||
*/
|
||||
int sound_stop(rct_sound* sound)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (sound->dsbuffer) {
|
||||
sound->dsbuffer->lpVtbl->Release(sound->dsbuffer);
|
||||
sound->dsbuffer = 0;
|
||||
return sound_remove(sound) ? 1 : 0;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -825,6 +905,7 @@ int sound_stop_all()
|
|||
*/
|
||||
void sound_bufferlost_check()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
rct_sound* sound = RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*);
|
||||
while (sound && sound != RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*)) {
|
||||
DWORD status;
|
||||
|
@ -835,6 +916,9 @@ void sound_bufferlost_check()
|
|||
}
|
||||
sound = sound->next;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -842,6 +926,7 @@ void sound_bufferlost_check()
|
|||
* rct2: 0x00404E53
|
||||
*/
|
||||
int sound_is_playing(rct_sound* sound){
|
||||
#ifdef _WIN32
|
||||
if (sound->dsbuffer) {
|
||||
DWORD status;
|
||||
if (SUCCEEDED(sound->dsbuffer->lpVtbl->GetStatus(sound->dsbuffer, &status))) {
|
||||
|
@ -850,6 +935,9 @@ int sound_is_playing(rct_sound* sound){
|
|||
|
||||
}
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -859,6 +947,7 @@ int sound_is_playing(rct_sound* sound){
|
|||
*/
|
||||
int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (sound->dsbuffer) {
|
||||
sound_set_frequency(sound, frequency);
|
||||
sound_set_pan(sound, pan);
|
||||
|
@ -876,6 +965,9 @@ int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency
|
|||
return 1;
|
||||
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -885,11 +977,15 @@ int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency
|
|||
*/
|
||||
int sound_set_frequency(rct_sound* sound, int frequency)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (sound->dsbuffer) {
|
||||
if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetFrequency(sound->dsbuffer, frequency)))
|
||||
return 1;
|
||||
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -899,11 +995,15 @@ int sound_set_frequency(rct_sound* sound, int frequency)
|
|||
*/
|
||||
int sound_set_pan(rct_sound* sound, int pan)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (sound->dsbuffer) {
|
||||
if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetPan(sound->dsbuffer, pan)))
|
||||
return 1;
|
||||
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -913,11 +1013,15 @@ int sound_set_pan(rct_sound* sound, int pan)
|
|||
*/
|
||||
int sound_set_volume(rct_sound* sound, int volume)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (sound->dsbuffer) {
|
||||
if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetVolume(sound->dsbuffer, volume)))
|
||||
return 1;
|
||||
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -927,9 +1031,13 @@ int sound_set_volume(rct_sound* sound, int volume)
|
|||
*/
|
||||
int sound_load3dparameters()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->GetAllParameters(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), &RCT2_GLOBAL(0x009A6084, DS3DBUFFER)))) {
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -945,6 +1053,7 @@ int sound_load3dposition()
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00404F85
|
||||
|
@ -1017,6 +1126,7 @@ int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -1091,6 +1201,7 @@ rct_sound* sound_remove(rct_sound* sound)
|
|||
*/
|
||||
int sound_bufferlost_restore(rct_sound* sound)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
DWORD buffersize = 0;
|
||||
LPWAVEFORMATEX waveformat = 0;
|
||||
char* data = 0;
|
||||
|
@ -1102,6 +1213,9 @@ int sound_bufferlost_restore(rct_sound* sound)
|
|||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1111,12 +1225,17 @@ int sound_bufferlost_restore(rct_sound* sound)
|
|||
*/
|
||||
struct rct_sound_effect* sound_get_effect(uint16 sound_id)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) && sound_id < RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[0]) {
|
||||
return (struct rct_sound_effect*)(RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, int) + RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[sound_id + 1]);
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00405222
|
||||
|
@ -1458,6 +1577,7 @@ int get_dsound_devices()
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -1734,6 +1854,7 @@ void stop_title_music()
|
|||
void audio_init1()
|
||||
{
|
||||
int devicenum = 0;
|
||||
#ifdef _WIN32
|
||||
if (RCT2_GLOBAL(0x009AAC5C, uint8)) {
|
||||
rct_dsdevice* dsdevice = &RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[0];
|
||||
while (dsdevice->guid.Data1 != RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID).Data1 ||
|
||||
|
@ -1763,6 +1884,9 @@ void audio_init1()
|
|||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1782,7 +1906,12 @@ void audio_init2(int device)
|
|||
other_sound->id = 0xFFFF;
|
||||
}
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 1;
|
||||
#ifdef _WIN32
|
||||
int successdsound = dsound_create_primary_buffer(0, device, 2, 22050, 16);
|
||||
#else
|
||||
int successdsound = 0;
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 0;
|
||||
if (!successdsound) {
|
||||
return;
|
||||
|
@ -1799,7 +1928,11 @@ void audio_init2(int device)
|
|||
}
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = device;
|
||||
rct_dsdevice dsdevice = RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[device];
|
||||
#ifdef _WIN32
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID) = dsdevice.guid;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
RCT2_GLOBAL(0x009AAC5C, uint8) = 1;
|
||||
config_save_default();
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 1;
|
||||
|
|
|
@ -8,12 +8,12 @@
|
|||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
@ -21,7 +21,9 @@
|
|||
#ifndef _AUDIO_H_
|
||||
#define _AUDIO_H_
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <guiddef.h>
|
||||
#endif // _WIN32
|
||||
|
||||
#include "../common.h"
|
||||
#include "../world/sprite.h"
|
||||
|
@ -44,16 +46,24 @@ void audio_get_devices();
|
|||
* Represents a single directsound device.
|
||||
*/
|
||||
typedef struct {
|
||||
#ifdef _WIN32
|
||||
GUID guid;
|
||||
char desc[256];
|
||||
char drvname[256];
|
||||
#else
|
||||
uint8 padding[16+256+256];
|
||||
#endif // _WIN32
|
||||
} rct_dsdevice;
|
||||
|
||||
/**
|
||||
* Represents a prepared sound.
|
||||
*/
|
||||
typedef struct rct_sound {
|
||||
#ifdef _WIN32
|
||||
struct IDirectSoundBuffer *dsbuffer;
|
||||
#else
|
||||
void *padding;
|
||||
#endif // _WIN32
|
||||
uint16 id;
|
||||
uint16 var_8;
|
||||
int has_caps;
|
||||
|
@ -162,15 +172,19 @@ int sound_set_pan(rct_sound* sound, int pan);
|
|||
int sound_set_volume(rct_sound* sound, int volume);
|
||||
int sound_load3dparameters();
|
||||
int sound_load3dposition();
|
||||
#ifdef _WIN32
|
||||
int dsound_count_devices();
|
||||
#endif // _WIN32
|
||||
rct_sound* sound_begin();
|
||||
rct_sound* sound_next(rct_sound* sound);
|
||||
rct_sound* sound_add(rct_sound* sound);
|
||||
rct_sound* sound_remove(rct_sound* sound);
|
||||
int sound_bufferlost_restore(rct_sound* sound);
|
||||
struct rct_sound_effect* sound_get_effect(uint16 sound_id);
|
||||
#ifdef _WIN32
|
||||
int dsound_create_primary_buffer(int a, int device, int channels, int samples, int bits);
|
||||
int get_dsound_devices();
|
||||
#endif // _WIN32
|
||||
int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z);
|
||||
void stop_completed_sounds();
|
||||
void start_title_music();
|
||||
|
|
|
@ -18,7 +18,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <dsound.h>
|
||||
#endif // _WIN32
|
||||
|
||||
extern "C" {
|
||||
#include "../config.h"
|
||||
|
@ -103,7 +105,11 @@ bool Source_Sample::LoadWAV(const char* filename)
|
|||
|
||||
if (spec != NULL) {
|
||||
format.freq = spec->freq;
|
||||
#ifdef _WIN32
|
||||
format.format = spec->format;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
format.channels = spec->channels;
|
||||
issdlwav = true;
|
||||
} else {
|
||||
|
@ -138,11 +144,15 @@ bool Source_Sample::LoadCSS1(const char *filename, unsigned int offset)
|
|||
Uint32 soundsize;
|
||||
SDL_RWread(rw, &soundsize, sizeof(soundsize), 1);
|
||||
length = soundsize;
|
||||
#ifdef _WIN32
|
||||
WAVEFORMATEX waveformat;
|
||||
SDL_RWread(rw, &waveformat, sizeof(waveformat), 1);
|
||||
format.freq = waveformat.nSamplesPerSec;
|
||||
format.format = AUDIO_S16LSB;
|
||||
format.channels = waveformat.nChannels;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
data = new (std::nothrow) uint8[length];
|
||||
if (!data) {
|
||||
log_verbose("Unable to allocate data");
|
||||
|
@ -170,6 +180,7 @@ void Source_Sample::Unload()
|
|||
|
||||
bool Source_Sample::Convert(AudioFormat format)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if(Source_Sample::format.format != format.format || Source_Sample::format.channels != format.channels || Source_Sample::format.freq != format.freq){
|
||||
SDL_AudioCVT cvt;
|
||||
if (SDL_BuildAudioCVT(&cvt, Source_Sample::format.format, Source_Sample::format.channels, Source_Sample::format.freq, format.format, format.channels, format.freq) < 0) {
|
||||
|
@ -188,6 +199,9 @@ bool Source_Sample::Convert(AudioFormat format)
|
|||
Source_Sample::format = format;
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -262,6 +276,7 @@ bool Source_SampleStream::LoadWAV(SDL_RWops* rw)
|
|||
return false;
|
||||
}
|
||||
Uint64 chunkstart = SDL_RWtell(rw);
|
||||
#ifdef _WIN32
|
||||
PCMWAVEFORMAT waveformat;
|
||||
SDL_RWread(rw, &waveformat, sizeof(waveformat), 1);
|
||||
SDL_RWseek(rw, chunkstart + fmtchunk_size, RW_SEEK_SET);
|
||||
|
@ -283,6 +298,9 @@ bool Source_SampleStream::LoadWAV(SDL_RWops* rw)
|
|||
break;
|
||||
}
|
||||
format.channels = waveformat.wf.nChannels;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
const Uint32 DATA = 0x61746164;
|
||||
Uint32 datachunk_size = FindChunk(rw, DATA);
|
||||
if (!datachunk_size) {
|
||||
|
@ -444,6 +462,7 @@ void Mixer::Init(const char* device)
|
|||
{
|
||||
Close();
|
||||
SDL_AudioSpec want, have;
|
||||
#ifdef _WIN32
|
||||
SDL_zero(want);
|
||||
want.freq = 44100;
|
||||
want.format = AUDIO_S16SYS;
|
||||
|
@ -455,6 +474,9 @@ void Mixer::Init(const char* device)
|
|||
format.format = have.format;
|
||||
format.channels = have.channels;
|
||||
format.freq = have.freq;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
const char* filename = get_file_path(PATH_ID_CSS1);
|
||||
for (int i = 0; i < countof(css1sources); i++) {
|
||||
Source_Sample* source_sample = new Source_Sample;
|
||||
|
@ -567,6 +589,7 @@ void SDLCALL Mixer::Callback(void* arg, uint8* stream, int length)
|
|||
|
||||
void Mixer::MixChannel(Channel& channel, uint8* data, int length)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (channel.source && channel.source->Length() > 0 && !channel.done && gConfigSound.sound) {
|
||||
AudioFormat streamformat = channel.source->Format();
|
||||
int loaded = 0;
|
||||
|
@ -710,6 +733,9 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length)
|
|||
channel.done = true;
|
||||
}
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
void Mixer::EffectPanS16(Channel& channel, sint16* data, int length)
|
||||
|
@ -752,10 +778,14 @@ void Mixer::EffectFadeU8(uint8* data, int length, int startvolume, int endvolume
|
|||
|
||||
bool Mixer::MustConvert(Source& source)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
const AudioFormat sourceformat = source.Format();
|
||||
if (sourceformat.format != format.format || sourceformat.channels != format.channels || sourceformat.freq != format.freq) {
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -880,4 +910,4 @@ void* Mixer_Play_Music(int pathid, int loop, int streaming)
|
|||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,8 +21,15 @@
|
|||
#ifndef _MIXER_H_
|
||||
#define _MIXER_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
#include "../common.h"
|
||||
#include <SDL.h>
|
||||
#include "../platform/platform.h"
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#define USE_MIXER
|
||||
|
||||
|
@ -206,11 +213,15 @@ void Mixer_Channel_SetGroup(void* channel, int group);
|
|||
void* Mixer_Play_Music(int pathid, int loop, int streaming);
|
||||
|
||||
static int DStoMixerVolume(int volume) { return (int)(SDL_MIX_MAXVOLUME * (SDL_pow(10, (float)volume / 2000))); };
|
||||
#ifdef _WIN32
|
||||
static float DStoMixerPan(int pan) { return (((float)pan + -DSBPAN_LEFT) / DSBPAN_RIGHT) / 2; };
|
||||
#else
|
||||
static float DStoMixerPan(int pan) { STUB(); return ((float)pan) / 2; };
|
||||
#endif // _WIN32
|
||||
static double DStoMixerRate(int frequency) { return (double)frequency / 22050; };
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "../addresses.h"
|
||||
#include "../common.h"
|
||||
#include "drawing.h"
|
||||
#include "../platform/platform.h"
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -324,4 +325,4 @@ void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short ri
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
11
src/hook.c
11
src/hook.c
|
@ -18,13 +18,17 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif // _WIN32
|
||||
#include "hook.h"
|
||||
#include "platform/platform.h"
|
||||
|
||||
void* g_hooktableaddress = 0;
|
||||
int g_hooktableoffset = 0;
|
||||
int g_maxhooks = 1000;
|
||||
|
||||
#ifdef _WIN32
|
||||
void hookfunc(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister)
|
||||
{
|
||||
int i = 0;
|
||||
|
@ -211,9 +215,11 @@ void hookfunc(int address, int newaddress, int stacksize, int registerargs[], in
|
|||
|
||||
WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0);
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
void addhook(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (!g_hooktableaddress) {
|
||||
g_hooktableaddress = VirtualAllocEx(GetCurrentProcess(), NULL, g_maxhooks * 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
||||
}
|
||||
|
@ -229,4 +235,7 @@ void addhook(int address, int newaddress, int stacksize, int registerargs[], int
|
|||
WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0);
|
||||
hookfunc(hookaddress, newaddress, stacksize, registerargs, registersreturned, eaxDestinationRegister);
|
||||
g_hooktableoffset++;
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ extern "C" {
|
|||
#include "../common.h"
|
||||
#include "../util/util.h"
|
||||
#include "localisation.h"
|
||||
#include "../platform/platform.h"
|
||||
}
|
||||
|
||||
#include "../core/FileStream.hpp"
|
||||
|
|
|
@ -18,6 +18,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif // _WIN32
|
||||
#include "../addresses.h"
|
||||
#include "../config.h"
|
||||
#include "../game.h"
|
||||
|
@ -848,8 +851,13 @@ int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, bufferCount);
|
||||
int result = WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL);
|
||||
#else
|
||||
STUB();
|
||||
int result = 0;
|
||||
#endif // _WIN32
|
||||
|
||||
if (heapBuffer != NULL) {
|
||||
free(heapBuffer);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef _HTTP_H_
|
||||
#define _HTTP_H_
|
||||
|
||||
#ifndef DISABLE_HTTP
|
||||
#include <jansson/jansson.h>
|
||||
#include "../common.h"
|
||||
|
||||
|
@ -9,10 +10,13 @@ typedef struct {
|
|||
json_t *root;
|
||||
} http_json_response;
|
||||
|
||||
void http_init();
|
||||
void http_dispose();
|
||||
http_json_response *http_request_json(const char *url);
|
||||
void http_request_json_async(const char *url, void (*callback)(http_json_response*));
|
||||
void http_request_json_dispose(http_json_response *response);
|
||||
#endif // DISABLE_HTTP
|
||||
|
||||
// These callbacks are defined anyway, but are dummy if HTTP is disabled
|
||||
void http_init();
|
||||
void http_dispose();
|
||||
|
||||
#endif
|
||||
|
|
|
@ -18,7 +18,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <windows.h>
|
||||
extern "C" {
|
||||
#include "../platform/platform.h"
|
||||
}
|
||||
|
||||
#include "network.h"
|
||||
|
||||
|
|
|
@ -44,6 +44,10 @@ extern "C" {
|
|||
|
||||
#ifndef DISABLE_NETWORK
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <winsock2.h>
|
||||
#endif // _WIN32
|
||||
|
||||
enum {
|
||||
NETWORK_AUTH_NONE,
|
||||
NETWORK_AUTH_REQUESTED,
|
||||
|
|
|
@ -8,12 +8,12 @@
|
|||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
@ -62,7 +62,7 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 *
|
|||
utf8 *ch, filter[MAX_PATH], oldPath[MAX_PATH], newPath[MAX_PATH];
|
||||
int fileEnumHandle;
|
||||
file_info fileInfo;
|
||||
|
||||
|
||||
if (!platform_ensure_directory_exists(newDirectory)) {
|
||||
log_error("Could not create directory %s.", newDirectory);
|
||||
return;
|
||||
|
@ -80,7 +80,7 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 *
|
|||
while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) {
|
||||
strcpy(newPath, newDirectory);
|
||||
strcat(newPath, fileInfo.path);
|
||||
|
||||
|
||||
strcpy(oldPath, originalDirectory);
|
||||
ch = strchr(oldPath, '*');
|
||||
if (ch != NULL)
|
||||
|
@ -115,6 +115,7 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 *
|
|||
// TODO move to platform
|
||||
static void openrct2_set_exe_path()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
wchar_t exePath[MAX_PATH];
|
||||
wchar_t tempPath[MAX_PATH];
|
||||
wchar_t *exeDelimiter;
|
||||
|
@ -127,6 +128,16 @@ static void openrct2_set_exe_path()
|
|||
tempPath[exeDelimiterIndex] = L'\0';
|
||||
_wfullpath(exePath, tempPath, MAX_PATH);
|
||||
WideCharToMultiByte(CP_UTF8, 0, exePath, countof(exePath), gExePath, countof(gExePath), NULL, NULL);
|
||||
#else
|
||||
char exePath[MAX_PATH];
|
||||
ssize_t bytesRead;
|
||||
bytesRead = readlink("/proc/self/exe", exePath, MAX_PATH);
|
||||
if (bytesRead == -1) {
|
||||
log_fatal("failed to read /proc/self/exe");
|
||||
}
|
||||
exePath[MAX_PATH - 1] = '\0';
|
||||
strncpy(gExePath, exePath, MAX_PATH);
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -179,7 +190,11 @@ bool openrct2_initialise()
|
|||
if (!gOpenRCT2Headless) {
|
||||
audio_init();
|
||||
audio_get_devices();
|
||||
#ifdef _WIN32
|
||||
get_dsound_devices();
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
}
|
||||
language_open(gConfigGeneral.language);
|
||||
http_init();
|
||||
|
@ -331,7 +346,7 @@ static void openrct2_loop()
|
|||
_spritelocations1[i].y = g_sprite_list[i].unknown.y;
|
||||
_spritelocations1[i].z = g_sprite_list[i].unknown.z;
|
||||
}
|
||||
|
||||
|
||||
// Update the game so the sprite positions update
|
||||
rct2_update();
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
/*****************************************************************************
|
||||
* Copyright (c) 2014 Ted John
|
||||
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
|
||||
*
|
||||
*
|
||||
* This file is part of OpenRCT2.
|
||||
*
|
||||
*
|
||||
* OpenRCT2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -17,11 +17,13 @@
|
|||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#ifndef _PLATFORM_H_
|
||||
#define _PLATFORM_H_
|
||||
|
||||
#ifdef _WIN32
|
||||
#define HAVE_MATH_H
|
||||
#endif // _WIN32
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
|
@ -136,6 +138,26 @@ uint8 platform_get_locale_temperature_format();
|
|||
|
||||
int windows_get_registry_install_info(rct2_install_info *installInfo, char *source, char *font, uint8 charset);
|
||||
HWND windows_get_window_handle();
|
||||
#endif
|
||||
#endif // _WIN32
|
||||
|
||||
#endif
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#define STUB() log_warning("Function %s at %s:%d is a stub.\n", __PRETTY_FUNCTION__, __FILE__, __LINE__)
|
||||
#define _strcmpi _stricmp
|
||||
#define _stricmp(x, y) strcasecmp((x), (y))
|
||||
#define _strnicmp(x, y, n) strncasecmp((x), (y), (n))
|
||||
|
||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||
#define RCT2_ENDIANESS __ORDER_LITTLE_ENDIAN__
|
||||
#define LOBYTE(w) ((uint8_t)(w))
|
||||
#define HIBYTE(w) ((uint8_t)(((uint16_t)(w)>>8)&0xFF))
|
||||
#endif // __BYTE_ORDER__
|
||||
|
||||
#ifndef RCT2_ENDIANESS
|
||||
#error Unknown endianess!
|
||||
#endif // RCT2_ENDIANESS
|
||||
|
||||
#endif // __linux__
|
||||
|
||||
#endif
|
||||
|
|
|
@ -736,6 +736,7 @@ void platform_set_cursor(char cursor)
|
|||
static void platform_load_cursors()
|
||||
{
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 2;
|
||||
#ifdef _WIN32
|
||||
HINSTANCE hInst = RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ARROW, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x74));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_BLANK, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA1));
|
||||
|
@ -764,6 +765,9 @@ static void platform_load_cursors()
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ENTRANCE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x9F));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_OPEN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA6));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_CLOSED, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA5));
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
|
||||
_cursors[0] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW);
|
||||
_cursors[1] = SDL_CreateCursor(blank_cursor_data, blank_cursor_mask, 32, 32, BLANK_CURSOR_HOTX, BLANK_CURSOR_HOTY);
|
||||
|
|
18
src/rct2.c
18
src/rct2.c
|
@ -333,6 +333,7 @@ int check_files_integrity()
|
|||
{
|
||||
int i;
|
||||
const char *path;
|
||||
#ifdef _WIN32
|
||||
HANDLE file;
|
||||
WIN32_FIND_DATA find_data;
|
||||
|
||||
|
@ -350,6 +351,9 @@ int check_files_integrity()
|
|||
|
||||
FindClose(file);
|
||||
}
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -439,6 +443,7 @@ const utf8 *get_file_path(int pathId)
|
|||
*/
|
||||
void get_system_info()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
OSVERSIONINFO versionInfo;
|
||||
SYSTEM_INFO sysInfo;
|
||||
MEMORYSTATUS memInfo;
|
||||
|
@ -450,10 +455,12 @@ void get_system_info()
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_OS_MINOR_VERSION, uint32) = versionInfo.dwMinorVersion;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_BUILD_NUMBER, uint32) = versionInfo.dwBuildNumber;
|
||||
} else {
|
||||
#endif // _WIN32
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_PLATFORM_ID, uint32) = -1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_MAJOR_VERSION, uint32) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_MINOR_VERSION, uint32) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_BUILD_NUMBER, uint32) = 0;
|
||||
#ifdef _WIN32
|
||||
}
|
||||
|
||||
GetSystemInfo(&sysInfo);
|
||||
|
@ -494,6 +501,9 @@ void get_system_info()
|
|||
RCT2_GLOBAL(0x1423C18, sint32) = 1;
|
||||
|
||||
RCT2_GLOBAL(0x01423C20, uint32) = (SDL_HasMMX() == SDL_TRUE);
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
|
||||
|
@ -503,6 +513,7 @@ void get_system_info()
|
|||
*/
|
||||
void get_system_time()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
SYSTEMTIME systime;
|
||||
|
||||
GetSystemTime(&systime);
|
||||
|
@ -510,6 +521,9 @@ void get_system_time()
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MONTH, sint16) = systime.wMonth;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_YEAR, sint16) = systime.wYear;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_DAYOFWEEK, sint16) = systime.wDayOfWeek;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -518,11 +532,15 @@ void get_system_time()
|
|||
*/
|
||||
void get_local_time()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
SYSTEMTIME systime;
|
||||
GetLocalTime(&systime);
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_HOUR, sint16) = systime.wHour;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MINUTE, sint16) = systime.wMinute;
|
||||
#else
|
||||
STUB();
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include "util.h"
|
||||
#include <SDL.h>
|
||||
#include "../platform/platform.h"
|
||||
|
||||
int squaredmetres_to_squaredfeet(int squaredMetres)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue