OGG_FetchEnd
====================
*/
-static void OGG_FetchEnd (void **chfetcherpointer)
+static void OGG_FetchEnd (void *chfetcherdata)
{
- ogg_stream_perchannel_t* per_ch = (ogg_stream_perchannel_t *)*chfetcherpointer;
+ ogg_stream_perchannel_t* per_ch = (ogg_stream_perchannel_t *)chfetcherdata;
if (per_ch != NULL)
{
Mem_Free (per_ch);
}
- *chfetcherpointer = NULL;
}
OGG_FreeSfx
====================
*/
-static void OGG_FreeSfx (sfx_t* sfx)
+static void OGG_FreeSfx (void *sfxfetcherdata)
{
- ogg_stream_persfx_t* per_sfx = (ogg_stream_persfx_t *)sfx->fetcher_data;
+ ogg_stream_persfx_t* per_sfx = (ogg_stream_persfx_t *)sfxfetcherdata;
// Free the Ogg Vorbis file
Mem_Free(per_sfx->file);
- sfx->memsize -= per_sfx->filesize;
// Free the stream structure
Mem_Free(per_sfx);
- sfx->memsize -= sizeof (*per_sfx);
-
- sfx->fetcher_data = NULL;
- sfx->fetcher = NULL;
}
qboolean OGG_LoadVorbisFile (const char *filename, sfx_t *sfx)
{
unsigned char *data;
- const char *loopcomment;
+ const char *thiscomment;
fs_offset_t filesize;
ov_decode_t ov_decode;
OggVorbis_File vf;
vorbis_info *vi;
vorbis_comment *vc;
ogg_int64_t len, buff_len;
+ double peak = 0.0;
+ double gaindb = 0.0;
if (!vf_dll)
return false;
vc = qov_comment(&vf, -1);
if(vc)
{
- loopcomment = qvorbis_comment_query(vc, "LOOP_START", 0);
- if(loopcomment)
- sfx->loopstart = bound(0, (unsigned int) (atof(loopcomment) * (double)snd_renderbuffer->format.speed / (double)per_sfx->format.speed), sfx->total_length);
+ thiscomment = qvorbis_comment_query(vc, "LOOP_START", 0);
+ if(thiscomment)
+ sfx->loopstart = bound(0, (unsigned int) (atof(thiscomment) * (double)snd_renderbuffer->format.speed / (double)per_sfx->format.speed), sfx->total_length);
+ thiscomment = qvorbis_comment_query(vc, "REPLAYGAIN_TRACK_PEAK", 0);
+ if(thiscomment)
+ peak = atof(thiscomment);
+ thiscomment = qvorbis_comment_query(vc, "REPLAYGAIN_TRACK_GAIN", 0);
+ if(thiscomment)
+ gaindb = atof(thiscomment);
}
}
else
vc = qov_comment(&vf, -1);
if(vc)
{
- loopcomment = qvorbis_comment_query(vc, "LOOP_START", 0);
- if(loopcomment)
- sfx->loopstart = bound(0, (unsigned int) (atoi(loopcomment) * (double)snd_renderbuffer->format.speed / (double)sb->format.speed), sfx->total_length);
+ thiscomment = qvorbis_comment_query(vc, "LOOP_START", 0);
+ if(thiscomment)
+ sfx->loopstart = bound(0, (unsigned int) (atoi(thiscomment) * (double)snd_renderbuffer->format.speed / (double)sb->format.speed), sfx->total_length);
+ thiscomment = qvorbis_comment_query(vc, "REPLAYGAIN_TRACK_PEAK", 0);
+ if(thiscomment)
+ peak = atof(thiscomment);
+ thiscomment = qvorbis_comment_query(vc, "REPLAYGAIN_TRACK_GAIN", 0);
+ if(thiscomment)
+ gaindb = atof(thiscomment);
}
qov_clear (&vf);
Mem_Free (buff);
}
+ if(peak)
+ {
+ sfx->volume_mult = min(1 / peak, exp(gaindb * 0.05 * log(10)));
+ sfx->volume_peak = peak;
+ Con_DPrintf ("\"%s\" uses ReplayGain (gain %f, peak %f)\n", filename, sfx->volume_mult, sfx->volume_peak);
+ }
+
return true;
}