]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_main.h
due to performance issues with streaming ogg decoding of all sounds, the
[xonotic/darkplaces.git] / snd_main.h
index 1d6011ab909a9ff3950af7950452c508b5f15ec1..62c5034297058b802394ed65658e2bf905767ac1 100644 (file)
@@ -66,15 +66,17 @@ struct sfx_s
 
                                                                                // One lock is automatically granted while the sfx is
                                                                                // playing (and removed when stopped). Locks can also be
-       int                                     locks;                  // added by S_PrecacheSound and S_ServerSounds.
-                                                                               // A SFX with no lock and no SFXFLAG_PERMANENTLOCK is
-                                                                               // freed at level change by S_ServerSounds.
+       int                                     locks;                  // added by S_PrecacheSound.
+                                                                               // A SFX with no lock, no SFXFLAG_PERMANENTLOCK, and not precached after a level change is freed
 
        unsigned int            flags;                  // cf SFXFLAG_* defines
        unsigned int            loopstart;              // in sample frames. equals total_length if not looped
        unsigned int            total_length;   // in sample frames
        const snd_fetcher_t     *fetcher;
        void                            *fetcher_data;  // Per-sfx data for the sound fetching functions
+
+       float                           volume_mult;    // for replay gain (multiplier to apply)
+       float                           volume_peak;    // for replay gain (highest peak); if set to 0, ReplayGain isn't supported
 };
 
 // maximum supported speakers constant
@@ -96,9 +98,9 @@ typedef struct channel_s
 
 // Sound fetching functions
 // "start" is both an input and output parameter: it returns the actual start time of the sound buffer
-typedef const snd_buffer_t* (*snd_fetcher_getsb_t) (channel_t* ch, unsigned int *start, unsigned int nbsampleframes);
-typedef void (*snd_fetcher_endsb_t) (channel_t* ch);
-typedef void (*snd_fetcher_free_t) (sfx_t* sfx);
+typedef const snd_buffer_t* (*snd_fetcher_getsb_t) (void *sfxfetcher, void **chfetcherpointer, unsigned int *start, unsigned int nbsampleframes);
+typedef void (*snd_fetcher_endsb_t) (void *chfetcherdata);
+typedef void (*snd_fetcher_free_t) (void *sfxfetcherdata);
 typedef const snd_format_t* (*snd_fetcher_getfmt_t) (sfx_t* sfx);
 struct snd_fetcher_s
 {
@@ -108,17 +110,12 @@ struct snd_fetcher_s
        snd_fetcher_getfmt_t    getfmt;
 };
 
-// 0 to NUM_AMBIENTS - 1 = water, etc
-// NUM_AMBIENTS to NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS - 1 = normal entity sounds
-// NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS to total_channels = static sounds
-#define        MAX_DYNAMIC_CHANNELS    512
-#define        MAX_CHANNELS                    1028
-
 extern unsigned int total_channels;
 extern channel_t channels[MAX_CHANNELS];
 
 extern snd_ringbuffer_t *snd_renderbuffer;
-extern unsigned int soundtime; // WARNING: sound modules must NOT use it
+extern qboolean snd_threaded; // enables use of snd_usethreadedmixing, provided that no sound hacks are in effect (like timedemo)
+extern qboolean snd_usethreadedmixing; // if true, the main thread does not mix sound, soundtime does not advance, and neither does snd_renderbuffer->endframe, instead the audio thread will call S_MixToBuffer as needed
 
 extern cvar_t _snd_mixahead;
 extern cvar_t snd_swapstereo;
@@ -129,7 +126,6 @@ extern cvar_t snd_streaming;
 #define SND_CHANNELLAYOUT_ALSA         2
 extern cvar_t snd_channellayout;
 
-
 extern int snd_blocked;                // counter. When > 0, we stop submitting sound to the audio device
 
 extern mempool_t *snd_mempool;
@@ -140,11 +136,20 @@ extern mempool_t *snd_mempool;
 extern qboolean simsound;
 
 
+#define STREAM_BUFFER_DURATION 0.3f // in seconds
+#define STREAM_BUFFER_FILL 0.2f // in seconds
+#define STREAM_BUFFER_SIZE(format_ptr) ((int)ceil (STREAM_BUFFER_DURATION * (format_ptr)->speed) * (format_ptr)->width * (format_ptr)->channels)
+
+// We work with 1 sec sequences, so this buffer must be able to contain
+// 1 sec of sound of the highest quality (48 KHz, 16 bit samples, stereo)
+extern unsigned char resampling_buffer [48000 * 2 * 2];
+
+
 // ====================================================================
 //         Architecture-independent functions
 // ====================================================================
 
-void S_PaintChannels (snd_ringbuffer_t* rb, unsigned int starttime, unsigned int endtime);
+void S_MixToBuffer(void *stream, unsigned int frames);
 
 qboolean S_LoadSound (sfx_t *sfx, qboolean complain);
 
@@ -182,5 +187,32 @@ qboolean SndSys_LockRenderBuffer (void);
 // Release the exclusive lock on "snd_renderbuffer"
 void SndSys_UnlockRenderBuffer (void);
 
+// if the sound system can generate events, send them
+void SndSys_SendKeyEvents(void);
+
+// exported for capturevideo so ogg can see all channels
+typedef struct portable_samplepair_s
+{
+       int sample[SND_LISTENERS];
+} portable_sampleframe_t;
+// LordHavoc: was 512, expanded to 2048
+#define        PAINTBUFFER_SIZE 2048
+
+typedef struct listener_s
+{
+       int channel_unswapped; // for un-swapping
+       float yawangle;
+       float dotscale;
+       float dotbias;
+       float ambientvolume;
+}
+listener_t;
+typedef struct speakerlayout_s
+{
+       const char *name;
+       unsigned int channels;
+       listener_t listeners[SND_LISTENERS];
+}
+speakerlayout_t;
 
 #endif