ref: 245306e314fe636490b9ad7557a5ea234b589ef2
parent: c93600e9102e4748e54322729651b2371ced90d0
author: Konstantinn Bonnet <qu7uux@gmail.com>
date: Tue Mar 17 13:19:46 EDT 2015
fix wpos overflow giving negative offset for dma buffer pos sound code is still bugged: sound dies after 5-6 hours, and some of the assumptions made are invalid (samplepos, etc.).
--- a/README
+++ b/README
@@ -47,8 +47,8 @@
-----------
- compiling with PARANOID reveals several points of failure that are otherwise
ignored, resulting in abnormal exit (also on linux)
- - leave running for a couple of hours -> sound dies and eventually, invalid
- write/reads -> crash
+ - leave running for a couple of hours → invalid write/reads → crash
+ - unrelated(?): after about 5 hours, sound dies
- compile with BAN_TEST -> net_dgrm build fails (struct sockaddr_in)
- sprites/particles not scaled correctly on high resolutions (also in quake2)
- m_windowed 1: can still look around in frozen world when paused
--- a/snd_9.c
+++ b/snd_9.c
@@ -6,7 +6,7 @@
int audio_fd;
int sndon;
-int wpos;
+uint wpos;
int stid = -1;
enum{
Nbuf = 16
@@ -76,7 +76,7 @@
return 1;
}
-int SNDDMA_GetDMAPos(void)
+uint SNDDMA_GetDMAPos(void)
{
if(!sndon)
return 0;
--- a/snd_dma.c
+++ b/snd_dma.c
@@ -744,9 +744,9 @@
void GetSoundtime(void)
{
- int samplepos;
+ uint samplepos;
static int buffers;
- static int oldsamplepos;
+ static uint oldsamplepos;
int fullsamples;
fullsamples = shm->samples / shm->channels;
--- a/sound.h
+++ b/sound.h
@@ -38,7 +38,7 @@
int channels;
int samples; // mono samples in buffer
int submission_chunk; // don't mix less than this #
- int samplepos; // in mono samples
+ uint samplepos; // in mono samples
int samplebits;
int speed;
unsigned char *buffer;
@@ -99,7 +99,7 @@
qboolean SNDDMA_Init(void);
// gets the current DMA position
-int SNDDMA_GetDMAPos(void);
+uint SNDDMA_GetDMAPos(void);
// shutdown the DMA xfer.
void SNDDMA_Shutdown(void);