diff --git a/Quake/cd_bsd.c b/Quake/cd_bsd.c deleted file mode 100644 index 2911bf00..00000000 --- a/Quake/cd_bsd.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - cd_bsd.c - - Copyright (C) 1996-1997 Id Software, Inc. - A few BSD bits taken from the darkplaces project for Hexen II: - Hammer of Thyrion (uHexen2) - - This program 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 2 - 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, write to: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ - - -#include "cd_unix.h" - -#ifdef __USE_BSD_CDROM__ - -#include "quakedef.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -static qboolean cdValid = false; -static qboolean playing = false; -static qboolean wasPlaying = false; -static qboolean initialized = false; -static qboolean enabled = true; -static qboolean playLooping = false; -static byte remap[100]; -static byte playTrack; -static byte maxTrack; - -static int cdfile = -1; -/* default path to cdrom device. user can always do -cddev */ -#if !defined(__FreeBSD__) -static const char default_dev[] = _PATH_DEV "cd0"; -#else -static const char default_dev[] = _PATH_DEV "acd0"; -#endif -static const char *cd_dev = default_dev; - -static float old_cdvolume; -static qboolean hw_vol_works = true; -static struct ioc_vol orig_vol; /* original setting to be restored upon exit */ -static struct ioc_vol drv_vol; /* the volume setting we'll be using */ - - -#define IOCTL_FAILURE(__name) do { \ - int __err = errno; \ - Con_DPrintf("ioctl %s failed (%d: %s)\n", #__name, __err, strerror(__err)); \ -} while (0) - - -static void CDAudio_Eject(void) -{ - if (cdfile == -1 || !enabled) - return; - - ioctl(cdfile, CDIOCALLOW); - if (ioctl(cdfile, CDIOCEJECT) == -1) - IOCTL_FAILURE(CDIOCEJECT); -} - -static void CDAudio_CloseDoor(void) -{ - if (cdfile == -1 || !enabled) - return; - - ioctl(cdfile, CDIOCALLOW); - if (ioctl(cdfile, CDIOCCLOSE) == -1) - IOCTL_FAILURE(CDIOCCLOSE); -} - -static int CDAudio_GetAudioDiskInfo(void) -{ - struct ioc_toc_header tochdr; - - if (cdfile == -1) - return -1; - - cdValid = false; - - if (ioctl(cdfile, CDIOREADTOCHEADER, &tochdr) == -1) - { - IOCTL_FAILURE(CDIOREADTOCHEADER); - return -1; - } - - if (tochdr.starting_track < 1) - { - Con_DPrintf("CDAudio: no music tracks\n"); - return -1; - } - - cdValid = true; - maxTrack = tochdr.ending_track; - - return 0; -} - -int CDAudio_Play(byte track, qboolean looping) -{ - struct ioc_read_toc_entry entry; - struct cd_toc_entry toc_buffer; - struct ioc_play_track ti; - - if (cdfile == -1 || !enabled) - return -1; - - if (!cdValid) - { - CDAudio_GetAudioDiskInfo(); - if (!cdValid) - return -1; - } - - track = remap[track]; - - if (track < 1 || track > maxTrack) - { - Con_DPrintf("CDAudio: Bad track number %u.\n", track); - return -1; - } - - /* don't try to play a non-audio track */ -# define CDROM_DATA_TRACK 4 - memset((char *)&toc_buffer, 0, sizeof(toc_buffer)); - entry.data_len = sizeof(toc_buffer); - entry.data = &toc_buffer; - entry.starting_track = track; - entry.address_format = CD_MSF_FORMAT; - if (ioctl(cdfile, CDIOREADTOCENTRYS, &entry) == -1) - { - IOCTL_FAILURE(CDIOREADTOCENTRYS); - return -1; - } - if (toc_buffer.control & CDROM_DATA_TRACK) - { - Con_Printf("CDAudio: track %i is not audio\n", track); - return -1; - } - - if (playing) - { - if (playTrack == track) - return 0; - CDAudio_Stop(); - } - - ti.start_track = track; - ti.end_track = track; - ti.start_index = 1; - ti.end_index = 99; - - if (ioctl(cdfile, CDIOCPLAYTRACKS, &ti) == -1) - { - IOCTL_FAILURE(CDIOCPLAYTRACKS); - return -1; - } - - if (ioctl(cdfile, CDIOCRESUME) == -1) - { - IOCTL_FAILURE(CDIOCRESUME); - return -1; - } - - playLooping = looping; - playTrack = track; - playing = true; - - if (bgmvolume.value == 0) /* don't bother advancing */ - CDAudio_Pause (); - - return 0; -} - -void CDAudio_Stop(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!playing) - return; - - if (ioctl(cdfile, CDIOCSTOP) == -1) - { - IOCTL_FAILURE(CDIOCSTOP); - return; - } - ioctl(cdfile, CDIOCALLOW); - - wasPlaying = false; - playing = false; -} - -void CDAudio_Pause(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!playing) - return; - - if (ioctl(cdfile, CDIOCPAUSE) == -1) - IOCTL_FAILURE(CDIOCPAUSE); - - wasPlaying = playing; - playing = false; -} - -void CDAudio_Resume(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!cdValid) - return; - - if (!wasPlaying) - return; - - if (ioctl(cdfile, CDIOCRESUME) == -1) - IOCTL_FAILURE(CDIOCRESUME); - playing = true; -} - -static void CD_f (void) -{ - const char *command; - int ret, n; - - if (Cmd_Argc() < 2) - { - Con_Printf("commands:"); - Con_Printf("on, off, reset, remap, \n"); - Con_Printf("play, stop, loop, pause, resume\n"); - Con_Printf("eject, close, info\n"); - return; - } - - command = Cmd_Argv (1); - - if (Q_strcasecmp(command, "on") == 0) - { - enabled = true; - return; - } - - if (Q_strcasecmp(command, "off") == 0) - { - if (playing) - CDAudio_Stop(); - enabled = false; - return; - } - - if (Q_strcasecmp(command, "reset") == 0) - { - enabled = true; - if (playing) - CDAudio_Stop(); - for (n = 0; n < 100; n++) - remap[n] = n; - CDAudio_GetAudioDiskInfo(); - return; - } - - if (Q_strcasecmp(command, "remap") == 0) - { - ret = Cmd_Argc() - 2; - if (ret <= 0) - { - for (n = 1; n < 100; n++) - if (remap[n] != n) - Con_Printf(" %u -> %u\n", n, remap[n]); - return; - } - for (n = 1; n <= ret; n++) - remap[n] = atoi(Cmd_Argv (n+1)); - return; - } - - if (Q_strcasecmp(command, "close") == 0) - { - CDAudio_CloseDoor(); - return; - } - - if (!cdValid) - { - CDAudio_GetAudioDiskInfo(); - if (!cdValid) - { - Con_Printf("No CD in player.\n"); - return; - } - } - - if (Q_strcasecmp(command, "play") == 0) - { - CDAudio_Play((byte)atoi(Cmd_Argv (2)), false); - return; - } - - if (Q_strcasecmp(command, "loop") == 0) - { - CDAudio_Play((byte)atoi(Cmd_Argv (2)), true); - return; - } - - if (Q_strcasecmp(command, "stop") == 0) - { - CDAudio_Stop(); - return; - } - - if (Q_strcasecmp(command, "pause") == 0) - { - CDAudio_Pause(); - return; - } - - if (Q_strcasecmp(command, "resume") == 0) - { - CDAudio_Resume(); - return; - } - - if (Q_strcasecmp(command, "eject") == 0) - { - if (playing) - CDAudio_Stop(); - CDAudio_Eject(); - cdValid = false; - return; - } - - if (Q_strcasecmp(command, "info") == 0) - { - Con_Printf("%u tracks\n", maxTrack); - if (playing) - Con_Printf("Currently %s track %u\n", playLooping ? "looping" : "playing", playTrack); - else if (wasPlaying) - Con_Printf("Paused %s track %u\n", playLooping ? "looping" : "playing", playTrack); - Con_Printf("Volume is %f\n", bgmvolume.value); - return; - } -} - -static qboolean CD_GetVolume (struct ioc_vol *vol) -{ - if (ioctl(cdfile, CDIOCGETVOL, vol) == -1) - { - IOCTL_FAILURE(CDIOCGETVOL); - return false; - } - return true; -} - -static qboolean CD_SetVolume (struct ioc_vol *vol) -{ - if (ioctl(cdfile, CDIOCSETVOL, vol) == -1) - { - IOCTL_FAILURE(CDIOCSETVOL); - return false; - } - return true; -} - -static qboolean CDAudio_SetVolume (float value) -{ - if (cdfile == -1 || !enabled) - return false; - - old_cdvolume = value; - - if (value == 0.0f) - CDAudio_Pause (); - else - CDAudio_Resume(); - - if (!hw_vol_works) - { - return false; - } - else - { - drv_vol.vol[0] = drv_vol.vol[2] = - drv_vol.vol[1] = drv_vol.vol[3] = value * 255.0f; - return CD_SetVolume (&drv_vol); - } -} - -void CDAudio_Update(void) -{ - struct ioc_read_subchannel subchnl; - struct cd_sub_channel_info data; - static time_t lastchk; - - if (cdfile == -1 || !enabled) - return; - - if (old_cdvolume != bgmvolume.value) - CDAudio_SetVolume (bgmvolume.value); - - if (playing && lastchk < time(NULL)) - { - lastchk = time(NULL) + 2; /* two seconds between chks */ - - memset (&subchnl, 0, sizeof(subchnl)); - subchnl.data = &data; - subchnl.data_len = sizeof(data); - subchnl.address_format = CD_MSF_FORMAT; - subchnl.data_format = CD_CURRENT_POSITION; - subchnl.track = playTrack; - if (ioctl(cdfile, CDIOCREADSUBCHANNEL, &subchnl) == -1) - { - IOCTL_FAILURE(CDIOCREADSUBCHANNEL); - playing = false; - return; - } - if (data.header.audio_status != CD_AS_PLAY_IN_PROGRESS && - data.header.audio_status != CD_AS_PLAY_PAUSED) - { - playing = false; - if (playLooping) - CDAudio_Play(playTrack, true); - } - else - { - playTrack = data.what.position.track_number; - } - } -} - -int CDAudio_Init(void) -{ - int i; - - if (safemode || COM_CheckParm("-nocdaudio")) - return -1; - - if ((i = COM_CheckParm("-cddev")) != 0 && i < com_argc - 1) - cd_dev = com_argv[i + 1]; - - if ((cdfile = open(cd_dev, O_RDONLY | O_NONBLOCK)) == -1) - { - i = errno; - Con_Printf("CDAudio_Init: open of \"%s\" failed (%d: %s)\n", - cd_dev, i, strerror(i)); - cdfile = -1; - return -1; - } - - for (i = 0; i < 100; i++) - remap[i] = i; - initialized = true; - enabled = true; - old_cdvolume = bgmvolume.value; - - Con_Printf("CDAudio initialized (using BSD ioctls)\n"); - - if (CDAudio_GetAudioDiskInfo()) - { - Con_Printf("CDAudio_Init: No CD in drive\n"); - cdValid = false; - } - - Cmd_AddCommand ("cd", CD_f); - - hw_vol_works = CD_GetVolume (&orig_vol); - if (hw_vol_works) - hw_vol_works = CDAudio_SetVolume (bgmvolume.value); - - return 0; -} - -void CDAudio_Shutdown(void) -{ - if (!initialized) - return; - CDAudio_Stop(); - if (hw_vol_works) - CD_SetVolume (&orig_vol); - close(cdfile); - cdfile = -1; -} - -#endif /* __USE_BSD_CDROM__ */ - diff --git a/Quake/cd_linux.c b/Quake/cd_linux.c deleted file mode 100644 index caad3be8..00000000 --- a/Quake/cd_linux.c +++ /dev/null @@ -1,487 +0,0 @@ -/* - cd_linux.c - - Copyright (C) 1996-1997 Id Software, Inc. - - This program 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 2 - 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, write to: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ - - -#include "cd_unix.h" - -#ifdef __USE_LINUX_CDROM__ - -#include "quakedef.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -static qboolean cdValid = false; -static qboolean playing = false; -static qboolean wasPlaying = false; -static qboolean initialized = false; -static qboolean enabled = true; -static qboolean playLooping = false; -static byte remap[100]; -static byte playTrack; -static byte maxTrack; - -static int cdfile = -1; -static const char default_dev[] = _PATH_DEV "cdrom"; /* user can always do -cddev */ -static const char *cd_dev = default_dev; - -static float old_cdvolume; -static qboolean hw_vol_works = true; -static struct cdrom_volctrl orig_vol; /* original setting to be restored upon exit */ -static struct cdrom_volctrl drv_vol; /* the volume setting we'll be using */ - - -#define IOCTL_FAILURE(__name) do { \ - int __err = errno; \ - Con_DPrintf("ioctl %s failed (%d: %s)\n", #__name, __err, strerror(__err)); \ -} while (0) - - -static void CDAudio_Eject(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (ioctl(cdfile, CDROMEJECT) == -1) - IOCTL_FAILURE(CDROMEJECT); -} - -static void CDAudio_CloseDoor(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (ioctl(cdfile, CDROMCLOSETRAY) == -1) - IOCTL_FAILURE(CDROMCLOSETRAY); -} - -static int CDAudio_GetAudioDiskInfo(void) -{ - struct cdrom_tochdr tochdr; - - if (cdfile == -1) - return -1; - - cdValid = false; - - if (ioctl(cdfile, CDROMREADTOCHDR, &tochdr) == -1) - { - IOCTL_FAILURE(CDROMREADTOCHDR); - return -1; - } - - if (tochdr.cdth_trk0 < 1) - { - Con_DPrintf("CDAudio: no music tracks\n"); - return -1; - } - - cdValid = true; - maxTrack = tochdr.cdth_trk1; - - return 0; -} - -int CDAudio_Play(byte track, qboolean looping) -{ - struct cdrom_tocentry entry; - struct cdrom_ti ti; - - if (cdfile == -1 || !enabled) - return -1; - - if (!cdValid) - { - CDAudio_GetAudioDiskInfo(); - if (!cdValid) - return -1; - } - - track = remap[track]; - - if (track < 1 || track > maxTrack) - { - Con_DPrintf("CDAudio: Bad track number %u.\n", track); - return -1; - } - - /* don't try to play a non-audio track */ - entry.cdte_track = track; - entry.cdte_format = CDROM_MSF; - if (ioctl(cdfile, CDROMREADTOCENTRY, &entry) == -1) - { - IOCTL_FAILURE(CDROMREADTOCENTRY); - return -1; - } - if (entry.cdte_ctrl == CDROM_DATA_TRACK) - { - Con_Printf("CDAudio: track %i is not audio\n", track); - return -1; - } - - if (playing) - { - if (playTrack == track) - return 0; - CDAudio_Stop(); - } - - ti.cdti_trk0 = track; - ti.cdti_trk1 = track; - ti.cdti_ind0 = 1; - ti.cdti_ind1 = 99; - - if (ioctl(cdfile, CDROMPLAYTRKIND, &ti) == -1) - { - IOCTL_FAILURE(CDROMPLAYTRKIND); - return -1; - } - - if (ioctl(cdfile, CDROMRESUME) == -1) - { - IOCTL_FAILURE(CDROMRESUME); - return -1; - } - - playLooping = looping; - playTrack = track; - playing = true; - - if (bgmvolume.value == 0) /* don't bother advancing */ - CDAudio_Pause (); - - return 0; -} - -void CDAudio_Stop(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!playing) - return; - - if (ioctl(cdfile, CDROMSTOP) == -1) - IOCTL_FAILURE(CDROMSTOP); - - wasPlaying = false; - playing = false; -} - -void CDAudio_Pause(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!playing) - return; - - if (ioctl(cdfile, CDROMPAUSE) == -1) - IOCTL_FAILURE(CDROMPAUSE); - - wasPlaying = playing; - playing = false; -} - -void CDAudio_Resume(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!cdValid) - return; - - if (!wasPlaying) - return; - - if (ioctl(cdfile, CDROMRESUME) == -1) - IOCTL_FAILURE(CDROMRESUME); - playing = true; -} - -static void CD_f (void) -{ - const char *command; - int ret, n; - - if (Cmd_Argc() < 2) - { - Con_Printf("commands:"); - Con_Printf("on, off, reset, remap, \n"); - Con_Printf("play, stop, loop, pause, resume\n"); - Con_Printf("eject, close, info\n"); - return; - } - - command = Cmd_Argv (1); - - if (Q_strcasecmp(command, "on") == 0) - { - enabled = true; - return; - } - - if (Q_strcasecmp(command, "off") == 0) - { - if (playing) - CDAudio_Stop(); - enabled = false; - return; - } - - if (Q_strcasecmp(command, "reset") == 0) - { - enabled = true; - if (playing) - CDAudio_Stop(); - for (n = 0; n < 100; n++) - remap[n] = n; - CDAudio_GetAudioDiskInfo(); - return; - } - - if (Q_strcasecmp(command, "remap") == 0) - { - ret = Cmd_Argc() - 2; - if (ret <= 0) - { - for (n = 1; n < 100; n++) - if (remap[n] != n) - Con_Printf(" %u -> %u\n", n, remap[n]); - return; - } - for (n = 1; n <= ret; n++) - remap[n] = atoi(Cmd_Argv (n+1)); - return; - } - - if (Q_strcasecmp(command, "close") == 0) - { - CDAudio_CloseDoor(); - return; - } - - if (!cdValid) - { - CDAudio_GetAudioDiskInfo(); - if (!cdValid) - { - Con_Printf("No CD in player.\n"); - return; - } - } - - if (Q_strcasecmp(command, "play") == 0) - { - CDAudio_Play((byte)atoi(Cmd_Argv (2)), false); - return; - } - - if (Q_strcasecmp(command, "loop") == 0) - { - CDAudio_Play((byte)atoi(Cmd_Argv (2)), true); - return; - } - - if (Q_strcasecmp(command, "stop") == 0) - { - CDAudio_Stop(); - return; - } - - if (Q_strcasecmp(command, "pause") == 0) - { - CDAudio_Pause(); - return; - } - - if (Q_strcasecmp(command, "resume") == 0) - { - CDAudio_Resume(); - return; - } - - if (Q_strcasecmp(command, "eject") == 0) - { - if (playing) - CDAudio_Stop(); - CDAudio_Eject(); - cdValid = false; - return; - } - - if (Q_strcasecmp(command, "info") == 0) - { - Con_Printf("%u tracks\n", maxTrack); - if (playing) - Con_Printf("Currently %s track %u\n", playLooping ? "looping" : "playing", playTrack); - else if (wasPlaying) - Con_Printf("Paused %s track %u\n", playLooping ? "looping" : "playing", playTrack); - Con_Printf("Volume is %f\n", bgmvolume.value); - return; - } -} - -static qboolean CD_GetVolume (struct cdrom_volctrl *vol) -{ - if (ioctl(cdfile, CDROMVOLREAD, vol) == -1) - { - IOCTL_FAILURE(CDROMVOLREAD); - return false; - } - return true; -} - -static qboolean CD_SetVolume (struct cdrom_volctrl *vol) -{ - if (ioctl(cdfile, CDROMVOLCTRL, vol) == -1) - { - IOCTL_FAILURE(CDROMVOLCTRL); - return false; - } - return true; -} - -static qboolean CDAudio_SetVolume (float value) -{ - if (cdfile == -1 || !enabled) - return false; - - old_cdvolume = value; - - if (value == 0.0f) - CDAudio_Pause (); - else - CDAudio_Resume(); - - if (!hw_vol_works) - { - return false; - } - else - { - drv_vol.channel0 = drv_vol.channel2 = - drv_vol.channel1 = drv_vol.channel3 = value * 255.0f; - return CD_SetVolume (&drv_vol); - } -} - -void CDAudio_Update(void) -{ - struct cdrom_subchnl subchnl; - static time_t lastchk; - - if (cdfile == -1 || !enabled) - return; - - if (old_cdvolume != bgmvolume.value) - CDAudio_SetVolume (bgmvolume.value); - - if (playing && lastchk < time(NULL)) - { - lastchk = time(NULL) + 2; /* two seconds between chks */ - subchnl.cdsc_format = CDROM_MSF; - if (ioctl(cdfile, CDROMSUBCHNL, &subchnl) == -1) - { - IOCTL_FAILURE(CDROMSUBCHNL); - playing = false; - return; - } - if (subchnl.cdsc_audiostatus != CDROM_AUDIO_PLAY && - subchnl.cdsc_audiostatus != CDROM_AUDIO_PAUSED) - { - playing = false; - if (playLooping) - CDAudio_Play(playTrack, true); - } - else - { - playTrack = subchnl.cdsc_trk; - } - } -} - -int CDAudio_Init(void) -{ - int i; - - if (safemode || COM_CheckParm("-nocdaudio")) - return -1; - - if ((i = COM_CheckParm("-cddev")) != 0 && i < com_argc - 1) - cd_dev = com_argv[i + 1]; - - if ((cdfile = open(cd_dev, O_RDONLY | O_NONBLOCK)) == -1) - { - i = errno; - Con_Printf("CDAudio_Init: open of \"%s\" failed (%d: %s)\n", - cd_dev, i, strerror(i)); - cdfile = -1; - return -1; - } - - for (i = 0; i < 100; i++) - remap[i] = i; - initialized = true; - enabled = true; - old_cdvolume = bgmvolume.value; - - Con_Printf("CDAudio initialized (using Linux ioctls)\n"); - - if (CDAudio_GetAudioDiskInfo()) - { - Con_Printf("CDAudio_Init: No CD in drive\n"); - cdValid = false; - } - - Cmd_AddCommand ("cd", CD_f); - - hw_vol_works = CD_GetVolume (&orig_vol); - if (hw_vol_works) - hw_vol_works = CDAudio_SetVolume (bgmvolume.value); - - return 0; -} - -void CDAudio_Shutdown(void) -{ - if (!initialized) - return; - CDAudio_Stop(); - if (hw_vol_works) - CD_SetVolume (&orig_vol); - close(cdfile); - cdfile = -1; -} - -#endif /* __USE_LINUX_CDROM__ */ - diff --git a/Quake/cd_unix.h b/Quake/cd_unix.h deleted file mode 100644 index 13eb551e..00000000 --- a/Quake/cd_unix.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - cd_unix.h - Unix include file to compile the correct cdaudio code - - This program 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 2 - 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, write to: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ - - -#ifndef __CD_UNIX_H -#define __CD_UNIX_H - -#undef __USE_BSD_CDROM__ -#undef __USE_LINUX_CDROM__ -#undef __USE_SDL_CDROM__ - -#if defined (WITH_SDLCD) -/* This means that the makefile is edited for USE_SDLCD */ -# define __USE_SDL_CDROM__ 1 -#elif defined (__linux) || defined (__linux__) -# define __USE_LINUX_CDROM__ 1 -#elif defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__NetBSD__) -# define __USE_BSD_CDROM__ 1 -#else /* elif defined (SDLQUAKE) */ -# define __USE_SDL_CDROM__ 1 -/* -#else -# error "no cdaudio module defined. edit cd_unix.h or your makefile.." -*/ -#endif - -#endif /* __CD_UNIX_H */ - diff --git a/Quake/cd_win.c b/Quake/cd_win.c deleted file mode 100644 index 3cdc86d4..00000000 --- a/Quake/cd_win.c +++ /dev/null @@ -1,619 +0,0 @@ -/* - cd_win.c - Win32 cdaudio code - - Copyright (C) 1996-1997 Id Software, Inc. - Quake is a trademark of Id Software, Inc., (c) 1996 Id Software, Inc. All - rights reserved. - - This program 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 2 - 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, write to: - - Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301 USA -*/ - -#include "quakedef.h" -#include "winquake.h" -#include - -/* - * You just can't set the volume of CD playback via MCI : - * http://blogs.msdn.com/larryosterman/archive/2005/10/06/477874.aspx - * OTOH, using the aux APIs to control the CD audio volume is broken. - */ -#undef USE_AUX_API - - -static qboolean cdValid = false; -static qboolean playing = false; -static qboolean wasPlaying = false; -static qboolean initialized = false; -static qboolean enabled = false; -static qboolean playLooping = false; -static byte remap[100]; -static byte playTrack; -static byte maxTrack; - -static float old_cdvolume; -static UINT wDeviceID; -static DWORD end_pos; -#if defined(USE_AUX_API) -static UINT CD_ID; -static unsigned long CD_OrigVolume; -static void CD_SetVolume(unsigned long Volume); -#endif /* USE_AUX_API */ - - -static void CDAudio_Eject(void) -{ - DWORD dwReturn; - - dwReturn = mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, (DWORD_PTR)NULL); - if (dwReturn) - Con_DPrintf("MCI_SET_DOOR_OPEN failed (%u)\n", (unsigned int)dwReturn); -} - - -static void CDAudio_CloseDoor(void) -{ - DWORD dwReturn; - - dwReturn = mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, (DWORD_PTR)NULL); - if (dwReturn) - Con_DPrintf("MCI_SET_DOOR_CLOSED failed (%u)\n", (unsigned int)dwReturn); -} - - -static int CDAudio_GetAudioDiskInfo(void) -{ - DWORD dwReturn; - MCI_STATUS_PARMS mciStatusParms; - - cdValid = false; - - mciStatusParms.dwItem = MCI_STATUS_READY; - dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD_PTR) (LPVOID) &mciStatusParms); - if (dwReturn) - { - Con_DPrintf("CDAudio: drive ready test - get status failed\n"); - return -1; - } - if (!mciStatusParms.dwReturn) - { - Con_DPrintf("CDAudio: drive not ready\n"); - return -1; - } - - mciStatusParms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS; - dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD_PTR) (LPVOID) &mciStatusParms); - if (dwReturn) - { - Con_DPrintf("CDAudio: get tracks - status failed\n"); - return -1; - } - if (mciStatusParms.dwReturn < 1) - { - Con_DPrintf("CDAudio: no music tracks\n"); - return -1; - } - - cdValid = true; - maxTrack = mciStatusParms.dwReturn; - - return 0; -} - - -int CDAudio_Play(byte track, qboolean looping) -{ - DWORD dwReturn; - MCI_PLAY_PARMS mciPlayParms; - MCI_STATUS_PARMS mciStatusParms; - - if (!enabled) - return -1; - - if (!cdValid) - { - CDAudio_GetAudioDiskInfo(); - if (!cdValid) - return -1; - } - - track = remap[track]; - - if (track < 1 || track > maxTrack) - { - Con_DPrintf("CDAudio: Bad track number %u.\n", track); - return -1; - } - - // don't try to play a non-audio track - mciStatusParms.dwItem = MCI_CDA_STATUS_TYPE_TRACK; - mciStatusParms.dwTrack = track; - dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT, (DWORD_PTR) (LPVOID) &mciStatusParms); - if (dwReturn) - { - Con_DPrintf("MCI_STATUS failed (%u)\n", (unsigned int)dwReturn); - return -1; - } - if (mciStatusParms.dwReturn != MCI_CDA_TRACK_AUDIO) - { - Con_Printf("CDAudio: track %i is not audio\n", track); - return -1; - } - - // get the length of the track to be played - mciStatusParms.dwItem = MCI_STATUS_LENGTH; - mciStatusParms.dwTrack = track; - dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT, (DWORD_PTR) (LPVOID) &mciStatusParms); - if (dwReturn) - { - Con_DPrintf("MCI_STATUS failed (%u)\n", (unsigned int)dwReturn); - return -1; - } - - if (playing) - { - if (playTrack == track) - return 0; - CDAudio_Stop(); - } - - mciPlayParms.dwFrom = MCI_MAKE_TMSF(track, 0, 0, 0); - mciPlayParms.dwTo = (mciStatusParms.dwReturn << 8) | track; - end_pos = mciPlayParms.dwTo; - mciPlayParms.dwCallback = (DWORD_PTR)mainwindow; - dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY | MCI_FROM | MCI_TO, (DWORD_PTR)(LPVOID) &mciPlayParms); - if (dwReturn) - { - Con_DPrintf("CDAudio: MCI_PLAY failed (%u)\n", (unsigned int)dwReturn); - return -1; - } - - playLooping = looping; - playTrack = track; - playing = true; - - if (bgmvolume.value == 0) /* don't bother advancing */ - CDAudio_Pause (); - - return 0; -} - - -void CDAudio_Stop(void) -{ - DWORD dwReturn; - - if (!enabled) - return; - - if (!playing) - return; - - dwReturn = mciSendCommand(wDeviceID, MCI_STOP, 0, (DWORD_PTR)NULL); - if (dwReturn) - Con_DPrintf("MCI_STOP failed (%u)", (unsigned int)dwReturn); - - wasPlaying = false; - playing = false; -} - - -void CDAudio_Pause(void) -{ - DWORD dwReturn; - MCI_GENERIC_PARMS mciGenericParms; - - if (!enabled) - return; - - if (!playing) - return; - - mciGenericParms.dwCallback = (DWORD_PTR)mainwindow; - dwReturn = mciSendCommand(wDeviceID, MCI_PAUSE, 0, (DWORD_PTR)(LPVOID) &mciGenericParms); - if (dwReturn) - Con_DPrintf("MCI_PAUSE failed (%u)", (unsigned int)dwReturn); - - wasPlaying = playing; - playing = false; -} - - -void CDAudio_Resume(void) -{ - DWORD dwReturn; - MCI_STATUS_PARMS mciStatusParms; - MCI_PLAY_PARMS mciPlayParms; - - if (!enabled) - return; - if (!cdValid) - return; - if (!wasPlaying) - return; - -#if 0 -/* dwReturn = mciSendCommand(wDeviceID, MCI_RESUME, MCI_WAIT, NULL); */ - mciPlayParms.dwFrom = MCI_MAKE_TMSF(playTrack, 0, 0, 0); - mciPlayParms.dwTo = MCI_MAKE_TMSF(playTrack + 1, 0, 0, 0); - mciPlayParms.dwCallback = (DWORD_PTR)mainwindow; - dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_TO | MCI_NOTIFY, (DWORD_PTR)(LPVOID) &mciPlayParms); -#endif - mciStatusParms.dwItem = MCI_STATUS_POSITION; - dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD_PTR) (LPVOID) &mciStatusParms); - if (dwReturn) - { - Con_DPrintf("MCI_STATUS failed (%u)\n", (unsigned int)dwReturn); - return; - } - mciPlayParms.dwFrom = mciStatusParms.dwReturn; - mciPlayParms.dwTo = end_pos; /* set in CDAudio_Play() */ - mciPlayParms.dwCallback = (DWORD_PTR)mainwindow; - dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_FROM | MCI_TO | MCI_NOTIFY, (DWORD_PTR)(LPVOID) &mciPlayParms); - if (dwReturn) - { - Con_DPrintf("CDAudio: MCI_PLAY failed (%u)\n", (unsigned int)dwReturn); - return; - } - playing = true; -} - - -static void CD_f (void) -{ - const char *command; - int ret, n; - - if (Cmd_Argc() < 2) - { - Con_Printf("commands:"); - Con_Printf("on, off, reset, remap, \n"); - Con_Printf("play, stop, loop, pause, resume\n"); - Con_Printf("eject, close, info\n"); - return; - } - - command = Cmd_Argv (1); - - if (Q_strcasecmp(command, "on") == 0) - { - enabled = true; - return; - } - - if (Q_strcasecmp(command, "off") == 0) - { - if (playing) - CDAudio_Stop(); - enabled = false; - return; - } - - if (Q_strcasecmp(command, "reset") == 0) - { - enabled = true; - if (playing) - CDAudio_Stop(); - for (n = 0; n < 100; n++) - remap[n] = n; - CDAudio_GetAudioDiskInfo(); - return; - } - - if (Q_strcasecmp(command, "remap") == 0) - { - ret = Cmd_Argc() - 2; - if (ret <= 0) - { - for (n = 1; n < 100; n++) - if (remap[n] != n) - Con_Printf(" %u -> %u\n", n, remap[n]); - return; - } - for (n = 1; n <= ret; n++) - remap[n] = atoi(Cmd_Argv (n+1)); - return; - } - - if (Q_strcasecmp(command, "close") == 0) - { - CDAudio_CloseDoor(); - return; - } - - if (!cdValid) - { - CDAudio_GetAudioDiskInfo(); - if (!cdValid) - { - Con_Printf("No CD in player.\n"); - return; - } - } - - if (Q_strcasecmp(command, "play") == 0) - { - CDAudio_Play((byte)atoi(Cmd_Argv (2)), false); - return; - } - - if (Q_strcasecmp(command, "loop") == 0) - { - CDAudio_Play((byte)atoi(Cmd_Argv (2)), true); - return; - } - - if (Q_strcasecmp(command, "stop") == 0) - { - CDAudio_Stop(); - return; - } - - if (Q_strcasecmp(command, "pause") == 0) - { - CDAudio_Pause(); - return; - } - - if (Q_strcasecmp(command, "resume") == 0) - { - CDAudio_Resume(); - return; - } - - if (Q_strcasecmp(command, "eject") == 0) - { - if (playing) - CDAudio_Stop(); - CDAudio_Eject(); - cdValid = false; - return; - } - - if (Q_strcasecmp(command, "info") == 0) - { - Con_Printf("%u tracks\n", maxTrack); - if (playing) - Con_Printf("Currently %s track %u\n", playLooping ? "looping" : "playing", playTrack); - else if (wasPlaying) - Con_Printf("Paused %s track %u\n", playLooping ? "looping" : "playing", playTrack); - Con_Printf("Volume is %f\n", bgmvolume.value); - return; - } -} - - -LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if (lParam != (LONG)wDeviceID) - return 1; - - switch (wParam) - { - case MCI_NOTIFY_SUCCESSFUL: - if (playing) - { - playing = false; - if (playLooping) - CDAudio_Play(playTrack, true); - } - break; - - case MCI_NOTIFY_ABORTED: - case MCI_NOTIFY_SUPERSEDED: - break; - - case MCI_NOTIFY_FAILURE: - Con_DPrintf("MCI_NOTIFY_FAILURE\n"); - CDAudio_Stop (); - cdValid = false; - break; - - default: - Con_DPrintf("Unexpected MM_MCINOTIFY type (%Iu)\n", wParam); - return 1; - } - - return 0; -} - - -static void CDAudio_SetVolume (float value) -{ - old_cdvolume = value; - - if (value == 0.0f) - CDAudio_Pause (); - else - CDAudio_Resume(); - -#if defined(USE_AUX_API) - CD_SetVolume (value * 0xffff); -#endif /* USE_AUX_API */ -} - -void CDAudio_Update(void) -{ - if (!enabled) - return; - - if (old_cdvolume != bgmvolume.value) - CDAudio_SetVolume (bgmvolume.value); -} - - -#if defined(USE_AUX_API) -static void CD_FindCDAux(void) -{ - UINT NumDevs, counter; - MMRESULT Result; - AUXCAPS Caps; - - CD_ID = -1; - if (!COM_CheckParm("-usecdvolume")) - return; - NumDevs = auxGetNumDevs(); - for (counter = 0; counter < NumDevs; counter++) - { - Result = auxGetDevCaps(counter,&Caps,sizeof(Caps)); - if (!Result) // valid - { - if (Caps.wTechnology == AUXCAPS_CDAUDIO) - { - CD_ID = counter; - auxGetVolume(CD_ID, &CD_OrigVolume); - return; - } - } - } -} - -static void CD_SetVolume(unsigned long Volume) -{ - if (CD_ID != -1) - auxSetVolume(CD_ID, (Volume<<16) + Volume); -} -#endif /* USE_AUX_API */ - -static const char *get_cddev_arg (const char *arg) -{ -/* arg should be like "D", "D:" or "D:\", make - * sure it is so. Also check if this is really - * a CDROM drive. */ - static char drive[4]; - if (!arg || ! *arg) - return NULL; - if (arg[1] != '\0') - { - if (arg[1] != ':') - return NULL; - if (arg[2] != '\0') - { - if (arg[2] != '\\' && - arg[2] != '/') - return NULL; - if (arg[3] != '\0') - return NULL; - } - } - if (*arg >= 'A' && *arg <= 'Z') - { - drive[0] = *arg; - drive[1] = ':'; - drive[2] = '\\'; - drive[3] = '\0'; - } - else if (*arg >= 'a' && *arg <= 'z') - { - /* make it uppercase */ - drive[0] = *arg - ('a' - 'A'); - drive[1] = ':'; - drive[2] = '\\'; - drive[3] = '\0'; - } - else - { - return NULL; - } - if (GetDriveType(drive) != DRIVE_CDROM) - { - Con_Printf("%c is not a CDROM drive\n", drive[0]); - return NULL; - } - drive[2] = '\0'; - return drive; -} - -int CDAudio_Init(void) -{ - DWORD dwReturn; - MCI_OPEN_PARMS mciOpenParms; - MCI_SET_PARMS mciSetParms; - const char *userdev = NULL; - int n; - - if (safemode || COM_CheckParm("-nocdaudio")) - return -1; - - if ((n = COM_CheckParm("-cddev")) != 0 && n < com_argc - 1) - { - userdev = get_cddev_arg(com_argv[n + 1]); - if (!userdev) - { - Con_Printf("Invalid argument to -cddev\n"); - return -1; - } - mciOpenParms.lpstrElementName = userdev; - } - - mciOpenParms.lpstrDeviceType = "cdaudio"; - dwReturn = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_SHAREABLE, (DWORD_PTR) (LPVOID) &mciOpenParms); - if (!userdev) - userdev = "default cdrom"; - if (dwReturn) - { - Con_Printf("CDAudio_Init: MCI_OPEN failed for %s (%u)\n", - userdev, (unsigned int)dwReturn); - return -1; - } - wDeviceID = mciOpenParms.wDeviceID; - - // Set the time format to track/minute/second/frame (TMSF). - mciSetParms.dwTimeFormat = MCI_FORMAT_TMSF; - dwReturn = mciSendCommand(wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD_PTR)(LPVOID) &mciSetParms); - if (dwReturn) - { - Con_Printf("MCI_SET_TIME_FORMAT failed (%u)\n", (unsigned int)dwReturn); - mciSendCommand(wDeviceID, MCI_CLOSE, 0, (DWORD_PTR)NULL); - return -1; - } - - for (n = 0; n < 100; n++) - remap[n] = n; - initialized = true; - enabled = true; - old_cdvolume = bgmvolume.value; - - if (CDAudio_GetAudioDiskInfo()) - { - Con_Printf("CDAudio_Init: No CD in player.\n"); - cdValid = false; - } - - Cmd_AddCommand ("cd", CD_f); - -#if defined(USE_AUX_API) - CD_FindCDAux(); -#endif /* USE_AUX_API */ - - Con_Printf("CD Audio Initialized\n"); - - return 0; -} - - -void CDAudio_Shutdown(void) -{ - if (!initialized) - return; - CDAudio_Stop(); - if (mciSendCommand(wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD_PTR)NULL)) - Con_DPrintf("CDAudio_Shutdown: MCI_CLOSE failed\n"); -} - diff --git a/Quake/gl_vidnt.c b/Quake/gl_vidnt.c deleted file mode 100644 index 19b47763..00000000 --- a/Quake/gl_vidnt.c +++ /dev/null @@ -1,2802 +0,0 @@ -/* -Copyright (C) 1996-2001 Id Software, Inc. -Copyright (C) 2002-2009 John Fitzgibbons and others - -This program 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 2 -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, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ -// gl_vidnt.c -- NT GL vid component - -#include "quakedef.h" -#include "bgmusic.h" -#include "winquake.h" -#include "resource.h" -#include - -#define MAX_MODE_LIST 600 //johnfitz -- was 30 -#define VID_ROW_SIZE 3 -#define WARP_WIDTH 320 -#define WARP_HEIGHT 200 -#define MAXWIDTH 10000 -#define MAXHEIGHT 10000 -#define BASEWIDTH 320 -#define BASEHEIGHT 200 - -#define MODE_WINDOWED 0 -#define NO_MODE (MODE_WINDOWED - 1) -#define MODE_FULLSCREEN_DEFAULT (MODE_WINDOWED + 1) - -typedef struct { - modestate_t type; - int width; - int height; - int modenum; - int dib; - int fullscreen; - int bpp; - int refreshrate; //johnfitz - int halfscreen; - char modedesc[17]; -} vmode_t; - -typedef struct { - int width; - int height; -} lmode_t; - -lmode_t lowresmodes[] = { - {320, 200}, - {320, 240}, - {400, 300}, - {512, 384}, -}; - -const char *gl_vendor; -const char *gl_renderer; -const char *gl_version; -const char *gl_extensions; -const char *wgl_extensions; //johnfitz - -qboolean DDActive; -qboolean scr_skipupdate; - -static vmode_t modelist[MAX_MODE_LIST]; -static int nummodes; -static vmode_t badmode; - -static DEVMODE gdevmode; -static qboolean vid_initialized = false; -static qboolean windowed, leavecurrentmode; -static qboolean vid_canalttab = false; -static qboolean vid_wassuspended = false; -static int windowed_mouse; -extern qboolean mouseactive; // from in_win.c -static HICON hIcon; - -int DIBWidth, DIBHeight; -RECT WindowRect; -DWORD WindowStyle, ExWindowStyle; - -HWND mainwindow, dibwindow; - -int vid_modenum = NO_MODE; -int vid_realmode; -int vid_default = MODE_WINDOWED; -static int windowed_default; -unsigned char vid_curpal[256*3]; -static qboolean fullsbardraw = false; - -HDC maindc; - -glvert_t glv; - -HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); -BOOL bSetupPixelFormat(HDC hDC); - -viddef_t vid; // global video state - -//unsigned short d_8to16table[256]; //johnfitz -- never used -//unsigned char d_15to8table[65536]; //johnfitz -- never used - -modestate_t modestate = MS_UNINIT; - -void VID_Menu_Init (void); //johnfitz -void VID_Menu_f (void); //johnfitz -void VID_MenuDraw (void); -void VID_MenuKey (int key); - -LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); -void AppActivate(BOOL fActive, BOOL minimize); -const char *VID_GetModeDescription (int mode); -void ClearAllStates (void); -void VID_UpdateWindowStatus (void); -void GL_Init (void); - -typedef void (APIENTRY *lp3DFXFUNC) (int, int, int, int, int, const void*); - -PFNGLMULTITEXCOORD2FARBPROC GL_MTexCoord2fFunc = NULL; //johnfitz -PFNGLACTIVETEXTUREARBPROC GL_SelectTextureFunc = NULL; //johnfitz - -typedef BOOL (APIENTRY * SETSWAPFUNC) (int); //johnfitz -typedef int (APIENTRY * GETSWAPFUNC) (void); //johnfitz -SETSWAPFUNC wglSwapIntervalEXT = NULL; //johnfitz -GETSWAPFUNC wglGetSwapIntervalEXT = NULL; //johnfitz - -qboolean isPermedia = false; -qboolean isIntelVideo = false; //johnfitz -- intel video workarounds from Baker -qboolean gl_mtexable = false; -qboolean gl_texture_env_combine = false; //johnfitz -qboolean gl_texture_env_add = false; //johnfitz -qboolean gl_swap_control = false; //johnfitz -qboolean gl_anisotropy_able = false; //johnfitz -float gl_max_anisotropy; //johnfitz - -int gl_stencilbits; //johnfitz - -qboolean vid_locked = false; //johnfitz - -void GL_SetupState (void); //johnfitz - -//==================================== - -//johnfitz -- new cvars -cvar_t vid_fullscreen = {"vid_fullscreen", "1", CVAR_ARCHIVE}; -cvar_t vid_width = {"vid_width", "640", CVAR_ARCHIVE}; -cvar_t vid_height = {"vid_height", "480", CVAR_ARCHIVE}; -cvar_t vid_bpp = {"vid_bpp", "16", CVAR_ARCHIVE}; -cvar_t vid_refreshrate = {"vid_refreshrate", "60", CVAR_ARCHIVE}; -cvar_t vid_vsync = {"vid_vsync", "0", CVAR_ARCHIVE}; -//johnfitz - -cvar_t _windowed_mouse = {"_windowed_mouse","1", CVAR_ARCHIVE}; -cvar_t vid_gamma = {"gamma", "1", CVAR_ARCHIVE}; //johnfitz -- moved here from view.c - -int window_center_x, window_center_y, window_x, window_y, window_width, window_height; -RECT window_rect; - - - -//========================================================================== -// -// HARDWARE GAMMA -- johnfitz -// -//========================================================================== - -typedef int (WINAPI * RAMPFUNC)(); -RAMPFUNC wglGetDeviceGammaRamp3DFX; -RAMPFUNC wglSetDeviceGammaRamp3DFX; - -unsigned short vid_gammaramp[768]; -unsigned short vid_systemgammaramp[768]; //to restore gamma on exit -unsigned short vid_3dfxgammaramp[768]; //to restore gamma on exit -int vid_gammaworks, vid_3dfxgamma; - -/* -================ -VID_Gamma_SetGamma -- apply gamma correction -================ -*/ -void VID_Gamma_SetGamma (void) -{ - if (maindc) - { - if (vid_gammaworks) - if (SetDeviceGammaRamp(maindc, vid_gammaramp) == false) - Con_Printf ("VID_Gamma_SetGamma: failed on SetDeviceGammaRamp\n"); - - if (vid_3dfxgamma) - if (wglSetDeviceGammaRamp3DFX(maindc, vid_gammaramp) == false) - Con_Printf ("VID_Gamma_SetGamma: failed on wglSetDeviceGammaRamp3DFX\n"); - } -} - -/* -================ -VID_Gamma_Restore -- restore system gamma -================ -*/ -void VID_Gamma_Restore (void) -{ - if (maindc) - { - if (vid_gammaworks) - if (SetDeviceGammaRamp(maindc, vid_systemgammaramp) == false) - Con_Printf ("VID_Gamma_Restore: failed on SetDeviceGammaRamp\n"); - - if (vid_3dfxgamma) - if (wglSetDeviceGammaRamp3DFX(maindc, vid_3dfxgammaramp) == false) - Con_Printf ("VID_Gamma_Restore: failed on wglSetDeviceGammaRamp3DFX\n"); - } -} - -/* -================ -VID_Gamma_Shutdown -- called on exit -================ -*/ -void VID_Gamma_Shutdown (void) -{ - VID_Gamma_Restore (); -} - -/* -================ -VID_Gamma_f -- callback when the cvar changes -================ -*/ -void VID_Gamma_f (cvar_t *var) -{ - static float oldgamma; - int i; - - if (vid_gamma.value == oldgamma) - return; - - oldgamma = vid_gamma.value; - - for (i=0; i<256; i++) - vid_gammaramp[i] = vid_gammaramp[i+256] = vid_gammaramp[i+512] = - CLAMP(0, (int) (255 * pow ((i+0.5)/255.5, vid_gamma.value) + 0.5), 255) << 8; - - VID_Gamma_SetGamma (); -} - -/* -================ -VID_Gamma_Init -- call on init -================ -*/ -void VID_Gamma_Init (void) -{ - vid_gammaworks = vid_3dfxgamma = false; - - if (strstr(gl_extensions, "WGL_3DFX_gamma_control")) - { - wglSetDeviceGammaRamp3DFX = (RAMPFUNC) wglGetProcAddress("wglSetDeviceGammaRamp3DFX"); - wglGetDeviceGammaRamp3DFX = (RAMPFUNC) wglGetProcAddress("wglGetDeviceGammaRamp3DFX"); - - if (wglGetDeviceGammaRamp3DFX (maindc, vid_3dfxgammaramp)) - vid_3dfxgamma = true; - - Con_Printf ("WGL_3DFX_gamma_control found\n"); - } - - if (GetDeviceGammaRamp (maindc, vid_systemgammaramp)) - vid_gammaworks = true; - - Cvar_RegisterVariable (&vid_gamma); - Cvar_SetCallback (&vid_gamma, VID_Gamma_f); -} - -//========================================================================== - -// direct draw software compatability stuff - -void VID_HandlePause (qboolean pause) -{ -} - -void VID_ForceLockState (int lk) -{ -} - -void VID_LockBuffer (void) -{ -} - -void VID_UnlockBuffer (void) -{ -} - -int VID_ForceUnlockedAndReturnState (void) -{ - return 0; -} - -void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height) -{ -} - -void D_EndDirectRect (int x, int y, int width, int height) -{ -} - -/* -================ -CenterWindow -================ -*/ -void CenterWindow(HWND hWndCenter, int width, int height, BOOL lefttopjustify) -{ - int CenterX, CenterY; - - CenterX = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; - CenterY = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; - if (CenterX > CenterY*2) - CenterX >>= 1; // dual screens - CenterX = (CenterX < 0) ? 0: CenterX; - CenterY = (CenterY < 0) ? 0: CenterY; - SetWindowPos (hWndCenter, NULL, CenterX, CenterY, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW | SWP_DRAWFRAME); -} - -/* -================ -VID_SetWindowedMode -================ -*/ -qboolean VID_SetWindowedMode (int modenum) -{ - HDC hdc; - int lastmodestate, width, height; - RECT rect; - - lastmodestate = modestate; - - WindowRect.top = WindowRect.left = 0; - - WindowRect.right = modelist[modenum].width; - WindowRect.bottom = modelist[modenum].height; - - DIBWidth = modelist[modenum].width; - DIBHeight = modelist[modenum].height; - - //johnfitz -- if width and height match desktop size, do aguirRe's trick of making the window have no titlebar/borders - if (DIBWidth == GetSystemMetrics(SM_CXSCREEN) && DIBHeight == GetSystemMetrics(SM_CYSCREEN)) - WindowStyle = WS_POPUP; // Window covers entire screen; no caption, borders etc - else - WindowStyle = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; - //johnfitz - ExWindowStyle = 0; - - rect = WindowRect; - AdjustWindowRectEx(&rect, WindowStyle, FALSE, 0); - - width = rect.right - rect.left; - height = rect.bottom - rect.top; - - // Create the DIB window - dibwindow = CreateWindowEx ( - ExWindowStyle, - "FitzQuake", //johnfitz -- was "WinQuake" - "FitzQuake", //johnfitz -- was "GLQuake" - WindowStyle, - rect.left, rect.top, - width, - height, - NULL, - NULL, - global_hInstance, - NULL); - - if (!dibwindow) - Sys_Error ("Couldn't create DIB window"); - - // Center and show the DIB window - CenterWindow(dibwindow, WindowRect.right - WindowRect.left, - WindowRect.bottom - WindowRect.top, false); - - ShowWindow (dibwindow, SW_SHOWDEFAULT); - UpdateWindow (dibwindow); - - modestate = MS_WINDOWED; - -// because we have set the background brush for the window to NULL -// (to avoid flickering when re-sizing the window on the desktop), -// we clear the window to black when created, otherwise it will be -// empty while Quake starts up. - hdc = GetDC(dibwindow); - PatBlt(hdc,0,0,WindowRect.right,WindowRect.bottom,BLACKNESS); - ReleaseDC(dibwindow, hdc); - - //johnfitz -- stuff - vid.width = modelist[modenum].width; - vid.height = modelist[modenum].height; - vid.conwidth = vid.width & 0xFFFFFFF8; - vid.conheight = vid.conwidth * vid.height / vid.width; - //johnfitz - - vid.numpages = 2; - - mainwindow = dibwindow; - - SendMessage (mainwindow, WM_SETICON, (WPARAM)TRUE, (LPARAM)hIcon); - SendMessage (mainwindow, WM_SETICON, (WPARAM)FALSE, (LPARAM)hIcon); - - return true; -} - -/* -================ -VID_SetFullDIBMode -================ -*/ -qboolean VID_SetFullDIBMode (int modenum) -{ - HDC hdc; - int lastmodestate, width, height; - RECT rect; - - if (!leavecurrentmode) - { - gdevmode.dmFields = DM_BITSPERPEL | - DM_PELSWIDTH | - DM_PELSHEIGHT | - DM_DISPLAYFREQUENCY; //johnfitz -- refreshrate - gdevmode.dmBitsPerPel = modelist[modenum].bpp; - gdevmode.dmPelsWidth = modelist[modenum].width << modelist[modenum].halfscreen; - gdevmode.dmPelsHeight = modelist[modenum].height; - gdevmode.dmDisplayFrequency = modelist[modenum].refreshrate; //johnfitz -- refreshrate - gdevmode.dmSize = sizeof (gdevmode); - - if (ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) - Sys_Error ("Couldn't set fullscreen DIB mode"); - } - - lastmodestate = modestate; - modestate = MS_FULLDIB; - - WindowRect.top = WindowRect.left = 0; - - WindowRect.right = modelist[modenum].width; - WindowRect.bottom = modelist[modenum].height; - - DIBWidth = modelist[modenum].width; - DIBHeight = modelist[modenum].height; - - WindowStyle = WS_POPUP; - ExWindowStyle = 0; - - rect = WindowRect; - AdjustWindowRectEx(&rect, WindowStyle, FALSE, 0); - - width = rect.right - rect.left; - height = rect.bottom - rect.top; - - // Create the DIB window - dibwindow = CreateWindowEx ( - ExWindowStyle, - "FitzQuake", //johnfitz -- was "WinQuake" - "FitzQuake", //johnfitz -- was "GLQuake" - WindowStyle, - rect.left, rect.top, - width, - height, - NULL, - NULL, - global_hInstance, - NULL); - - if (!dibwindow) - Sys_Error ("Couldn't create DIB window"); - - ShowWindow (dibwindow, SW_SHOWDEFAULT); - UpdateWindow (dibwindow); - -// Because we have set the background brush for the window to NULL -// (to avoid flickering when re-sizing the window on the desktop), we -// clear the window to black when created, otherwise it will be -// empty while Quake starts up. - hdc = GetDC(dibwindow); - PatBlt(hdc,0,0,WindowRect.right,WindowRect.bottom,BLACKNESS); - ReleaseDC(dibwindow, hdc); - - //johnfitz -- stuff - vid.width = modelist[modenum].width; - vid.height = modelist[modenum].height; - vid.conwidth = vid.width & 0xFFFFFFF8; - vid.conheight = vid.conwidth * vid.height / vid.width; - //johnfitz - - vid.numpages = 2; - -// needed because we're not getting WM_MOVE messages fullscreen on NT - window_x = 0; - window_y = 0; - - mainwindow = dibwindow; - - SendMessage (mainwindow, WM_SETICON, (WPARAM)TRUE, (LPARAM)hIcon); - SendMessage (mainwindow, WM_SETICON, (WPARAM)FALSE, (LPARAM)hIcon); - - return true; -} - -/* -================ -VID_SetMode -================ -*/ -int VID_SetMode (int modenum) -{ - int original_mode, temp; - qboolean stat = false; - MSG msg; - - if ((windowed && (modenum != 0)) || - (!windowed && (modenum < 1)) || - (!windowed && (modenum >= nummodes))) - { - Sys_Error ("Bad video mode\n"); - } - -// so Con_Printfs don't mess us up by forcing vid and snd updates - temp = scr_disabled_for_loading; - scr_disabled_for_loading = true; - - CDAudio_Pause (); - BGM_Pause (); - - if (vid_modenum == NO_MODE) - original_mode = windowed_default; - else - original_mode = vid_modenum; - - // Set either the fullscreen or windowed mode - if (modelist[modenum].type == MS_WINDOWED) - { - if (_windowed_mouse.value && key_dest == key_game) - { - stat = VID_SetWindowedMode(modenum); - IN_ActivateMouse (); - IN_HideMouse (); - } - else - { - IN_DeactivateMouse (); - IN_ShowMouse (); - stat = VID_SetWindowedMode(modenum); - } - } - else if (modelist[modenum].type == MS_FULLDIB) - { - stat = VID_SetFullDIBMode(modenum); - IN_ActivateMouse (); - IN_HideMouse (); - } - else - { - Sys_Error ("VID_SetMode: Bad mode type in modelist"); - } - - if (!stat) - { - Sys_Error ("Couldn't set video mode"); - } - - //johnfitz -- re-initialize dinput becuase it's tied to the "mainwindow" object - if (COM_CheckParm ("-dinput")) - IN_InitDInput (); - //johnfitz - - window_width = DIBWidth; - window_height = DIBHeight; - VID_UpdateWindowStatus (); - - CDAudio_Resume (); - BGM_Resume (); - scr_disabled_for_loading = temp; - -// now we try to make sure we get the focus on the mode switch, because -// sometimes in some systems we don't. We grab the foreground, then -// finish setting up, pump all our messages, and sleep for a little while -// to let messages finish bouncing around the system, then we put -// ourselves at the top of the z order, then grab the foreground again, -// Who knows if it helps, but it probably doesn't hurt - SetForegroundWindow (mainwindow); - vid_modenum = modenum; - - while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - Sleep (100); - - SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0, - SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | - SWP_NOCOPYBITS); - - SetForegroundWindow (mainwindow); - -// fix the leftover Alt from any Alt-Tab or the like that switched us away - ClearAllStates (); - - Con_SafePrintf ("Video mode %s initialized\n", VID_GetModeDescription (vid_modenum)); - - vid.recalc_refdef = 1; - - return true; -} - -/* -=============== -VID_Vsync_f -- johnfitz -=============== -*/ -void VID_Vsync_f (cvar_t *var) -{ - if (gl_swap_control) - { - if (vid_vsync.value) - { - if (!wglSwapIntervalEXT(1)) - Con_Printf ("VID_Vsync_f: failed on wglSwapIntervalEXT\n"); - } - else - { - if (!wglSwapIntervalEXT(0)) - Con_Printf ("VID_Vsync_f: failed on wglSwapIntervalEXT\n"); - } - } -} - -/* -=================== -VID_Restart -- johnfitz -- change video modes on the fly -=================== -*/ -void VID_Restart (void) -{ - HDC hdc; - HGLRC hrc; - int i; - qboolean mode_changed = false; - - if (vid_locked) - return; - -// -// check cvars against current mode -// - if (vid_fullscreen.value) - { - if (modelist[vid_default].type == MS_WINDOWED) - mode_changed = true; - else if (modelist[vid_default].bpp != (int)vid_bpp.value) - mode_changed = true; - else if (modelist[vid_default].refreshrate != (int)vid_refreshrate.value) - mode_changed = true; - } - else - if (modelist[vid_default].type != MS_WINDOWED) - mode_changed = true; - - if (modelist[vid_default].width != (int)vid_width.value || - modelist[vid_default].height != (int)vid_height.value) - mode_changed = true; - - if (mode_changed) - { -// -// decide which mode to set -// - if (vid_fullscreen.value) - { - for (i=1; i 0) ? (int)scr_conwidth.value : (scr_conscale.value > 0) ? (int)(vid.width/scr_conscale.value) : vid.width; - vid.conwidth = CLAMP (320, vid.conwidth, vid.width); - vid.conwidth &= 0xFFFFFFF8; - vid.conheight = vid.conwidth * vid.height / vid.width; - } -// -// keep cvars in line with actual mode -// - Cvar_Set ("vid_width", va("%i", modelist[vid_default].width)); - Cvar_Set ("vid_height", va("%i", modelist[vid_default].height)); - Cvar_Set ("vid_bpp", va("%i", modelist[vid_default].bpp)); - Cvar_Set ("vid_refreshrate", va("%i", modelist[vid_default].refreshrate)); - Cvar_Set ("vid_fullscreen", (windowed) ? "0" : "1"); -} - -/* -================ -VID_Test -- johnfitz -- like vid_restart, but asks for confirmation after switching modes -================ -*/ -void VID_Test (void) -{ - vmode_t oldmode; - qboolean mode_changed = false; - - if (vid_locked) - return; -// -// check cvars against current mode -// - if (vid_fullscreen.value) - { - if (modelist[vid_default].type == MS_WINDOWED) - mode_changed = true; - else if (modelist[vid_default].bpp != (int)vid_bpp.value) - mode_changed = true; - else if (modelist[vid_default].refreshrate != (int)vid_refreshrate.value) - mode_changed = true; - } - else - if (modelist[vid_default].type != MS_WINDOWED) - mode_changed = true; - - if (modelist[vid_default].width != (int)vid_width.value || - modelist[vid_default].height != (int)vid_height.value) - mode_changed = true; - - if (!mode_changed) - return; -// -// now try the switch -// - oldmode = modelist[vid_default]; - - VID_Restart (); - - //pop up confirmation dialoge - if (!SCR_ModalMessage("Would you like to keep this\nvideo mode? (y/n)\n", 5.0f)) - { - //revert cvars and mode - Cvar_Set ("vid_width", va("%i", oldmode.width)); - Cvar_Set ("vid_height", va("%i", oldmode.height)); - Cvar_Set ("vid_bpp", va("%i", oldmode.bpp)); - Cvar_Set ("vid_refreshrate", va("%i", oldmode.refreshrate)); - Cvar_Set ("vid_fullscreen", (oldmode.type == MS_WINDOWED) ? "0" : "1"); - VID_Restart (); - } -} - -/* -================ -VID_Unlock -- johnfitz -================ -*/ -void VID_Unlock (void) -{ - vid_locked = false; - - //sync up cvars in case they were changed during the lock - Cvar_Set ("vid_width", va("%i", modelist[vid_default].width)); - Cvar_Set ("vid_height", va("%i", modelist[vid_default].height)); - Cvar_Set ("vid_bpp", va("%i", modelist[vid_default].bpp)); - Cvar_Set ("vid_refreshrate", va("%i", modelist[vid_default].refreshrate)); - Cvar_Set ("vid_fullscreen", (windowed) ? "0" : "1"); -} - -/* -================ -VID_UpdateWindowStatus -================ -*/ -void VID_UpdateWindowStatus (void) -{ - window_rect.left = window_x; - window_rect.top = window_y; - window_rect.right = window_x + window_width; - window_rect.bottom = window_y + window_height; - window_center_x = (window_rect.left + window_rect.right) / 2; - window_center_y = (window_rect.top + window_rect.bottom) / 2; - - IN_UpdateClipCursor (); -} - -//============================================================================== -// -// OPENGL STUFF -// -//============================================================================== - -/* -=============== -GL_MakeNiceExtensionsList -- johnfitz -=============== -*/ -char *GL_MakeNiceExtensionsList (const char *in) -{ - char *copy, *token, *out; - int i, count; - - //each space will be replaced by 4 chars, so count the spaces before we malloc - for (i = 0, count = 1; i < (int) strlen(in); i++) - if (in[i] == ' ') - count++; - out = Z_Malloc (strlen(in) + count*3 + 1); //usually about 1-2k - out[0] = 0; - - copy = (char *) Z_Strdup(in); - - for (token = strtok(copy, " "); token; token = strtok(NULL, " ")) - { - strcat(out, "\n "); - strcat(out, token); - } - - Z_Free (copy); - return out; -} - -/* -=============== -GL_Info_f -- johnfitz -=============== -*/ -void GL_Info_f (void) -{ - static char *gl_extensions_nice = NULL; - static char *wgl_extensions_nice = NULL; - - if (!gl_extensions_nice) - gl_extensions_nice = GL_MakeNiceExtensionsList (gl_extensions); - - if (!wgl_extensions_nice) - wgl_extensions_nice = GL_MakeNiceExtensionsList (wgl_extensions); - - Con_SafePrintf ("GL_VENDOR: %s\n", gl_vendor); - Con_SafePrintf ("GL_RENDERER: %s\n", gl_renderer); - Con_SafePrintf ("GL_VERSION: %s\n", gl_version); - Con_Printf ("GL_EXTENSIONS: %s\n", gl_extensions_nice); - Con_Printf ("WGL_EXTENSIONS: %s\n", wgl_extensions_nice); -} - -/* -=============== -GL_CheckExtensions -- johnfitz -=============== -*/ -void GL_CheckExtensions (void) -{ - // - // multitexture - // - if (COM_CheckParm("-nomtex")) - Con_Warning ("Mutitexture disabled at command line\n"); - else if (strstr(gl_extensions, "GL_ARB_multitexture")) - { - GL_MTexCoord2fFunc = (void *) wglGetProcAddress("glMultiTexCoord2fARB"); - GL_SelectTextureFunc = (void *) wglGetProcAddress("glActiveTextureARB"); - if (GL_MTexCoord2fFunc && GL_SelectTextureFunc) - { - Con_Printf("FOUND: ARB_multitexture\n"); - TEXTURE0 = GL_TEXTURE0_ARB; - TEXTURE1 = GL_TEXTURE1_ARB; - gl_mtexable = true; - } - else - { - Con_Warning ("Couldn't link to multitexture functions\n"); - } - } - else if (strstr(gl_extensions, "GL_SGIS_multitexture")) - { - GL_MTexCoord2fFunc = (void *) wglGetProcAddress("glMTexCoord2fSGIS"); - GL_SelectTextureFunc = (void *) wglGetProcAddress("glSelectTextureSGIS"); - if (GL_MTexCoord2fFunc && GL_SelectTextureFunc) - { - Con_Printf("FOUND: SGIS_multitexture\n"); - TEXTURE0 = TEXTURE0_SGIS; - TEXTURE1 = TEXTURE1_SGIS; - gl_mtexable = true; - } - else - { - Con_Warning ("Couldn't link to multitexture functions\n"); - } - } - else - { - Con_Warning ("multitexture not supported (extension not found)\n"); - } - - // - // texture_env_combine - // - if (COM_CheckParm("-nocombine")) - Con_Warning ("texture_env_combine disabled at command line\n"); - else if (strstr(gl_extensions, "GL_ARB_texture_env_combine")) - { - Con_Printf("FOUND: ARB_texture_env_combine\n"); - gl_texture_env_combine = true; - } - else if (strstr(gl_extensions, "GL_EXT_texture_env_combine")) - { - Con_Printf("FOUND: EXT_texture_env_combine\n"); - gl_texture_env_combine = true; - } - else - { - Con_Warning ("texture_env_combine not supported\n"); - } - - // - // texture_env_add - // - if (COM_CheckParm("-noadd")) - Con_Warning ("texture_env_add disabled at command line\n"); - else if (strstr(gl_extensions, "GL_ARB_texture_env_add")) - { - Con_Printf("FOUND: ARB_texture_env_add\n"); - gl_texture_env_add = true; - } - else if (strstr(gl_extensions, "GL_EXT_texture_env_add")) - { - Con_Printf("FOUND: EXT_texture_env_add\n"); - gl_texture_env_add = true; - } - else - { - Con_Warning ("texture_env_add not supported\n"); - } - - // - // swap control - // - if (strstr(gl_extensions, "GL_EXT_swap_control") || strstr(wgl_extensions, "WGL_EXT_swap_control")) - { - wglSwapIntervalEXT = (SETSWAPFUNC) wglGetProcAddress("wglSwapIntervalEXT"); - wglGetSwapIntervalEXT = (GETSWAPFUNC) wglGetProcAddress("wglGetSwapIntervalEXT"); - - if (wglSwapIntervalEXT && wglGetSwapIntervalEXT) - { - if (!wglSwapIntervalEXT(0)) - Con_Warning ("vertical sync not supported (wglSwapIntervalEXT failed)\n"); - else if (wglGetSwapIntervalEXT() == -1) - Con_Warning ("vertical sync not supported (swap interval is -1.) Make sure you don't have vertical sync disabled in your driver settings.\n"); - else - { - Con_Printf("FOUND: GL_EXT_swap_control\n"); - gl_swap_control = true; - } - } - else - { - Con_Warning ("Couldn't link to vertical sync functions\n"); - } - } - else - { - Con_Warning ("vertical sync not supported (extension not found)\n"); - } - - // - // anisotropic filtering - // - if (strstr(gl_extensions, "GL_EXT_texture_filter_anisotropic")) - { - float test1,test2; - GLuint tex; - - // test to make sure we really have control over it - // 1.0 and 2.0 should always be legal values - glGenTextures(1, &tex); - glBindTexture (GL_TEXTURE_2D, tex); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); - glGetTexParameterfv (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &test1); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f); - glGetTexParameterfv (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &test2); - glDeleteTextures(1, &tex); - - if (test1 == 1 && test2 == 2) - { - Con_Printf("FOUND: EXT_texture_filter_anisotropic\n"); - gl_anisotropy_able = true; - } - else - { - Con_Warning ("anisotropic filtering locked by driver. Current driver setting is %f\n", test1); - } - - //get max value either way, so the menu and stuff know it - glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max_anisotropy); - } - else - { - Con_Warning ("texture_filter_anisotropic not supported\n"); - } -} - -/* -=============== -GetWGLExtensions -- johnfitz -=============== -*/ -void GetWGLExtensions (void) -{ - const char *(*wglGetExtensionsStringARB) (HDC hdc); - const char *(*wglGetExtensionsStringEXT) (); - - if ((wglGetExtensionsStringARB = (void *) wglGetProcAddress ("wglGetExtensionsStringARB")) != NULL) - wgl_extensions = wglGetExtensionsStringARB (maindc); - else if ((wglGetExtensionsStringEXT = (void *) wglGetProcAddress ("wglGetExtensionsStringEXT")) != NULL) - wgl_extensions = wglGetExtensionsStringEXT (); - else - wgl_extensions = ""; -} - -/* -=============== -GL_SetupState -- johnfitz - -does all the stuff from GL_Init that needs to be done every time a new GL render context is created -GL_Init will still do the stuff that only needs to be done once -=============== -*/ -void GL_SetupState (void) -{ - glClearColor (0.15,0.15,0.15,0); //johnfitz -- originally 1,0,0,0 - glCullFace(GL_BACK); //johnfitz -- glquake used CCW with backwards culling -- let's do it right - glFrontFace(GL_CW); //johnfitz -- glquake used CCW with backwards culling -- let's do it right - glEnable(GL_TEXTURE_2D); - glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.666); - glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); - glShadeModel (GL_FLAT); - glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //johnfitz - glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glDepthRange (0, 1); //johnfitz -- moved here becuase gl_ztrick is gone. - glDepthFunc (GL_LEQUAL); //johnfitz -- moved here becuase gl_ztrick is gone. -} - -/* -=============== -GL_Init -=============== -*/ -void GL_Init (void) -{ - gl_vendor = (const char *) glGetString (GL_VENDOR); - gl_renderer = (const char *) glGetString (GL_RENDERER); - gl_version = (const char *) glGetString (GL_VERSION); - gl_extensions = (const char *) glGetString (GL_EXTENSIONS); - - GetWGLExtensions (); //johnfitz - GL_CheckExtensions (); //johnfitz - - Cmd_AddCommand ("gl_info", GL_Info_f); //johnfitz - - Cvar_RegisterVariable (&vid_vsync); //johnfitz - Cvar_SetCallback (&vid_vsync, VID_Vsync_f); - - if (strnicmp(gl_renderer,"PowerVR",7)==0) - fullsbardraw = true; - - if (strnicmp(gl_renderer,"Permedia",8)==0) - isPermedia = true; - - //johnfitz -- intel video workarounds from Baker - if (!strcmp(gl_vendor, "Intel")) - { - Con_Printf ("Intel Display Adapter detected\n"); - isIntelVideo = true; - } - //johnfitz - -#if 0 - //johnfitz -- confirm presence of stencil buffer - glGetIntegerv(GL_STENCIL_BITS, &gl_stencilbits); - if(!gl_stencilbits) - Con_Warning ("Could not create stencil buffer\n"); - else - Con_Printf ("%i bit stencil buffer\n", gl_stencilbits); -#endif - - GL_SetupState (); //johnfitz -} - -/* -================= -GL_BeginRendering -- sets values of glx, gly, glwidth, glheight -================= -*/ -void GL_BeginRendering (int *x, int *y, int *width, int *height) -{ - *x = *y = 0; - *width = WindowRect.right - WindowRect.left; - *height = WindowRect.bottom - WindowRect.top; -} - -/* -================= -GL_EndRendering -================= -*/ -void GL_EndRendering (void) -{ - if (!scr_skipupdate || block_drawing) - SwapBuffers(maindc); - -// handle the mouse state when windowed if that's changed - if (modestate == MS_WINDOWED) - { - if (!_windowed_mouse.value) { - if (windowed_mouse) { - IN_DeactivateMouse (); - IN_ShowMouse (); - windowed_mouse = false; - } - } else { - windowed_mouse = true; - if (key_dest == key_game && !mouseactive && ActiveApp) { - IN_ActivateMouse (); - IN_HideMouse (); - } else if (mouseactive && key_dest != key_game) { - IN_DeactivateMouse (); - IN_ShowMouse (); - } - } - } - if (fullsbardraw) - Sbar_Changed(); -} - -void VID_SetDefaultMode (void) -{ - IN_DeactivateMouse (); -} - - -void VID_Shutdown (void) -{ - HGLRC hRC; - HDC hDC; - - if (vid_initialized) - { - vid_canalttab = false; - hRC = wglGetCurrentContext(); - hDC = wglGetCurrentDC(); - - wglMakeCurrent(NULL, NULL); - - if (hRC) - wglDeleteContext(hRC); - - VID_Gamma_Shutdown (); //johnfitz - - if (hDC && dibwindow) - ReleaseDC(dibwindow, hDC); - - if (modestate == MS_FULLDIB) - ChangeDisplaySettings (NULL, 0); - - if (maindc && dibwindow) - ReleaseDC (dibwindow, maindc); - - AppActivate(false, false); - } -} - -//========================================================================== - - -BOOL bSetupPixelFormat(HDC hDC) -{ - static PIXELFORMATDESCRIPTOR pfd = { - sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd - 1, // version number - PFD_DRAW_TO_WINDOW | // support window - PFD_SUPPORT_OPENGL | // support OpenGL - PFD_DOUBLEBUFFER, // double buffered - PFD_TYPE_RGBA, // RGBA type - 24, // 24-bit color depth - 0, 0, 0, 0, 0, 0, // color bits ignored - 0, // no alpha buffer - 0, // shift bit ignored - 0, // no accumulation buffer - 0, 0, 0, 0, // accum bits ignored - 32, // 32-bit z-buffer - 0, // no stencil buffer - 0, // no auxiliary buffer - PFD_MAIN_PLANE, // main layer - 0, // reserved - 0, 0, 0 // layer masks ignored - }; - int pixelformat; - PIXELFORMATDESCRIPTOR test; //johnfitz - - if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ) - { - MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); - return FALSE; - } - - DescribePixelFormat(hDC, pixelformat, sizeof(PIXELFORMATDESCRIPTOR), &test); //johnfitz - - if (SetPixelFormat(hDC, pixelformat, &pfd) == FALSE) - { - MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); - return FALSE; - } - - return TRUE; -} - - - -byte scantokey[128] = - { -// 0 1 2 3 4 5 6 7 -// 8 9 A B C D E F - 0 , 27, '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', K_BACKSPACE, 9, // 0 - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']', 13 , K_CTRL,'a', 's', // 1 - 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', - '\'' , '`', K_SHIFT,'\\', 'z', 'x', 'c', 'v', // 2 - 'b', 'n', 'm', ',', '.', '/', K_SHIFT,'*', - K_ALT,' ', 0 , K_F1, K_F2, K_F3, K_F4, K_F5, // 3 - K_F6, K_F7, K_F8, K_F9, K_F10, K_PAUSE , 0 , K_HOME, - K_UPARROW,K_PGUP,'-',K_LEFTARROW,'5',K_RIGHTARROW,'+',K_END, //4 - K_DOWNARROW,K_PGDN,K_INS,K_DEL,0,0, 0, K_F11, - K_F12,0 , 0 , 0 , 0 , 0 , 0 , 0, // 5 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, // 6 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // 7 - }; - -byte shiftscantokey[128] = - { -// 0 1 2 3 4 5 6 7 -// 8 9 A B C D E F - 0 , 27, '!', '@', '#', '$', '%', '^', - '&', '*', '(', ')', '_', '+', K_BACKSPACE, 9, // 0 - 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', - 'O', 'P', '{', '}', 13 , K_CTRL,'A', 'S', // 1 - 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', - '"' , '~', K_SHIFT,'|', 'Z', 'X', 'C', 'V', // 2 - 'B', 'N', 'M', '<', '>', '?', K_SHIFT,'*', - K_ALT,' ', 0 , K_F1, K_F2, K_F3, K_F4, K_F5, // 3 - K_F6, K_F7, K_F8, K_F9, K_F10, K_PAUSE , 0 , K_HOME, - K_UPARROW,K_PGUP,'_',K_LEFTARROW,'%',K_RIGHTARROW,'+',K_END, //4 - K_DOWNARROW,K_PGDN,K_INS,K_DEL,0,0, 0, K_F11, - K_F12,0 , 0 , 0 , 0 , 0 , 0 , 0, // 5 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, // 6 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // 7 - }; - - -/* -======= -MapKey - -Map from windows to quake keynums -======= -*/ -int MapKey (int key) -{ - /* - key = (key>>16)&255; - if (key > 127) - return 0; - if (scantokey[key] == 0) - Con_DPrintf("key 0x%02x has no translation\n", key); - return scantokey[key]; - */ - - int extended; - extern cvar_t cl_keypad; - - extended = (key >> 24) & 1; - - key = (key>>16)&255; - if (key > 127) - return 0; - - key = scantokey[key]; - - if (cl_keypad.value) { - if (extended) { - switch (key) { - case K_ENTER: return KP_ENTER; - case '/': return KP_SLASH; - case K_PAUSE: return KP_NUMLOCK; - }; - } else { - switch (key) { - case K_HOME: return KP_HOME; - case K_UPARROW: return KP_UPARROW; - case K_PGUP: return KP_PGUP; - case K_LEFTARROW: return KP_LEFTARROW; - case K_RIGHTARROW: return KP_RIGHTARROW; - case K_END: return KP_END; - case K_DOWNARROW: return KP_DOWNARROW; - case K_PGDN: return KP_PGDN; - case K_INS: return KP_INS; - case K_DEL: return KP_DEL; - } - } - } else { - // cl_keypad 0, compatibility mode - switch (key) { - case KP_STAR: return '*'; - case KP_MINUS: return '-'; - case KP_5: return '5'; - case KP_PLUS: return '+'; - } - } - - return key; -} - -/* -=================================================================== - -MAIN WINDOW - -=================================================================== -*/ - -/* -================ -ClearAllStates -================ -*/ -void ClearAllStates (void) -{ - //johnfitz -- moved some code into Key_ClearStates - Key_ClearStates (); - IN_ClearStates (); -} - -void AppActivate(BOOL fActive, BOOL minimize) -/**************************************************************************** -* -* Function: AppActivate -* Parameters: fActive - True if app is activating -* -* Description: If the application is activating, then swap the system -* into SYSPAL_NOSTATIC mode so that our palettes will display -* correctly. -* -****************************************************************************/ -{ - static BOOL sound_active; - - ActiveApp = fActive; - Minimized = minimize; - -// enable/disable sound on focus gain/loss - if (!ActiveApp && sound_active) - { - S_BlockSound (); - sound_active = false; - } - else if (ActiveApp && !sound_active) - { - S_UnblockSound (); - sound_active = true; - } - - if (fActive) - { - if (modestate == MS_FULLDIB) - { - IN_ActivateMouse (); - IN_HideMouse (); - if (vid_canalttab && vid_wassuspended) { - vid_wassuspended = false; - ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN); - ShowWindow(mainwindow, SW_SHOWNORMAL); - MoveWindow(mainwindow, 0, 0, gdevmode.dmPelsWidth, gdevmode.dmPelsHeight, false); //johnfitz -- alt-tab fix via Baker - } - } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value && key_dest == key_game) - { - IN_ActivateMouse (); - IN_HideMouse (); - } - VID_Gamma_SetGamma (); //johnfitz - } - - if (!fActive) - { - if (modestate == MS_FULLDIB) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - if (vid_canalttab) { - ChangeDisplaySettings (NULL, 0); - vid_wassuspended = true; - } - } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - } - VID_Gamma_Restore (); //johnfitz - } -} - - -/* main window procedure */ -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - LONG lRet = 1; - int fActive, fMinimized, temp; - extern unsigned int uiWheelMessage; - - if ( uMsg == uiWheelMessage ) - uMsg = WM_MOUSEWHEEL; - - switch (uMsg) - { - case WM_KILLFOCUS: - if (modestate == MS_FULLDIB) - ShowWindow(mainwindow, SW_SHOWMINNOACTIVE); - break; - - case WM_CREATE: - break; - - case WM_MOVE: - window_x = (int) LOWORD(lParam); - window_y = (int) HIWORD(lParam); - VID_UpdateWindowStatus (); - break; - - case WM_KEYDOWN: - case WM_SYSKEYDOWN: - Key_Event (MapKey(lParam), true); - break; - - case WM_KEYUP: - case WM_SYSKEYUP: - Key_Event (MapKey(lParam), false); - break; - - case WM_SYSCHAR: - // keep Alt-Space from happening - break; - - // this is complicated because Win32 seems to pack multiple mouse events into - // one update sometimes, so we always check all states and look for events - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MOUSEMOVE: - temp = 0; - - if (wParam & MK_LBUTTON) - temp |= 1; - - if (wParam & MK_RBUTTON) - temp |= 2; - - if (wParam & MK_MBUTTON) - temp |= 4; - - IN_MouseEvent (temp); - - break; - - // JACK: This is the mouse wheel with the Intellimouse - // Its delta is either positive or neg, and we generate the proper - // Event. - case WM_MOUSEWHEEL: - if ((short) HIWORD(wParam) > 0) { - Key_Event(K_MWHEELUP, true); - Key_Event(K_MWHEELUP, false); - } else { - Key_Event(K_MWHEELDOWN, true); - Key_Event(K_MWHEELDOWN, false); - } - break; - - case WM_SIZE: - break; - - case WM_CLOSE: - if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", - MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) - { - Sys_Quit (); - } - - break; - - case WM_ACTIVATE: - fActive = LOWORD(wParam); - fMinimized = (BOOL) HIWORD(wParam); - AppActivate(!(fActive == WA_INACTIVE), fMinimized); - - // fix the leftover Alt from any Alt-Tab or the like that switched us away - ClearAllStates (); - - break; - - case WM_DESTROY: - { - if (dibwindow) - DestroyWindow (dibwindow); - - PostQuitMessage (0); - } - break; - - case MM_MCINOTIFY: - lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); - break; - - default: - /* pass all unhandled messages to DefWindowProc */ - lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); - break; - } - - /* return 1 if handled message, 0 if not */ - return lRet; -} - -//========================================================================== -// -// COMMANDS -// -//========================================================================== - -/* -================= -VID_NumModes -================= -*/ -int VID_NumModes (void) -{ - return nummodes; -} - - -/* -================= -VID_GetModePtr -================= -*/ -vmode_t *VID_GetModePtr (int modenum) -{ - - if ((modenum >= 0) && (modenum < nummodes)) - return &modelist[modenum]; - else - return &badmode; -} - - -/* -================= -VID_GetModeDescription -================= -*/ -const char *VID_GetModeDescription (int mode) -{ - const char *pinfo; - vmode_t *pv; - static char temp[100]; - - if ((mode < 0) || (mode >= nummodes)) - return NULL; - - if (!leavecurrentmode) - { - pv = VID_GetModePtr (mode); - pinfo = pv->modedesc; - } - else - { - sprintf (temp, "Desktop resolution (%ix%ix%i)", //johnfitz -- added bpp - modelist[MODE_FULLSCREEN_DEFAULT].width, - modelist[MODE_FULLSCREEN_DEFAULT].height, - modelist[MODE_FULLSCREEN_DEFAULT].bpp); //johnfitz -- added bpp - pinfo = temp; - } - - return pinfo; -} - -// KJB: Added this to return the mode driver name in description for console -/* -================= -VID_GetExtModeDescription -================= -*/ -const char *VID_GetExtModeDescription (int mode) -{ - static char pinfo[40]; - vmode_t *pv; - - if ((mode < 0) || (mode >= nummodes)) - return NULL; - - pv = VID_GetModePtr (mode); - if (modelist[mode].type == MS_FULLDIB) - { - if (!leavecurrentmode) - { - sprintf(pinfo,"%s fullscreen", pv->modedesc); - } - else - { - sprintf (pinfo, "Desktop resolution (%ix%ix%i)", //johnfitz -- added bpp - modelist[MODE_FULLSCREEN_DEFAULT].width, - modelist[MODE_FULLSCREEN_DEFAULT].height, - modelist[MODE_FULLSCREEN_DEFAULT].bpp); //johnfitz -- added bpp - } - } - else - { - if (modestate == MS_WINDOWED) - sprintf(pinfo, "%s windowed", pv->modedesc); - else - sprintf(pinfo, "windowed"); - } - - return pinfo; -} - -/* -================= -VID_DescribeCurrentMode_f -================= -*/ -void VID_DescribeCurrentMode_f (void) -{ - Con_Printf ("%s\n", VID_GetExtModeDescription (vid_modenum)); -} - -/* -================= -VID_DescribeModes_f -- johnfitz -- changed formatting, and added refresh rates after each mode. -================= -*/ -void VID_DescribeModes_f (void) -{ - int i, lnummodes, t; - vmode_t *pv; - int lastwidth=0, lastheight=0, lastbpp=0, count=0; - - lnummodes = VID_NumModes (); - - t = leavecurrentmode; - leavecurrentmode = 0; - - for (i=1 ; iwidth && lastheight == pv->height && lastbpp == pv->bpp) - { - Con_SafePrintf (",%i", pv->refreshrate); - } - else - { - if (count>0) - Con_SafePrintf ("\n"); - Con_SafePrintf (" %4i x %4i x %i : %i", pv->width, pv->height, pv->bpp, pv->refreshrate); - lastwidth = pv->width; - lastheight = pv->height; - lastbpp = pv->bpp; - count++; - } - } - Con_Printf ("\n%i modes\n", count); - - leavecurrentmode = t; -} - -//========================================================================== -// -// INIT -// -//========================================================================== - -/* -================= -VID_InitDIB -================= -*/ -void VID_InitDIB (HINSTANCE hInstance) -{ - int i; - DEVMODE devmode; //johnfitz - WNDCLASS wc; - HDC hdc; - - /* Register the frame class */ - wc.style = 0; - wc.lpfnWndProc = (WNDPROC)MainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = 0; - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = NULL; - wc.lpszMenuName = 0; - wc.lpszClassName = "FitzQuake"; //johnfitz -- was WinQuake - - if (!RegisterClass (&wc) ) - Sys_Error ("Couldn't register window class"); - - modelist[0].type = MS_WINDOWED; - - i = COM_CheckParm("-width"); - if (i && i < com_argc-1) - modelist[0].width = Q_atoi(com_argv[i+1]); - else - modelist[0].width = 640; - - if (modelist[0].width < 320) - modelist[0].width = 320; - - i = COM_CheckParm("-height"); - if (i && i < com_argc-1) - modelist[0].height= Q_atoi(com_argv[i+1]); - else - modelist[0].height = modelist[0].width * 240/320; - - if (modelist[0].height < 200) //johnfitz -- was 240 - modelist[0].height = 200; //johnfitz -- was 240 - - //johnfitz -- get desktop bit depth - hdc = GetDC(NULL); - modelist[0].bpp = GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(NULL, hdc); - //johnfitz - - //johnfitz -- get refreshrate - if (EnumDisplaySettings (NULL, ENUM_CURRENT_SETTINGS, &devmode)) - modelist[0].refreshrate = devmode.dmDisplayFrequency; - //johnfitz - - sprintf (modelist[0].modedesc, "%dx%dx%d %dHz", //johnfitz -- added bpp, refreshrate - modelist[0].width, - modelist[0].height, - modelist[0].bpp, //johnfitz -- added bpp - modelist[0].refreshrate); //johnfitz -- added refreshrate - - modelist[0].modenum = MODE_WINDOWED; - modelist[0].dib = 1; - modelist[0].fullscreen = 0; - modelist[0].halfscreen = 0; - - nummodes = 1; -} - -/* -================= -VID_InitFullDIB -================= -*/ -void VID_InitFullDIB (HINSTANCE hInstance) -{ - DEVMODE devmode; - int i, modenum, originalnummodes, existingmode, numlowresmodes; - int j, bpp, done; - BOOL stat; - -// enumerate >8 bpp modes - originalnummodes = nummodes; - modenum = 0; - - do - { - stat = EnumDisplaySettings (NULL, modenum, &devmode); - - if ((devmode.dmBitsPerPel >= 15) && - (devmode.dmPelsWidth <= MAXWIDTH) && - (devmode.dmPelsHeight <= MAXHEIGHT) && - (nummodes < MAX_MODE_LIST)) - { - devmode.dmFields = DM_BITSPERPEL | - DM_PELSWIDTH | - DM_PELSHEIGHT | - DM_DISPLAYFREQUENCY; //johnfitz -- refreshrate - - if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) == - DISP_CHANGE_SUCCESSFUL) - { - modelist[nummodes].type = MS_FULLDIB; - modelist[nummodes].width = devmode.dmPelsWidth; - modelist[nummodes].height = devmode.dmPelsHeight; - modelist[nummodes].modenum = 0; - modelist[nummodes].halfscreen = 0; - modelist[nummodes].dib = 1; - modelist[nummodes].fullscreen = 1; - modelist[nummodes].bpp = devmode.dmBitsPerPel; - modelist[nummodes].refreshrate = devmode.dmDisplayFrequency; //johnfitz -- refreshrate - sprintf (modelist[nummodes].modedesc, "%dx%dx%d %dHz", //johnfitz -- refreshrate - (int) devmode.dmPelsWidth, - (int) devmode.dmPelsHeight, - (int) devmode.dmBitsPerPel, - (int) devmode.dmDisplayFrequency); //johnfitz -- refreshrate - - // if the width is more than twice the height, reduce it by half because this - // is probably a dual-screen monitor - if (!COM_CheckParm("-noadjustaspect")) - { - if (modelist[nummodes].width > (modelist[nummodes].height << 1)) - { - modelist[nummodes].width >>= 1; - modelist[nummodes].halfscreen = 1; - sprintf (modelist[nummodes].modedesc, "%dx%dx%d %dHz", //johnfitz -- refreshrate - modelist[nummodes].width, - modelist[nummodes].height, - modelist[nummodes].bpp, - modelist[nummodes].refreshrate); //johnfitz -- refreshrate - } - } - - for (i=originalnummodes, existingmode = 0 ; i=vid_menu_nummodes) - i = 0; - else if (i<0) - i = vid_menu_nummodes-1; - } - - Cvar_SetValue ("vid_width",(float)vid_menu_modes[i].width); - Cvar_SetValue ("vid_height",(float)vid_menu_modes[i].height); - VID_Menu_RebuildBppList (); - VID_Menu_RebuildRateList (); - VID_Menu_CalcAspectRatio (); -} - -/* -================ -VID_Menu_ChooseNextBpp - -chooses next bpp in order, then updates vid_bpp cvar, then updates refreshrate list -================ -*/ -void VID_Menu_ChooseNextBpp (int dir) -{ - int i; - - for (i=0;i=vid_menu_numbpps) - i = 0; - else if (i<0) - i = vid_menu_numbpps-1; - } - - Cvar_SetValue ("vid_bpp",(float)vid_menu_bpps[i]); - VID_Menu_RebuildRateList (); -} - -/* -================ -VID_Menu_ChooseNextRate - -chooses next refresh rate in order, then updates vid_refreshrate cvar -================ -*/ -void VID_Menu_ChooseNextRate (int dir) -{ - int i; - - for (i=0;i=vid_menu_numrates) - i = 0; - else if (i<0) - i = vid_menu_numrates-1; - } - - Cvar_SetValue ("vid_refreshrate",(float)vid_menu_rates[i]); -} - -/* -================ -VID_MenuKey -================ -*/ -void VID_MenuKey (int key) -{ - switch (key) - { - case K_ESCAPE: - VID_SyncCvars (); //sync cvars before leaving menu. FIXME: there are other ways to leave menu - S_LocalSound ("misc/menu1.wav"); - M_Menu_Options_f (); - break; - - case K_UPARROW: - S_LocalSound ("misc/menu1.wav"); - video_options_cursor--; - if (video_options_cursor < 0) - video_options_cursor = VIDEO_OPTIONS_ITEMS-1; - break; - - case K_DOWNARROW: - S_LocalSound ("misc/menu1.wav"); - video_options_cursor++; - if (video_options_cursor >= VIDEO_OPTIONS_ITEMS) - video_options_cursor = 0; - break; - - case K_LEFTARROW: - S_LocalSound ("misc/menu3.wav"); - switch (video_options_cursor) - { - case 0: - VID_Menu_ChooseNextMode (1); - break; - case 1: - VID_Menu_ChooseNextBpp (1); - break; - case 2: - VID_Menu_ChooseNextRate (1); - break; - case 3: - Cbuf_AddText ("toggle vid_fullscreen\n"); - break; - case 4: - case 5: - default: - break; - } - break; - - case K_RIGHTARROW: - S_LocalSound ("misc/menu3.wav"); - switch (video_options_cursor) - { - case 0: - VID_Menu_ChooseNextMode (-1); - break; - case 1: - VID_Menu_ChooseNextBpp (-1); - break; - case 2: - VID_Menu_ChooseNextRate (-1); - break; - case 3: - Cbuf_AddText ("toggle vid_fullscreen\n"); - break; - case 4: - case 5: - default: - break; - } - break; - - case K_ENTER: - m_entersound = true; - switch (video_options_cursor) - { - case 0: - VID_Menu_ChooseNextMode (1); - break; - case 1: - VID_Menu_ChooseNextBpp (1); - break; - case 2: - VID_Menu_ChooseNextRate (1); - break; - case 3: - Cbuf_AddText ("toggle vid_fullscreen\n"); - break; - case 4: - Cbuf_AddText ("vid_test\n"); - break; - case 5: - Cbuf_AddText ("vid_restart\n"); - break; - default: - break; - } - break; - - default: - break; - } -} - -/* -================ -VID_MenuDraw -================ -*/ -void VID_MenuDraw (void) -{ - int i = 0; - qpic_t *p; - const char *title; - - M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp")); - - //p = Draw_CachePic ("gfx/vidmodes.lmp"); - p = Draw_CachePic ("gfx/p_option.lmp"); - M_DrawPic ( (320-p->width)/2, 4, p); - - // title - title = "Video Options"; - M_PrintWhite ((320-8*strlen(title))/2, 32, title); - - // options - M_Print (16, video_cursor_table[i], " Video mode"); - M_Print (184, video_cursor_table[i], va("%ix%i (%i:%i)", (int)vid_width.value, (int)vid_height.value, vid_menu_rwidth, vid_menu_rheight)); - i++; - - M_Print (16, video_cursor_table[i], " Color depth"); - M_Print (184, video_cursor_table[i], va("%i", (int)vid_bpp.value)); - i++; - - M_Print (16, video_cursor_table[i], " Refresh rate"); - M_Print (184, video_cursor_table[i], va("%i Hz", (int)vid_refreshrate.value)); - i++; - - M_Print (16, video_cursor_table[i], " Fullscreen"); - M_DrawCheckbox (184, video_cursor_table[i], (int)vid_fullscreen.value); - i++; - - M_Print (16, video_cursor_table[i], " Test changes"); - i++; - - M_Print (16, video_cursor_table[i], " Apply changes"); - - // cursor - M_DrawCharacter (168, video_cursor_table[video_options_cursor], 12+((int)(realtime*4)&1)); - - // notes "345678901234567890123456789012345678" -// M_Print (16, 172, "Windowed modes always use the desk- "); -// M_Print (16, 180, "top color depth, and can never be "); -// M_Print (16, 188, "larger than the desktop resolution. "); -} - -/* -================ -VID_Menu_f -================ -*/ -void VID_Menu_f (void) -{ - key_dest = key_menu; - m_state = m_video; - m_entersound = true; - - //set all the cvars to match the current mode when entering the menu - VID_SyncCvars (); - - //set up bpp and rate lists based on current cvars - VID_Menu_RebuildBppList (); - VID_Menu_RebuildRateList (); - - //aspect ratio - VID_Menu_CalcAspectRatio (); -} diff --git a/Quake/snd_alsa.c b/Quake/snd_alsa.c deleted file mode 100644 index 07e6d3ea..00000000 --- a/Quake/snd_alsa.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - snd_alsa.c - - ALSA 1.0 sound driver for Linux Hexen II - - Copyright (C) 1999,2004 contributors of the QuakeForge project - - This program 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 2 - 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, write to: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA -*/ - - -#include "quakedef.h" -#include - -#define NB_PERIODS 4 - -//static const char alsa_default[] = "hw:0,0"; -//static const char alsa_default[] = "plughw:0"; -static const char alsa_default[] = "default"; -static const char *pcmname = alsa_default; -static snd_pcm_t *pcm = NULL; -static snd_pcm_uframes_t buffer_size; - -static const int tryrates[] = { 11025, 22050, 44100, 48000, 16000, 24000, 8000 }; -static const int MAX_TRYRATES = sizeof(tryrates)/sizeof(tryrates[0]); - - -#if defined(__GNUC__) && \ - !(defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) -#define ALSA_CHECK_ERR(check, fmt, args...) \ - do { \ - if (check < 0) { \ - Con_Printf ("ALSA: " fmt, ##args); \ - goto error; \ - } \ - } while (0) -#else -#define ALSA_CHECK_ERR(check, ...) \ - do { \ - if (check < 0) { \ - Con_Printf ("ALSA: " __VA_ARGS__); \ - goto error; \ - } \ - } while (0) -#endif - -qboolean SNDDMA_Init (dma_t *dma) -{ - int i, err; - unsigned int rate; - int tmp_bits, tmp_chan; - snd_pcm_hw_params_t *hw = NULL; - snd_pcm_sw_params_t *sw = NULL; - snd_pcm_uframes_t frag_size; - - i = COM_CheckParm("-alsadev"); - if (i != 0 && i < com_argc - 1) - pcmname = com_argv[i + 1]; - - err = snd_pcm_open (&pcm, pcmname, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); - if (err < 0) - { - Con_Printf ("ALSA: error opening device \"%s\": %s\n", pcmname, snd_strerror(err)); - return false; - } - Con_Printf ("ALSA: Using device: %s\n", pcmname); - - err = snd_pcm_hw_params_malloc (&hw); - ALSA_CHECK_ERR(err, "unable to allocate hardware params. %s\n", snd_strerror(err)); - - err = snd_pcm_hw_params_any (pcm, hw); - ALSA_CHECK_ERR(err, "unable to init hardware params. %s\n", snd_strerror(err)); - - err = snd_pcm_hw_params_set_access (pcm, hw, SND_PCM_ACCESS_MMAP_INTERLEAVED); - ALSA_CHECK_ERR(err, "unable to set interleaved access. %s\n", snd_strerror(err)); - - i = (loadas8bit.value) ? 8 : 16; - tmp_bits = (i == 8) ? SND_PCM_FORMAT_U8 : SND_PCM_FORMAT_S16; - err = snd_pcm_hw_params_set_format (pcm, hw, (snd_pcm_format_t) tmp_bits); - if (err < 0) - { - Con_Printf ("Problems setting %d bit format, trying alternatives..\n", i); - tmp_bits = (i == 8) ? SND_PCM_FORMAT_S16 : SND_PCM_FORMAT_U8; - err = snd_pcm_hw_params_set_format (pcm, hw, (snd_pcm_format_t) tmp_bits); - ALSA_CHECK_ERR(err, "Neither 8 nor 16 bit format supported. %s\n", snd_strerror(err)); - } - tmp_bits = (tmp_bits == SND_PCM_FORMAT_U8) ? 8 : 16; - - i = tmp_chan = (COM_CheckParm("-sndmono") == 0) ? 2 : 1; - err = snd_pcm_hw_params_set_channels (pcm, hw, tmp_chan); - if (err < 0) - { - Con_Printf ("Problems setting channels to %s, retrying for %s\n", - (i == 2) ? "stereo" : "mono", - (i == 2) ? "mono" : "stereo"); - tmp_chan = (i == 2) ? 1 : 2; - err = snd_pcm_hw_params_set_channels (pcm, hw, tmp_chan); - ALSA_CHECK_ERR(err, "unable to set desired channels. %s\n", snd_strerror(err)); - } - - rate = (int)sndspeed.value; - err = snd_pcm_hw_params_set_rate_near (pcm, hw, &rate, 0); - if (err < 0) - { - Con_Printf("Problems setting sample rate, trying alternatives..\n"); - for (i = 0; i < MAX_TRYRATES; i++) - { - rate = tryrates[i]; - err = snd_pcm_hw_params_set_rate_near (pcm, hw, &rate, 0); - if (err < 0) - { - Con_DPrintf ("Unable to set sample rate %d\n", tryrates[i]); - rate = 0; - } - else - { - if (rate != (unsigned int) tryrates[i]) - { - Con_Printf ("Warning: Rate set (%u) didn't match requested rate (%d)!\n", rate, tryrates[i]); - // goto error; - } - break; - } - } - if (rate == 0) - { - Con_Printf ("Unable to set any sample rates.\n"); - goto error; - } - } - else - { - if (rate != (unsigned int) sndspeed.value) - { - Con_Printf ("Warning: Rate set (%u) didn't match requested rate (%d)!\n", rate, (int)sndspeed.value); - // goto error; - } - } - - /* pick a buffer size that is a power of 2 (by masking off low bits) */ - buffer_size = i = (int)(rate * 0.15f); - while (buffer_size & (buffer_size-1)) - buffer_size &= (buffer_size-1); - /* then check if it is the nearest power of 2 and bump it up if not */ - if (i - buffer_size >= buffer_size >> 1) - buffer_size *= 2; - - err = snd_pcm_hw_params_set_buffer_size_near (pcm, hw, &buffer_size); - ALSA_CHECK_ERR(err, "unable to set buffer size near %lu (%s)\n", - (unsigned long)buffer_size, snd_strerror(err)); - - err = snd_pcm_hw_params_get_buffer_size (hw, &buffer_size); - ALSA_CHECK_ERR(err, "unable to get buffer size. %s\n", snd_strerror(err)); - if (buffer_size & (buffer_size-1)) - { - Con_Printf ("ALSA: WARNING: non-power of 2 buffer size. sound may be\n"); - Con_Printf ("unsatisfactory. Recommend using either the plughw or hw\n"); - Con_Printf ("devices or adjusting dmix to have a power of 2 buf size\n"); - } - - /* pick a period size near the buffer_size we got from ALSA */ - frag_size = buffer_size / NB_PERIODS; - err = snd_pcm_hw_params_set_period_size_near (pcm, hw, &frag_size, 0); - ALSA_CHECK_ERR(err, "unable to set period size near %i. %s\n", - (int)frag_size, snd_strerror(err)); - - err = snd_pcm_hw_params (pcm, hw); - ALSA_CHECK_ERR(err, "unable to install hardware params. %s\n", snd_strerror(err)); - - err = snd_pcm_sw_params_malloc (&sw); - ALSA_CHECK_ERR(err, "unable to allocate software params. %s\n", snd_strerror(err)); - - err = snd_pcm_sw_params_current (pcm, sw); - ALSA_CHECK_ERR(err, "unable to determine current software params. %s\n", snd_strerror(err)); - - err = snd_pcm_sw_params_set_start_threshold (pcm, sw, ~0U); - ALSA_CHECK_ERR(err, "unable to set playback threshold. %s\n", snd_strerror(err)); - - err = snd_pcm_sw_params_set_stop_threshold (pcm, sw, ~0U); - ALSA_CHECK_ERR(err, "unable to set playback stop threshold. %s\n", snd_strerror(err)); - - err = snd_pcm_sw_params (pcm, sw); - ALSA_CHECK_ERR(err, "unable to install software params. %s\n", snd_strerror(err)); - - memset ((void *) dma, 0, sizeof(dma_t)); - shm = dma; - - shm->channels = tmp_chan; - - /* - // don't mix less than this in mono samples: - err = snd_pcm_hw_params_get_period_size (hw, - (snd_pcm_uframes_t *) (char *) (&shm->submission_chunk), 0); - ALSA_CHECK_ERR(err, "unable to get period size. %s\n", snd_strerror(err)); - */ - shm->submission_chunk = 1; - shm->samplepos = 0; - shm->samplebits = tmp_bits; - - Con_Printf ("ALSA: %lu bytes buffer with mmap interleaved access\n", (unsigned long)buffer_size); - - shm->samples = buffer_size * shm->channels; // mono samples in buffer - shm->speed = rate; - - SNDDMA_GetDMAPos (); // sets shm->buffer - - snd_pcm_hw_params_free(hw); - snd_pcm_sw_params_free(sw); - - return true; - -error: -// full clean-up - if (hw) - snd_pcm_hw_params_free(hw); - if (sw) - snd_pcm_sw_params_free(sw); - shm = NULL; - snd_pcm_close (pcm); - pcm = NULL; - return false; -} - -int SNDDMA_GetDMAPos (void) -{ - snd_pcm_uframes_t offset; - snd_pcm_uframes_t nframes; - const snd_pcm_channel_area_t *areas; - - if (!shm) - return 0; - - nframes = shm->samples/shm->channels; - snd_pcm_avail_update (pcm); - snd_pcm_mmap_begin (pcm, &areas, &offset, &nframes); - // The following commit was absent in QF, causing the - // very first sound to be corrupted - snd_pcm_mmap_commit (pcm, offset, nframes); - offset *= shm->channels; - nframes *= shm->channels; - shm->samplepos = offset; - shm->buffer = (unsigned char *) areas->addr; // FIXME! there's an area per channel - return shm->samplepos; -} - -void SNDDMA_Shutdown (void) -{ - if (shm) - { - // full clean-up - Con_Printf ("Shutting down ALSA sound\n"); - snd_pcm_drop (pcm); // do I need this? - snd_pcm_close (pcm); - pcm = NULL; - shm->buffer = NULL; - shm = NULL; - } -} - -/* -============== -SNDDMA_LockBuffer - -Makes sure dma buffer is valid -============== -*/ -void SNDDMA_LockBuffer (void) -{ - /* nothing to do here */ -} - -/* -============== -SNDDMA_Submit - -Unlock the dma buffer / -Send sound to the device -============== -*/ -void SNDDMA_Submit (void) -{ - snd_pcm_uframes_t offset; - snd_pcm_uframes_t nframes; - const snd_pcm_channel_area_t *areas; - int state; - int count = paintedtime - soundtime; - - nframes = count / shm->channels; - snd_pcm_avail_update (pcm); - snd_pcm_mmap_begin (pcm, &areas, &offset, &nframes); - state = snd_pcm_state (pcm); - - switch (state) - { - case SND_PCM_STATE_PREPARED: - snd_pcm_mmap_commit (pcm, offset, nframes); - snd_pcm_start (pcm); - break; - case SND_PCM_STATE_RUNNING: - snd_pcm_mmap_commit (pcm, offset, nframes); - break; - default: - break; - } -} - -void SNDDMA_BlockSound (void) -{ - snd_pcm_pause (pcm, 1); -} - -void SNDDMA_UnblockSound (void) -{ - snd_pcm_pause (pcm, 0); -} - diff --git a/Quake/snd_oss.c b/Quake/snd_oss.c deleted file mode 100644 index a077cfb8..00000000 --- a/Quake/snd_oss.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - snd_oss.c - - Copyright (C) 1996-1997 Id Software, Inc. - - This program 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 2 - 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, write to: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ - -#include "quakedef.h" - -#include -#include -#include -#include -#include -#include -/* FIXME: is by the book, but we might - * have to take care of , - * and someday. */ -#include -#include - -static int FORMAT_S16; - -static int audio_fd = -1; -static const char oss_default[] = "/dev/dsp"; -static const char *ossdev = oss_default; -static unsigned long mmaplen; - -static const int tryrates[] = { 11025, 22050, 44100, 48000, 16000, 24000, 8000 }; -static const int MAX_TRYRATES = sizeof(tryrates)/sizeof(tryrates[0]); - - -qboolean SNDDMA_Init (dma_t *dma) -{ - int i, caps, tmp; - unsigned long sz; - struct audio_buf_info info; - - if (host_bigendian) FORMAT_S16 = AFMT_S16_BE; - else FORMAT_S16 = AFMT_S16_LE; - - tmp = COM_CheckParm("-ossdev"); - if (tmp != 0 && tmp < com_argc - 1) - ossdev = com_argv[tmp + 1]; - Con_Printf ("OSS: Using device: %s\n", ossdev); - -// open /dev/dsp, confirm capability to mmap, and get size of dma buffer - audio_fd = open(ossdev, O_RDWR|O_NONBLOCK); - if (audio_fd == -1) - { // Failed open, retry up to 3 times if it's busy - tmp = 3; - while ( (audio_fd == -1) && tmp-- && - ((errno == EAGAIN) || (errno == EBUSY)) ) - { - sleep (1); - audio_fd = open(ossdev, O_RDWR|O_NONBLOCK); - } - if (audio_fd == -1) - { - Con_Printf("Could not open %s. %s\n", ossdev, strerror(errno)); - return false; - } - } - - memset ((void *) dma, 0, sizeof(dma_t)); - shm = dma; - - if (ioctl(audio_fd, SNDCTL_DSP_RESET, 0) == -1) - { - Con_Printf("Could not reset %s. %s\n", ossdev, strerror(errno)); - goto error; - } - - if (ioctl(audio_fd, SNDCTL_DSP_GETCAPS, &caps) == -1) - { - Con_Printf("Couldn't retrieve soundcard capabilities. %s\n", strerror(errno)); - goto error; - } - - if (!(caps & DSP_CAP_TRIGGER) || !(caps & DSP_CAP_MMAP)) - { - Con_Printf("Audio driver doesn't support mmap or trigger\n"); - goto error; - } - -// set sample bits & speed - i = (loadas8bit.value) ? 8 : 16; - tmp = (i == 16) ? FORMAT_S16 : AFMT_U8; - if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &tmp) == -1) - { - Con_Printf("Problems setting %d bit format, trying alternatives..\n", i); - // try what the device gives us - if (ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &tmp) == -1) - { - Con_Printf("Unable to retrieve supported formats. %s\n", strerror(errno)); - goto error; - } - if (tmp & FORMAT_S16) - { - i = 16; - tmp = FORMAT_S16; - } - else if (tmp & AFMT_U8) - { - i = 8; - tmp = AFMT_U8; - } - else - { - Con_Printf("Neither 8 nor 16 bit format supported.\n"); - goto error; - } - if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &tmp) == -1) - { - Con_Printf("Unable to set sound format. %s\n", strerror(errno)); - goto error; - } - } - shm->samplebits = i; - - tmp = (int)sndspeed.value; - if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &tmp) == -1) - { - Con_Printf("Problems setting sample rate, trying alternatives..\n"); - shm->speed = 0; - for (i = 0; i < MAX_TRYRATES; i++) - { - tmp = tryrates[i]; - if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &tmp) == -1) - { - Con_DPrintf ("Unable to set sample rate %d\n", tryrates[i]); - } - else - { - if (tmp != tryrates[i]) - { - Con_Printf ("Warning: Rate set (%d) didn't match requested rate (%d)!\n", tmp, tryrates[i]); - // goto error; - } - shm->speed = tmp; - break; - } - } - if (shm->speed == 0) - { - Con_Printf("Unable to set any sample rates.\n"); - goto error; - } - } - else - { - if (tmp != (int)sndspeed.value) - { - Con_Printf ("Warning: Rate set (%d) didn't match requested rate (%d)!\n", tmp, (int)sndspeed.value); - // goto error; - } - shm->speed = tmp; - } - - i = (COM_CheckParm("-sndmono") == 0) ? 2 : 1; - tmp = (i == 2) ? 1 : 0; - if (ioctl(audio_fd, SNDCTL_DSP_STEREO, &tmp) == -1) - { - Con_Printf ("Problems setting channels to %s, retrying for %s\n", - (i == 2) ? "stereo" : "mono", - (i == 2) ? "mono" : "stereo"); - tmp = (i == 2) ? 0 : 1; - if (ioctl(audio_fd, SNDCTL_DSP_STEREO, &tmp) == -1) - { - Con_Printf("unable to set desired channels. %s\n", strerror(errno)); - goto error; - } - } - shm->channels = tmp +1; - - if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info) == -1) - { - Con_Printf("Couldn't retrieve buffer status. %s\n", strerror(errno)); - goto error; - } - - shm->samples = info.fragstotal * info.fragsize / (shm->samplebits / 8); - shm->submission_chunk = 1; - -// memory map the dma buffer - sz = sysconf (_SC_PAGESIZE); - mmaplen = info.fragstotal * info.fragsize; - mmaplen = (mmaplen + sz - 1) & ~(sz - 1); - shm->buffer = (unsigned char *) mmap(NULL, mmaplen, PROT_READ|PROT_WRITE, - MAP_FILE|MAP_SHARED, audio_fd, 0); - if (!shm->buffer || shm->buffer == MAP_FAILED) - { - Con_Printf("Could not mmap %s. %s\n", ossdev, strerror(errno)); - goto error; - } - Con_Printf ("OSS: mmaped %lu bytes buffer\n", mmaplen); - -// toggle the trigger & start her up - tmp = 0; - if (ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp) == -1) - { - Con_Printf("Could not toggle %s. %s\n", ossdev, strerror(errno)); - munmap (shm->buffer, mmaplen); - goto error; - } - tmp = PCM_ENABLE_OUTPUT; - if (ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp) == -1) - { - Con_Printf("Could not toggle %s. %s\n", ossdev, strerror(errno)); - munmap (shm->buffer, mmaplen); - goto error; - } - - shm->samplepos = 0; - - return true; - -error: - close(audio_fd); - audio_fd = -1; - shm->buffer = NULL; - shm = NULL; - return false; -} - -int SNDDMA_GetDMAPos (void) -{ - struct count_info count; - - if (!shm) - return 0; - - if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &count) == -1) - { - Con_Printf("Uh, sound dead. %s\n", strerror(errno)); - munmap (shm->buffer, mmaplen); - shm->buffer = NULL; - shm = NULL; - close(audio_fd); - audio_fd = -1; - return 0; - } -// shm->samplepos = (count.bytes / (shm->samplebits / 8)) & (shm->samples-1); -// fprintf(stderr, "%d \r", count.ptr); - shm->samplepos = count.ptr / (shm->samplebits / 8); - - return shm->samplepos; -} - -void SNDDMA_Shutdown (void) -{ - int tmp = 0; - if (shm) - { - Con_Printf ("Shutting down OSS sound\n"); - munmap (shm->buffer, mmaplen); - shm->buffer = NULL; - shm = NULL; - ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp); - ioctl(audio_fd, SNDCTL_DSP_RESET, 0); - close(audio_fd); - audio_fd = -1; - } -} - -/* -============== -SNDDMA_LockBuffer - -Makes sure dma buffer is valid -============== -*/ -void SNDDMA_LockBuffer (void) -{ - /* nothing to do here */ -} - -/* -============== -SNDDMA_Submit - -Unlock the dma buffer / -Send sound to the device -=============== -*/ -void SNDDMA_Submit(void) -{ -} - -void SNDDMA_BlockSound (void) -{ -} - -void SNDDMA_UnblockSound (void) -{ -} - diff --git a/Quake/snd_win.c b/Quake/snd_win.c deleted file mode 100644 index b94c2f1c..00000000 --- a/Quake/snd_win.c +++ /dev/null @@ -1,773 +0,0 @@ -/* - snd_win.c - $Id: snd_win.c,v 1.37 2008-12-28 14:34:34 sezero Exp $ - - Copyright (C) 1996-1997 Id Software, Inc. - - This program 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 2 - 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, write to: - - Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301 USA -*/ - -#define DX_DLSYM /* dynamic loading of dsound symbols */ - -#include "quakedef.h" -#include "winquake.h" -#include -#include - -//#define SNDBUFSIZE 65536 -// 64K is > 1 second at 16-bit, 22050 Hz -//#define WAV_BUFFERS 64 -#define WAV_BUFFERS 128 -#define WAV_MASK (WAV_BUFFERS - 1) - -/* DirectSound : */ -#ifndef DSBSIZE_MIN -#define DSBSIZE_MIN 4 -#endif -#ifndef DSBSIZE_MAX -#define DSBSIZE_MAX 0x0FFFFFFF -#endif - -static LPDIRECTSOUND pDS; -static LPDIRECTSOUNDBUFFER pDSBuf, pDSPBuf; - -#if defined(DX_DLSYM) /* dynamic loading of dsound symbols */ -static HINSTANCE hInstDS; -static HRESULT (WINAPI *pDirectSoundCreate)(GUID FAR *lpGUID, LPDIRECTSOUND FAR *lplpDS, IUnknown FAR *pUnkOuter); -#else /* ! DX_DLSYM : we're linked to dsound */ -#define pDirectSoundCreate DirectSoundCreate -#endif /* DX_DLSYM */ - -typedef enum {SIS_SUCCESS, SIS_FAILURE, SIS_NOTAVAIL} sndinitstat; - -static qboolean wavonly; -static qboolean dsound_init; -static qboolean wav_init; -static qboolean snd_firsttime = true, snd_isdirect, snd_iswave; -static qboolean primary_format_set; - -static int sample16; -static int snd_sent, snd_completed; -static int ds_sbuf_size, wv_buf_size; - -static HANDLE hData; -static HGLOBAL hWaveHdr; - -static HPSTR lpData; -static LPWAVEHDR lpWaveHdr; -static HWAVEOUT hWaveOut; -//WAVEOUTCAPS wavecaps; - -static DWORD gSndBufSize; -static MMTIME mmstarttime; - - -/* -================== -FreeSound -================== -*/ -static void FreeSound (void) -{ - int i; - - if (pDSBuf) - { - IDirectSoundBuffer_Stop(pDSBuf); - IDirectSound_Release(pDSBuf); - } - -// only release primary buffer if it's not also the mixing buffer we just released - if (pDSPBuf && (pDSBuf != pDSPBuf)) - { - IDirectSound_Release(pDSPBuf); - } - - if (pDS) - { - IDirectSound_SetCooperativeLevel(pDS, mainwindow, DSSCL_NORMAL); - IDirectSound_Release(pDS); - } - - if (hWaveOut) - { - waveOutReset (hWaveOut); - - if (lpWaveHdr) - { - for (i = 0; i < WAV_BUFFERS; i++) - waveOutUnprepareHeader (hWaveOut, lpWaveHdr+i, sizeof(WAVEHDR)); - } - - waveOutClose (hWaveOut); - - if (hWaveHdr) - { - GlobalUnlock(hWaveHdr); - GlobalFree(hWaveHdr); - } - if (hData) - { - GlobalUnlock(hData); - GlobalFree(hData); - } - } - - pDS = NULL; - pDSBuf = NULL; - pDSPBuf = NULL; - hWaveOut = 0; - hData = 0; - hWaveHdr = 0; - lpData = NULL; - lpWaveHdr = NULL; - dsound_init = false; - wav_init = false; -} - - -/* -================== -SNDDMA_InitDirect - -Direct-Sound support -================== -*/ -static sndinitstat SNDDMA_InitDirect (dma_t *dma) -{ - DSBUFFERDESC dsbuf; - DSBCAPS dsbcaps; - DWORD dwSize, dwWrite; - DSCAPS dscaps; - WAVEFORMATEX format, pformat; - HRESULT hresult; - int reps; - - memset((void *) dma, 0, sizeof(dma_t)); - shm = dma; - - shm->channels = 2; /* = desired_channels; */ - shm->samplebits = (loadas8bit.value) ? 8 : 16; - shm->speed = sndspeed.value; - - memset (&format, 0, sizeof(format)); - format.wFormatTag = WAVE_FORMAT_PCM; - format.nChannels = shm->channels; - format.wBitsPerSample = shm->samplebits; - format.nSamplesPerSec = shm->speed; - format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; - format.cbSize = 0; - format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; - -#if defined(DX_DLSYM) - if (!hInstDS) - { - hInstDS = LoadLibrary("dsound.dll"); - - if (hInstDS == NULL) - { - Con_SafePrintf ("Couldn't load dsound.dll\n"); - return SIS_FAILURE; - } - - pDirectSoundCreate = (HRESULT (WINAPI *)(GUID FAR *, LPDIRECTSOUND FAR *, IUnknown FAR *)) - GetProcAddress(hInstDS,"DirectSoundCreate"); - - if (!pDirectSoundCreate) - { - Con_SafePrintf ("Couldn't get DS proc addr\n"); - return SIS_FAILURE; - } - } -#endif /* DX_DLSYM */ - - hresult = pDirectSoundCreate(NULL, &pDS, NULL); - if (hresult != DS_OK) - { - if (hresult != DSERR_ALLOCATED) - { - Con_SafePrintf ("DirectSound create failed\n"); - return SIS_FAILURE; - } - - Con_SafePrintf ("DirectSoundCreate failure, hardware already in use\n"); - return SIS_NOTAVAIL; - } - - dscaps.dwSize = sizeof(dscaps); - - if (DS_OK != IDirectSound_GetCaps(pDS, &dscaps)) - { - Con_SafePrintf ("Couldn't get DS caps\n"); - } - - if (dscaps.dwFlags & DSCAPS_EMULDRIVER) - { - Con_SafePrintf ("No DirectSound driver installed\n"); - FreeSound (); - return SIS_FAILURE; - } - - // if (DS_OK != IDirectSound_SetCooperativeLevel(pDS, mainwindow, DSSCL_EXCLUSIVE)) - /* Pa3PyX: Some MIDI synthesizers are software and require access to - waveOut; so if we set the coop level to exclusive, MIDI will fail - to init because the device is locked. We use priority level instead. - That way we don't lock out software synths and other apps, but can - still set the sound buffer format. */ - if (DS_OK != IDirectSound_SetCooperativeLevel(pDS, mainwindow, DSSCL_PRIORITY)) - { - Con_SafePrintf ("Set coop level failed\n"); - FreeSound (); - return SIS_FAILURE; - } - -// get access to the primary buffer, if possible, so we can set the -// sound hardware format - memset (&dsbuf, 0, sizeof(dsbuf)); - dsbuf.dwSize = sizeof(DSBUFFERDESC); - dsbuf.dwFlags = DSBCAPS_PRIMARYBUFFER; - dsbuf.dwBufferBytes = 0; - dsbuf.lpwfxFormat = NULL; - - memset(&dsbcaps, 0, sizeof(dsbcaps)); - dsbcaps.dwSize = sizeof(dsbcaps); - primary_format_set = false; - - if (!COM_CheckParm ("-snoforceformat")) - { - if (DS_OK == IDirectSound_CreateSoundBuffer(pDS, &dsbuf, &pDSPBuf, NULL)) - { - pformat = format; - - if (DS_OK != IDirectSoundBuffer_SetFormat(pDSPBuf, &pformat)) - { - if (snd_firsttime) - Con_SafePrintf ("Set primary sound buffer format: no\n"); - } - else - { - if (snd_firsttime) - Con_SafePrintf ("Set primary sound buffer format: yes\n"); - - primary_format_set = true; - } - } - } - - if (!primary_format_set || !COM_CheckParm ("-primarysound")) - { - // create the secondary buffer we'll actually work with - memset (&dsbuf, 0, sizeof(dsbuf)); - dsbuf.dwSize = sizeof(DSBUFFERDESC); - dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCSOFTWARE; - if (ds_sbuf_size < DSBSIZE_MIN) - ds_sbuf_size = 1 << (Q_log2(DSBSIZE_MIN) + 1); - if (ds_sbuf_size > DSBSIZE_MAX) - ds_sbuf_size = 1 << Q_log2(DSBSIZE_MAX); - dsbuf.dwBufferBytes = ds_sbuf_size; - dsbuf.lpwfxFormat = &format; - - memset(&dsbcaps, 0, sizeof(dsbcaps)); - dsbcaps.dwSize = sizeof(dsbcaps); - - if (DS_OK != IDirectSound_CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) - { - Con_SafePrintf ("DS:CreateSoundBuffer Failed"); - FreeSound (); - return SIS_FAILURE; - } - - shm->channels = format.nChannels; - shm->samplebits = format.wBitsPerSample; - shm->speed = format.nSamplesPerSec; - - if (DS_OK != IDirectSound_GetCaps(pDSBuf, &dsbcaps)) - { - Con_SafePrintf ("DS:GetCaps failed\n"); - FreeSound (); - return SIS_FAILURE; - } - - if (snd_firsttime) - Con_SafePrintf ("Using secondary sound buffer\n"); - } - else - { - if (DS_OK != IDirectSound_SetCooperativeLevel(pDS, mainwindow, DSSCL_WRITEPRIMARY)) - { - Con_SafePrintf ("Set coop level failed\n"); - FreeSound (); - return SIS_FAILURE; - } - - if (DS_OK != IDirectSound_GetCaps(pDSPBuf, &dsbcaps)) - { - Con_Printf ("DS:GetCaps failed\n"); - return SIS_FAILURE; - } - - pDSBuf = pDSPBuf; - Con_SafePrintf ("Using primary sound buffer\n"); - } - - // Make sure mixer is active - IDirectSoundBuffer_Play(pDSBuf, 0, 0, DSBPLAY_LOOPING); - - if (snd_firsttime) - Con_SafePrintf ("%lu bytes in sound buffer\n", (unsigned long)dsbcaps.dwBufferBytes); - - gSndBufSize = dsbcaps.dwBufferBytes; - -// initialize the buffer - reps = 0; - - while ((hresult = IDirectSoundBuffer_Lock(pDSBuf, 0, gSndBufSize, (LPVOID *) (HPSTR) &lpData, &dwSize, NULL, NULL, 0)) != DS_OK) - { - if (hresult != DSERR_BUFFERLOST) - { - Con_SafePrintf ("SNDDMA_InitDirect: DS::Lock Sound Buffer Failed\n"); - FreeSound (); - return SIS_FAILURE; - } - - if (++reps > 10000) - { - Con_SafePrintf ("SNDDMA_InitDirect: DS: couldn't restore buffer\n"); - FreeSound (); - return SIS_FAILURE; - } - } - - memset(lpData, 0, dwSize); -// lpData[4] = lpData[5] = 0x7f; // force a pop for debugging - - IDirectSoundBuffer_Unlock(pDSBuf, lpData, dwSize, NULL, 0); - - /* we don't want anyone to access the buffer directly w/o locking it first. */ - lpData = NULL; - - IDirectSoundBuffer_Stop(pDSBuf); - IDirectSoundBuffer_GetCurrentPosition(pDSBuf, &mmstarttime.u.sample, &dwWrite); - IDirectSoundBuffer_Play(pDSBuf, 0, 0, DSBPLAY_LOOPING); - - shm->samples = gSndBufSize / (shm->samplebits / 8); - shm->samplepos = 0; - shm->submission_chunk = 1; - shm->buffer = (unsigned char *) lpData; - sample16 = (shm->samplebits / 8) - 1; - - dsound_init = true; - - return SIS_SUCCESS; -} - - -/* -================== -SNDDM_InitWav - -Crappy windows multimedia base -================== -*/ -static qboolean SNDDMA_InitWav (dma_t *dma) -{ - WAVEFORMATEX format; - int i; - HRESULT hr; - - snd_sent = 0; - snd_completed = 0; - - memset((void *) dma, 0, sizeof(dma_t)); - shm = dma; - - shm->channels = 2; /* = desired_channels; */ - shm->samplebits = (loadas8bit.value) ? 8 : 16; - shm->speed = sndspeed.value; - - memset (&format, 0, sizeof(format)); - format.wFormatTag = WAVE_FORMAT_PCM; - format.nChannels = shm->channels; - format.wBitsPerSample = shm->samplebits; - format.nSamplesPerSec = shm->speed; - format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; - format.cbSize = 0; - format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; - - /* Open a waveform device for output using window callback. */ - hr = waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER, &format, 0, 0L, CALLBACK_NULL); - if (hr != MMSYSERR_NOERROR) - { - if (hr != MMSYSERR_ALLOCATED) - { - Con_SafePrintf ("waveOutOpen failed\n"); - return false; - } - - Con_SafePrintf ("waveOutOpen failure, hardware already in use\n"); - return false; - } - - /* - * Allocate and lock memory for the waveform data. The memory - * for waveform data must be globally allocated with - * GMEM_MOVEABLE and GMEM_SHARE flags. - */ - gSndBufSize = WAV_BUFFERS * wv_buf_size; - hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, gSndBufSize); - if (!hData) - { - Con_SafePrintf ("Sound: Out of memory.\n"); - FreeSound (); - return false; - } - lpData = (HPSTR) GlobalLock(hData); - if (!lpData) - { - Con_SafePrintf ("Sound: Failed to lock.\n"); - FreeSound (); - return false; - } - memset (lpData, 0, gSndBufSize); - - /* - * Allocate and lock memory for the header. This memory must - * also be globally allocated with GMEM_MOVEABLE and - * GMEM_SHARE flags. - */ - hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (DWORD) sizeof(WAVEHDR) * WAV_BUFFERS); - if (hWaveHdr == NULL) - { - Con_SafePrintf ("Sound: Failed to Alloc header.\n"); - FreeSound (); - return false; - } - lpWaveHdr = (LPWAVEHDR) GlobalLock(hWaveHdr); - if (lpWaveHdr == NULL) - { - Con_SafePrintf ("Sound: Failed to lock header.\n"); - FreeSound (); - return false; - } - memset (lpWaveHdr, 0, sizeof(WAVEHDR) * WAV_BUFFERS); - - /* After allocation, set up and prepare headers. */ - for (i = 0; i < WAV_BUFFERS; i++) - { - lpWaveHdr[i].dwBufferLength = wv_buf_size; - lpWaveHdr[i].lpData = lpData + i * wv_buf_size; - - if (waveOutPrepareHeader(hWaveOut, lpWaveHdr+i, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) - { - Con_SafePrintf ("Sound: failed to prepare wave headers\n"); - FreeSound (); - return false; - } - } - - shm->samples = gSndBufSize / (shm->samplebits / 8); - shm->samplepos = 0; - shm->submission_chunk = 1; - shm->buffer = (unsigned char *) lpData; - sample16 = (shm->samplebits / 8) - 1; - - wav_init = true; - - Con_SafePrintf ("%d sound buffers, %d bytes/sound buffer\n", WAV_BUFFERS, wv_buf_size); - - return true; -} - -/* -================== -SNDDMA_Init - -Try to find a sound device to mix for. -Returns false if nothing is found. -================== -*/ -qboolean SNDDMA_Init (dma_t *dma) -{ - sndinitstat stat; - int sndbits = (loadas8bit.value) ? 8 : 16; - - if (COM_CheckParm ("-wavonly")) - wavonly = true; - - dsound_init = wav_init = 0; - - stat = SIS_FAILURE; // assume DirectSound won't initialize - - /* Calculate Wave and DS buffer sizes to set, to store - 2 secs of data, round up to the next power of 2 */ - ds_sbuf_size = 1 << (Q_log2((sndbits >> 3) * ((int)sndspeed.value << 1)) + 1); - wv_buf_size = 1 << (Q_log2(((int)sndspeed.value << 3) / WAV_BUFFERS) + 1); - - /* Init DirectSound */ - if (!wavonly) - { - if (snd_firsttime || snd_isdirect) - { - stat = SNDDMA_InitDirect (dma); - - if (stat == SIS_SUCCESS) - { - snd_isdirect = true; - - if (snd_firsttime) - Con_SafePrintf ("DirectSound initialized\n"); - } - else - { - snd_isdirect = false; - Con_SafePrintf ("DirectSound failed to init\n"); - } - } - } - -// if DirectSound didn't succeed in initializing, try to initialize -// waveOut sound, unless DirectSound failed because the hardware is -// already allocated (in which case the user has already chosen not -// to have sound) - if (!dsound_init && (stat != SIS_NOTAVAIL)) - { - if (snd_firsttime || snd_iswave) - { - snd_iswave = SNDDMA_InitWav (dma); - - if (snd_iswave) - { - if (snd_firsttime) - Con_SafePrintf ("Wave sound initialized\n"); - } - else - { - Con_SafePrintf ("Wave sound failed to init\n"); - } - } - } - - if (!dsound_init && !wav_init) - { - if (snd_firsttime) - Con_SafePrintf ("No sound device initialized\n"); - - snd_firsttime = false; - - return false; - } - - snd_firsttime = false; - - return true; -} - -/* -============== -SNDDMA_GetDMAPos - -return the current sample position (in mono samples read) -inside the recirculating dma buffer, so the mixing code will know -how many sample are required to fill it up. -=============== -*/ -int SNDDMA_GetDMAPos (void) -{ - MMTIME mmtime; - int s; - DWORD dwWrite; - - if (dsound_init) - { - mmtime.wType = TIME_SAMPLES; - IDirectSoundBuffer_GetCurrentPosition(pDSBuf, &mmtime.u.sample, &dwWrite); - s = mmtime.u.sample - mmstarttime.u.sample; - } - else if (wav_init) - { - s = snd_sent * wv_buf_size; - } - else - { // we should not reach here... - return 0; - } - - s >>= sample16; - - s &= (shm->samples-1); - - return s; -} - -/* -============== -SNDDMA_LockBuffer - -Makes sure dma buffer is valid -=============== -*/ -static DWORD locksize; -void SNDDMA_LockBuffer (void) -{ - if (pDSBuf) - { - void *pData; - int reps; - HRESULT hresult; - DWORD dwStatus; - - reps = 0; - shm->buffer = NULL; - - if (IDirectSoundBuffer_GetStatus(pDSBuf, &dwStatus) != DS_OK) - Con_Printf ("Couldn't get sound buffer status\n"); - - if (dwStatus & DSBSTATUS_BUFFERLOST) - IDirectSoundBuffer_Restore(pDSBuf); - - if (!(dwStatus & DSBSTATUS_PLAYING)) - IDirectSoundBuffer_Play(pDSBuf, 0, 0, DSBPLAY_LOOPING); - - while ((hresult = IDirectSoundBuffer_Lock(pDSBuf, 0, gSndBufSize, (void **) &pData, &locksize, NULL, NULL, 0)) != DS_OK) - { - if (hresult != DSERR_BUFFERLOST) - { - Con_Printf ("SNDDMA_LockBuffer: DS::Lock Sound Buffer Failed\n"); - S_Shutdown (); - return; - } - - if (++reps > 10000) - { - Con_Printf ("SNDDMA_LockBuffer: DS: couldn't restore buffer\n"); - S_Shutdown (); - return; - } - } - - shm->buffer = (unsigned char *) pData; - } -} - -/* -============== -SNDDMA_Submit - -Unlock the dma buffer / -Send sound to the device -=============== -*/ -void SNDDMA_Submit (void) -{ - LPWAVEHDR h; - int wResult; - - if (pDSBuf) - IDirectSoundBuffer_Unlock(pDSBuf, shm->buffer, locksize, NULL, 0); - - if (!wav_init) - return; - - // - // find which sound blocks have completed - // - while (1) - { - if ( snd_completed == snd_sent ) - { - Con_DPrintf ("Sound overrun\n"); - break; - } - - if ( ! (lpWaveHdr[snd_completed & WAV_MASK].dwFlags & WHDR_DONE) ) - { - break; - } - - snd_completed++; // this buffer has been played - } - - // - // submit two new sound blocks - // - while (((snd_sent - snd_completed) >> sample16) < 4) - { - h = lpWaveHdr + (snd_sent & WAV_MASK); - - snd_sent++; - /* - * Now the data block can be sent to the output device. The - * waveOutWrite function returns immediately and waveform - * data is sent to the output device in the background. - */ - wResult = waveOutWrite(hWaveOut, h, sizeof(WAVEHDR)); - - if (wResult != MMSYSERR_NOERROR) - { - Con_SafePrintf ("Failed to write block to device\n"); - FreeSound (); - return; - } - } -} - -/* -================== -SNDDMA_BlockSound -================== -*/ -void SNDDMA_BlockSound (void) -{ - // DirectSound takes care of blocking itself - if (snd_iswave) - { - waveOutReset (hWaveOut); - } -} - - -/* -================== -SNDDMA_UnblockSound -================== -*/ -void SNDDMA_UnblockSound (void) -{ -} - - -/* -============== -SNDDMA_Shutdown - -Reset the sound device for exiting -=============== -*/ -void SNDDMA_Shutdown (void) -{ - FreeSound (); -#if defined(DX_DLSYM) - if (hInstDS) - { - FreeLibrary(hInstDS); - hInstDS = NULL; - } -#endif /* DX_DLSYM */ -} - diff --git a/Quake/winquake.h b/Quake/winquake.h deleted file mode 100644 index 22313af8..00000000 --- a/Quake/winquake.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright (C) 1996-2001 Id Software, Inc. -Copyright (C) 2002-2009 John Fitzgibbons and others - -This program 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 2 -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, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ -// winquake.h: Win32-specific Quake header file - -#ifndef __WINQUAKE_H -#define __WINQUAKE_H - -/* include windows.h here, because we need the data types */ -#include - -/* required compatibility versions for directx components */ -#define DIRECTDRAW_VERSION 0x0300 -#define DIRECTSOUND_VERSION 0x0300 -#define DIRECTINPUT_VERSION 0x0300 - -#ifndef WM_MOUSEWHEEL -#define WM_MOUSEWHEEL 0x020A -#endif - -extern qboolean Win95, Win95old, WinNT, WinVista; - -extern HINSTANCE global_hInstance; -extern int global_nCmdShow; - -extern qboolean DDActive; - -extern HWND mainwindow; -extern qboolean ActiveApp, Minimized; - -void VID_LockBuffer (void); -void VID_UnlockBuffer (void); - -int VID_ForceUnlockedAndReturnState (void); -void VID_ForceLockState (int lk); - -void IN_ShowMouse (void); -void IN_DeactivateMouse (void); -void IN_HideMouse (void); -void IN_ActivateMouse (void); -void IN_RestoreOriginalMouseState (void); -void IN_SetQuakeMouseState (void); -void IN_MouseEvent (int mstate); - -extern cvar_t _windowed_mouse; - -extern int window_center_x, window_center_y; -extern RECT window_rect; - -extern qboolean mouseinitialized; -extern HWND hwnd_dialog; - -extern HANDLE hinput, houtput; - -void IN_UpdateClipCursor (void); -void CenterWindow(HWND hWndCenter, int width, int height, BOOL lefttopjustify); - -void VID_SetDefaultMode (void); - -#endif /* __WINQUAKE_H */ -