You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
2.7 KiB
150 lines
2.7 KiB
![]()
5 years ago
|
/*
|
||
|
s_backend.c - sound hardware output
|
||
|
Copyright (C) 2009 Uncle Mike
|
||
|
|
||
|
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 3 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef XASH_DEDICATED
|
||
|
#include "common.h"
|
||
|
#if XASH_SOUND == SOUND_NULL
|
||
|
|
||
|
#include "sound.h"
|
||
|
|
||
|
#define SAMPLE_16BIT_SHIFT 1
|
||
|
#define SECONDARY_BUFFER_SIZE 0x10000
|
||
|
|
||
|
/*
|
||
|
=======================================================================
|
||
|
Global variables. Must be visible to window-procedure function
|
||
|
so it can unlock and free the data block after it has been played.
|
||
|
=======================================================================
|
||
|
*/
|
||
|
|
||
|
dma_t dma;
|
||
|
|
||
|
void S_Activate( qboolean active )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
==================
|
||
|
SNDDMA_Init
|
||
|
|
||
|
Try to find a sound device to mix for.
|
||
|
Returns false if nothing is found.
|
||
|
==================
|
||
|
*/
|
||
|
qboolean SNDDMA_Init( void )
|
||
|
{
|
||
|
Msg( "Audio is not enabled\n" );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
==============
|
||
|
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 )
|
||
|
{
|
||
|
return dma.samplepos;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
==============
|
||
|
SNDDMA_GetSoundtime
|
||
|
|
||
|
update global soundtime
|
||
|
===============
|
||
|
*/
|
||
|
int SNDDMA_GetSoundtime( void )
|
||
|
{
|
||
|
static int buffers, oldsamplepos;
|
||
|
int samplepos, fullsamples;
|
||
|
|
||
|
fullsamples = dma.samples / 2;
|
||
|
|
||
|
// it is possible to miscount buffers
|
||
|
// if it has wrapped twice between
|
||
|
// calls to S_Update. Oh well.
|
||
|
samplepos = SNDDMA_GetDMAPos();
|
||
|
|
||
|
if( samplepos < oldsamplepos )
|
||
|
{
|
||
|
buffers++; // buffer wrapped
|
||
|
|
||
|
if( paintedtime > 0x40000000 )
|
||
|
{
|
||
|
// time to chop things off to avoid 32 bit limits
|
||
|
buffers = 0;
|
||
|
paintedtime = fullsamples;
|
||
|
S_StopAllSounds( true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
oldsamplepos = samplepos;
|
||
|
|
||
|
return (buffers * fullsamples + samplepos / 2);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
==============
|
||
|
SNDDMA_BeginPainting
|
||
|
|
||
|
Makes sure dma.buffer is valid
|
||
|
===============
|
||
|
*/
|
||
|
void SNDDMA_BeginPainting( void )
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
==============
|
||
|
SNDDMA_Submit
|
||
|
|
||
|
Send sound to device if buffer isn't really the dma buffer
|
||
|
Also unlocks the dsound buffer
|
||
|
===============
|
||
|
*/
|
||
|
void SNDDMA_Submit( void )
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
==============
|
||
|
SNDDMA_Shutdown
|
||
|
|
||
|
Reset the sound device for exiting
|
||
|
===============
|
||
|
*/
|
||
|
void SNDDMA_Shutdown( void )
|
||
|
{
|
||
|
Con_Printf("Shutting down audio.\n");
|
||
|
dma.initialized = false;
|
||
|
|
||
|
if (dma.buffer) {
|
||
|
Z_Free(dma.buffer);
|
||
|
dma.buffer = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
#endif
|