Revision: 2325
http://gtkpod.svn.sourceforge.net/gtkpod/?rev=2325&view=rev
Author: tmzullinger
Date: 2009-04-18 00:09:21 +0000 (Sat, 18 Apr 2009)
Log Message:
-----------
Add preferences for handling ReplayGain
This adds two preference settings, replaygain_offset and
replaygain_mode_album_priority. The first is a simple offset value that
is added to the ReplayGain value before being converted to a Soundcheck
value and stored in the iTunesDB. The other setting allows a choice
between Audiofile (aka album) gain and Radio (aka track) gain.
Modified Paths:
--------------
gtkpod/trunk/ChangeLog
gtkpod/trunk/data/gtkpod.glade
gtkpod/trunk/src/mp3file.c
gtkpod/trunk/src/prefs.c
gtkpod/trunk/src/prefsdlg.c
Modified: gtkpod/trunk/ChangeLog
===================================================================
--- gtkpod/trunk/ChangeLog 2009-04-18 00:09:09 UTC (rev 2324)
+++ gtkpod/trunk/ChangeLog 2009-04-18 00:09:21 UTC (rev 2325)
@@ -1,5 +1,22 @@
2009-04-17 Todd Zullinger <[email protected]>
+ Patch from: Author: Greg Carroll <[email protected]>
+
+ * data/gtkpod.glade
+ src/mp3file.c
+ src/prefs.c
+ src/prefsdlg.c:
+ Add preferences for handling ReplayGain.
+
+ This adds two preference settings, replaygain_offset and
+ replaygain_mode_album_priority. The first is a simple
+ offset value that is added to the ReplayGain value before
+ being converted to a Soundcheck value and stored in the
+ iTunesDB. The other setting allows a choice between
+ Audiofile (aka album) gain and Radio (aka track) gain.
+
+2009-04-17 Todd Zullinger <[email protected]>
+
* src/mp3file.c:
Add support for reading ReplayGain data in common ID3 tags.
The order of preference for ReplayGain data is now ID3, APE,
Modified: gtkpod/trunk/data/gtkpod.glade
===================================================================
--- gtkpod/trunk/data/gtkpod.glade 2009-04-18 00:09:09 UTC (rev 2324)
+++ gtkpod/trunk/data/gtkpod.glade 2009-04-18 00:09:21 UTC (rev 2325)
@@ -10440,6 +10440,19 @@
<property name="position">2</property>
</packing>
</child>
+ <child>
+ <widget class="GtkButton" id="replaygain">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property
name="receives_default">True</property>
+ <property name="label"
translatable="yes">ReplayGain...</property>
+ <property name="response_id">0</property>
+ <signal name="clicked"
handler="on_replaygain_clicked"/>
+ </widget>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
@@ -13654,4 +13667,186 @@
</widget>
</child>
</widget>
+ <widget class="GtkDialog" id="prefs_replaygain_dialog">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">ReplayGain Preferences</property>
+ <property name="resizable">False</property>
+ <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+ <property name="icon">gtkpod-icon-48.png</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox19">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkVBox" id="vbox51">
+ <property name="visible">True</property>
+ <property name="border_width">7</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkFrame" id="frame27">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment46">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox57">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkRadioButton" id="mode_album">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Album
gain (formerly "audiophile gain")</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled"
handler="on_replaygain_mode_album_toggled"/>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="mode_track">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Track
gain (formerly "radio gain")</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">mode_album</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label120">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes"><b>Preferred gain type</b></property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame28">
+ <property name="visible">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment49">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkHBox" id="hbox52">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkSpinButton" id="replaygain_offset">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="adjustment">0 -20 20 1 10
0</property>
+ <property name="climb_rate">1</property>
+ <signal name="value_changed"
handler="on_replaygain_offset_value_changed"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label124">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes">dB</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label125">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Offset
to add to ReplayGain</b></property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox51">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkLabel" id="label51">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">These settings
will only be applied to newly added or updated tracks. This could result in
tracks that are normalized to different levels until updated.</property>
+ <property name="wrap">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area19">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <child>
+ <widget class="GtkButton" id="rg_close">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">gtk-close</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
</glade-interface>
Modified: gtkpod/trunk/src/mp3file.c
===================================================================
--- gtkpod/trunk/src/mp3file.c 2009-04-18 00:09:09 UTC (rev 2324)
+++ gtkpod/trunk/src/mp3file.c 2009-04-18 00:09:21 UTC (rev 2325)
@@ -199,6 +199,7 @@
#include "itdb.h"
#include "file.h"
#include "misc.h"
+#include "prefs.h"
/* MIN_CONSEC_GOOD_FRAMES defines how many consecutive valid MP3 frames
@@ -2402,7 +2403,12 @@
gboolean mp3_read_soundcheck (const gchar *path, Track *track)
{
GainData gd;
+ gint replaygain_offset;
+ gint replaygain_mode_album_priority;
+ replaygain_offset = prefs_get_int ("replaygain_offset");
+ replaygain_mode_album_priority = prefs_get_int
("replaygain_mode_album_priority");
+
g_return_val_if_fail (track, FALSE);
memset (&gd, 0, sizeof (GainData));
@@ -2420,16 +2426,16 @@
else
return FALSE;
- if (gd.audiophile_gain_set)
+ if (gd.audiophile_gain_set && replaygain_mode_album_priority)
{
DEBUG ("Setting Soundcheck value from album ReplayGain\n");
- track->soundcheck = replaygain_to_soundcheck (gd.audiophile_gain);
+ track->soundcheck = replaygain_to_soundcheck (gd.audiophile_gain +
replaygain_offset);
return TRUE;
}
if (gd.radio_gain_set)
{
DEBUG ("Setting Soundcheck value from radio ReplayGain\n");
- track->soundcheck = replaygain_to_soundcheck (gd.radio_gain);
+ track->soundcheck = replaygain_to_soundcheck (gd.radio_gain +
replaygain_offset);
return TRUE;
}
Modified: gtkpod/trunk/src/prefs.c
===================================================================
--- gtkpod/trunk/src/prefs.c 2009-04-18 00:09:09 UTC (rev 2324)
+++ gtkpod/trunk/src/prefs.c 2009-04-18 00:09:21 UTC (rev 2325)
@@ -321,9 +321,13 @@
prefs_set_int("pm_sort", SORT_NONE);
prefs_set_int("tm_sortcol", TM_COLUMN_TITLE);
prefs_set_int("tm_sort", SORT_NONE);
-
- /* New conversion preferences */
- prefs_set_int("conversion_target_format", TARGET_FORMAT_MP3);
+
+ /* New conversion preferences */
+ prefs_set_int("conversion_target_format", TARGET_FORMAT_MP3);
+
+ /* ReplayGain prefs */
+ prefs_set_int("replaygain_offset", 0);
+ prefs_set_int("replaygain_mode_album_priority", TRUE);
}
/* Initialize default variable-length list entries */
Modified: gtkpod/trunk/src/prefsdlg.c
===================================================================
--- gtkpod/trunk/src/prefsdlg.c 2009-04-18 00:09:09 UTC (rev 2324)
+++ gtkpod/trunk/src/prefsdlg.c 2009-04-18 00:09:21 UTC (rev 2325)
@@ -1294,3 +1294,46 @@
{
sort_window_create ();
}
+
+/*
+ glade callback
+*/
+G_MODULE_EXPORT void on_replaygain_clicked (GtkButton *sender, gpointer e)
+{
+ GladeXML *xml = gtkpod_xml_new (xml_file, "prefs_replaygain_dialog");
+ GtkWidget *dlg = gtkpod_xml_get_widget (xml, "prefs_replaygain_dialog");
+ GtkWidget *mode_album_radio = gtkpod_xml_get_widget (xml, "mode_album");
+ GtkWidget *mode_track_radio = gtkpod_xml_get_widget (xml, "mode_track");
+
+ gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW
(prefs_dialog));
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (gtkpod_xml_get_widget (xml,
"replaygain_offset")), prefs_get_int("replaygain_offset"));
+
+ if(prefs_get_int("replaygain_mode_album_priority"))
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
(mode_album_radio), TRUE);
+ else
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
(mode_track_radio), TRUE);
+
+ glade_xml_signal_autoconnect (xml);
+ gtk_dialog_run (GTK_DIALOG (dlg));
+ gtk_widget_destroy (dlg);
+ g_object_unref (xml);
+}
+
+/*
+ glade callback
+*/
+G_MODULE_EXPORT void on_replaygain_mode_album_toggled (GtkToggleButton
*sender, gpointer e)
+{
+ gboolean active = gtk_toggle_button_get_active (sender);
+
+ prefs_set_int ("replaygain_mode_album_priority", active);
+}
+
+/*
+ glade callback
+*/
+G_MODULE_EXPORT void on_replaygain_offset_value_changed (GtkSpinButton
*sender, gpointer e)
+{
+ prefs_set_int ("replaygain_offset", gtk_spin_button_get_value_as_int
(sender));
+}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Stay on top of everything new and different, both inside and
around Java (TM) technology - register by April 22, and save
$200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
300 plus technical and hands-on sessions. Register today.
Use priority code J9JMT32. http://p.sf.net/sfu/p
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2