X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=snd_ogg.c;h=75b12d1b418dce8425e891e9227a7ba44a94696b;hb=1c5ad5fd67d911df4af95ac7c543d0ff1d3dca13;hp=ccedb504c5e7260d69c3b6e5bc5d7246871425d1;hpb=f7d63b738768163fd9cdd0bfcfaba910d2b6587a;p=xonotic%2Fdarkplaces.git diff --git a/snd_ogg.c b/snd_ogg.c index ccedb504..75b12d1b 100644 --- a/snd_ogg.c +++ b/snd_ogg.c @@ -567,23 +567,16 @@ static const snd_buffer_t* OGG_FetchSound (void *sfxfetcher, void **chfetcherpoi OGG_FetchEnd ==================== */ -static void OGG_FetchEnd (channel_t* ch) +static void OGG_FetchEnd (void *chfetcherdata) { - ogg_stream_perchannel_t* per_ch; + ogg_stream_perchannel_t* per_ch = (ogg_stream_perchannel_t *)chfetcherdata; - per_ch = (ogg_stream_perchannel_t *)ch->fetcher_data; if (per_ch != NULL) { - size_t buff_len; - // Free the ogg vorbis decoder qov_clear (&per_ch->vf); - buff_len = per_ch->sb.maxframes * per_ch->sb.format.channels * per_ch->sb.format.width; - ch->sfx->memsize -= sizeof (*per_ch) - sizeof (per_ch->sb.samples) + buff_len; - Mem_Free (per_ch); - ch->fetcher_data = NULL; } } @@ -593,20 +586,15 @@ static void OGG_FetchEnd (channel_t* ch) 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; } @@ -634,13 +622,15 @@ Load an Ogg Vorbis file into memory 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; @@ -706,9 +696,15 @@ qboolean OGG_LoadVorbisFile (const char *filename, sfx_t *sfx) 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 @@ -758,9 +754,15 @@ qboolean OGG_LoadVorbisFile (const char *filename, sfx_t *sfx) 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); @@ -768,5 +770,12 @@ qboolean OGG_LoadVorbisFile (const char *filename, sfx_t *sfx) 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; }