[xiph-commits] r15374 - trunk/vorbis-tools/ogg123
ivo at svn.xiph.org
ivo at svn.xiph.org
Sat Oct 4 13:59:43 PDT 2008
Author: ivo
Date: 2008-10-04 13:59:42 -0700 (Sat, 04 Oct 2008)
New Revision: 15374
Added:
trunk/vorbis-tools/ogg123/vgfilter.c
trunk/vorbis-tools/ogg123/vgfilter.h
Log:
Ah, shoot: forgot to add the required files.
Added: trunk/vorbis-tools/ogg123/vgfilter.c
===================================================================
--- trunk/vorbis-tools/ogg123/vgfilter.c (rev 0)
+++ trunk/vorbis-tools/ogg123/vgfilter.c 2008-10-04 20:59:42 UTC (rev 15374)
@@ -0,0 +1,115 @@
+/*
+ * vgfilter.c (c) 2007,2008 William Poetra Yoga Hadisoeseno
+ * based on:
+ * vgplay.c 1.0 (c) 2003 John Morton
+*/
+
+/* vgplay.c 1.0 (c) 2003 John Morton
+ *
+ * Portions of this file are (C) COPYRIGHT 1994-2002 by
+ * the XIPHOPHORUS Company http://www.xiph.org/
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the
+ * distribution.
+ *
+ * - Neither the name of the Xiph.org Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ **********************************************************************
+ *
+ * vgfilter - a filter for ov_read_filter to enable replay gain.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <math.h>
+
+#include <vorbis/codec.h>
+#include <vorbis/vorbisfile.h>
+
+#include "vgfilter.h"
+
+/*
+ * Initialize the replaygain parameters from vorbis comments.
+ */
+void vg_init(vgain_state *vg, vorbis_comment *vc) {
+ float track_gain_db = 0.00, track_peak = 1.00;
+ char *tag = NULL;
+
+ if (vc) {
+ if ((tag = vorbis_comment_query(vc, "replaygain_album_gain", 0))
+ || (tag = vorbis_comment_query(vc, "rg_audiophile", 0)))
+ track_gain_db = atof(tag);
+ else if ((tag = vorbis_comment_query(vc, "replaygain_track_gain", 0))
+ || (tag = vorbis_comment_query(vc, "rg_radio", 0)))
+ track_gain_db = atof(tag);
+
+ if ((tag = vorbis_comment_query(vc, "replaygain_album_peak", 0))
+ || (tag = vorbis_comment_query(vc, "replaygain_track_peak", 0))
+ || (tag = vorbis_comment_query(vc, "rg_peak", 0)))
+ track_peak = atof(tag);
+ }
+
+ vg->scale_factor = pow(10.0, (track_gain_db + VG_PREAMP_DB)/20);
+ vg->max_scale = 1.0 / track_peak;
+}
+
+
+/*
+ * This is the filter function for the decoded Ogg Vorbis stream.
+ */
+void vg_filter(float **pcm, long channels, long samples, void *filter_param)
+{
+ int i, j;
+ float cur_sample;
+ vgain_state *param = filter_param;
+ float scale_factor = param->scale_factor;
+ float max_scale = param->max_scale;
+
+ /* Apply the gain, and any limiting necessary */
+ if (scale_factor > max_scale) {
+ for(i = 0; i < channels; i++)
+ for(j = 0; j < samples; j++) {
+ cur_sample = pcm[i][j] * scale_factor;
+ /* This is essentially the scaled hard-limiting algorithm */
+ /* It looks like the soft-knee to me */
+ /* I haven't found a better limiting algorithm yet... */
+ if (cur_sample < -0.5)
+ cur_sample = tanh((cur_sample + 0.5) / (1-0.5)) * (1-0.5) - 0.5;
+ else if (cur_sample > 0.5)
+ cur_sample = tanh((cur_sample - 0.5) / (1-0.5)) * (1-0.5) + 0.5;
+ pcm[i][j] = cur_sample;
+ }
+ } else if (scale_factor > 0.0) {
+ for(i = 0; i < channels; i++)
+ for(j = 0; j < samples; j++)
+ pcm[i][j] *= scale_factor;
+ }
+}
Added: trunk/vorbis-tools/ogg123/vgfilter.h
===================================================================
--- trunk/vorbis-tools/ogg123/vgfilter.h (rev 0)
+++ trunk/vorbis-tools/ogg123/vgfilter.h 2008-10-04 20:59:42 UTC (rev 15374)
@@ -0,0 +1,67 @@
+/*
+ * vgfilter.h (c) 2007,2008 William Poetra Yoga Hadisoeseno
+ * based on:
+ * vgplay.h 1.0 (c) 2003 John Morton
+*/
+
+/* vgplay.h 1.0 (c) 2003 John Morton
+ *
+ * Portions of this file are (C) COPYRIGHT 1994-2002 by
+ * the XIPHOPHORUS Company http://www.xiph.org/
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the
+ * distribution.
+ *
+ * - Neither the name of the Xiph.org Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ **********************************************************************
+ *
+ * vgfilter - a filter for ov_read_filter to enable replay gain.
+ *
+ */
+
+
+#ifndef __VGPLAY_H
+#define __VGPLAY_H
+
+/* Default pre-amp in dB */
+#define VG_PREAMP_DB 0.0
+
+typedef struct {
+ float scale_factor; /* The scale factor */
+ float max_scale; /* The maximum scale factor before clipping occurs */
+} vgain_state;
+
+
+/* Initializes the ReplayGain the vgain_state structure for a track. */
+extern void vg_init(vgain_state *vg_state, vorbis_comment *vc);
+
+/* The filter where VorbisGain is applied */
+extern void vg_filter(float **pcm, long channels, long samples, void *filter_param);
+
+#endif /* __VGPLAY_H */
More information about the commits
mailing list