diff -pruN 1.8-2/configure.ac 1.8-2ubuntu32/configure.ac
--- 1.8-2/configure.ac 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/configure.ac 2015-04-13 20:36:41.000000000 +0000
@@ -0,0 +1,90 @@
+AC_PREREQ([2.69])
+
+AC_INIT([gnomeradio],[1.8],[http://bugzilla.gnome.org/enter_bug.cgi?product=gnomeradio],[gnomeradio],[http://projects.gnome.org/gnomeradio/])
+
+AM_MAINTAINER_MODE([enable])
+AC_CONFIG_SRCDIR([src/gui.c])
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_MACRO_DIR([m4])
+
+AM_INIT_AUTOMAKE([1.11 dist-xz tar-ustar no-dist-gzip check-news])
+
+AM_SILENT_RULES([yes])
+
+GETTEXT_PACKAGE=gnomeradio
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, ["$GETTEXT_PACKAGE"], [Define to the Gettext package name])
+AC_SUBST(GETTEXT_PACKAGE)
+IT_PROG_INTLTOOL([0.40.0])
+
+YELP_HELP_INIT
+
+AC_PROG_CXX
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AM_PATH_GLIB_2_0
+
+LT_PREREQ([2.2])
+LT_INIT
+
+AC_CHECK_HEADERS([fcntl.h limits.h memory.h stdlib.h string.h sys/ioctl.h sys/time.h unistd.h])
+
+AC_TYPE_SSIZE_T
+AC_CHECK_MEMBERS([struct stat.st_rdev])
+
+AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
+AC_HEADER_MAJOR
+AC_FUNC_MALLOC
+AC_FUNC_REALLOC
+AC_CHECK_FUNCS([memset realpath rint strcasecmp strchr strcspn strdup strncasecmp strrchr strstr])
+
+PKG_CHECK_MODULES(ALSA, alsa >= 1.0.25)
+AC_SUBST(ALSA_CFLAGS)
+AC_SUBST(ALSA_LIBS)
+
+PKG_CHECK_MODULES(GNOME, gtk+-3.0 libxml-2.0 glib-2.0 gio-2.0)
+AC_SUBST(GNOME_CFLAGS)
+AC_SUBST(GNOME_LIBS)
+
+PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0 >= 1.0.5 gstreamer-plugins-base-1.0 >= 1.0.5 gstreamer-pbutils-1.0 >= 1.0.5)
+AC_SUBST(GSTREAMER_CFLAGS)
+AC_SUBST(GSTREAMER_LIBS)
+
+PKG_CHECK_MODULES(XML, libxml-2.0 >= 2.4)
+AC_SUBST(XML_CFLAGS)
+AC_SUBST(XML_LIBS)
+
+AC_PATH_PROG(GLIB_COMPILE_SCHEMAS, glib-compile-schemas)
+GLIB_GSETTINGS
+
+GLIB_COMPILE_RESOURCES=`$PKG_CONFIG gio-2.0 --variable=glib_compile_resources`
+AC_SUBST(GLIB_COMPILE_RESOURCES)
+
+AC_SUBST(LIRC)
+LIRC=""
+if test "$enable_lirc" != "no"; then
+ AC_CHECK_LIB(lirc_client, lirc_init,
+ AC_DEFINE(HAVE_LIRC, 1, "Is LIRC installed") LIRC="-llirc_client",,)
+else
+ echo "*** lirc disabled"
+fi
+
+AC_CONFIG_FILES([gnomeradio.spec
+ Makefile
+ data/Makefile
+ data/icons/16x16/Makefile
+ data/icons/22x22/Makefile
+ data/icons/24x24/Makefile
+ data/icons/32x32/Makefile
+ data/icons/48x48/Makefile
+ data/icons/Makefile
+ data/icons/scalable/Makefile
+ data/pixmaps/Makefile
+ help/Makefile
+ po/Makefile.in
+ src/Makefile])
+
+AC_OUTPUT
+
diff -pruN 1.8-2/configure.in 1.8-2ubuntu32/configure.in
--- 1.8-2/configure.in 2015-04-13 20:36:40.000000000 +0000
+++ 1.8-2ubuntu32/configure.in 1970-01-01 00:00:00.000000000 +0000
@@ -1,72 +0,0 @@
-AC_PREREQ(2.52)
-
-AC_INIT(gnomeradio, 1.8, http://mfcn.ilo.de/gnomeradio)
-AC_CONFIG_SRCDIR(src/gui.c)
-AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
-
-AM_MAINTAINER_MODE
-AM_CONFIG_HEADER(config.h)
-AC_CONFIG_MACRO_DIR([m4])
-AC_PROG_INTLTOOL([0.21])
-
-AM_PROG_LIBTOOL
-AC_ISC_POSIX
-AC_PROG_CC
-AC_PROG_INSTALL
-AC_PROG_MAKE_SET
-
-
-ALL_LINGUAS="ar am az be bg ca cs da de dz en_CA en_GB es eu fi fr he hr hu it ja lv mk ml mn ms nb nl oc pa pl pt pt_BR ru rw sk sr sr@Latn sv tr uk vi zh_CN zh_TW"
-AM_GLIB_GNU_GETTEXT
-GETTEXT_PACKAGE=gnomeradio
-AC_SUBST(GETTEXT_PACKAGE)
-AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", GETTEXT_PACKAGE)
-
-
-PKG_CHECK_MODULES(GNOME, dbus-glib-1 gconf-2.0 >= 2.12 gtk+-3.0 libgnome-media-profiles-3.0 >= 3.0)
-AC_SUBST(GNOME_CFLAGS)
-AC_SUBST(GNOME_LIBS)
-AC_SUBST(LIRC)
-
-PKG_CHECK_MODULES(GSTREAMER, gstreamer-0.10 gstreamer-plugins-base-0.10)
-AC_SUBST(GSTREAMER_CFLAGS)
-AC_SUBST(GSTREAMER_LIBS)
-
-GNOME_DOC_INIT
-
-AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
-
-if test x"$GCONFTOOL" = xno; then
- AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
-fi
-
-AM_GCONF_SOURCE_2
-
-LIRC=""
-if test "$enable_lirc" != "no"; then
- AC_CHECK_LIB(lirc_client, lirc_init,
- AC_DEFINE(HAVE_LIRC, 1, "Is LIRC installed") LIRC="-llirc_client",,)
-else
- echo "*** lirc disabled"
-fi
-
-AC_ARG_ENABLE(install_schemas,
- [ --disable-install-schemas Disable installation of the gconf schemas])
-AM_CONDITIONAL(INSTALL_SCHEMAS, test x$enable_install_schemas != xno)
-
-AC_OUTPUT([
-gnomeradio.spec
-Makefile
-src/Makefile
-po/Makefile.in
-data/Makefile
-data/pixmaps/Makefile
-data/icons/Makefile
-data/icons/16x16/Makefile
-data/icons/22x22/Makefile
-data/icons/24x24/Makefile
-data/icons/32x32/Makefile
-data/icons/48x48/Makefile
-data/icons/scalable/Makefile
-help/Makefile
-])
diff -pruN 1.8-2/COPYING 1.8-2ubuntu32/COPYING
--- 1.8-2/COPYING 2007-02-24 23:33:39.000000000 +0000
+++ 1.8-2ubuntu32/COPYING 2015-04-13 20:36:41.000000000 +0000
@@ -1,12 +1,12 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
- Preamble
+ Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
@@ -15,7 +15,7 @@ software--to make sure the software is f
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,8 +55,8 @@ patent must be licensed for everyone's f
The precise terms and conditions for copying, distribution and
modification follow.
-
- GNU GENERAL PUBLIC LICENSE
+
+ GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
@@ -110,7 +110,7 @@ above, provided that you also meet all o
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place,
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -255,7 +255,7 @@ make exceptions for this. Our decision
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
- NO WARRANTY
+ NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
@@ -303,17 +303,16 @@ the "copyright" line and a pointer to wh
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
- Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
@@ -336,5 +335,6 @@ necessary. Here is a sample; alter the
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
+
diff -pruN 1.8-2/data/gnomeradio.desktop.in 1.8-2ubuntu32/data/gnomeradio.desktop.in
--- 1.8-2/data/gnomeradio.desktop.in 2015-04-13 20:36:40.000000000 +0000
+++ 1.8-2ubuntu32/data/gnomeradio.desktop.in 2015-04-13 20:36:41.000000000 +0000
@@ -1,13 +1,14 @@
[Desktop Entry]
-_Name=FM-Radio Tuner
-_Comment=Listen to FM-radio
+_Name=Gnomeradio
+_Comment=Listen to FM radio
+_Keywords=Radio;Tuner;FM;
Exec=gnomeradio
Icon=gnomeradio
-Categories=AudioVideo;Audio;Tuner
-StartupNotify=true
Terminal=false
Type=Application
+Categories=GNOME;GTK;AudioVideo;Audio;Tuner;
+X-GNOME-DocPath=gnomeradio/gnomeradio.xml
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnomeradio
X-GNOME-Bugzilla-Component=general
-X-GNOME-DocPath=gnomeradio/gnomeradio.xml
+StartupNotify=true
diff -pruN 1.8-2/data/gnomeradio.gep 1.8-2ubuntu32/data/gnomeradio.gep
--- 1.8-2/data/gnomeradio.gep 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/data/gnomeradio.gep 2015-04-13 20:36:41.000000000 +0000
@@ -0,0 +1,62 @@
+[GStreamer Encoding Target]
+name = gnomeradio
+category = muh
+description = Common encoding profiles for Gnomeradio
+
+[profile-mp3]
+name = mp3
+description = MPEG Layer 3 Audio
+format = application/x-id3
+type = container
+
+[streamprofile-mp3-1]
+parent = mp3
+type = audio
+format = audio/mpeg, mpegversion=1, layer=3
+presence = 1
+
+
+[profile-oggvorbis]
+name = oggvorbis
+description = Ogg Vorbis
+format = application/ogg
+type = container
+
+[streamprofile-oggvorbis-1]
+parent = oggvorbis
+type = audio
+format = audio/x-vorbis
+presence = 1
+
+
+[profile-oggopus]
+name = oggopus
+description = Ogg Opus
+format = application/ogg
+type = container
+
+[streamprofile-oggopus-1]
+parent = oggopus
+type = audio
+format = audio/x-opus
+presence = 1
+
+
+[profile-flac]
+name = flac
+description = FLAC
+format = audio/x-flac
+type = audio
+
+
+[profile-m4a]
+name = m4a
+description = MPEG 4 Audio
+format = video/quicktime, variant=iso
+type = container
+
+[streamprofile-m4a-1]
+parent = m4a
+type = audio
+format = audio/mpeg, mpegversion=4, stream-format=raw
+presence = 1
diff -pruN 1.8-2/data/gnomeradio.schemas.in 1.8-2ubuntu32/data/gnomeradio.schemas.in
--- 1.8-2/data/gnomeradio.schemas.in 2008-04-13 13:09:06.000000000 +0000
+++ 1.8-2ubuntu32/data/gnomeradio.schemas.in 2015-04-13 20:36:41.000000000 +0000
@@ -8,7 +8,7 @@
TRUE
Mute on exit
- If unchecked, gnomeradio won't mute after exiting
+ Mute radio device on exit
@@ -29,10 +29,10 @@
/apps/gnomeradio/device
gnomeradio
string
- /dev/radio
+ auto
Radio device
- Specify the radio-device (in most cases /dev/radio)
+ The radio device to use (e.g. /dev/radio0)
@@ -44,7 +44,7 @@
any
Device driver
- Specify the device driver to use (any, v4l1 or v4l2)
+ The device driver to use (any, v4l1 or v4l2)
@@ -53,22 +53,46 @@
/apps/gnomeradio/mixer
gnomeradio
string
- line
+ default/Master
Mixer source
- Choose the mixer source (line, line1, etc.) that is able to control the volume of your radio
+ The mixer device and channel to use (e.g. hw:0/Line)
- /schemas/apps/gnomeradio/mixer-device
- /apps/gnomeradio/mixer-device
+ /schemas/apps/gnomeradio/muted
+ /apps/gnomeradio/muted
gnomeradio
- string
- /dev/mixer
+ bool
+ FALSE
+
+ Muted
+ This setting saves whether or not gnomeradio was muted when it was last exited
+
+
+
+
+ /schemas/apps/gnomeradio/unmute-volume
+ /apps/gnomeradio/unmute-volume
+ gnomeradio
+ float
+ -1
+
+ Unmute volume
+ This setting saves the volume before muting gnomeradio session
+
+
+
+
+ /schemas/apps/gnomeradio/audio-loopback
+ /apps/gnomeradio/audio-loopback
+ gnomeradio
+ bool
+ TRUE
- Mixer Device
- The mixer device that gnomeradio should use. Only changeable via this key (no GUI option)
+ Audio Loopback mode
+ Start an audio streaming between the radio device and the audio output device
@@ -92,7 +116,7 @@
-1
Last presets
- The preset that was enabled when gnomeradio was terminated. Range is 0 ... (# presets - 1). None is -1
+ The preset that was enabled when gnomeradio was terminated. Range is 0 ... (presets - 1). None is -1
@@ -101,10 +125,10 @@
/apps/gnomeradio/recording/profile
gnomeradio
string
- cdlossy
+ audio/x-vorbis
- GnomeMedia Profile
- Choose the GnomeMedia Profile that should be used for recording
+ Media format
+ Choose the format that should be used for recording
diff -pruN 1.8-2/data/icons/Makefile.am 1.8-2ubuntu32/data/icons/Makefile.am
--- 1.8-2/data/icons/Makefile.am 2007-02-24 23:33:38.000000000 +0000
+++ 1.8-2ubuntu32/data/icons/Makefile.am 2015-04-13 20:36:41.000000000 +0000
@@ -1,11 +1,13 @@
SUBDIRS = 16x16 22x22 24x24 32x32 48x48 scalable
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
-install-data-hook:
+install-data-hook: update-icon-cache
+uninstall-hook: update-icon-cache
+update-icon-cache:
@-if test -z "$(DESTDIR)"; then \
echo "Updating Gtk icon cache."; \
$(gtk_update_icon_cache); \
else \
- echo "*** Icon cache not updated. After install, run this:"; \
+ echo "*** Icon cache not updated. After (un)install, run this:"; \
echo "*** $(gtk_update_icon_cache)"; \
fi
diff -pruN 1.8-2/data/Makefile.am 1.8-2ubuntu32/data/Makefile.am
--- 1.8-2/data/Makefile.am 2007-02-24 23:33:38.000000000 +0000
+++ 1.8-2ubuntu32/data/Makefile.am 2015-04-13 20:36:41.000000000 +0000
@@ -3,24 +3,27 @@ SUBDIRS = icons pixmaps
applicationsdir = $(datadir)/applications/
applications_in_files = gnomeradio.desktop.in
applications_DATA = $(applications_in_files:.desktop.in=.desktop)
-@INTLTOOL_DESKTOP_RULE@
-schemadir = @GCONF_SCHEMA_FILE_DIR@
-schema_in_files = gnomeradio.schemas.in
-schema_DATA = $(schema_in_files:.schemas.in=.schemas)
-@INTLTOOL_SCHEMAS_RULE@
+@INTLTOOL_DESKTOP_RULE@
all-local: $(applications_DATA)
-install-data-local:
-if INSTALL_SCHEMAS
- GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA)
-endif
-
-EXTRA_DIST = $(applications_DATA) \
- $(applications_in_files) \
- $(schema_DATA) \
- $(schema_in_files) \
- example.lircrc
+profilesdir = $(datadir)/gnomeradio
+profiles_DATA = gnomeradio.gep
+
+@INTLTOOL_XML_NOMERGE_RULE@
+
+gsettings_SCHEMAS = org.gnome.gnomeradio.gschema.xml
+
+@GSETTINGS_RULES@
+
+EXTRA_DIST = \
+ $(applications_DATA) \
+ $(applications_in_files) \
+ $(profiles_DATA) \
+ $(gsettings_SCHEMAS) \
+ example.lircrc
+
+CLEANFILES = $(applications_DATA)
+
-CLEANFILES = $(schema_DATA) $(applications_DATA)
diff -pruN 1.8-2/data/org.gnome.gnomeradio.gschema.xml 1.8-2ubuntu32/data/org.gnome.gnomeradio.gschema.xml
--- 1.8-2/data/org.gnome.gnomeradio.gschema.xml 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/data/org.gnome.gnomeradio.gschema.xml 2015-04-13 20:36:41.000000000 +0000
@@ -0,0 +1,69 @@
+
+
+
+ false
+ The first time gnomeradio was run
+ Set to true when the user ran the first time gnomeradio
+
+
+ 100.00
+ Last frequency
+ The last frequency (in MHz) in use
+
+
+ 'auto'
+ Radio device
+ The default radio device to use (e.g. /dev/radio0)
+
+
+ 'any'
+ Device driver
+ The default device driver to use (any, v4l1 or v4l2)
+
+
+ 'default/Master'
+ Mixer source
+ The default mixer device and channel to use (e.g. hw:0/Line)
+
+
+ false
+ Muted
+ The muted state in last exited
+
+
+ -1
+ Unmute volume
+ The volume before muting gnomeradio session
+
+
+ true
+ Mute on exit
+ Mute radio device on exit
+
+
+ true
+ The audio loopback mode
+ When set to true will start an audio streaming between the wireless device and the audio output device
+
+
+ 0
+ Number of presets
+ The number of presets
+
+
+ -1
+ Last presets
+ The preset that was enabled when gnomeradio was terminated. Range is 0 ... (presets - 1). None is -1
+
+
+ ''
+ The default location to use for the recorded files
+ The path to the location where gnomeradio should store recorded files. If that value is empty, the HOME folder will be used
+
+
+ 'audio/x-vorbis'
+ The media type for encoding audio when recording
+ The media type for encoding audio when recording (e.g. audio/x-vorbis for Ogg Vorbis, or audio/mpeg for MP3). This is not a MIME type.
+
+
+
diff -pruN 1.8-2/data/pixmaps/Makefile.am 1.8-2ubuntu32/data/pixmaps/Makefile.am
--- 1.8-2/data/pixmaps/Makefile.am 2007-02-24 23:33:37.000000000 +0000
+++ 1.8-2ubuntu32/data/pixmaps/Makefile.am 2015-04-13 20:36:41.000000000 +0000
@@ -1,7 +1,5 @@
-EXTRA_DIST = digits.xpm \
- freq_up.xpm \
- signal.xpm \
- vol_down.xpm \
- freq_down.xpm \
- stereo.xpm \
- vol_up.xpm
+EXTRA_DIST = digits.xpm \
+ freq_down.xpm \
+ freq_up.xpm \
+ signal.xpm \
+ stereo.xpm
diff -pruN 1.8-2/debian/changelog 1.8-2ubuntu32/debian/changelog
--- 1.8-2/debian/changelog 2011-11-15 16:57:55.000000000 +0000
+++ 1.8-2ubuntu32/debian/changelog 2015-04-13 18:43:38.000000000 +0000
@@ -1,3 +1,516 @@
+gnomeradio (1.8-2ubuntu32) vivid; urgency=medium
+
+ * Change alsa mixer from hw:0/Line to default/Master.
+ The master volume at the default mixer is called "Master", and not "Line".
+ This is the volume that applies to all devices. Ok, old PCI devices may have
+ a cable wired into the "Line" input at the motherboard but this is not a
+ common setup anymore.
+ * Fix error message when channel is not available.
+ The original message were too confusing as it was printing:
+ mixer: find error: Sucess
+ mixer: Can't open mixer default, mixer volume and mute unavailable.
+ The first message is useless, as it says nothing and it contradicts itself.
+ The second one also doesn't help much, as the error is generally because
+ "Line" mixer may not be found at the default device. So, improve it to
+ provide more information.
+ * Avoid scan dialog from locking up during long running process.
+ (LP: #1441336)
+ * Make sure dialogs has a transient parent. (LP: #1441768)
+ * Get rid of deprecation warnings introduced with gtk-3.14.
+ * Remove the duplicate frequencies after running scanner again. (LP: #1441338)
+ * debian/control: Updated to Standards-Version 3.9.6, no changes needed.
+
+ -- POJAR GEORGE Fri, 03 Apr 2015 13:19:52 +0000
+
+gnomeradio (1.8-2ubuntu31) vivid; urgency=medium
+
+ * Fix volume button popup with a known limitation of popovers (at least in
+ their current implementation). (LP: #1438261)
+
+ -- POJAR GEORGE Mon, 30 Mar 2015 15:02:43 +0000
+
+gnomeradio (1.8-2ubuntu30) utopic; urgency=medium
+
+ * Don't break up when recording doesn't work and we use key allocated to
+ finish it.
+ * Minor adjustment to prevent noise sound through the speakers.
+
+ -- POJAR GEORGE Wed, 09 Jul 2014 23:42:55 +0000
+
+gnomeradio (1.8-2ubuntu29) utopic; urgency=medium
+
+ * Improve volume control handling:
+ - Use a absolute value when adjust the volume level.
+ - Don't touch volume level when switch to mute.
+ - Cleaned up the volume stuff so that lirc.c doesn't has to touch the
+ GtkVolumeButton anymore.
+ - Don't leak the buffer in alsa code.
+ - Various code clean up.
+ * Reworked first run dialog.
+
+ -- POJAR GEORGE Sun, 06 Jul 2014 18:18:26 +0000
+
+gnomeradio (1.8-2ubuntu28) utopic; urgency=medium
+
+ * Small update needed because GTK+ 3.12 available in the Ubuntu 14.10 Utopic
+ Unicorn. (LP: #1329749)
+ - Stop using deprecated gtk margin function.
+ - Setting the volume icon size in UI to match the rest of the buttons.
+ - Use the new support for RTL icons in GtkIconTheme.
+
+ -- POJAR GEORGE Fri, 13 Jun 2014 00:51:01 +0000
+
+gnomeradio (1.8-2ubuntu27) utopic; urgency=medium
+
+ * Added an explicit reference to the audio settings in man and help pages in
+ the event that radio card is not connected to the sound card via a cable.
+
+ -- POJAR GEORGE Wed, 11 Jun 2014 07:20:34 +0000
+
+gnomeradio (1.8-2ubuntu26) trusty; urgency=low
+
+ * debian/patches/gnomeradio-g_object.patch: Removed useless calls to the
+ G_OBJECT() macro. (LP: #1267306)
+ * Updated debian/patches/gnomeradio-about.patch: Update COPYING file with
+ latest versions from gnu.org. (LP: #1266203)
+ * Updated debian/patches/gnomeradio-gtk_stock.patch: UI make it more sleek,
+ remove relief from the UI buttons. (LP: #1265154)
+ * Updated debian/patches/gnomeradio-gtk_application.patch: Make the main
+ window a GtkApplicationWindow.
+ * Updated debian/patches/gnomeradio-ngettext.patch: Fix localization, use
+ g_dngettext instead of ngettext.
+ * Updated debian/patches/gnomeradio-record_information.patch: Use GDateTime
+ instead of time_t.
+ * Moved changes from debian/patches/gnomeradio-thread_safe.patch to
+ debian/patches/gnomeradio-alsa.patch and removed it as result.
+ * debian/control: Updated to Standards-Version 3.9.5, no changes needed.
+
+ -- POJAR GEORGE Tue, 24 Dec 2013 10:38:24 +0000
+
+gnomeradio (1.8-2ubuntu25) trusty; urgency=low
+
+ * debian/patches/gnomeradio-gsettings.patch: Port gnomeradio to GSettings.
+ (LP: #1256796)
+ * debian/patches/gnomeradio-gtk_application.patch: Use GtkApplication, which
+ provides single-instance support. (LP: #1258429)
+ * debian/patches/gnomeradio-g_dbus.patch: Migrate from dbus-glib to glib's
+ GDBus. (LP: #1258518)
+ * Updates debian/patches/gnomeradio-about.patch: Use simply "About" instead of
+ "About Gnomeradio". (LP: #1259301)
+ * Updates debian/patches/gnomeradio-media_types.patch: Added ellipsis
+ character (…) for label of the install media type button.
+ * Updates debian/patches/gnomeradio-presets.patch: Joint into one patch with
+ debian/patches/gnomeradio-station_list.patch.
+ * debian/control: Removed Build-Depends on: libgconf2-dev and
+ libdbus-glib-1-dev.
+ * debian/rules: Removed the rule regarding GConf.
+
+ -- POJAR GEORGE Sun, 01 Dec 2013 22:09:30 +0000
+
+gnomeradio (1.8-2ubuntu24) trusty; urgency=low
+
+ * Fixed previous debian/changelog: gnomeradio-tray_menu.patch is a new patch
+ not one updated.
+ * Updated debian/patches/gnomeradio-alsa.patch: Fixed wrong switch in case
+ statement. (LP: 1240691)
+ * Updated debian/patches/gnomeradio-auto_device.patch: Fixed pointer to local
+ stack variable returned or used outside scope.
+ * Updated debian/patches/gnomeradio-preferences.patch:
+ - Fixed the indentation of code suggests it is nested when it is not.
+ - Fixed function that returns non-void is missing a return value.
+ - Use GtkSwitch instead GtkRadioButton to change audio loopback state.
+ (LP: 1240632)
+ - Avoid memory leak (unref the gconf client when we're done).
+ * Updated debian/patches/gnomeradio-tray_menu.patch: Moved
+ tree_view_switch_to_preset() inside of gnomeradio_switch_to_preset() so
+ preset list will be updated when use LIRC command.
+ * Updated gnomeradio-station_list.patch: Make sure the XML document will be
+ indented.
+
+ -- POJAR GEORGE Mon, 30 Sep 2013 12:21:35 +0000
+
+gnomeradio (1.8-2ubuntu23) saucy; urgency=low
+
+ * Updated debian/patches/gnomeradio-tray_menu.patch:
+ - Fixed menu item not update conform new order when we use move up[down]
+ swap. (LP: #1232931)
+ - Fixed conditional jump or move depends on uninitialized value.
+ - Added function to switch to preset in settings preset list when changed
+ them from tray menu.
+ - Cleaned up the files relating to the tray icon. Neither gui.c, prefs.c nor
+ record.c touch the internals of trayicon.c anymore.
+ * Updated debian/patches/gnomeradio-preferences.patch:
+ - Added option to disable audio loopback mode in Preferences settings.
+ - Moved in separate GOptionGroup all command line parameters which refers to
+ audio loopback mode.
+ * Updated debian/patches/gnomeradio-device.patch: Not need radio_mute() when
+ exit or session die, already is called in radio_stop().
+ * Updated debian/patches/gnomeradio-station_list.patch: Fixed pointer targets
+ in passing argument differ in signedness.
+ * Removed the content against configure and Makefile.in, since we use
+ autoreconf anyways, from:
+ - debian/patches/gnomeradio-gstreamer-1.0.patch.
+ - debian/patches/gnomeradio-volume_button.patch.
+ * Updated debian/patches/gnomeradio-volume_button.patch: Removed unused
+ vol_down[up].xpm icons.
+ * debian/gnomeradio.1: Updated man page.
+
+ -- POJAR GEORGE Thu, 20 Sep 2013 13:31:33 +0000
+
+gnomeradio (1.8-2ubuntu22) saucy; urgency=low
+
+ * Updated debian/patches/gnomeradio-media_types.patch: Fix ambiguous function
+ prototypes.
+ * Application name is suggestive, so we removed long name. Updated to make
+ this change:
+ - debian/patches/gnomeradio.desktop.patch
+ - debian/patches/gnomeradio-documentation.patch
+ - debian/gnomeradio.1
+ - debian/menu
+ - debian/control
+ * Added keywords to .desktop file.
+ * debian/gnomeradio.xpm: Added instead of generating it automatically during
+ the build of the package.
+ * debian/control: Removed Build-Depends on imagemagick.
+ * debian/rules: Removed the rule regarding the generation of gnomeradio.xpm.
+
+ -- POJAR GEORGE Wed, 25 Sep 2013 11:49:11 +0000
+
+gnomeradio (1.8-2ubuntu21) saucy; urgency=low
+
+ * Updated debian/patches/gnomeradio-media_types.patch: Add ogg opus encoding
+ profile.
+ * Updated debian/patches/gnomeradio-alsamixer.patch: Fix tooltip text in mute
+ on exit option.
+ * Updated debian/patches/gnomeradio-lirc.patch:
+ - Autodetect supported TV applications when switch to TV mode.
+ - Merged (and removed them as result) with gnomeradio-function.patch and
+ gnomeradio-keycode_mapping.patch.
+ * Added header to debian/patches/gnomeradio-preferences.patch.
+
+ -- POJAR GEORGE Mon, 23 Sep 2013 08:47:52 +0000
+
+gnomeradio (1.8-2ubuntu20) saucy; urgency=low
+
+ * Updated debian/patches/gnomeradio-station_list.patch: Prevent to parse
+ malformed/incomplete/invalid XML file.
+ * Updated debian/patches/gnomeradio-auto_device.patch:
+ - Automatically detect radio device when users type auto in settings field.
+ - Updated error messages to be clear and precise.
+ * Updated debian/patches/gnomeradio-alsamixer.patch: Make presets list the
+ default widget when open settings dialog. Presets are the most common
+ settings for users than devices settings.
+ * Updated debian/patches/gnomeradio-about.patch: It is not safe in principle
+ to write raw UTF-8 in narrow string literals, made to be multibyte
+ encodings.
+ * debian/patches/gnomeradio-prefs.patch: Renamed to
+ debian/patches/gnomeradio-about.patch.
+ * debian/patches/gnomeradio-preferences.patch: Make sentence capitalization in
+ text and increased preferences dialog.
+
+ -- POJAR GEORGE Wed, 11 Sep 2013 15:06:44 +0000
+
+gnomeradio (1.8-2ubuntu19) saucy; urgency=low
+
+ * debian/patches/gnomeradio-auto_device.patch: Added option to auto detect
+ radio device. Automatically switch between PCI and USB radio device.
+
+ -- POJAR GEORGE Tue, 10 Sep 2013 17:10:13 +0000
+
+gnomeradio (1.8-2ubuntu18) saucy; urgency=low
+
+ * Updated debian/patches/gnomeradio-alsamixer.patch:
+ - Switch keyboard focus between radio[mixer] entry field when we need to set
+ this devices.
+ - Obstructed radio[mixer] device entry field to be empty to avoid alsa
+ buffer overrun when loopback device is enabled.
+ * Updated debian/patches/gnomeradio-alsa.patch: Fix tab indent in
+ alsa_stream.c (only code styling).
+ * Updated debian/patches/gnomeradio-station_list.patch: Use ellipsis instead
+ three dots.
+ * Updated debian/patches/gnomeradio-media_types.patch: Fix potential crash
+ when GST_MESSAGE_ERROR are passed to the application.
+ * debian/patches/gnomeradio-license.patch: Renamed to
+ debian/patches/gnomeradio-about.patch.
+ * debian/patches/gnomeradio-about.patch: Add better comments about the
+ application.
+
+ -- POJAR GEORGE Fri, 06 Sep 2013 10:54:25 +0000
+
+gnomeradio (1.8-2ubuntu17) saucy; urgency=low
+
+ * Updated debian/patches/gnomeradio-automake.patch: Link against lpthread.
+ (LP: #1218748)
+ * Updated debian/patches/gnomeradio-media_types.patch: Fix assigned value is
+ undefined.
+ * Drop docbook-to-man while docbook-to-man needs a new maintainer:
+ - debian/rules: Updated rules.
+ - debian/gnomeradio.1: Added man page written in nroff.
+ - debian/manpages: Added.
+ - debian/control: Removed Build-Depends on docbook-to-man.
+
+ -- POJAR GEORGE Fri, 30 Aug 2013 05:55:31 +0000
+
+gnomeradio (1.8-2ubuntu16) saucy; urgency=low
+
+ * debian/patches/gnomeradio-gtk_stock.patch:
+ - Drop GtkStock usage.
+ - Use g_markup_printf_escaped().
+ - Stop using GtkImageMenuItem.
+ - Set button arrow icons according to locale's text direction.
+ * Updated debian/patches/gnomeradio-media_types.patch:
+ - Fix memory leak in gst_pipeline_get_bus().
+ - Optimise queries file information.
+ * Updated debian/patches/gnomeradio-documentation.patch: Fix memory leak in
+ display_help_cb().
+ * Updated debian/patches/gnomeradio-gstreamer-1.0.patch: Improved peak level
+ message.
+ * Updated debian/patches/gnomeradio-g_list.patch: Use g_list_free_full().
+ * debian/gnomeradio.sgml: Added missing tag.
+ * Refresh patches:
+ - debian/patches/gnomeradio-alsa.patch
+ - debian/patches/gnomeradio-alsamixer.patch
+ - debian/patches/gnomeradio-build.patch
+ - debian/patches/gnomeradio-function.patch
+ - debian/patches/gnomeradio-g_thread_init_deprecation.patch
+ - debian/patches/gnomeradio-gtk_grid.patch
+ - debian/patches/gnomeradio-keyboard_shortcuts.patch
+ - debian/patches/gnomeradio-license.patch
+ - debian/patches/gnomeradio-ngettext.patch
+ - debian/patches/gnomeradio-non_modal.patch
+ - debian/patches/gnomeradio-record_information.patch
+ - debian/patches/gnomeradio-save_the_world.patch
+ - debian/patches/gnomeradio-set_pulse_role.patch
+ - debian/patches/gnomeradio-thread_safe.patch
+
+ -- POJAR GEORGE Thu, 11 Jul 2013 07:37:28 +0000
+
+gnomeradio (1.8-2ubuntu15) saucy; urgency=low
+
+ * Modified debian/patches/gnomeradio-alsa.patch: Added command line option to
+ disable loopback digital audio from radio device.
+ * Modified debian/patches/gnomeradio-media_types.patch: Use
+ g_return_val_if_fail().
+ * debian/gnomeradio.sgml: Updated man page.
+ * Refresh patches:
+ - debian/patches/gnomeradio-alsamixer.patch
+ - debian/patches/gnomeradio-media_types.patch
+ - debian/patches/gnomeradio-save_the_world.patch
+
+ -- POJAR GEORGE Sat, 05 Jul 2013 15:14:16 +0000
+
+gnomeradio (1.8-2ubuntu14) saucy; urgency=low
+
+ * debian/patches/gnomeradio-thread_safe.patch: Replace strtok() with
+ strtok_r(), readdir() with readdir_r() and localtime() with localtime_r()
+ for thread safe.
+ * Improved mixer error message in debian/patches/gnomeradio-alsamixer.patch.
+ * Moved changes applied to src/record.c from gnomeradio-media_types.patch to
+ gnomeradio-record_information.patch.
+ - Improved error message when getting information for file.
+ * debian/{control, rules}: Enable PIE hardening.
+ * Refresh patches:
+ - debian/patches/gnomeradio-gstreamer-1.0.patch
+ - debian/patches/gnomeradio-keyboard_shortcuts.patch
+ - debian/patches/gnomeradio-non_modal.patch
+
+ -- POJAR GEORGE Sat, 15 Jun 2013 15:14:16 +0000
+
+gnomeradio (1.8-2ubuntu13) saucy; urgency=low
+
+ * debian/patches/gnomeradio-automake.patch:
+ - Fix build with Automake 1.13.
+ - Use po/LINGUAS file.
+ * debian/patches/gnomeradio-g_list.patch:
+ - Don't use g_list_length() when testing for an empty list. This function
+ needlessly iterate through the entire list.
+ - Use g_list_prepend()/g_list_reverse() in a loop. More efficient than using
+ g_list_append(), which must traverse the whole list.
+ * Modified debian/patches/gnomeradio-alsa.patch:
+ - Fix memory leak in bus_type get_bus().
+ - Fix invalid printf() format.
+ * Modified debian/patches/gnomeradio-grid.patch and next patches:
+ - Use gtk_widget_set_[hv]align() instead of gtk_misc_set_alignment().
+ - Set the minimum content height instead of using gtk_widget_size_request()
+ on the parent scrolled window.
+ * Modified debian/patches/gnomeradio-record_information.patch:
+ - Set 'Details' as argument of the expander label.
+ - Removed redundant expander callback function.
+ - Pass NULL to gtk_label_new() arguments that call gtk_label_set_text()
+ function.
+ * Refresh patches:
+ - debian/patches/gnomeradio-alsamixer.patch
+ - debian/patches/gnomeradio-keyboard_shortcuts.patch
+ - debian/patches/gnomeradio-media_types.patch
+ - debian/patches/gnomeradio-non_modal.patch
+ - debian/patches/gnomeradio-presets.patch
+ - debian/patches/gnomeradio-station_list.patch
+
+ -- POJAR GEORGE Tue, 11 Jun 2013 10:37:16 +0000
+
+gnomeradio (1.8-2ubuntu12) saucy; urgency=low
+
+ * debian/gnomeradio-save_the_world: Use g_timeout_add_seconds instead
+ g_timeout_add.
+ * Modified debian/patches/gnomeradio-media_types.patch: Don't start recording
+ and show error dialog if we don't have write permission to selected location
+ or else missing multimedia plugin.
+ * Modified debian/patches/gnomeradio-prefs.patch: Fix
+ gtk_file_chooser_get_filename() return null.
+ * Modified debian/patches/gnomeradio-record_information.patch: Don't use
+ gtk_image_new_from_pixbuf to avoid memory leak.
+
+ -- POJAR GEORGE Wed, 29 May 2013 16:24:49 +0000
+
+gnomeradio (1.8-2ubuntu11) saucy; urgency=low
+
+ * Modified debian/patches/gnomeradio-media_types.patch: Fixed crashed with
+ SIGSEGV in fprintf(). (LP: #1183470)
+ * Modified gnomeradio-license.patch:
+ - Rewrite About() to display only the essential information.
+ - Run gtk-update-icon-cache in uninstall-hook.
+ * Modified gnomeradio-station_list.patch: Added missing ellipsis for some
+ buttons in Preferences menu.
+ * Added full path of icon in debian/menu.
+
+ -- POJAR GEORGE Fri, 24 May 2013 01:42:00 +0300
+
+gnomeradio (1.8-2ubuntu10) saucy; urgency=low
+
+ * Updated debian/patches/gnomeradio.desktop.patch: Set Name to Gnomeradio in
+ desktop file. (LP: #1082423)
+
+ -- POJAR GEORGE Thu, 11 Apr 2013 20:20:02 +0000
+
+gnomeradio (1.8-2ubuntu9) raring; urgency=low
+
+ * debian/gnomeradio.sgml: Updated man pages to reflect reality.
+
+ -- POJAR GEORGE Thu, 28 Mar 2013 12:27:27 +0000
+
+gnomeradio (1.8-2ubuntu8) raring; urgency=low
+
+ * debian/patches/gnomeradio-alsa.patch: Added support for looping back audio
+ through alsa devices. (LP: #1154029)
+ * debian/patches/gnomeradio-alsamixer.patch: Added support to use the ALSA
+ mixer APIs. (LP: #613809)
+ * debian/patches/gnomeradio-media_profile.patch: Replaced GnomeMediaProfile
+ with GstEncodingProfile. (LP: #1154028)
+ * debian/patches/gnomeradio-documentation.patch: Use new documentation
+ infrastructure. (LP: #1091476)
+ * debian/rules: Removed obsolete --disable-scrollkeeper configure flag.
+ * debian/control: Build-Depends: added libasound2-dev, yelp-tools, removed
+ libgnome-media-profiles-dev, gnome-doc-utils, scrollkeeper.
+
+ -- POJAR GEORGE Sun, 03 Mar 2013 10:18:52 +0000
+
+gnomeradio (1.8-2ubuntu7) raring; urgency=low
+
+ * debian/patches/gnomeradio-device.patch: Don't stop radio twice to avoid
+ double free or corruption. (LP: #1110660)
+ * debian/control: Updated to Standards-Version 3.9.4, no changes needed
+
+ -- POJAR GEORGE Thu, 21 Feb 2013 16:49:57 +0000
+
+gnomeradio (1.8-2ubuntu6) raring; urgency=low
+
+ * debian/patches/gnomeradio-build.patch: Fix build in amd64, due to casting
+ gpointers to (gint). Now we use the GPOINTER_TO_INT macro wherever it's
+ needed.
+ * debian/patches/gnomeradio-set_pulse_role.patch: Set the pulse media role.
+ (LP: #1079573)
+ * debian/patches/gnomeradio-eos_message.patch: Send EOS before we stop
+ recording. (LP: #1079625)
+ * debian/patches/gnomeradio-presets.patch: Added option for sorting preset
+ stations with up or down arrow buttons. (LP: #1082274)
+ * debian/patches/gnomeradio-station_list.patch: Added option to export/import
+ list of preset stations to/from xml file. (LP: #69791)
+ * debian/patches/gnomeradio-gstreamer-1.0.patch: Port to GStreamer 1.0 API.
+ (LP: #1085118)
+ * Update debian/patches/gnomeradio-record_information: Get information about
+ audio profile.
+ * debian/control: Build-Depends: libgstreamer1.0-dev,
+ libgstreamer-plugins-base1.0-dev, libxml2-dev.
+
+ -- POJAR GEORGE Fri, 16 Nov 2012 07:16:10 +0000
+
+gnomeradio (1.8-2ubuntu5) quantal; urgency=low
+
+ * Updated debian/patches/gnomeradio-gtk_grid.patch: Redesigned
+ "Gnomeradio Settings" dialog to become more productive.
+ * Updated debian/patches/gnomeradio-record_information.patch: Fix information
+ in message dialog.
+ * Updated debian/patches/gnomeradio-keyboard_shortcuts.patch: Group function
+ "key_press_event" in gui.c.
+ * debian/patches/gnomeradio-non_modal.patch: Set "Gnomeradio recording status"
+ dialog to non-modal to enable interaction with volume control in main
+ window. (LP: #1029472)
+
+ -- POJAR GEORGE Tue, 24 Jul 2012 20:33:09 +0000
+
+gnomeradio (1.8-2ubuntu4) quantal; urgency=low
+
+ * debian/patches/gnomeradio-keyboard_shortcuts.patch: Added a new keyboard
+ shortcut 's' to stop recording. (LP: #1026417)
+ * debian/patches/gnomeradio-keycode_mapping.patch: Use current keycode mapping
+ in default lirc keyname.
+
+ -- POJAR GEORGE Thu, 19 Jul 2012 01:18:31 +0000
+
+gnomeradio (1.8-2ubuntu3) quantal; urgency=low
+
+ * debian/patches/gnomeradio-g_thread_init_deprecation.patch: Fix obsolete
+ g_thread_init(). (LP: #1013383)
+ * debian/patches/gnomeradio-gtk_grid.patch: Port to GtkGrid from deprecated
+ GtkTable. (LP: #1018398)
+ * gnomeradio-record_information.patch: Redesigned
+ 'Gnomeradio recording status' window to show more recording information.
+ (LP: #1019981)
+
+ -- POJAR GEORGE Mon, 02 Jul 2012 20:54:09 +0000
+
+gnomeradio (1.8-2ubuntu2) quantal; urgency=low
+
+ * debian/patches/gnomeradio-ngettext.patch: Adds ngettext support for messages
+ strings. (LP: #980633)
+ * debian/patches/gnomeradio-help.patch: Fixed frecquency value step in manual
+ chapter "Usage/Frequency". (LP: #980652)
+ * debian/patches/gnomeradio-prefs.patch: Switched from a GtkButton to a
+ GtkFileChooserButton, instead of fidling around with the dialog.
+ * debian/patches/gnomeradio-function.patch: Added a new function, so that
+ lirc.c doesn't touch the internals of gui.c anymore.
+ * debian/patches/gnomeradio-license.patch: Added license dialog and website
+ label to "About Gnomeradio" dialog. (LP: #997473)
+ * debian/patches/gnomeradio-record.patch: Changed audio source from osssrc to
+ autoaudiosrc that automatically detects an appropriate audio source to use.
+ (LP: #1004761)
+ * Updated debian/patches/gnomeradio-v4l2.patch to fix the tooltip typo, use
+ "dev/radio0" (the official name of the radio device). (LP: #1005127)
+ * debian/gnomeradio.sgml: Fixed ending tag mismatch.
+ * Switch to debhelper compat level v8.
+
+ -- POJAR GEORGE Tue, 12 Jun 2012 11:44:06 -0400
+
+gnomeradio (1.8-2ubuntu1) precise; urgency=low
+
+ * debian/patches/gnomeradio-volume_button.patch: replace BaconVolumeButton
+ with GtkVolumeButton (LP: #957867)
+ * debian/patches/gnomeradio-gtk3.patch: resolve build warnings about is used
+ deprecated GTK 3 API (LP: #954993)
+ * debian/patches/gnomeradio-draw_signal.patch: fixed problems with GTK 3
+ events and signals (LP: #955462)
+ * debian/patches/gnomeradio-gstreamer.patch: use standard gstreamer functions
+ to parse a description
+ * debian/patches/gnomeradio-v4l2.patch: changed defaults autodetection driver
+ for using v4l2 (LP: #958030)
+ * debian/patches/gnomeradio-lirc.patch: add a lirc command "toggle visible"
+ * debian/control: update to starndards-version 3.9.3, changes needed
+ + modify Maintainer value to match the Debian Maintainer Field specification
+ + moved project homepage field from description to new location.
+ + add suggests field: lirc-x
+
+ -- POJAR GEORGE Mon, 19 Mar 2012 08:17:36 +0100
+
gnomeradio (1.8-2) unstable; urgency=low
[ Michael Biebl ]
diff -pruN 1.8-2/debian/compat 1.8-2ubuntu32/debian/compat
--- 1.8-2/debian/compat 2011-10-28 19:37:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/compat 2015-04-13 18:42:54.000000000 +0000
@@ -1 +1 @@
-5
+9
diff -pruN 1.8-2/debian/control 1.8-2ubuntu32/debian/control
--- 1.8-2/debian/control 2011-11-15 16:57:38.000000000 +0000
+++ 1.8-2ubuntu32/debian/control 2015-04-13 18:43:38.000000000 +0000
@@ -1,16 +1,34 @@
Source: gnomeradio
Section: sound
Priority: optional
-Maintainer: Francesco Namuri
-Build-Depends: debhelper (>= 5), liblircclient-dev, cdbs, libxml-sax-expat-perl, scrollkeeper, docbook-to-man, libgnome-media-profiles-dev, libgstreamer0.10-dev, libgstreamer-plugins-base0.10-dev, gnome-doc-utils, imagemagick, libv4l-dev, libgtk-3-dev, libdbus-glib-1-dev, libgconf2-dev, dh-autoreconf, intltool
-Standards-Version: 3.9.2
-Homepage: http://www.wh-hms.uni-ulm.de/~mfcn/gnomeradio
+Maintainer: Ubuntu Developers
+XSBC-Original-Maintainer: Francesco Namuri
+Build-Depends:
+ debhelper (>=9),
+ dpkg-dev (>= 1.16.1~),
+ liblircclient-dev,
+ cdbs,
+ libxml-sax-expat-perl,
+ libgstreamer1.0-dev,
+ libgstreamer-plugins-base1.0-dev,
+ libxml2-dev,
+ yelp-tools,
+ libv4l-dev,
+ libgtk-3-dev,
+ libasound2-dev,
+ dh-autoreconf,
+ intltool
+Standards-Version: 3.9.6
+Homepage: http://projects.gnome.org/gnomeradio/
Package: gnomeradio
Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Description: FM-radio tuner for the GNOME desktop
- Gnomeradio is a FM-radio tuner for the GNOME desktop.
- It should work with every FM tuner card that is supported by video4linux.
- Remote controls are supported via (optional) LIRC-support.
- Gnomeradio can also record radio as a Wave, MP3 or Ogg files.
+Depends:
+ ${shlibs:Depends},
+ ${misc:Depends}
+Suggests: lirc-x
+Description: Listen to FM radio
+ Gnomeradio is a FM radio tuner for the GNOME desktop. It should work with
+ every FM tuner card that is supported by video4linux. Remote controls are
+ supported via (optional) LIRC support. Gnomeradio can also record radio using
+ GStreamer backend.
diff -pruN 1.8-2/debian/gnomeradio.1 1.8-2ubuntu32/debian/gnomeradio.1
--- 1.8-2/debian/gnomeradio.1 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/gnomeradio.1 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,60 @@
+.\" (C) Copyright 2013 POJAR GEORGE ,
+.\"
+.\" This is free software; you may redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as
+.\" published by the Free Software Foundation; either version 2,
+.\" or (at your option) any later version.
+.\"
+.\" This is distributed in the hope that it will be useful, but
+.\" WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+.\" GNU General Public License for more details.
+.\"
+.\"You should have received a copy of the GNU General Public License along
+.\"with this program; if not, write to the Free Software Foundation, Inc.,
+.\"51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+.TH gnomeradio 1 "2013\-08\-25" "GNOME"
+.SH NAME
+gnomeradio \- Listen to FM radio
+.SH SYNOPSIS
+.B gnomeradio
+.RI [ OPTION... ]
+.SH DESCRIPTION
+.B gnomeradio
+is a FM radio tuner for the GNOME desktop. It should work with
+every FM tuner card that is supported by video4linux. Remote controls are
+supported via (optional) LIRC support. Gnomeradio can also record radio using
+GStreamer backend.
+.SH OPTIONS
+.TP
+.B \-?, \-h, \-\-help
+Show the application's help
+.TP
+.B \-\-version
+Show the application's version
+.TP
+.B \-\-scan
+Scan for available stations
+.P
+The following command options related to audio loopback mode.
+The audio loopback mode is required when radio card is not connected
+to the sound card via a cable. In this case, Gnomeradio needs to map
+the audio from the internal digital capture out to sound card.
+.TP
+.B \-\-alsa-loopback
+Enable audio loopback mode
+.TP
+.B -\-alsa-capture=DEVICE
+Set an capture device for audio loopback mode
+.TP
+.B \-\-alsa-playback=DEVICE
+Set an playback device for audio loopback mode
+.TP
+.B \-\-alsa-latency=TIME
+Set a latency for audio loopback mode in ms
+.TP
+.B \-\-alsa-debug
+Show the debug output for audio loopback mode
+.SH AUTHOR
+This manual page was written by POJAR GEORGE ,
+for the Debian system (but may be used by others).
diff -pruN 1.8-2/debian/gnomeradio.install 1.8-2ubuntu32/debian/gnomeradio.install
--- 1.8-2/debian/gnomeradio.install 2011-10-28 19:37:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/gnomeradio.install 2015-04-13 18:42:54.000000000 +0000
@@ -1 +1 @@
-gnomeradio.xpm usr/share/pixmaps/
+debian/gnomeradio.xpm usr/share/pixmaps/
diff -pruN 1.8-2/debian/gnomeradio.sgml 1.8-2ubuntu32/debian/gnomeradio.sgml
--- 1.8-2/debian/gnomeradio.sgml 2011-10-28 19:37:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/gnomeradio.sgml 1970-01-01 00:00:00.000000000 +0000
@@ -1,123 +0,0 @@
-
- Moritz">
- Breit">
-
- 2005-08-03">
-
- 1">
- mail@mobr.de">
-
- GNOMERADIO">
-
-
- Ubuntu">
- GNU">
- GPL">
-]>
-
-
-
-
- &dhemail;
-
-
- &dhfirstname;
- &dhsurname;
-
-
- 2005
- &dhusername;
-
- &dhdate;
-
-
- &dhucpackage;
-
- &dhsection;
-
-
- &dhpackage;
-
- FM-radio tuner for the GNOME desktop
-
-
-
- &dhpackage;
- --help
-
-
-
- DESCRIPTION
-
- This manual page documents briefly the
- &dhpackage; command.
-
- This manual page was written for the &debian; distribution
- because the original program does not have a manual page.
-
- &dhpackage; is a FM-radio tuner for
- the GNOME desktop (version 1 and 2).
- It should work with every FM tuner card that is supported by
- video4linux.
- Remote controls are supported via (optional) LIRC-support.
- Gnomeradio can also record radio as a Wave, MP3 or Ogg files.
-
-
-
-
- OPTIONS
-
- These programs follow the usual &gnu; command line syntax,
- with long options starting with two dashes (`-').
- It has only the standard gtk command line parameters which
- the help option will show you.
-
-
-
- -?
- --help
-
-
- Show summary of options.
-
-
-
-
-
- AUTHOR
-
- This manual page was written by &dhusername; &dhemail; for
- the &debian; system (but may be used by others). Permission is
- granted to copy, distribute and/or modify this document under
- the terms of the &gnu; General Public License, Version 2 any
- later version published by the Free Software Foundation.
-
-
- On Debian systems, the complete text of the GNU General Public
- License can be found in /usr/share/common-licenses/GPL.
-
-
-
-
-
-
-
-
diff -pruN 1.8-2/debian/gnomeradio.xpm 1.8-2ubuntu32/debian/gnomeradio.xpm
--- 1.8-2/debian/gnomeradio.xpm 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/gnomeradio.xpm 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,190 @@
+/* XPM */
+static char *gnomeradio[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 152 2 ",
+" c #840000",
+". c #8D0000",
+"X c #9D0000",
+"o c #960E0E",
+"O c #990F0F",
+"+ c #971111",
+"@ c #991212",
+"# c #A50101",
+"$ c #A90303",
+"% c #AA0A0A",
+"& c #BE0303",
+"* c #B60909",
+"= c #AD1010",
+"- c #AF1818",
+"; c #B31616",
+": c #B21C1C",
+"> c #9E3332",
+", c #B72424",
+"< c #BA2424",
+"1 c #B32929",
+"2 c #BB2B2B",
+"3 c #BA3333",
+"4 c #C10404",
+"5 c #C20A0A",
+"6 c #CB0C0C",
+"7 c #C51717",
+"8 c #CE1414",
+"9 c #C51C1C",
+"0 c #CC1A1A",
+"q c #D41313",
+"w c #D81717",
+"e c #D51B1B",
+"r c #DD1B1B",
+"t c #E01E1E",
+"y c #C22B2B",
+"u c #CA2828",
+"i c #D62020",
+"p c #DC2222",
+"a c #DB2D2D",
+"s c #C43535",
+"d c #CB3434",
+"f c #C53D3D",
+"g c #CD3B3B",
+"h c #D23636",
+"j c #DC3232",
+"k c #D23C3C",
+"l c #DB3838",
+"z c #E42121",
+"x c #E92626",
+"c c #E42B2B",
+"v c #EB2E2E",
+"b c #EC3131",
+"n c #E43E3E",
+"m c #ED3D3D",
+"M c #C35603",
+"N c #CC5F0C",
+"B c #925854",
+"V c #C44444",
+"C c #CB4242",
+"Z c #CF4F4F",
+"A c #D04747",
+"S c #DC4545",
+"D c #D54E4E",
+"F c #DE4F4F",
+"G c #CD5252",
+"H c #D35454",
+"J c #D95050",
+"K c #DD5E5E",
+"L c #E64343",
+"P c #EE4242",
+"I c #E24B4B",
+"U c #EF4B4B",
+"Y c #E25454",
+"T c #EE5454",
+"R c #E55959",
+"E c #EB5A5A",
+"W c #C86B6A",
+"Q c #D66464",
+"! c #DB6464",
+"~ c #DA6B6B",
+"^ c #D77272",
+"/ c #DE7272",
+"( c #E16565",
+") c #E36E6E",
+"_ c #EB6969",
+"` c #F16464",
+"' c #F26C6C",
+"] c #E37171",
+"[ c #EC7272",
+"{ c #E27878",
+"} c #EA7B7B",
+"| c #F27272",
+" . c #F37D7D",
+".. c #C59E01",
+"X. c #C4A000",
+"o. c #D6C004",
+"O. c #DCC610",
+"+. c #E2CC1A",
+"@. c #DEC921",
+"#. c #E8D328",
+"$. c #EDD932",
+"%. c #EDDD5C",
+"&. c #F4E040",
+"*. c #F7E249",
+"=. c #F9E64A",
+"-. c #FCE94F",
+";. c #FDED6D",
+":. c #F6E97D",
+">. c #8F8B86",
+",. c #8D8F8A",
+"<. c #998E8A",
+"1. c #8E908B",
+"2. c #98918D",
+"3. c #999490",
+"4. c #B48783",
+"5. c #B98784",
+"6. c #BC9794",
+"7. c #B9BAB6",
+"8. c #BABBB8",
+"9. c #C0928F",
+"0. c #C29391",
+"q. c #CD9D9C",
+"w. c #E98B8B",
+"e. c #F48383",
+"r. c #F48B8B",
+"t. c #E69696",
+"y. c #EA9090",
+"u. c #E99C9C",
+"i. c #F69595",
+"p. c #F59B9B",
+"a. c #F6A4A4",
+"s. c #F9A6A6",
+"d. c #F5A9A9",
+"f. c #F9ACAC",
+"g. c #F9B4B4",
+"h. c #F7BEBE",
+"j. c #FABDBD",
+"k. c #F8EC8E",
+"l. c #F2E891",
+"z. c #FBF09F",
+"x. c #C2C2BF",
+"c. c #F3EBAF",
+"v. c #C5C6C2",
+"b. c #CCCCC9",
+"n. c #FAC3C3",
+"m. c #FBCCCC",
+"M. c #FBD3D3",
+"N. c #FCDADA",
+"B. c #FAF6DA",
+"V. c #FDFADD",
+"C. c gray100",
+"Z. c None",
+/* pixels */
+"Z.Z.Z.Z.Z.Z.Z.,.,.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.,.,.Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.,.b.b.,.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.,.b.b.,.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.,.v.v.,.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.1.v.v.,.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.Z.,.1.8.1.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.1.8.,.1.Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.Z.Z.Z.,.v.1.Z.Z.Z.Z.Z.Z.Z.Z.Z.1.v.1.Z.Z.Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.1.v.,.Z.Z.Z.Z.Z.Z.Z.1.v.1.Z.Z.Z.Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.1.v.1.Z.Z.Z.Z.Z.1.v.1.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.1.v.>.> # > 1.v.1.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.B >.8.2.n.2.8.>.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.$ % $ # # # $ q.3.6.e.5.<.W $ # # # % $ Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.% : Q t.h.m.m.m.= ) d.a.p.e.' l = m.m.n.u.^ 3 % Z.Z.Z.Z.",
+"Z.Z.Z.% V n.j.g.f.s.s.s./ : % $ # % % ; ~ i.i.p.a.f.j.G $ Z.Z.Z.",
+"Z.Z.% G h.d.f.n.M.N.N.N.M.M.M.M.m.m.m.m.n.n.n.g.s.i.r.f.Q $ Z.Z.",
+"Z.Z.- g.a.m.j.g.a.p.i.i.r.( D g g D ! r.i.r.i.i.p.a.d. .a., Z.Z.",
+"Z.% ! d.n.a.r.r.r.e.r.[ g s 3 3 3 3 s d _ e.e.e. . .r.p.r.] $ Z.",
+"Z.$ d.n.r.e. . . . .[ d [ r.r.r.e.r.r.[ h _ | | | | ' .i.p.% Z.",
+"Z.C g.r.' ' ' ' ' | k 2 1 1 1 1 1 1 1 1 2 k | ` ` ` ` ` | i.A Z.",
+"$ ) g.U U U U U T U 7 E ' ' ' ' | | | ' _ u | E T T T T T e.K $ ",
+"$ y. .P P P P m m m & $ # # # # # # # $ $ 5 ` m P P P P P ' [ $ ",
+"$ p.` b b b b v v v 6 a U U U U U U U U a 8 T x x x x x x n [ $ ",
+"$ d.n x v x x x x x t 4 $ # # # # # # $ & I L z z z z z t c e.# ",
+"# d.v z z z x t t x t w 4 0 a n n j 0 & l T r t r r r r r z } # ",
+"$ w.L t p t t r t r t t p 8 5 4 & 6 0 R I p w w w w q w q j K # ",
+"# ! R r p R _ I r w w w w p j S Y J I j q q i F ( F e q q S C # ",
+"Z.C { w Y d O @ y q N ....X...X.X.X.X.....N F s O @ y 6 6 K < Z.",
+"Z.# / S ( o q.0.@ 6 ..*.-.-.&.#.O.@.%.k.z...! O q.0.+ 6 h H $ Z.",
+"Z.Z.; { J + 0.4.+ 6 X.-.-.=.$.+.o.+.$.=.C...g O 0.4.o 7 ! % Z.Z.",
+"Z.Z.# y / G @ o * 4 ..=.;.:.l.c.B.C.C.C.V...5 , + o s Q , # Z.Z.",
+"Z.Z.Z.# % H H d 9 5 M X.X.X.X.X.X.X.X.X...M & 9 d H Z % # Z.Z.Z.",
+"Z.Z.Z.Z.. # , f G Q ! ~ ~ ^ ~ ! ~ ~ ~ ~ ^ ! ~ G f , # Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.Z.X # # # # # # # # # # # # # # # # X Z.Z.Z.Z.Z.Z.Z.",
+"Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z."
+};
diff -pruN 1.8-2/debian/manpages 1.8-2ubuntu32/debian/manpages
--- 1.8-2/debian/manpages 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/manpages 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1 @@
+debian/gnomeradio.1
diff -pruN 1.8-2/debian/menu 1.8-2ubuntu32/debian/menu
--- 1.8-2/debian/menu 2011-10-28 19:37:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/menu 2015-04-13 18:42:54.000000000 +0000
@@ -1,3 +1,3 @@
?package(gnomeradio):needs="X11" section="Applications/TV and Radio"\
- icon="gnomeradio.xpm" title="Gnomeradio"\
- longtitle="Gnomeradio FM-Radio tuner for the GNOME desktop" command="/usr/bin/gnomeradio"
+ icon="/usr/share/pixmaps/gnomeradio.xpm" title="Gnomeradio"\
+ command="/usr/bin/gnomeradio"
diff -pruN 1.8-2/debian/patches/fix_gnome_radio_gui.patch 1.8-2ubuntu32/debian/patches/fix_gnome_radio_gui.patch
--- 1.8-2/debian/patches/fix_gnome_radio_gui.patch 2011-11-13 15:46:26.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/fix_gnome_radio_gui.patch 2015-04-13 18:42:54.000000000 +0000
@@ -1,7 +1,7 @@
-Index: gnomeradio-1.8/src/gui.c
+Index: b/src/gui.c
===================================================================
---- gnomeradio-1.8.orig/src/gui.c 2011-11-13 16:45:54.829031323 +0100
-+++ gnomeradio-1.8/src/gui.c 2011-11-13 16:46:24.405032055 +0100
+--- a/src/gui.c 2012-12-03 10:14:53.722899843 +0000
++++ b/src/gui.c 2012-12-03 10:14:54.042899833 +0000
@@ -1051,6 +1051,7 @@
gtk_widget_set_tooltip_text(vol_scale, text);
g_free(text);*/
diff -pruN 1.8-2/debian/patches/gnomeradio-1.8-nogtk2.patch 1.8-2ubuntu32/debian/patches/gnomeradio-1.8-nogtk2.patch
--- 1.8-2/debian/patches/gnomeradio-1.8-nogtk2.patch 2011-11-13 15:46:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-1.8-nogtk2.patch 2015-04-13 18:42:54.000000000 +0000
@@ -1,7 +1,7 @@
-Index: gnomeradio-1.8/src/bacon-volume.c
+Index: b/src/bacon-volume.c
===================================================================
---- gnomeradio-1.8.orig/src/bacon-volume.c 2011-11-13 16:45:00.457029980 +0100
-+++ gnomeradio-1.8/src/bacon-volume.c 2011-11-13 16:45:00.829029990 +0100
+--- a/src/bacon-volume.c 2012-12-03 10:14:53.474899850 +0000
++++ b/src/bacon-volume.c 2012-12-03 10:14:53.722899843 +0000
@@ -520,7 +520,7 @@
float step)
{
@@ -11,10 +11,10 @@ Index: gnomeradio-1.8/src/bacon-volume.c
adj = gtk_adjustment_new (min, min, max, step, 10 * step, 0);
gtk_range_set_adjustment (GTK_RANGE (scale), GTK_ADJUSTMENT (adj));
-Index: gnomeradio-1.8/src/bacon-volume.h
+Index: b/src/bacon-volume.h
===================================================================
---- gnomeradio-1.8.orig/src/bacon-volume.h 2011-11-13 16:42:56.000000000 +0100
-+++ gnomeradio-1.8/src/bacon-volume.h 2011-11-13 16:45:00.829029990 +0100
+--- a/src/bacon-volume.h 2012-12-03 10:14:49.950899955 +0000
++++ b/src/bacon-volume.h 2012-12-03 10:14:53.722899843 +0000
@@ -20,8 +20,7 @@
#ifndef __BACON_VOLUME_BUTTON_H__
#define __BACON_VOLUME_BUTTON_H__
@@ -25,10 +25,10 @@ Index: gnomeradio-1.8/src/bacon-volume.h
G_BEGIN_DECLS
-Index: gnomeradio-1.8/src/gui.c
+Index: b/src/gui.c
===================================================================
---- gnomeradio-1.8.orig/src/gui.c 2011-11-13 16:45:00.461029981 +0100
-+++ gnomeradio-1.8/src/gui.c 2011-11-13 16:45:54.829031323 +0100
+--- a/src/gui.c 2012-12-03 10:14:53.474899850 +0000
++++ b/src/gui.c 2012-12-03 10:14:53.722899843 +0000
@@ -21,9 +21,11 @@
/*** the gui to gnomeradio */
@@ -713,10 +713,10 @@ Index: gnomeradio-1.8/src/gui.c
static void show_message(GtkMessageType type, const char* text, const char* details)
{
GtkWidget *dialog;
-Index: gnomeradio-1.8/src/lirc.c
+Index: b/src/lirc.c
===================================================================
---- gnomeradio-1.8.orig/src/lirc.c 2011-11-13 16:42:56.000000000 +0100
-+++ gnomeradio-1.8/src/lirc.c 2011-11-13 16:45:00.833029989 +0100
+--- a/src/lirc.c 2012-12-03 10:14:49.950899955 +0000
++++ b/src/lirc.c 2012-12-03 10:14:53.722899843 +0000
@@ -20,7 +20,8 @@
#include
@@ -749,10 +749,10 @@ Index: gnomeradio-1.8/src/lirc.c
}
else if (strcasecmp (cmd, "quit") == 0)
{
-Index: gnomeradio-1.8/src/prefs.c
+Index: b/src/prefs.c
===================================================================
---- gnomeradio-1.8.orig/src/prefs.c 2011-11-13 16:45:00.461029981 +0100
-+++ gnomeradio-1.8/src/prefs.c 2011-11-13 16:45:00.833029989 +0100
+--- a/src/prefs.c 2012-12-03 10:14:53.478899850 +0000
++++ b/src/prefs.c 2012-12-03 10:14:53.722899843 +0000
@@ -15,6 +15,7 @@
*/
@@ -920,10 +920,10 @@ Index: gnomeradio-1.8/src/prefs.c
gtk_box_pack_start(GTK_BOX(rbox), record_table, TRUE, TRUE, 0);
-Index: gnomeradio-1.8/src/prefs.h
+Index: b/src/prefs.h
===================================================================
---- gnomeradio-1.8.orig/src/prefs.h 2011-11-13 16:42:56.000000000 +0100
-+++ gnomeradio-1.8/src/prefs.h 2011-11-13 16:45:00.833029989 +0100
+--- a/src/prefs.h 2012-12-03 10:14:49.950899955 +0000
++++ b/src/prefs.h 2012-12-03 10:14:53.722899843 +0000
@@ -18,7 +18,6 @@
#define _PREFS_H
@@ -932,10 +932,10 @@ Index: gnomeradio-1.8/src/prefs.h
gboolean save_settings(void);
gboolean load_settings(void);
-Index: gnomeradio-1.8/src/record.c
+Index: b/src/record.c
===================================================================
---- gnomeradio-1.8.orig/src/record.c 2011-11-13 16:45:00.461029981 +0100
-+++ gnomeradio-1.8/src/record.c 2011-11-13 16:45:00.833029989 +0100
+--- a/src/record.c 2012-12-03 10:14:53.478899850 +0000
++++ b/src/record.c 2012-12-03 10:14:53.722899843 +0000
@@ -24,7 +24,8 @@
#include
@@ -975,10 +975,10 @@ Index: gnomeradio-1.8/src/record.c
gtk_window_set_modal(GTK_WINDOW(status_dialog), TRUE);
-Index: gnomeradio-1.8/src/record.h
+Index: b/src/record.h
===================================================================
---- gnomeradio-1.8.orig/src/record.h 2011-11-13 16:42:56.000000000 +0100
-+++ gnomeradio-1.8/src/record.h 2011-11-13 16:45:00.833029989 +0100
+--- a/src/record.h 2012-12-03 10:14:49.950899955 +0000
++++ b/src/record.h 2012-12-03 10:14:53.722899843 +0000
@@ -17,8 +17,6 @@
#ifndef _RECORD_H
#define _RECORD_H
@@ -988,10 +988,10 @@ Index: gnomeradio-1.8/src/record.h
void run_status_window(Recording *recording);
GtkWidget* record_status_window(Recording *recording);
-Index: gnomeradio-1.8/src/rec_tech.c
+Index: b/src/rec_tech.c
===================================================================
---- gnomeradio-1.8.orig/src/rec_tech.c 2011-11-13 16:45:00.093029972 +0100
-+++ gnomeradio-1.8/src/rec_tech.c 2011-11-13 16:45:00.833029989 +0100
+--- a/src/rec_tech.c 2012-12-03 10:14:53.266899856 +0000
++++ b/src/rec_tech.c 2012-12-03 10:14:53.722899843 +0000
@@ -16,7 +16,8 @@
@@ -1049,10 +1049,10 @@ Index: gnomeradio-1.8/src/rec_tech.c
goto error;
}
-Index: gnomeradio-1.8/src/trayicon.c
+Index: b/src/trayicon.c
===================================================================
---- gnomeradio-1.8.orig/src/trayicon.c 2011-11-13 16:45:00.461029981 +0100
-+++ gnomeradio-1.8/src/trayicon.c 2011-11-13 16:45:00.833029989 +0100
+--- a/src/trayicon.c 2012-12-03 10:14:53.478899850 +0000
++++ b/src/trayicon.c 2012-12-03 10:14:53.722899843 +0000
@@ -19,13 +19,13 @@
*/
@@ -1077,10 +1077,10 @@ Index: gnomeradio-1.8/src/trayicon.c
+ gtk_status_icon_set_tooltip_text(GTK_STATUS_ICON(tray_icon), text);
g_free(text);
}
-Index: gnomeradio-1.8/configure.in
+Index: b/configure.in
===================================================================
---- gnomeradio-1.8.orig/configure.in 2011-11-13 16:45:00.093029972 +0100
-+++ gnomeradio-1.8/configure.in 2011-11-13 16:45:00.833029989 +0100
+--- a/configure.in 2012-12-03 10:14:53.266899856 +0000
++++ b/configure.in 2012-12-03 10:14:53.722899843 +0000
@@ -23,12 +23,9 @@
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", GETTEXT_PACKAGE)
diff -pruN 1.8-2/debian/patches/gnomeradio-about.patch 1.8-2ubuntu32/debian/patches/gnomeradio-about.patch
--- 1.8-2/debian/patches/gnomeradio-about.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-about.patch 2015-04-13 18:43:38.000000000 +0000
@@ -0,0 +1,242 @@
+Description: Added license dialog and website label to "About" dialog.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/997473
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -819,43 +819,57 @@ static void mute_button_toggled_cb(GtkBu
+ }
+ */
+
++static char *get_license_text (void)
++{
++ const gchar *license[] = {
++ N_("Gnomeradio is free software; you can redistribute it and/or modify "
++ "it under the terms of the GNU General Public License as published by "
++ "the Free Software Foundation; either version 2 of the License, or "
++ "(at your option) any later version."),
++ N_("Gnomeradio is distributed in the hope that it will be useful, "
++ "but WITHOUT ANY WARRANTY; without even the implied warranty of "
++ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
++ "GNU General Public License for more details."),
++ N_("You should have received a copy of the GNU General Public License "
++ "along with Gnomeradio; if not, write to the Free Software Foundation, "
++ "Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA")
++ };
++ return g_strjoin ("\n\n",
++ _(license[0]),
++ _(license[1]),
++ _(license[2]),
++ NULL);
++}
++
+ static void about_button_clicked_cb(GtkButton *button, gpointer data)
+ {
+- GdkPixbuf *app_icon;
+- GtkIconTheme *icontheme;
+ static GtkWidget *about;
+- const char *authors[] = {"Jörgen Scheibengruber ", NULL};
+- char *text;
++ const char *authors[] = {"J\xc3\xb6rgen Scheibengruber ", NULL};
+
+ /* Feel free to put your names here translators :-) */
+ char *translators = _("TRANSLATORS");
++ char *license = get_license_text ();
+
+- if (about)
+- {
+- gtk_window_present(GTK_WINDOW(about));
++ if (about) {
++ gtk_window_present (GTK_WINDOW (about));
+ return;
+ }
+- icontheme = gtk_icon_theme_get_default();
+- app_icon = gtk_icon_theme_load_icon(icontheme, "gnomeradio", 48, 0, NULL);
+
+-#ifdef HAVE_LIRC
+- text =_("Gnomeradio is a FM-Tuner application for the GNOME desktop. "
+- "It should work with all tuner hardware that is supported by the video4linux drivers.\n\n"
+- "This version has been compiled with LIRC support.");
+-#else
+- text =_("Gnomeradio is a FM-Tuner application for the GNOME desktop. "
+- "It should work with all tuner hardware that is supported by the video4linux drivers.\n\n"
+- "This version has been compiled without LIRC support.");
+-#endif
+-
+- gtk_show_about_dialog(NULL,
+- "program-name", "Gnomeradio",
+- "version", VERSION,
+- "copyright", "Copyright 2001 - 2006 Jörgen Scheibengruber",
+- "comments", text,
+- "authors", (const char **) authors,
+- "translator-credits", strcmp("TRANSLATORS", translators) ? translators : NULL,
+- "logo", app_icon, NULL);
++ gtk_show_about_dialog (GTK_WINDOW (app),
++ "version", VERSION,
++ "copyright", _("Copyright \xc2\xa9 2001 - 2006 J\xc3\xb6rgen Scheibengruber"),
++ "comments", _("Listen to FM radio"),
++ "authors", authors,
++ "translator-credits", strcmp("TRANSLATORS", translators) ? translators : NULL,
++ "logo-icon-name", "gnomeradio",
++ "license", license,
++ "wrap-license", TRUE,
++ "website-label", _("Gnomeradio Website"),
++ "website", "http://www.gnome.org/projects/gnomeradio/",
++ NULL);
++
++ g_free (license);
++
+ /* about = gnome_about_new ("Gnomeradio", VERSION, "Copyright 2001 - 2006 Jörgen Scheibengruber",
+ text, (const char **) authors, NULL,
+ strcmp("TRANSLATORS", translators) ? translators : NULL,
+@@ -1091,7 +1105,7 @@ GtkWidget* gnome_radio_gui(void)
+ gtk_widget_set_tooltip_text(scfw_button, _("Scan Forwards"));
+ gtk_widget_set_tooltip_text(stbw_button, _("0.05 MHz Backwards"));
+ gtk_widget_set_tooltip_text(stfw_button, _("0.05 MHz Forwards"));
+- gtk_widget_set_tooltip_text(about_button, _("About Gnomeradio"));
++ gtk_widget_set_tooltip_text(about_button, _("About"));
+ gtk_widget_set_tooltip_text(rec_button, _("Record radio as Wave, OGG or MP3"));
+ gtk_widget_set_tooltip_text(prefs_button, _("Edit your Preferences"));
+ gtk_widget_set_tooltip_text(mute_button, _("Adjust the Volume"));
+Index: gnomeradio-1.8/data/icons/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/data/icons/Makefile.am
++++ gnomeradio-1.8/data/icons/Makefile.am
+@@ -1,11 +1,13 @@
+ SUBDIRS = 16x16 22x22 24x24 32x32 48x48 scalable
+
+ gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
+-install-data-hook:
++install-data-hook: update-icon-cache
++uninstall-hook: update-icon-cache
++update-icon-cache:
+ @-if test -z "$(DESTDIR)"; then \
+ echo "Updating Gtk icon cache."; \
+ $(gtk_update_icon_cache); \
+ else \
+- echo "*** Icon cache not updated. After install, run this:"; \
++ echo "*** Icon cache not updated. After (un)install, run this:"; \
+ echo "*** $(gtk_update_icon_cache)"; \
+ fi
+Index: gnomeradio-1.8/COPYING
+===================================================================
+--- gnomeradio-1.8.orig/COPYING
++++ gnomeradio-1.8/COPYING
+@@ -1,12 +1,12 @@
+- GNU GENERAL PUBLIC LICENSE
+- Version 2, June 1991
++ GNU GENERAL PUBLIC LICENSE
++ Version 2, June 1991
+
+- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+- Preamble
++ Preamble
+
+ The licenses for most software are designed to take away your
+ freedom to share and change it. By contrast, the GNU General Public
+@@ -15,7 +15,7 @@ software--to make sure the software is f
+ General Public License applies to most of the Free Software
+ Foundation's software and to any other program whose authors commit to
+ using it. (Some other Free Software Foundation software is covered by
+-the GNU Library General Public License instead.) You can apply it to
++the GNU Lesser General Public License instead.) You can apply it to
+ your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+@@ -55,8 +55,8 @@ patent must be licensed for everyone's f
+
+ The precise terms and conditions for copying, distribution and
+ modification follow.
+-
+- GNU GENERAL PUBLIC LICENSE
++
++ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+@@ -110,7 +110,7 @@ above, provided that you also meet all o
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+-
++
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the Program,
+ and can be reasonably considered independent and separate works in
+@@ -168,7 +168,7 @@ access to copy from a designated place,
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+-
++
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+@@ -225,7 +225,7 @@ impose that choice.
+
+ This section is intended to make thoroughly clear what is believed to
+ be a consequence of the rest of this License.
+-
++
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces, the
+ original copyright holder who places the Program under this License
+@@ -255,7 +255,7 @@ make exceptions for this. Our decision
+ of preserving the free status of all derivatives of our free software and
+ of promoting the sharing and reuse of software generally.
+
+- NO WARRANTY
++ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGES.
+
+- END OF TERMS AND CONDITIONS
+-
+- How to Apply These Terms to Your New Programs
++ END OF TERMS AND CONDITIONS
++
++ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+ possible use to the public, the best way to achieve this is to make it
+@@ -303,17 +303,16 @@ the "copyright" line and a pointer to wh
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+- You should have received a copy of the GNU General Public License
+- along with this program; if not, write to the Free Software
+- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+-
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ Also add information on how to contact you by electronic and paper mail.
+
+ If the program is interactive, make it output a short notice like this
+ when it starts in an interactive mode:
+
+- Gnomovision version 69, Copyright (C) year name of author
++ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+@@ -336,5 +335,6 @@ necessary. Here is a sample; alter the
+ This General Public License does not permit incorporating your program into
+ proprietary programs. If your program is a subroutine library, you may
+ consider it more useful to permit linking proprietary applications with the
+-library. If this is what you want to do, use the GNU Library General
++library. If this is what you want to do, use the GNU Lesser General
+ Public License instead of this License.
++
diff -pruN 1.8-2/debian/patches/gnomeradio-alsamixer.patch 1.8-2ubuntu32/debian/patches/gnomeradio-alsamixer.patch
--- 1.8-2/debian/patches/gnomeradio-alsamixer.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-alsamixer.patch 2015-04-13 18:43:38.000000000 +0000
@@ -0,0 +1,2048 @@
+Description: Added support to use the ALSA mixer APIs.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/613809
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/mixer.c
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/mixer.c
+@@ -0,0 +1,125 @@
++/**
++ * Copyright (C) 2002, 2003 Doug Bell
++ *
++ * Some mixer routines from mplayer, http://mplayer.sourceforge.net.
++ * Copyright (C) 2000-2002. by A'rpi/ESP-team & others
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#include "mixer.h"
++
++/**
++ * Sets the mixer device and channel.
++ */
++static int null_set_device( const char *devname )
++{
++ return 0;
++}
++
++/**
++ * Sets the initial state of the mixer device.
++ */
++static void null_set_state( int is_muted, int unmute_volume )
++{
++}
++
++/**
++ * Returns the current volume setting.
++ */
++static int null_get_volume( void )
++{
++ return 0;
++}
++
++/**
++ * Returns the volume that would be used to restore the unmute state.
++ */
++static int null_get_unmute_volume( void )
++{
++ return 0;
++}
++
++/**
++ * Tunes the relative volume.
++ */
++static void null_set_volume( int value )
++{
++}
++
++/**
++ * Sets the mute state.
++ */
++static void null_mute( int mute )
++{
++}
++
++/**
++ * Returns true if the mixer is muted.
++ */
++static int null_is_muted( void )
++{
++ return 0;
++}
++
++/**
++ * Closes the mixer device if it is open.
++ */
++static void null_close_device( void )
++{
++}
++
++/* The null device, which always works. */
++static struct mixer null_mixer = {
++ .set_device = null_set_device,
++ .set_state = null_set_state,
++ .get_volume = null_get_volume,
++ .get_unmute_volume = null_get_unmute_volume,
++ .set_volume = null_set_volume,
++ .mute = null_mute,
++ .is_muted = null_is_muted,
++ .close_device = null_close_device,
++};
++
++/* List of all available access methods.
++ * Uses weak symbols: NULL is not linked in. */
++static struct mixer *mixers[] = {
++ &alsa_mixer,
++ &oss_mixer,
++ &null_mixer /* LAST */
++};
++/* The actual access method. */
++struct mixer *mixer = &null_mixer;
++
++/**
++ * Sets the mixer device and channel.
++ * Try each access method until one succeeds.
++ */
++int mixer_set_device( const char *devname )
++{
++ int i;
++ mixer->close_device();
++ for (i = 0; i < sizeof(mixers)/sizeof(mixers[0]); i++) {
++ mixer = mixers[i];
++ if (!mixer)
++ continue;
++ if (mixer->set_device (devname) == 0)
++ break;
++ else
++ return 0;
++ }
++
++ return 1;
++}
+Index: gnomeradio-1.8/src/mixer.h
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/mixer.h
+@@ -0,0 +1,88 @@
++/**
++ * Copyright (C) 2002, 2003 Doug Bell
++ *
++ * Some mixer routines from mplayer, http://mplayer.sourceforge.net.
++ * Copyright (C) 2000-2002. by A'rpi/ESP-team & others
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#ifndef MIXER_H_INCLUDED
++#define MIXER_H_INCLUDED
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
++
++/**
++ * Sets the mixer device and channel.
++ * All interfaces are scanned until one succeeds.
++ */
++int mixer_set_device( const char *devname );
++
++struct mixer {
++/**
++ * Sets the mixer device and channel.
++ */
++int (* set_device)( const char *devname );
++
++/**
++ * Sets the initial state of the mixer device.
++ */
++void (* set_state)( int is_muted, int unmute_volume );
++
++/**
++ * Returns the current volume setting.
++ */
++int (* get_volume)( void );
++
++/**
++ * Returns the volume that would be used to restore the unmute state.
++ */
++int (* get_unmute_volume)( void );
++
++/**
++ * Tunes the relative volume.
++ */
++void (* set_volume)( int value );
++
++/**
++ * Sets the mute state.
++ */
++void (* mute)( int mute );
++
++/**
++ * Returns true if the mixer is muted.
++ */
++int (* is_muted)( void );
++
++/**
++ * Closes the mixer device if it is open.
++ */
++void (* close_device)( void );
++};
++
++#pragma weak alsa_mixer
++extern struct mixer alsa_mixer;
++#pragma weak oss_mixer
++extern struct mixer oss_mixer;
++extern struct mixer *mixer;
++
++#ifdef __cplusplus
++};
++#endif
++#endif /* MIXER_H_INCLUDED */
+Index: gnomeradio-1.8/src/tech.c
+===================================================================
+--- gnomeradio-1.8.orig/src/tech.c
++++ /dev/null
+@@ -1,171 +0,0 @@
+-/*
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- */
+-
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-
+-#include
+-
+-#include "tech.h"
+-
+-static int mixer_fd = -1, mixer_src = -1;
+-static char *devices[] = SOUND_DEVICE_NAMES;
+-
+-/*
+- * These functions handle the mixer device
+- */
+-
+-int mixer_init(char *mixer_device, char *mixer_source)
+-{
+- int i;
+-
+- mixer_src = -1;
+-
+- for (i=0;i> i)%2;
+- if (res)
+- {
+- result[o] = malloc(strlen(devices[i])+1);
+- sprintf(result[o], "%s", devices[i]);
+- o++;
+- }
+- result[o] = NULL;
+- }
+- }
+- return result;
+-}
+-
+-int mixer_set_rec_device(void)
+-{
+- int devmask, recmask;
+-
+- if (mixer_fd <= 0)
+- return 0;
+-
+- if (mixer_src < 0)
+- return 0;
+-
+- if ((ioctl(mixer_fd, SOUND_MIXER_READ_RECMASK, &devmask)) == -1)
+- return 0;
+-
+- recmask = 1 << mixer_src;
+- if (!(recmask & devmask))
+- return 0;
+-
+- if ((ioctl(mixer_fd, SOUND_MIXER_WRITE_RECSRC, &recmask)) == -1)
+- return 0;
+-
+- return 1;
+-}
+-
+-int mixer_close(void)
+-{
+- if (mixer_fd > 0)
+- close(mixer_fd);
+-
+- return 1;
+-}
+-
+-int mixer_set_volume(int volume)
+-{
+- int i_vol;
+- if (mixer_fd<0)
+- return -1;
+-
+- assert(volume <= 100);
+- assert(volume >= 0);
+-
+-
+- if (mixer_src<0)
+- return -1;
+-
+- i_vol = volume;
+- i_vol += volume << 8;
+-
+- /*printf("Setting %s to vol %i\n", devices[mixer_src], volume);*/
+- if ((ioctl(mixer_fd, MIXER_WRITE(mixer_src), &i_vol)) < 0)
+- return 0;
+-
+- return 1;
+-}
+-
+-int mixer_get_volume(void)
+-{
+- int i_vol = 0, r, l, volume;
+-
+- if (mixer_fd<0)
+- return -1;
+-
+- if (mixer_src<0)
+- return -1;
+-
+- if ((ioctl(mixer_fd, MIXER_READ(mixer_src), &i_vol)) < 0)
+- return 0;
+-
+- r = i_vol >> 8;
+- l = i_vol % (1 << 8);
+- volume = (r + l)/2;
+- /*printf("%d %d %d %d\n", r, l, volume, i_vol);*/
+-
+- assert((volume >= 0) && (volume <= 100));
+-
+- return volume;
+-}
+Index: gnomeradio-1.8/src/tech.h
+===================================================================
+--- gnomeradio-1.8.orig/src/tech.h
++++ /dev/null
+@@ -1,34 +0,0 @@
+-/*
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- */
+-
+-#ifndef _TECH_H
+-#define _TECH_H
+-
+-int mixer_init(char *mixer_device, char *mixer_source);
+-
+-char* mixer_get_sndcard_name(void);
+-
+-char** mixer_get_rec_devices(void);
+-
+-int mixer_close(void);
+-
+-int mixer_set_volume(int volume);
+-
+-int mixer_get_volume(void);
+-
+-int mixer_set_rec_device(void);
+-
+-#endif
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -30,7 +30,7 @@
+ #include
+ #include "gui.h"
+ #include "trayicon.h"
+-#include "tech.h"
++#include "mixer.h"
+ #include "radio.h"
+ #include "rec_tech.h"
+ #include "lirc.h"
+@@ -49,6 +49,8 @@
+ #define STEREO_WIDTH 35
+ #define SCAN_SPEED 20
+
++#define VOLUME_STEP 5
++
+ #define TRANSLATORS "TRANSLATORS"
+
+ /* Latency is not a big problem for radio (no video to sync with), and
+@@ -61,7 +63,7 @@ char *alsa_capture = NULL;
+ int alsa_latency = DEFAULT_LATENCY;
+ int alsa_debug = 0;
+
+-GtkWidget* mute_button, *preset_combo;
++GtkWidget* volume_button, *preset_combo;
+ GtkAdjustment *adj;
+ GtkWidget* app;
+
+@@ -78,6 +80,8 @@ static GtkWidget *rec_button;
+ static GtkWidget *prefs_button;
+
+ static int timeout_id, bp_timeout_id = -1, bp_timeout_steps = 0;
++static int volume_value_changed_id;
++static gint mode;
+
+ static DBusGProxy * connect_to_session (void);
+
+@@ -241,43 +245,116 @@ static void initial_frequency_scan(GtkWi
+ }
+ }
+ }
+-}
++}
++
++static gdouble
++get_volume (void)
++{
++ return gtk_scale_button_get_value (GTK_SCALE_BUTTON (volume_button)) * 100;
++}
++
++static void
++set_volume (gdouble volume)
++{
++ mixer->set_volume (volume);
++
++ g_signal_handler_block (G_OBJECT(volume_button), volume_value_changed_id);
++ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), volume / 100);
++ g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
++
++ if (tray_menu) {
++ g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->is_muted());
++ g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ }
++
++ if (radio_is_muted())
++ radio_unmute();
++
++ settings.unmute_volume = volume / 100;
++}
+
+-int gtk_volume_button_get_value (GtkWidget *button)
++void
++volume_up (void)
+ {
+- return (int) (gtk_scale_button_get_value(GTK_SCALE_BUTTON(button)) * 100);
++ gdouble volume;
++
++ volume = get_volume ();
++ set_volume (volume > 95 ? 100 : volume + VOLUME_STEP);
++}
++
++void
++volume_down (void)
++{
++ gdouble volume;
++
++ volume = get_volume ();
++ set_volume (volume < 5 ? 0 : volume - VOLUME_STEP);
+ }
+
+-void gtk_volume_button_set_value (GtkWidget *button, int value)
++static void
++volume_value_changed_cb (GtkVolumeButton *button, gpointer user_data)
+ {
+- gtk_scale_button_set_value(GTK_SCALE_BUTTON(button), (gdouble) value / 100);
++ set_volume (gtk_scale_button_get_value (GTK_SCALE_BUTTON (volume_button)) * 100);
++}
++
++void
++toggle_volume (void)
++{
++ gdouble volume;
++
++ if (radio_is_muted())
++ radio_unmute();
++ else
++ radio_mute();
++
++ if (mixer->is_muted()) {
++ mixer->mute(0);
++ settings.muted = FALSE;
++ } else {
++ mixer->mute(1);
++ settings.muted = TRUE;
++ }
++
++ volume = (gdouble) mixer->get_volume();
++ g_signal_handler_block (G_OBJECT(volume_button), volume_value_changed_id);
++ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), volume / 100);
++ g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
++
++ if (tray_menu) {
++ g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->is_muted());
++ g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ }
+ }
+
+ static void prefs_button_clicked_cb(GtkButton *button, gpointer app)
+ {
+ GtkWidget* dialog;
+ gint choise;
+-
++
+ dialog = prefs_window(app);
+-
++
+ /* Michael Jochum proposed to not use gnome_dialog_set_parent()
+ but following instead. */
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(app));
+ gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
+-
++
+ /*gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(app));*/
+-
++
++ action_mode (mode);
++
+ choise = GTK_RESPONSE_HELP;
+ while (choise == GTK_RESPONSE_HELP)
+ {
+- choise = gtk_dialog_run(GTK_DIALOG(dialog));
++ choise = gtk_dialog_run(GTK_DIALOG(dialog));
+ switch (choise)
+ {
+ case GTK_RESPONSE_HELP:
+ display_help_cb("gnomeradio-settings");
+ break;
+ default:
+- /* We need the hide signal to get the value of the device_entry */
++ /* We need the hide signal to get the value of the device[mixer]_entry */
+ gtk_widget_hide(dialog);
+ gtk_widget_destroy(dialog);
+ }
+@@ -286,81 +363,69 @@ static void prefs_button_clicked_cb(GtkB
+
+ void start_radio(gboolean restart, GtkWidget *app)
+ {
+- DriverType driver = DRIVER_ANY;
++ DriverType driver = DRIVER_ANY;
+ if (restart)
+ radio_stop();
+-
+- if (settings.driver) {
+- if (0 == strcmp(settings.driver, "v4l1"))
+- driver = DRIVER_V4L1;
+- if (0 == strcmp(settings.driver, "v4l2"))
+- driver = DRIVER_V4L2;
+- }
+
+- if (!radio_init(settings.device, driver))
+- {
+- char *caption = g_strdup_printf(_("Could not open device \"%s\"!"), settings.device);
+- char *detail = g_strdup_printf(_("Check your settings and make sure that no other\n"
+- "program is using %s.\nAlso make sure that you have read-access to it."), settings.device);
++ if (settings.driver) {
++ if (0 == strcmp(settings.driver, "v4l1"))
++ driver = DRIVER_V4L1;
++ if (0 == strcmp(settings.driver, "v4l2"))
++ driver = DRIVER_V4L2;
++ }
++
++ if (!radio_init(settings.device, driver)) {
++ char *caption = g_strdup_printf(_("Could not open radio device \"%s\"!"), settings.device);
++ char *detail = g_strdup_printf(_("Check your settings and make sure that no other program is using %s.\n"
++ "Also make sure that you have read access to it."), settings.device);
+ show_error_message(caption, detail);
+ g_free(caption);
+ g_free(detail);
+-
+- if (!restart)
++
++ if (!restart) {
++ mode = RADIO_DEVICE;
+ prefs_button_clicked_cb(NULL, app);
++ mode = PRESETS;
++ }
+ }
+ }
+
+ void start_mixer(gboolean restart, GtkWidget *app)
+ {
+- gint res, vol;
+-
+ if (restart)
+- mixer_close();
+-
+- res = mixer_init(settings.mixer_dev, settings.mixer);
+- if (res <1)
+- {
+- char *buffer;
+-
+- if (res == -1)
+- buffer = g_strdup_printf(_("Mixer source \"%s\" is not a valid source!"), settings.mixer);
+- else
+- buffer = g_strdup_printf(_("Could not open \"%s\"!"), settings.mixer_dev);
+-
+- show_error_message(buffer, NULL);
+-
+- g_free(buffer);
+- }
+- vol = mixer_get_volume();
+- if (vol >= 0) {
+- gtk_volume_button_set_value(mute_button, vol);
+- /*gtk_adjustment_set_value(volume, (double)vol);*/
+- }
+-}
++ mixer->close_device();
+
+-GList* get_mixer_recdev_list(void)
+-{
+- int i;
+- char **array, *dev;
+- GList *result = NULL;
+-
+- array = mixer_get_rec_devices();
+- if (!array)
+- return NULL;
+-
+- i = 0;
+- dev = array[i];
+- while (dev)
+- {
+- char *text = g_strdup(dev);
+- result = g_list_append(result, text);
+- free(dev);
+- dev = array[++i];
+- }
+- free(array);
+-
+- return result;
++ if (mixer_set_device(settings.mixer)) {
++ mixer->set_state (settings.muted, settings.unmute_volume);
++ g_signal_handler_block (G_OBJECT(volume_button), volume_value_changed_id);
++ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), settings.unmute_volume);
++ g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
++
++ if (tray_menu) {
++ g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->is_muted());
++ g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ }
++
++ gtk_widget_set_sensitive(volume_button, TRUE);
++ } else {
++ char *caption, *detail;
++
++ caption = g_strdup_printf(_("Could not open mixer device \"%s\"!"), settings.mixer);
++ detail = g_strdup_printf(_("You can use alsamixer to get information about the sound card.\n"
++ "The format to set mixer to use: \"device/channel\" (e.g. hw:0/Line)."));
++ show_error_message(caption, detail);
++ g_free(caption);
++ g_free(detail);
++
++ gtk_widget_set_sensitive(volume_button, FALSE);
++
++ if (!restart) {
++ mode = MIXER_DEVICE;
++ prefs_button_clicked_cb(NULL, app);
++ mode = PRESETS;
++ }
++ }
+ }
+
+ static gboolean redraw_status_window(void)
+@@ -454,14 +519,14 @@ static gboolean draw_cb(GtkWidget *widge
+ {
+ redraw_status_window();
+ return TRUE;
+-}
++}
+
+ void exit_gnome_radio(void)
+ {
+ if (settings.mute_on_exit)
+ radio_stop();
+
+- mixer_close();
++ mixer->close_device();
+ save_settings();
+ gtk_main_quit();
+ }
+@@ -510,41 +575,6 @@ static void adj_value_changed_cb(GtkAdju
+ radio_set_freq(gtk_adjustment_get_value(adj)/STEPS);
+ }
+
+-static void volume_value_changed_cb(GtkVolumeButton *button, gpointer user_data)
+-{
+- /* char *text; */
+- int vol = (int)(gtk_volume_button_get_value(mute_button) + 0.5f);
+-
+- mixer_set_volume(vol);
+-
+-/* text = g_strdup_printf(_("Volume: %d%%"), vol);
+- gtk_widget_set_tooltip_text(vol_scale, text);
+- g_free(text);*/
+-
+- if (tray_menu) {
+- g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), vol == 0);
+- g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- }
+-}
+-
+-#if 0
+-static gboolean poll_volume_change(gpointer data)
+-{
+- int vol;
+- if ((vol = mixer_get_volume()) < 0)
+- return FALSE;
+-
+- if (vol != (int)volume->value)
+- {
+- g_print("external volume change detected\n");
+- gtk_adjustment_set_value(volume, (double)vol);
+- }
+-
+- return TRUE;
+-}
+-#endif
+-
+ static void change_frequency(gpointer data)
+ {
+ gboolean increase = (gboolean) GPOINTER_TO_INT (data);
+@@ -637,7 +667,7 @@ void scfw_button_clicked_cb(GtkButton *b
+ return;
+ }
+ radio_mute();
+- timeout_id = g_timeout_add(1000/SCAN_SPEED, (GSourceFunc)scan_freq, (gpointer)1);
++ timeout_id = g_timeout_add(1000/SCAN_SPEED, (GSourceFunc)scan_freq, (gpointer)1);
+ }
+
+ void scbw_button_clicked_cb(GtkButton *button, gpointer data)
+@@ -756,16 +786,6 @@ static int start_recording(const gchar *
+ Recording* recording;
+ char *filename;
+
+- if (!mixer_set_rec_device())
+- {
+- GtkWidget *dialog;
+- dialog = gtk_message_dialog_new(NULL, DIALOG_FLAGS, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+- "Could not set \"%s\" as recording Source", settings.mixer);
+- gtk_dialog_run (GTK_DIALOG (dialog));
+- gtk_widget_destroy (dialog);
+- return -1;
+- }
+-
+ /* You can translate the filename for a recording:
+ * args for this format are: path, station title, time
+ */
+@@ -823,45 +843,6 @@ void rec_button_clicked_cb(GtkButton *bu
+ g_free(time);
+ }
+
+-void toggle_volume(void)
+-{
+- static int old_vol;
+- int muted, vol
+-
+- muted = radio_is_muted();
+- vol = mixer_get_volume();
+-
+- if (vol) {
+- old_vol = vol;
+- vol = 0;
+- } else {
+- vol = old_vol;
+- }
+-
+- mixer_set_volume(vol);
+- gtk_volume_button_set_value(mute_button, vol);
+-
+- if (muted)
+- radio_unmute();
+- else
+- radio_mute();
+-}
+-
+-/*
+-static void mute_button_toggled_cb(GtkButton *button, gpointer data)
+-{
+- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mute_button)))
+- {
+- gtk_widget_set_tooltip_text(mute_button, _("Unmute"));
+- }
+- else
+- {
+- gtk_widget_set_tooltip_text(mute_button, _("Mute"));
+- }
+- toggle_volume();
+-}
+-*/
+-
+ static char *get_license_text (void)
+ {
+ const gchar *license[] = {
+@@ -1011,9 +992,10 @@ GtkWidget* gnome_radio_gui(void)
+ stfw_button = gtk_button_new();
+ stbw_button = gtk_button_new();
+ about_button = gtk_button_new();
+- /*mute_button = gtk_toggle_button_new();*/
+- mute_button = gtk_volume_button_new();
+- gtk_button_set_relief(GTK_BUTTON(mute_button), GTK_RELIEF_NORMAL);
++ /*volume_button = gtk_toggle_button_new();*/
++ volume_button = gtk_volume_button_new();
++ gtk_button_set_relief(GTK_BUTTON(volume_button), GTK_RELIEF_NORMAL);
++ gtk_widget_set_sensitive(volume_button, FALSE);
+ rec_button = gtk_button_new();
+ /*help_button = gtk_button_new();*/
+
+@@ -1024,7 +1006,7 @@ GtkWidget* gnome_radio_gui(void)
+ gtk_container_add(GTK_CONTAINER(stfw_button), stfw_pixmap);
+ gtk_container_add(GTK_CONTAINER(stbw_button), stbw_pixmap);
+ gtk_container_add(GTK_CONTAINER(about_button), about_pixmap);
+- /*gtk_container_add(GTK_CONTAINER(mute_button), mute_pixmap);*/
++ /*gtk_container_add(GTK_CONTAINER(volume_button), mute_pixmap);*/
+ gtk_container_add(GTK_CONTAINER(rec_button), rec_pixmap);
+ /*gtk_container_add(GTK_CONTAINER(help_button), help_pixmap);*/
+
+@@ -1078,7 +1060,7 @@ GtkWidget* gnome_radio_gui(void)
+ /* gtk_scale_set_digits(GTK_SCALE(vol_scale), 0);
+ gtk_scale_set_draw_value(GTK_SCALE(vol_scale), FALSE);
+
+- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mute_button), mixer_get_volume() == 0);*/
++ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(volume_button), mixer->get_volume() == 0);*/
+
+ gtk_widget_set_size_request(drawing_area, DIGIT_WIDTH*6+10+SIGNAL_WIDTH+STEREO_WIDTH, DIGIT_HEIGTH+10);
+
+@@ -1089,7 +1071,7 @@ GtkWidget* gnome_radio_gui(void)
+ gtk_box_pack_start(GTK_BOX(hbox2), stfw_button, FALSE, FALSE, 2);
+ gtk_box_pack_start(GTK_BOX(hbox2), scfw_button, FALSE, FALSE, 2);
+ gtk_box_pack_start(GTK_BOX(hbox2), vseparator1, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(hbox2), mute_button, FALSE, FALSE, 2);
++ gtk_box_pack_start(GTK_BOX(hbox2), volume_button, FALSE, FALSE, 2);
+ /*gtk_box_pack_start(GTK_BOX(hbox2), vseparator2, TRUE, TRUE, 3);*/
+ gtk_box_pack_start(GTK_BOX(hbox2), rec_button, FALSE, FALSE, 2);
+ gtk_box_pack_start(GTK_BOX(hbox2), vseparator4, FALSE, FALSE, 2);
+@@ -1130,7 +1112,7 @@ GtkWidget* gnome_radio_gui(void)
+ g_signal_connect(G_OBJECT(app), "delete_event", G_CALLBACK(delete_event_cb), NULL);
+ g_signal_connect(G_OBJECT(quit_button), "clicked", G_CALLBACK(quit_button_clicked_cb), NULL);
+ g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(adj_value_changed_cb), (gpointer) app);
+- g_signal_connect(G_OBJECT(mute_button), "value-changed", G_CALLBACK(volume_value_changed_cb), NULL);
++ volume_value_changed_id = g_signal_connect(G_OBJECT(volume_button), "value-changed", G_CALLBACK(volume_value_changed_cb), NULL);
+ g_signal_connect(G_OBJECT(stfw_button), "pressed", G_CALLBACK(step_button_pressed_cb), (gpointer)TRUE);
+ g_signal_connect(G_OBJECT(stbw_button), "pressed", G_CALLBACK(step_button_pressed_cb), (gpointer)FALSE);
+ g_signal_connect(G_OBJECT(stfw_button), "clicked", G_CALLBACK(step_button_clicked_cb), (gpointer)TRUE);
+@@ -1151,7 +1133,7 @@ GtkWidget* gnome_radio_gui(void)
+ gtk_widget_set_tooltip_text(about_button, _("About"));
+ gtk_widget_set_tooltip_text(rec_button, _("Record radio as OGG, Flac, Wave or MP3"));
+ gtk_widget_set_tooltip_text(prefs_button, _("Edit your Preferences"));
+- gtk_widget_set_tooltip_text(mute_button, _("Adjust the Volume"));
++ gtk_widget_set_tooltip_text(volume_button, _("Adjust the Volume"));
+ gtk_widget_set_tooltip_text(quit_button, _("Quit"));
+ text = g_strdup_printf(_("Frequency: %.2f MHz"), gtk_adjustment_get_value(adj)/STEPS);
+ gtk_widget_set_tooltip_text(freq_scale, text);
+@@ -1172,7 +1154,7 @@ session_die_cb(void)
+ if (settings.mute_on_exit)
+ radio_stop();
+
+- mixer_close();
++ mixer->close_device();
+ gtk_main_quit();
+ exit (0);
+ }
+@@ -1196,8 +1178,6 @@ gconf_error_handler(GConfClient *client,
+ gboolean
+ key_press_event_cb(GtkWidget *app, GdkEventKey *event, gpointer data)
+ {
+- int vol = (int)(gtk_volume_button_get_value(mute_button) + 0.5f);
+-
+ switch (event->keyval)
+ {
+ case GDK_KEY_F1: display_help_cb(NULL);
+@@ -1228,13 +1208,11 @@ key_press_event_cb(GtkWidget *app, GdkEv
+ break;
+ case GDK_KEY_KP_Add:
+ case GDK_KEY_plus:
+- gtk_volume_button_set_value(mute_button, vol > 95 ? 100 : vol + 5);
+- /*gtk_adjustment_set_value(volume, (volume->value > 95) ? 100 : volume->value+5);*/
++ volume_up();
+ break;
+ case GDK_KEY_minus:
+ case GDK_KEY_KP_Subtract:
+- gtk_volume_button_set_value(mute_button, vol < 5 ? 0 : vol - 5);
+- /*gtk_adjustment_set_value(volume,(volume->value < 5) ? 0 : volume->value-5);*/
++ volume_down();
+ break;
+ }
+ return FALSE;
+@@ -1394,8 +1372,8 @@ int main(int argc, char* argv[])
+
+ load_settings();
+
+- start_mixer(FALSE, app);
+ start_radio(FALSE, app);
++ start_mixer(FALSE, app);
+ if (is_first_start() || do_scan) {
+ if (!radio_is_init()) {
+ fprintf(stderr, "Could not scan. Radio is not initialized\n");
+@@ -1415,12 +1393,12 @@ int main(int argc, char* argv[])
+
+ gtk_widget_show_all(app);
+ main_visible = TRUE;
++ mode = PRESETS;
+
+ /* Create an tray icon */
+ create_tray_icon(app);
+
+ adj_value_changed_cb(NULL, (gpointer) app);
+- /*volume_value_changed_cb(NULL, NULL);*/
+
+ #ifdef HAVE_LIRC
+ if(!my_lirc_init())
+Index: gnomeradio-1.8/src/gui.h
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.h
++++ gnomeradio-1.8/src/gui.h
+@@ -30,10 +30,11 @@ typedef struct Preset preset;
+ struct Gnomeradio_Settings
+ {
+ gchar *device;
+- gchar *mixer_dev;
+ gchar *mixer;
++ gboolean muted;
++ gfloat unmute_volume;
+ gboolean mute_on_exit;
+- gchar *driver;
++ gchar *driver;
+
+ GList *presets;
+ };
+@@ -48,8 +49,6 @@ void start_radio(gboolean restart, GtkWi
+
+ void start_mixer(gboolean restart, GtkWidget *app);
+
+-GList* get_mixer_recdev_list(void);
+-
+ void exit_gnome_radio(void);
+
+ void scfw_button_clicked_cb(GtkButton *button, gpointer data);
+@@ -58,9 +57,9 @@ void scbw_button_clicked_cb(GtkButton *b
+
+ void rec_button_clicked_cb(GtkButton *button, gpointer app);
+
+-int gtk_volume_button_get_value (GtkWidget *button);
++void volume_up (void);
+
+-void gtk_volume_button_set_value (GtkWidget *button, int value);
++void volume_down (void);
+
+ void toggle_volume(void);
+
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -26,7 +26,7 @@
+ #include "gui.h"
+ #include "rec_tech.h"
+
+-extern GtkWidget* mute_button, *preset_combo;
++extern GtkWidget *preset_combo;
+ extern GtkAdjustment *adj;
+
+ extern int mom_ps;
+@@ -34,10 +34,9 @@ extern gnomeradio_settings settings;
+
+ extern gboolean main_visible;
+
+-static GtkWidget *device_entry;
+-static GtkWidget *mixer_combo;
++static GtkWidget *device_entry, *mixer_entry;
+ static GtkWidget *mute_on_exit_cb;
+-static GtkWidget *save_button, *move_up_button, *move_down_button, *remove_button;
++static GtkWidget *save_button, *move_up_button, *move_down_button, *add_button, *remove_button;
+ static GtkWidget *list_view;
+ static GtkListStore *list_store;
+ static GtkTreeSelection *selection;
+@@ -60,7 +59,8 @@ gboolean save_settings(void)
+ gconf_client_set_string(client, "/apps/gnomeradio/device", settings.device, NULL);
+ gconf_client_set_string(client, "/apps/gnomeradio/driver", settings.driver, NULL);
+ gconf_client_set_string(client, "/apps/gnomeradio/mixer", settings.mixer, NULL);
+- gconf_client_set_string(client, "/apps/gnomeradio/mixer-device", settings.mixer_dev, NULL);
++ gconf_client_set_bool(client, "/apps/gnomeradio/muted", settings.muted, NULL);
++ gconf_client_set_float(client, "/apps/gnomeradio/unmute-volume", settings.unmute_volume, NULL);
+ gconf_client_set_bool(client, "/apps/gnomeradio/mute-on-exit", settings.mute_on_exit, NULL);
+ /*gconf_client_set_float(client, "/apps/gnomeradio/volume", volume->value, NULL);*/
+ gconf_client_set_float(client, "/apps/gnomeradio/last-freq", gtk_adjustment_get_value(adj)/STEPS, NULL);
+@@ -123,10 +123,9 @@ gboolean load_settings(void)
+ settings.driver = g_strdup("any");
+ settings.mixer = gconf_client_get_string(client, "/apps/gnomeradio/mixer", NULL);
+ if (!settings.mixer)
+- settings.mixer = g_strdup("line");
+- settings.mixer_dev = gconf_client_get_string(client, "/apps/gnomeradio/mixer-device", NULL);
+- if (!settings.mixer_dev)
+- settings.mixer_dev = g_strdup("/dev/mixer");
++ settings.mixer = g_strdup("default/Master");
++ settings.muted = gconf_client_get_bool(client, "/apps/gnomeradio/muted", NULL);
++ settings.unmute_volume = gconf_client_get_float(client, "/apps/gnomeradio/unmute-volume", NULL);
+ settings.mute_on_exit = gconf_client_get_bool(client, "/apps/gnomeradio/mute-on-exit", NULL);
+ /*volume->value = gconf_client_get_float(client, "/apps/gnomeradio/volume", NULL);*/
+ freq = gconf_client_get_float(client, "/apps/gnomeradio/last-freq", NULL);
+@@ -194,11 +193,16 @@ static void mute_on_exit_toggled_cb(GtkW
+
+ static gboolean device_entry_activate_cb(GtkWidget *widget, gpointer data)
+ {
+- const gchar *text = gtk_entry_get_text(GTK_ENTRY(device_entry));
++ const gchar *text;
+
+- if (!strcmp(settings.device, text)) return FALSE;
++ text = gtk_entry_get_text(GTK_ENTRY(device_entry));
++
++ if (!strcmp(settings.device, text) || (text[0] == '\0'))
++ return FALSE;
+
+- if (settings.device) g_free(settings.device);
++ if (settings.device)
++ g_free(settings.device);
++
+ settings.device = g_strdup(text);
+
+ start_radio(TRUE, data);
+@@ -206,28 +210,19 @@ static gboolean device_entry_activate_cb
+ return FALSE;
+ }
+
+-static gboolean mixer_combo_change_cb(GtkComboBox *combo, gpointer data)
++static gboolean mixer_entry_activate_cb(GtkWidget *widget, gpointer data)
+ {
+- GList *mixer_devs;
+- int active;
+- gchar *mixer_dev, *tmp;
+-
+- g_assert(combo);
+- mixer_devs = g_object_get_data(G_OBJECT(combo), "mixer_devs");
+- active = gtk_combo_box_get_active(combo);
+- g_assert(active > -1);
+-
+- mixer_dev = (gchar*)g_list_nth_data(mixer_devs, active);
+- g_assert(mixer_dev);
+-
+- if (g_str_equal(mixer_dev, settings.mixer))
+- return FALSE;
++ const gchar *text;
++
++ text = gtk_entry_get_text(GTK_ENTRY(mixer_entry));
+
+- if (settings.mixer) g_free(settings.mixer);
+- settings.mixer = g_strdup(mixer_dev);
++ if (!strcmp(settings.mixer, text) || (text[0] == '\0'))
++ return FALSE;
+
+- if ((tmp = strstr(settings.mixer, " (")))
+- tmp[0] = '\0';
++ if (settings.mixer)
++ g_free(settings.mixer);
++
++ settings.mixer = g_strdup(text);
+
+ start_mixer(TRUE, data);
+
+@@ -695,11 +690,34 @@ static void list_view_selection_changed_
+ gtk_widget_set_sensitive(save_button, sel);
+ }
+
+-static void free_string_list(GList *list)
++static void list_view_scroll_to_active_preset_cb(GtkWidget *widget, gpointer data)
+ {
+- if (!list) return;
+- g_list_foreach(list, (GFunc)g_free, NULL);
+- g_list_free(list);
++ GtkTreePath *path = NULL;
++ GtkTreeIter iter;
++ gint active;
++
++ if (settings.presets == NULL) {
++ gtk_widget_grab_focus(add_button);
++ return;
++ }
++
++ active = gtk_combo_box_get_active(GTK_COMBO_BOX(preset_combo)) - 1;
++
++ if (active < 0) {
++ gtk_widget_grab_focus(add_button);
++ return;
++ }
++
++ if (!gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list_store), &iter, NULL, active))
++ return;
++
++ path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
++
++ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW (list_view), path, NULL, FALSE, 0, 0);
++ gtk_tree_view_set_cursor(GTK_TREE_VIEW (list_view), path, NULL, FALSE );
++ gtk_tree_path_free(path);
++
++ gtk_widget_grab_focus(list_view);
+ }
+
+ static void free_preset_list(gpointer data, gpointer user_data)
+@@ -1020,6 +1038,25 @@ static void load_from_file_cb(GtkWidget
+ gtk_widget_destroy(dialog);
+ }
+
++gboolean action_mode (gint mode)
++{
++ switch (mode) {
++ case RADIO_DEVICE:
++ gtk_widget_grab_focus (device_entry);
++ break;
++ case MIXER_DEVICE:
++ gtk_widget_grab_focus (mixer_entry);
++ break;
++ case PRESETS:
++ list_view_scroll_to_active_preset_cb(list_view, NULL);
++ break;
++ default:
++ break;
++ }
++
++ return TRUE;
++}
++
+ GtkWidget* prefs_window(GtkWidget *app)
+ {
+ GtkWidget *dialog;
+@@ -1030,15 +1067,14 @@ GtkWidget* prefs_window(GtkWidget *app)
+ GtkWidget *destination_label;
+ GtkWidget *destination_button;
+ GtkWidget *profile_combo;
+- GtkWidget *mixer_eb, *profile_eb;
++ GtkWidget *profile_eb;
+ GtkWidget *device_label, *mixer_label;
+ GtkWidget *button_box;
+- GtkWidget *open_button, *add_button;
++ GtkWidget *open_button;
+ GtkWidget *scrolled_window;
+ GtkCellRenderer *cellrenderer;
+ GtkTreeViewColumn *list_column;
+- GList *mixer_devs, *ptr;
+- gint i, active;
++ gint i;
+ char *settings_hdr, *presets_hdr, *record_hdr;
+ preset* ps;
+
+@@ -1080,20 +1116,11 @@ GtkWidget* prefs_window(GtkWidget *app)
+
+ mixer_label = gtk_label_new(_("Mixer Source:"));
+ gtk_widget_set_halign(mixer_label, GTK_ALIGN_START);
+- mixer_eb = gtk_event_box_new();
+- mixer_combo = gtk_combo_box_text_new();
+- gtk_container_add(GTK_CONTAINER(mixer_eb), mixer_combo);
+- ptr = mixer_devs = get_mixer_recdev_list();
+- for (i = 0, active = 0; ptr; ptr = g_list_next(ptr)) {
+- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mixer_combo), ptr->data);
+- if (g_str_equal(ptr->data, settings.mixer)) active = i;
+- ++i;
+- }
+- gtk_combo_box_set_active(GTK_COMBO_BOX(mixer_combo), active);
+- g_object_set_data_full(G_OBJECT(mixer_combo), "mixer_devs", mixer_devs, (GDestroyNotify)free_string_list);
++ mixer_entry = gtk_entry_new();
++ gtk_entry_set_text(GTK_ENTRY(mixer_entry), settings.mixer);
+
+ gtk_grid_attach(GTK_GRID(grid), mixer_label, 1, 2, 1, 1);
+- gtk_grid_attach(GTK_GRID(grid), mixer_eb, 2, 2, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), mixer_entry, 2, 2, 1, 1);
+
+ mute_on_exit_cb = gtk_check_button_new_with_label(_("Mute on exit"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mute_on_exit_cb), settings.mute_on_exit);
+@@ -1102,13 +1129,13 @@ GtkWidget* prefs_window(GtkWidget *app)
+
+ g_signal_connect(G_OBJECT(device_entry), "hide", G_CALLBACK(device_entry_activate_cb), app);
+ g_signal_connect(G_OBJECT(device_entry), "activate", G_CALLBACK(device_entry_activate_cb), NULL);
+- g_signal_connect(G_OBJECT(mixer_combo), "changed", G_CALLBACK(mixer_combo_change_cb), app);
++ g_signal_connect(G_OBJECT(mixer_entry), "hide", G_CALLBACK(mixer_entry_activate_cb), app);
++ g_signal_connect(G_OBJECT(mixer_entry), "activate", G_CALLBACK(mixer_entry_activate_cb), NULL);
+ g_signal_connect(G_OBJECT(mute_on_exit_cb), "toggled", G_CALLBACK(mute_on_exit_toggled_cb), NULL);
+
+- gtk_widget_set_tooltip_text(device_entry, _("Specify the radio-device (in most cases /dev/radio0)"));
+- gtk_widget_set_tooltip_text(mixer_eb,
+- _("Choose the mixer source (line, line1, etc.) that is able to control the volume of your radio"));
+- gtk_widget_set_tooltip_text(mute_on_exit_cb, _("If unchecked, gnomeradio won't mute after exiting"));
++ gtk_widget_set_tooltip_text(device_entry, _("The radio device to use (e.g. /dev/radio0)"));
++ gtk_widget_set_tooltip_text(mixer_entry, _("The mixer device and channel to use (e.g. hw:0/Line)"));
++ gtk_widget_set_tooltip_text(mute_on_exit_cb, _("Mute radio device on exit"));
+
+ /* The presets part */
+ presets_hdr = g_strconcat("", _("Presets"), " ", NULL);
+@@ -1238,7 +1265,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_box_pack_end(GTK_BOX(button_box), save_button, FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(button_box), open_button, FALSE, FALSE, 0);
+
+- gtk_grid_attach(GTK_GRID(grid), button_box, 1, 7, 2, 1);
++ gtk_grid_attach(GTK_GRID(grid), button_box, 2, 7, 1, 1);
+
+ /* The record settings part */
+ record_hdr = g_strconcat("", _("Record Settings"), " ", NULL);
+Index: gnomeradio-1.8/src/trayicon.c
+===================================================================
+--- gnomeradio-1.8.orig/src/trayicon.c
++++ gnomeradio-1.8/src/trayicon.c
+@@ -23,7 +23,7 @@
+ #include
+ #include "gui.h"
+ #include "trayicon.h"
+-#include "tech.h"
++#include "mixer.h"
+
+ extern GtkAdjustment *adj;
+
+@@ -83,7 +83,7 @@ void create_tray_menu(GtkWidget *app) {
+ gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), gtk_separator_menu_item_new());
+
+ mute_menuitem = gtk_check_menu_item_new_with_label(_("Muted"));
+- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer_get_volume() == 0);
++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->get_volume() == 0);
+ gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), mute_menuitem);
+ mute_menuitem_toggled_cb_id =
+ g_signal_connect(G_OBJECT(mute_menuitem), "toggled", (GCallback)mute_menuitem_toggled_cb, (gpointer)app);
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -27,7 +27,6 @@
+ #include
+ #include
+ #include "gui.h"
+-#include "tech.h"
+ #include "rec_tech.h"
+ #include "prefs.h"
+
+Index: gnomeradio-1.8/src/lirc.c
+===================================================================
+--- gnomeradio-1.8.orig/src/lirc.c
++++ gnomeradio-1.8/src/lirc.c
+@@ -27,7 +27,6 @@
+ #include "lirc.h"
+ #include "gui.h"
+
+-extern GtkWidget* mute_button;
+ extern GtkWidget *app;
+
+ static int fd = -1;
+@@ -47,7 +46,6 @@ static struct TV_LIST
+ static void execute_lirc_command (char *cmd)
+ {
+ printf("lirc command: %s\n", cmd);
+- int vol = (int)(gtk_volume_button_get_value(mute_button) + 0.5f);
+
+ if (strcasecmp (cmd, "tune up") == 0)
+ {
+@@ -59,13 +57,11 @@ static void execute_lirc_command (char *
+ }
+ else if (strcasecmp (cmd, "volume up") == 0)
+ {
+- gtk_volume_button_set_value(mute_button, vol > 95 ? 100 : vol + 5);
+- /*gtk_adjustment_set_value(volume, (volume->value > 95) ? 100 : volume->value+5);*/
++ volume_up();
+ }
+ else if (strcasecmp (cmd, "volume down") == 0)
+ {
+- gtk_volume_button_set_value(mute_button, vol < 5 ? 0 : vol - 5);
+- /*gtk_adjustment_set_value(volume,(volume->value < 5) ? 0 : volume->value-5);*/
++ volume_down();
+ }
+ else if (strcasecmp (cmd, "mute") == 0)
+ {
+Index: gnomeradio-1.8/data/gnomeradio.schemas.in
+===================================================================
+--- gnomeradio-1.8.orig/data/gnomeradio.schemas.in
++++ gnomeradio-1.8/data/gnomeradio.schemas.in
+@@ -8,7 +8,7 @@
+ TRUE
+
+ Mute on exit
+- If unchecked, gnomeradio won't mute after exiting
++ Mute radio device on exit
+
+
+
+@@ -32,7 +32,7 @@
+ /dev/radio0
+
+ Radio device
+- Specify the radio-device (in most cases /dev/radio)
++ The radio device to use (e.g. /dev/radio0)
+
+
+
+@@ -44,7 +44,7 @@
+ any
+
+ Device driver
+- Specify the device driver to use (any, v4l1 or v4l2)
++ The device driver to use (any, v4l1 or v4l2)
+
+
+
+@@ -53,22 +53,34 @@
+ /apps/gnomeradio/mixer
+ gnomeradio
+ string
+- line
++ default/Master
+
+ Mixer source
+- Choose the mixer source (line, line1, etc.) that is able to control the volume of your radio
++ The mixer device and channel to use (e.g. hw:0/Line)
+
+
+
+
+- /schemas/apps/gnomeradio/mixer-device
+- /apps/gnomeradio/mixer-device
++ /schemas/apps/gnomeradio/muted
++ /apps/gnomeradio/muted
+ gnomeradio
+- string
+- /dev/mixer
++ bool
++ FALSE
++
++ Muted
++ This setting saves whether or not gnomeradio was muted when it was last exited
++
++
++
++
++ /schemas/apps/gnomeradio/unmute-volume
++ /apps/gnomeradio/unmute-volume
++ gnomeradio
++ float
++ -1
+
+- Mixer Device
+- The mixer device that gnomeradio should use. Only changeable via this key (no GUI option)
++ Unmute volume
++ This setting saves the volume before muting gnomeradio session
+
+
+
+@@ -92,7 +104,7 @@
+ -1
+
+ Last presets
+- The preset that was enabled when gnomeradio was terminated. Range is 0 ... (# presets - 1). None is -1
++ The preset that was enabled when gnomeradio was terminated. Range is 0 ... (presets - 1). None is -1
+
+
+
+Index: gnomeradio-1.8/src/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/src/Makefile.am
++++ gnomeradio-1.8/src/Makefile.am
+@@ -15,24 +15,28 @@ gnomeradio_SOURCES = \
+ get_media_devices.h \
+ gui.h \
+ lirc.h \
++ mixer.h \
+ prefs.h \
+ radio.h \
+ rec_tech.h \
+ record.h \
+- tech.h \
+ trayicon.h \
++ utils.h \
+ v4l1.h \
+ v4l2.h \
+ alsa_stream.c \
+ get_media_devices.c \
+ gui.c \
+ lirc.c \
++ mixer.c \
++ mixer-alsa.c \
++ mixer-oss.c \
+ prefs.c \
+ radio.c \
+ rec_tech.c \
+ record.c \
+- tech.c \
+ trayicon.c \
++ utils.c \
+ v4l1.c \
+ v4l2.c
+
+Index: gnomeradio-1.8/src/mixer-alsa.c
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/mixer-alsa.c
+@@ -0,0 +1,239 @@
++/**
++ * Copyright (C) 2006 Philipp Hahn
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include "mixer.h"
++
++static const char alsa_core_devnames[] = "default";
++static char *card, *channel;
++static int muted = 0;
++static int mutecount = 0;
++static snd_mixer_t *handle = NULL;
++static snd_mixer_elem_t *elem = NULL;
++
++static long alsa_min, alsa_max, alsa_vol;
++
++static void alsa_open_mixer( void )
++{
++ int err;
++ static snd_mixer_selem_id_t *sid = NULL;
++ if ((err = snd_mixer_open (&handle, 0)) < 0) {
++ fprintf(stderr, "mixer: open error: %s\n", snd_strerror(err));
++ return;
++ }
++ if ((err = snd_mixer_attach (handle, card)) < 0) {
++ fprintf(stderr, "mixer: attach error: %s\n", snd_strerror(err));
++ goto error;
++ }
++ if ((err = snd_mixer_selem_register (handle, NULL, NULL)) < 0) {
++ fprintf(stderr, "mixer: register error: %s\n", snd_strerror(err));
++ goto error;
++ }
++ if ((err = snd_mixer_load (handle)) < 0) {
++ fprintf(stderr, "mixer: load error: %s\n", snd_strerror(err));
++ goto error;
++ }
++ snd_mixer_selem_id_malloc(&sid);
++ if (sid == NULL)
++ goto error;
++ snd_mixer_selem_id_set_name(sid, channel);
++ if (!(elem = snd_mixer_find_selem(handle, sid))) {
++ fprintf(stderr, "mixer: unable to find mixer for channel %s\n", channel);
++ goto error;
++ }
++ if (!snd_mixer_selem_has_playback_volume(elem)) {
++ fprintf(stderr, "mixer: no playback\n");
++ goto error;
++ }
++ snd_mixer_selem_get_playback_volume_range(elem, &alsa_min, &alsa_max);
++ if ((alsa_max - alsa_min) <= 0) {
++ fprintf(stderr, "mixer: no valid playback range\n");
++ goto error;
++ }
++ snd_mixer_selem_id_free(sid);
++
++ return;
++
++error:
++ if (sid != NULL) {
++ snd_mixer_selem_id_free(sid);
++ sid = NULL;
++ }
++ if (handle) {
++ snd_mixer_close(handle);
++ handle = NULL;
++ }
++
++ return;
++}
++
++/* Volume saved to file */
++static int alsa_get_unmute_volume( void )
++{
++ long value;
++ if (elem == NULL)
++ return -1;
++
++ if (snd_mixer_selem_is_playback_mono(elem)) {
++ snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &value);
++ return value;
++ } else {
++ int c, n = 0;
++ long sum = 0;
++ for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) {
++ if (snd_mixer_selem_has_playback_channel(elem, c)) {
++ snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &value);
++ sum += value;
++ n++;
++ }
++ }
++ if (!n)
++ return 0;
++
++ value = sum / n;
++ sum = (long)((double)(alsa_vol * (alsa_max - alsa_min)) / 100. + 0.5);
++
++ if (sum != value)
++ alsa_vol = (long)(((value * 100.) / (alsa_max - alsa_min)) + 0.5);
++
++ return alsa_vol;
++ }
++}
++
++static int alsa_get_volume( void )
++{
++ if (muted)
++ return 0;
++ else
++ return alsa_get_unmute_volume();
++}
++
++static void alsa_set_volume( int value )
++{
++ long volume;
++
++ volume = (long)((value * (alsa_max - alsa_min) / 100.) + 0.5);
++ volume = CLAMP(volume, alsa_min, alsa_max);
++
++ snd_mixer_selem_set_playback_volume_all(elem, volume);
++ snd_mixer_selem_set_playback_switch_all(elem, 1);
++ muted = 0;
++ mutecount = 0;
++}
++
++static void alsa_mute( int mute )
++{
++ /**
++ * Make sure that if multiple users mute the card,
++ * we only honour the last one.
++ */
++ if( !mute && mutecount )
++ mutecount--;
++ if( mutecount )
++ return;
++
++ if( mute ) {
++ mutecount++;
++ muted = 1;
++ if (snd_mixer_selem_has_playback_switch(elem))
++ snd_mixer_selem_set_playback_switch_all(elem, 0);
++ else
++ fprintf(stderr, "mixer: mute not implemented\n");
++ } else {
++ muted = 0;
++ if (snd_mixer_selem_has_playback_switch(elem))
++ snd_mixer_selem_set_playback_switch_all(elem, 1);
++ else
++ fprintf(stderr, "mixer: mute not implemented\n");
++ }
++}
++
++static int alsa_is_muted( void )
++{
++ return muted;
++}
++
++static int alsa_set_device( const char *devname )
++{
++ int i;
++
++ if (card)
++ free(card);
++ card = strdup( devname );
++ if( !card )
++ return -1;
++
++ i = strcspn( card, "/" );
++ if( i == strlen( card ) ) {
++ channel = "Master";
++ } else {
++ card[i] = 0;
++ channel = card + i + 1;
++ }
++ alsa_open_mixer();
++ if (!handle) {
++ fprintf(stderr, "mixer: Can't open mixer %s (channel %s), mixer volume and mute unavailable.\n",
++ card, channel);
++ return -1;
++ }
++
++ return 0;
++}
++
++static void alsa_set_state( int is_muted, int unmute_volume )
++{
++ /**
++ * 1. we come back unmuted: Don't touch anything
++ * 2. we don't have a saved volume: Don't touch anything
++ * 3. we come back muted and we have a saved volume:
++ * - if gnomeradio muted it, unmute to old volume
++ * - if user did it, remember that we're muted and old volume
++ */
++ if( alsa_get_volume() == 0 && unmute_volume > 0 ) {
++ snd_mixer_selem_set_playback_volume_all(elem, unmute_volume);
++ muted = 1;
++
++ if( !is_muted )
++ alsa_mute( 0 );
++ }
++}
++
++static void alsa_close_device( void )
++{
++ elem = NULL;
++ if (handle)
++ snd_mixer_close(handle);
++ handle = NULL;
++ muted = 0;
++ mutecount = 0;
++}
++
++struct mixer alsa_mixer = {
++ .set_device = alsa_set_device,
++ .set_state = alsa_set_state,
++ .get_volume = alsa_get_volume,
++ .get_unmute_volume = alsa_get_unmute_volume,
++ .set_volume = alsa_set_volume,
++ .mute = alsa_mute,
++ .is_muted = alsa_is_muted,
++ .close_device = alsa_close_device,
++};
+Index: gnomeradio-1.8/src/mixer-oss.c
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/mixer-oss.c
+@@ -0,0 +1,257 @@
++/**
++ * Copyright (C) 2002, 2003 Doug Bell
++ *
++ * Some mixer routines from mplayer, http://mplayer.sourceforge.net.
++ * Copyright (C) 2000-2002. by A'rpi/ESP-team & others
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include "utils.h"
++#include "mixer.h"
++
++static char *mixer_device = "/dev/mixer";
++static int saved_volume = (50 << 8 & 0xFF00) | (50 & 0x00FF);
++static int mixer_channel = SOUND_MIXER_LINE;
++static int mixer_dev_mask = 1 << SOUND_MIXER_LINE;
++static int muted = 0;
++static int mutecount = 0;
++static int fd = -1;
++
++static int oss_get_volume( void )
++{
++ int r, l, cmd, devs;
++ int volume = 0;
++
++ if( fd < 0 )
++ fd = open( mixer_device, O_RDONLY );
++ if( fd != -1 ) {
++ ioctl( fd, SOUND_MIXER_READ_DEVMASK, &devs );
++ if( devs & mixer_dev_mask )
++ cmd = MIXER_READ( mixer_channel );
++ else
++ return volume;
++
++ ioctl(fd, cmd, &volume);
++ r = (volume & 0xFF);
++ l = (volume & 0xFF00) >> 8;
++ volume = (r + l) / 2;
++ volume = CLAMP (volume, 0, 100);
++ }
++
++ return volume;
++}
++
++static int oss_get_unmute_volume( void )
++{
++ if( muted ) {
++ return saved_volume;
++ } else {
++ int volume, cmd, devs;
++
++ if( fd < 0 )
++ fd = open( mixer_device, O_RDONLY );
++ if( fd != -1 ) {
++ ioctl( fd, SOUND_MIXER_READ_DEVMASK, &devs );
++ if( devs & mixer_dev_mask )
++ cmd = MIXER_READ( mixer_channel );
++ else
++ return -1;
++
++ ioctl( fd, cmd, &volume );
++ volume = CLAMP (volume, 0, 100);
++ return volume;
++ }
++ }
++
++ return -1;
++}
++
++static void oss_set_volume( int value )
++{
++ int v, volume, cmd, devs;
++
++ volume = CLAMP (value, 0, 100);
++
++ if( fd < 0 )
++ fd = open( mixer_device, O_RDONLY );
++ if( fd != -1 ) {
++ ioctl( fd, SOUND_MIXER_READ_DEVMASK, &devs );
++ if( devs & mixer_dev_mask )
++ cmd = MIXER_WRITE( mixer_channel );
++ else
++ return;
++
++ v = (volume << 8) + volume;
++ ioctl( fd, cmd, &v );
++ muted = 0;
++ mutecount = 0;
++ }
++}
++
++static void oss_mute( int mute )
++{
++ int volume, cmd, devs;
++
++ /**
++ * Make sure that if multiple users mute the card,
++ * we only honour the last one.
++ */
++ if( !mute && mutecount )
++ mutecount--;
++ if( mutecount )
++ return;
++
++ if( fd < 0 )
++ fd = open( mixer_device, O_RDONLY );
++
++ if( mute ) {
++ mutecount++;
++ if( fd != -1 ) {
++ /* Save volume */
++ ioctl( fd, SOUND_MIXER_READ_DEVMASK, &devs );
++ if( devs & mixer_dev_mask )
++ cmd = MIXER_READ( mixer_channel );
++ else
++ return;
++
++ ioctl( fd, cmd, &volume );
++ saved_volume = volume;
++
++ /* Now set volume to 0 */
++ ioctl( fd, SOUND_MIXER_READ_DEVMASK, &devs );
++ if( devs & mixer_dev_mask )
++ cmd = MIXER_WRITE( mixer_channel );
++ else
++ return;
++
++ volume = 0;
++ ioctl( fd, cmd, &volume );
++
++ muted = 1;
++ return;
++ }
++ } else {
++ if( fd != -1 ) {
++ ioctl( fd, SOUND_MIXER_READ_DEVMASK, &devs );
++ if( devs & mixer_dev_mask )
++ cmd = MIXER_WRITE( mixer_channel );
++ else
++ return;
++
++ volume = saved_volume;
++ ioctl( fd, cmd, &volume );
++ muted = 0;
++ return;
++ }
++ }
++}
++
++static int oss_is_muted( void )
++{
++ return muted;
++}
++
++static char *oss_core_devnames[] = SOUND_DEVICE_NAMES;
++
++static int oss_set_device( const char *devname )
++{
++ const char *channame;
++ int found = 0;
++ int i;
++
++ mixer_device = strdup( devname );
++ if( !mixer_device )
++ return -1;
++
++ i = strcspn( mixer_device, ":" );
++ if( i == strlen( mixer_device ) ) {
++ channame = "line";
++ } else {
++ mixer_device[ i ] = 0;
++ channame = mixer_device + i + 1;
++ }
++ if( !open_read( mixer_device ) ) {
++ fprintf( stderr, "mixer: Can't open device %s, "
++ "mixer volume and mute unavailable.\n", mixer_device );
++ return -1;
++ }
++
++ mixer_channel = SOUND_MIXER_LINE;
++ for( i = 0; i < SOUND_MIXER_NRDEVICES; i++ ) {
++ if( !strcasecmp( channame, oss_core_devnames[ i ] ) ) {
++ mixer_channel = i;
++ found = 1;
++ break;
++ }
++ }
++ if( !found ) {
++ fprintf( stderr, "mixer: No such mixer channel '%s', using channel 'line'.\n", channame );
++ return -1;
++ }
++ mixer_dev_mask = 1 << mixer_channel;
++
++ return 0;
++}
++
++static void oss_set_state( int is_muted, int unmute_volume )
++{
++ /**
++ * 1. we come back unmuted: Don't touch anything
++ * 2. we don't have a saved volume: Don't touch anything
++ * 3. we come back muted and we have a saved volume:
++ * - if gnomeradio muted it, unmute to old volume
++ * - if user did it, remember that we're muted and old volume
++ */
++ if( oss_get_volume() == 0 && unmute_volume > 0 ) {
++ saved_volume = unmute_volume;
++ muted = 1;
++
++ if( !is_muted )
++ oss_mute( 0 );
++ }
++}
++
++static void oss_close_device( void )
++{
++ if( fd >= 0 )
++ close( fd );
++ saved_volume = (50 << 8 & 0xFF00) | (50 & 0x00FF);
++ mixer_channel = SOUND_MIXER_LINE;
++ mixer_dev_mask = 1 << SOUND_MIXER_LINE;
++ muted = 0;
++ mutecount = 0;
++ fd = -1;
++}
++
++struct mixer oss_mixer = {
++ .set_device = oss_set_device,
++ .set_state = oss_set_state,
++ .get_volume = oss_get_volume,
++ .get_unmute_volume = oss_get_unmute_volume,
++ .set_volume = oss_set_volume,
++ .mute = oss_mute,
++ .is_muted = oss_is_muted,
++ .close_device = oss_close_device,
++};
+Index: gnomeradio-1.8/src/prefs.h
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.h
++++ gnomeradio-1.8/src/prefs.h
+@@ -22,6 +22,15 @@
+ gboolean save_settings(void);
+ gboolean load_settings(void);
+
++enum
++{
++ RADIO_DEVICE,
++ MIXER_DEVICE,
++ PRESETS
++};
++
++gboolean action_mode (gint mode);
++
+ GtkWidget* prefs_window(GtkWidget *app);
+
+ #endif
+Index: gnomeradio-1.8/src/utils.c
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/utils.c
+@@ -0,0 +1,30 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#include
++#include "utils.h"
++
++int open_read(const char *filename)
++{
++ int fd;
++ fd = open(filename, O_RDONLY);
++ if (fd < 0) {
++ return 0;
++ } else {
++ close(fd);
++ return 1;
++ }
++}
+Index: gnomeradio-1.8/src/utils.h
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/utils.h
+@@ -0,0 +1,22 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#ifndef _UTILS_H
++#define _UTILS_H
++
++int open_read(const char *filename);
++
++#endif
diff -pruN 1.8-2/debian/patches/gnomeradio-alsa.patch 1.8-2ubuntu32/debian/patches/gnomeradio-alsa.patch
--- 1.8-2/debian/patches/gnomeradio-alsa.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-alsa.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,1938 @@
+Description: Added support for looping back audio through alsa devices.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1154029
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/alsa_stream.c
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/alsa_stream.c
+@@ -0,0 +1,642 @@
++/*
++ * ALSA streaming support
++ *
++ * Originally written by:
++ * Copyright (c) by Devin Heitmueller
++ * for usage at tvtime
++ * Derived from the alsa-driver test tool latency.c:
++ * Copyright (c) by Jaroslav Kysela
++ *
++ * Copyright (c) 2011 - Mauro Carvalho Chehab
++ * Ported to xawtv, with bug fixes and improvements
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ */
++
++#include "config.h"
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include "alsa_stream.h"
++
++#define ARRAY_SIZE(a) (sizeof(a)/sizeof(*(a)))
++
++/* Private vars to control alsa thread status */
++static int stop_alsa = 0;
++
++/* Error handlers */
++snd_output_t *output = NULL;
++FILE *error_fp;
++int verbose = 0;
++
++struct final_params {
++ int bufsize;
++ int rate;
++ int latency;
++ int channels;
++};
++
++static int setparams_stream(snd_pcm_t *handle,
++ snd_pcm_hw_params_t *params,
++ snd_pcm_format_t format,
++ int *channels,
++ const char *id)
++{
++ int err;
++
++ err = snd_pcm_hw_params_any(handle, params);
++ if (err < 0) {
++ fprintf(error_fp,
++ "alsa: Broken configuration for %s PCM: no configurations available: %s\n",
++ snd_strerror(err), id);
++ return err;
++ }
++
++ err = snd_pcm_hw_params_set_access(handle, params,
++ SND_PCM_ACCESS_RW_INTERLEAVED);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Access type not available for %s: %s\n", id,
++ snd_strerror(err));
++ return err;
++ }
++
++ err = snd_pcm_hw_params_set_format(handle, params, format);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Sample format not available for %s: %s\n", id,
++ snd_strerror(err));
++ return err;
++ }
++
++retry:
++ err = snd_pcm_hw_params_set_channels(handle, params, *channels);
++ if (err < 0) {
++ if (strcmp(id, "capture") == 0 && *channels == 2) {
++ *channels = 1;
++ goto retry; /* Retry with mono capture */
++ }
++ fprintf(error_fp, "alsa: Channels count (%i) not available for %s: %s\n",
++ *channels, id, snd_strerror(err));
++ return err;
++ }
++
++ return 0;
++}
++
++static void getparams_periods(snd_pcm_t *handle,
++ snd_pcm_hw_params_t *params,
++ unsigned int *usecs,
++ unsigned int *count,
++ const char *id)
++{
++ unsigned min = 0, max = 0;
++
++ snd_pcm_hw_params_get_periods_min(params, &min, 0);
++ snd_pcm_hw_params_get_periods_max(params, &max, 0);
++ if (min && max) {
++ if (verbose)
++ fprintf(error_fp, "alsa: %s periods range between %u and %u. Want: %u\n",
++ id, min, max, *count);
++ if (*count < min)
++ *count = min;
++ if (*count > max)
++ *count = max;
++ }
++
++ min = max = 0;
++ snd_pcm_hw_params_get_period_time_min(params, &min, 0);
++ snd_pcm_hw_params_get_period_time_max(params, &max, 0);
++ if (min && max) {
++ if (verbose)
++ fprintf(error_fp, "alsa: %s period time range between %u and %u. Want: %u\n",
++ id, min, max, *usecs);
++ if (*usecs < min)
++ *usecs = min;
++ if (*usecs > max)
++ *usecs = max;
++ }
++}
++
++static int setparams_periods(snd_pcm_t *handle,
++ snd_pcm_hw_params_t *params,
++ unsigned int *usecs,
++ unsigned int *count,
++ const char *id)
++{
++ int err;
++
++ err = snd_pcm_hw_params_set_period_time_near(handle, params, usecs, 0);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Unable to set period time %u for %s: %s\n",
++ *usecs, id, snd_strerror(err));
++ return err;
++ }
++
++ err = snd_pcm_hw_params_set_periods_near(handle, params, count, 0);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Unable to set %u periods for %s: %s\n",
++ *count, id, snd_strerror(err));
++ return err;
++ }
++
++ if (verbose)
++ fprintf(error_fp, "alsa: %s period set to %u periods of %u time\n",
++ id, *count, *usecs);
++
++ return 0;
++}
++
++static int setparams_set(snd_pcm_t *handle,
++ snd_pcm_hw_params_t *params,
++ snd_pcm_sw_params_t *swparams,
++ snd_pcm_uframes_t start_treshold,
++ const char *id)
++{
++ int err;
++
++ err = snd_pcm_hw_params(handle, params);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Unable to set hw params for %s: %s\n",
++ id, snd_strerror(err));
++ return err;
++ }
++ err = snd_pcm_sw_params_current(handle, swparams);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Unable to determine current swparams for %s: %s\n",
++ id, snd_strerror(err));
++ return err;
++ }
++ err = snd_pcm_sw_params_set_start_threshold(handle, swparams,
++ start_treshold);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Unable to set start threshold mode for %s: %s\n",
++ id, snd_strerror(err));
++ return err;
++ }
++
++ err = snd_pcm_sw_params_set_avail_min(handle, swparams, 4);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Unable to set avail min for %s: %s\n",
++ id, snd_strerror(err));
++ return err;
++ }
++ err = snd_pcm_sw_params(handle, swparams);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Unable to set sw params for %s: %s\n",
++ id, snd_strerror(err));
++ return err;
++ }
++ return 0;
++}
++
++static int alsa_try_rate(snd_pcm_t *phandle, snd_pcm_t *chandle,
++ snd_pcm_hw_params_t *p_hwparams,
++ snd_pcm_hw_params_t *c_hwparams,
++ int allow_resample, unsigned *ratep, unsigned *ratec)
++{
++ int err;
++
++ err = snd_pcm_hw_params_set_rate_near(chandle, c_hwparams, ratec, 0);
++ if (err)
++ return err;
++
++ *ratep = *ratec;
++ err = snd_pcm_hw_params_set_rate_near(phandle, p_hwparams, ratep, 0);
++ if (err)
++ return err;
++
++ if (*ratep == *ratec)
++ return 0;
++
++ if (verbose)
++ fprintf(error_fp,
++ "alsa_try_rate: capture wanted %u, playback wanted %u%s\n",
++ *ratec, *ratep, allow_resample ? " with resample enabled": "");
++
++ return 1; /* No error, but also no match */
++}
++
++static int setparams(snd_pcm_t *phandle, snd_pcm_t *chandle,
++ snd_pcm_format_t format,
++ int latency, int allow_resample,
++ struct final_params *negotiated)
++{
++ int i;
++ unsigned ratep, ratec = 0;
++ unsigned ratemin = 32000, ratemax = 96000, val;
++ int err, channels = 2;
++ snd_pcm_hw_params_t *p_hwparams, *c_hwparams;
++ snd_pcm_sw_params_t *p_swparams, *c_swparams;
++ snd_pcm_uframes_t c_size, p_psize, c_psize;
++ /* Our latency is 2 periods (in usecs) */
++ unsigned int c_periods = 2, p_periods;
++ unsigned int c_periodtime, p_periodtime;
++ const unsigned int prefered_rates[] = { 44100, 48000, 32000 };
++
++ snd_pcm_hw_params_alloca(&p_hwparams);
++ snd_pcm_hw_params_alloca(&c_hwparams);
++ snd_pcm_sw_params_alloca(&p_swparams);
++ snd_pcm_sw_params_alloca(&c_swparams);
++
++ if (setparams_stream(chandle, c_hwparams, format, &channels, "capture"))
++ return 1;
++
++ if (setparams_stream(phandle, p_hwparams, format, &channels, "playback"))
++ return 1;
++
++ if (allow_resample) {
++ err = snd_pcm_hw_params_set_rate_resample(chandle, c_hwparams, 1);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Resample setup failed: %s\n", snd_strerror(err));
++ return 1;
++ } else if (verbose) {
++ fprintf(error_fp, "alsa: Resample enabled.\n");
++ }
++ }
++
++ err = snd_pcm_hw_params_get_rate_min(c_hwparams, &ratemin, 0);
++ if (err >= 0 && verbose)
++ fprintf(error_fp, "alsa: Capture min rate is %u\n", ratemin);
++ err = snd_pcm_hw_params_get_rate_max(c_hwparams, &ratemax, 0);
++ if (err >= 0 && verbose)
++ fprintf(error_fp, "alsa: Capture max rate is %u\n", ratemax);
++ err = snd_pcm_hw_params_get_rate_min(p_hwparams, &val, 0);
++ if (err >= 0) {
++ if (verbose)
++ fprintf(error_fp, "alsa: Playback min rate is %u\n", val);
++ if (val > ratemin)
++ ratemin = val;
++ }
++ err = snd_pcm_hw_params_get_rate_max(p_hwparams, &val, 0);
++ if (err >= 0) {
++ if (verbose)
++ fprintf(error_fp, "alsa: Playback max rate is %u\n", val);
++ if (val < ratemax)
++ ratemax = val;
++ }
++
++ if (verbose)
++ fprintf(error_fp,
++ "alsa: Will search a common rate between %u and %u\n",
++ ratemin, ratemax);
++
++ /* First try a set of common rates */
++ err = -1;
++ for (i = 0; i < ARRAY_SIZE(prefered_rates); i++) {
++ if (prefered_rates[i] < ratemin || prefered_rates[i] > ratemax)
++ continue;
++ ratep = ratec = prefered_rates[i];
++ err = alsa_try_rate(phandle, chandle, p_hwparams, c_hwparams,
++ allow_resample, &ratep, &ratec);
++ if (err == 0)
++ break;
++ }
++
++ if (err != 0) {
++ if (ratemin >= 44100) {
++ for (i = ratemin; i <= ratemax; i += 100) {
++ ratep = ratec = i;
++ err = alsa_try_rate(phandle, chandle, p_hwparams, c_hwparams,
++ allow_resample, &ratep, &ratec);
++ if (err == 0)
++ break;
++ }
++ } else {
++ for (i = ratemax; i >= ratemin; i -= 100) {
++ ratep = ratec = i;
++ err = alsa_try_rate(phandle, chandle, p_hwparams, c_hwparams,
++ allow_resample, &ratep, &ratec);
++ if (err == 0)
++ break;
++ }
++ }
++ }
++
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Failed to set a supported rate: %s\n",
++ snd_strerror(err));
++ return 1;
++ }
++ if (ratep != ratec) {
++ if (verbose || allow_resample)
++ fprintf(error_fp,
++ "alsa: Couldn't find a rate that it is supported by both playback and capture\n");
++ return 2;
++ }
++ if (verbose)
++ fprintf(error_fp, "alsa: Using Rate %u\n", ratec);
++
++ /* Negotiate period parameters */
++
++ c_periodtime = latency * 1000 / c_periods;
++ getparams_periods(chandle, c_hwparams, &c_periodtime, &c_periods, "capture");
++ p_periods = c_periods * 2;
++ p_periodtime = c_periodtime;
++ getparams_periods(phandle, p_hwparams, &p_periodtime, &p_periods, "playback");
++ c_periods = p_periods / 2;
++
++ /*
++ * Some playback devices support a very limited periodtime range. If the user needs to
++ * use a higher latency to avoid overrun/underrun, use an alternate algorithm of incresing
++ * the number of periods, to archive the needed latency
++ */
++ if (p_periodtime < c_periodtime) {
++ c_periodtime = p_periodtime;
++ c_periods = round (latency * 1000.0 / c_periodtime + 0.5);
++ getparams_periods(chandle, c_hwparams, &c_periodtime, &c_periods, "capture");
++ p_periods = c_periods * 2;
++ p_periodtime = c_periodtime;
++ getparams_periods(phandle, p_hwparams, &p_periodtime, &p_periods, "playback");
++ c_periods = p_periods / 2;
++ }
++
++ if (setparams_periods(chandle, c_hwparams, &c_periodtime, &c_periods, "capture"))
++ return 1;
++
++ /* Note we use twice as much periods for the playback buffer, since we
++ will get a period size near the requested time and we don't want it to
++ end up smaller then the capture buffer as then we could end up blocking
++ on writing to it. Note we will configure the playback dev to start
++ playing as soon as it has 2 capture periods worth of data, so this
++ won't influence latency */
++ if (setparams_periods(phandle, p_hwparams, &p_periodtime, &p_periods, "playback"))
++ return 1;
++
++ snd_pcm_hw_params_get_period_size(p_hwparams, &p_psize, NULL);
++ snd_pcm_hw_params_get_period_size(c_hwparams, &c_psize, NULL);
++ snd_pcm_hw_params_get_buffer_size(c_hwparams, &c_size);
++
++ latency = c_periods * c_psize;
++ if (setparams_set(phandle, p_hwparams, p_swparams, latency, "playback"))
++ return 1;
++
++ if (setparams_set(chandle, c_hwparams, c_swparams, c_psize, "capture"))
++ return 1;
++
++ if ((err = snd_pcm_prepare(phandle)) < 0) {
++ fprintf(error_fp, "alsa: Prepare error: %s\n", snd_strerror(err));
++ return 1;
++ }
++
++ if (verbose) {
++ fprintf(error_fp, "alsa: Negociated configuration:\n");
++ snd_pcm_dump_setup(phandle, output);
++ snd_pcm_dump_setup(chandle, output);
++ fprintf(error_fp, "alsa: Parameters are %uHz, %s, %i channels\n",
++ ratep, snd_pcm_format_name(format), channels);
++ fprintf(error_fp, "alsa: Set bitrate to %u%s, buffer size is %u\n", ratec,
++ allow_resample ? " with resample enabled at playback": "",
++ (unsigned int)c_size);
++ }
++
++ negotiated->bufsize = c_size;
++ negotiated->rate = ratep;
++ negotiated->channels = channels;
++ negotiated->latency = latency;
++ return 0;
++}
++
++/* Read up to len frames */
++static snd_pcm_sframes_t readbuf(snd_pcm_t *handle, char *buf, long len)
++{
++ snd_pcm_sframes_t r;
++
++ r = snd_pcm_readi(handle, buf, len);
++ if (r < 0 && r != -EAGAIN) {
++ r = snd_pcm_recover(handle, r, 0);
++ if (r < 0)
++ fprintf(error_fp, "alsa: overrun recover error: %s\n", snd_strerror(r));
++ }
++ return r;
++}
++
++/* Write len frames (note not up to len, but all of len!) */
++static snd_pcm_sframes_t writebuf(snd_pcm_t *handle, char *buf, long len)
++{
++ snd_pcm_sframes_t r;
++
++ while (1) {
++ r = snd_pcm_writei(handle, buf, len);
++ if (r == len)
++ return 0;
++ if (r < 0) {
++ r = snd_pcm_recover(handle, r, 0);
++ if (r < 0) {
++ fprintf(error_fp, "alsa: underrun recover error: %s\n",
++ snd_strerror(r));
++ return r;
++ }
++ }
++ buf += r * 4;
++ len -= r;
++ snd_pcm_wait(handle, 100);
++ }
++}
++
++static int alsa_stream(const char *pdevice, const char *cdevice, int latency)
++{
++ snd_pcm_t *phandle, *chandle;
++ char *buffer;
++ int err;
++ ssize_t r;
++ struct final_params negotiated;
++ snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
++ char pdevice_new[32];
++
++ err = snd_output_stdio_attach(&output, error_fp, 0);
++ if (err < 0) {
++ fprintf(error_fp, "alsa: Output failed: %s\n", snd_strerror(err));
++ return 0;
++ }
++
++ /* Open the devices */
++ if ((err = snd_pcm_open(&phandle, pdevice, SND_PCM_STREAM_PLAYBACK,
++ 0)) < 0) {
++ fprintf(error_fp, "alsa: Cannot open playback device %s: %s\n",
++ pdevice, snd_strerror(err));
++ return 0;
++ }
++ if ((err = snd_pcm_open(&chandle, cdevice, SND_PCM_STREAM_CAPTURE,
++ SND_PCM_NONBLOCK)) < 0) {
++ fprintf(error_fp, "alsa: Cannot open capture device %s: %s\n",
++ cdevice, snd_strerror(err));
++ snd_pcm_close(phandle);
++ return 0;
++ }
++
++ err = setparams(phandle, chandle, format, latency, 0, &negotiated);
++
++ /* Try to use plughw instead, as it allows emulating speed */
++ if (err == 2 && strncmp(pdevice, "hw", 2) == 0) {
++
++ snd_pcm_close(phandle);
++
++ sprintf(pdevice_new, "plug%s", pdevice);
++ pdevice = pdevice_new;
++ if (verbose)
++ fprintf(error_fp, "alsa: Trying %s for playback\n", pdevice);
++ if ((err = snd_pcm_open(&phandle, pdevice, SND_PCM_STREAM_PLAYBACK,
++ 0)) < 0) {
++ fprintf(error_fp, "alsa: Cannot open playback device %s: %s\n",
++ pdevice, snd_strerror(err));
++ snd_pcm_close(chandle);
++ return 0;
++ }
++
++ err = setparams(phandle, chandle, format, latency, 1, &negotiated);
++ }
++
++ if (err != 0) {
++ fprintf(error_fp, "alsa: setparams failed\n");
++ snd_pcm_close(phandle);
++ snd_pcm_close(chandle);
++ return 1;
++ }
++
++ buffer = malloc((negotiated.bufsize * snd_pcm_format_width(format) / 8)
++ * negotiated.channels);
++ if (buffer == NULL) {
++ fprintf(error_fp, "alsa: Failed allocating buffer for audio\n");
++ snd_pcm_close(phandle);
++ snd_pcm_close(chandle);
++ return 0;
++ }
++
++ if (verbose)
++ fprintf(error_fp,
++ "alsa: stream started from %s to %s (%i Hz, buffer delay = %.2f ms)\n",
++ cdevice, pdevice, negotiated.rate,
++ negotiated.latency * 1000.0 / negotiated.rate);
++
++ while (!stop_alsa) {
++ /* We start with a read and not a wait to auto(re)start the capture */
++ r = readbuf(chandle, buffer, negotiated.bufsize);
++ if (r == 0) /* Succesfully recovered from an overrun? */
++ continue; /* Force restart of capture stream */
++ if (r > 0)
++ writebuf(phandle, buffer, r);
++ /* use poll to wait for next event */
++ while (!stop_alsa && !snd_pcm_wait(chandle, 50))
++ ;
++ }
++
++ snd_pcm_drop(chandle);
++ snd_pcm_drop(phandle);
++
++ snd_pcm_unlink(chandle);
++ snd_pcm_hw_free(phandle);
++ snd_pcm_hw_free(chandle);
++
++ snd_pcm_close(phandle);
++ snd_pcm_close(chandle);
++
++ free(buffer);
++
++ return 0;
++}
++
++struct input_params {
++ char *pdevice;
++ char *cdevice;
++ int latency;
++};
++
++static void *alsa_thread_entry(void *whatever)
++{
++ struct input_params *inputs = (struct input_params *) whatever;
++
++ if (verbose)
++ fprintf(error_fp, "alsa: starting copying alsa stream from %s to %s\n",
++ inputs->cdevice, inputs->pdevice);
++ alsa_stream(inputs->pdevice, inputs->cdevice, inputs->latency);
++ if (verbose)
++ fprintf(error_fp, "alsa: stream stopped\n");
++
++ free(inputs->pdevice);
++ free(inputs->cdevice);
++ free(inputs);
++
++ return NULL;
++}
++
++/*************************************************************************
++ Public functions
++ *************************************************************************/
++
++static int alsa_is_running = 0;
++static pthread_t alsa_thread;
++
++int alsa_thread_startup(const char *pdevice, const char *cdevice, int latency,
++ FILE *__error_fp, int __verbose)
++{
++ int ret;
++ struct input_params *inputs;
++
++ if ((strcasecmp(pdevice, "disabled") == 0) ||
++ (strcasecmp(cdevice, "disabled") == 0))
++ return 0;
++
++ if (__error_fp)
++ error_fp = __error_fp;
++ else
++ error_fp = stderr;
++
++ verbose = __verbose;
++
++ if (alsa_is_running) {
++ fprintf(error_fp, "alsa: Already running\n");
++ return EBUSY;
++ }
++
++ inputs = malloc(sizeof(struct input_params));
++ if (inputs == NULL) {
++ fprintf(error_fp, "alsa: failed allocating memory for inputs\n");
++ return ENOMEM;
++ }
++
++ inputs->pdevice = strdup(pdevice);
++ inputs->cdevice = strdup(cdevice);
++ inputs->latency = latency;
++
++ stop_alsa = 0;
++ ret = pthread_create(&alsa_thread, NULL,
++ &alsa_thread_entry, (void *) inputs);
++ if (ret == 0)
++ alsa_is_running = 1;
++
++ return ret;
++}
++
++void alsa_thread_stop(void)
++{
++ if (!alsa_is_running)
++ return;
++
++ stop_alsa = 1;
++ pthread_join(alsa_thread, NULL);
++ alsa_is_running = 0;
++}
++
++int alsa_thread_is_running(void)
++{
++ return alsa_is_running;
++}
+Index: gnomeradio-1.8/src/alsa_stream.h
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/alsa_stream.h
+@@ -0,0 +1,34 @@
++
++/*
++ * ALSA streaming support
++ *
++ * Originally written by:
++ * Copyright (c) by Devin Heitmueller
++ * for usage at tvtime
++ * Derived from the alsa-driver test tool latency.c:
++ * Copyright (c) by Jaroslav Kysela
++ *
++ * Copyright (c) 2011 - Mauro Carvalho Chehab
++ * Ported to xawtv, with bug fixes and improvements
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ */
++
++int alsa_thread_startup(const char *pdevice, const char *cdevice, int latency,
++ FILE *__error_fp,
++ int __verbose);
++void alsa_thread_stop(void);
++int alsa_thread_is_running(void);
+Index: gnomeradio-1.8/src/get_media_devices.c
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/get_media_devices.c
+@@ -0,0 +1,600 @@
++/*
++ Copyright © 2011 by Mauro Carvalho Chehab
++
++ The get_media_devices is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The libv4l2util Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the libv4l2util Library; if not, write to the Free
++ Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA
++ 02110-1335 USA.
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include "get_media_devices.h"
++
++#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
++
++/**
++ * struct media_device_entry - Describes one device entry got via sysfs
++ *
++ * @device: sysfs name for a device.
++ * PCI devices are like: pci0000:00/0000:00:1b.0
++ * USB devices are like: pci0000:00/0000:00:1d.7/usb1/1-8
++ * @node: Device node, in sysfs or alsa hw identifier
++ * @device_type: Type of the device (V4L_*, DVB_*, SND_*)
++ */
++struct media_device_entry {
++ char *device;
++ char *node;
++ enum device_type type;
++ enum bus_type bus;
++ unsigned major, minor; /* Device major/minor */
++};
++
++/**
++ * struct media_devices - Describes all devices found
++ *
++ * @device: sysfs name for a device.
++ * PCI devices are like: pci0000:00/0000:00:1b.0
++ * USB devices are like: pci0000:00/0000:00:1d.7/usb1/1-8
++ * @node: Device node, in sysfs or alsa hw identifier
++ * @device_type: Type of the device (V4L_*, DVB_*, SND_*)
++ */
++struct media_devices {
++ struct media_device_entry *md_entry;
++ unsigned int md_size;
++};
++
++typedef int (*fill_data_t)(struct media_device_entry *md);
++
++#define DEVICE_STR "devices"
++
++static void get_uevent_info(struct media_device_entry *md_ptr, char *dname)
++{
++ FILE *fd;
++ char file[PATH_MAX], *name, *p;
++ char s[1024];
++ char *s_ptr;
++
++ snprintf(file, PATH_MAX, "%s/%s/uevent", dname, md_ptr->node);
++ fd = fopen(file, "r");
++ if (!fd)
++ return;
++ while (fgets(s, sizeof(s), fd)) {
++ p = strtok_r(s, "=", &s_ptr);
++ if (!p)
++ continue;
++ name = p;
++ p = strtok_r(NULL, "\n", &s_ptr);
++ if (!p)
++ continue;
++ if (!strcmp(name, "MAJOR"))
++ md_ptr->major = atol(p);
++ else if (!strcmp(name, "MINOR"))
++ md_ptr->minor = atol(p);
++ }
++
++ fclose(fd);
++}
++
++static enum bus_type get_bus(char *device)
++{
++ char file[PATH_MAX];
++ char s[1024];
++ FILE *f;
++
++ if (!strcmp(device, "/sys/devices/virtual"))
++ return MEDIA_BUS_VIRTUAL;
++
++ snprintf(file, PATH_MAX, "%s/modalias", device);
++ f = fopen(file, "r");
++ if (!f)
++ return MEDIA_BUS_UNKNOWN;
++ if (!fgets(s, sizeof(s), f)) {
++ fclose(f);
++ return MEDIA_BUS_UNKNOWN;
++ }
++ fclose(f);
++
++ if (!strncmp(s, "pci", 3))
++ return MEDIA_BUS_PCI;
++ if (!strncmp(s, "usb", 3))
++ return MEDIA_BUS_USB;
++
++ return MEDIA_BUS_UNKNOWN;
++}
++
++static int get_class(char *class,
++ struct media_device_entry **md,
++ unsigned int *md_size,
++ fill_data_t fill)
++{
++ DIR *dir;
++ struct dirent entbuf, *entry;
++ char dname[PATH_MAX];
++ char fname[PATH_MAX];
++ char link[PATH_MAX];
++ char virt_dev[60];
++ int err = -2;
++ struct media_device_entry *md_ptr = NULL;
++ char *p, *device;
++ enum bus_type bus;
++ static int virtual = 0;
++
++ snprintf(dname, PATH_MAX, "/sys/class/%s", class);
++ dir = opendir(dname);
++ if (!dir) {
++ return 0;
++ }
++
++ while (!readdir_r(dir, &entbuf, &entry)) {
++ if ( !entry )
++ break;
++ /* Skip . and .. */
++ if (entry->d_name[0] == '.')
++ continue;
++ /* Canonicalize the device name */
++ snprintf(fname, PATH_MAX, "%s/%s", dname, entry->d_name);
++ if (realpath(fname, link)) {
++ device = link;
++
++ /* Remove the subsystem/class_name from the string */
++ p = strstr(device, class);
++ if (!p)
++ continue;
++ *(p - 1) = '\0';
++
++ bus = get_bus(device);
++
++ /* remove the /sys/devices/ from the name */
++ device += 13;
++
++ switch (bus) {
++ case MEDIA_BUS_PCI:
++ /* Remove the device function nr */
++ p = strrchr(device, '.');
++ if (!p)
++ continue;
++ *p = '\0';
++ break;
++ case MEDIA_BUS_USB:
++ /* Remove USB interface from the path */
++ p = strrchr(device, '/');
++ if (!p)
++ continue;
++ /* In case we have a device where the driver
++ attaches directly to the usb device rather
++ then to an interface */
++ if (!strchr(p, ':'))
++ break;
++ *p = '\0';
++ break;
++ case MEDIA_BUS_VIRTUAL:
++ /* Don't group virtual devices */
++ sprintf(virt_dev, "virtual%d", virtual++);
++ device = virt_dev;
++ break;
++ case MEDIA_BUS_UNKNOWN:
++ break;
++ }
++
++ /* Add one more element to the devices struct */
++ *md = realloc(*md, (*md_size + 1) * sizeof(*md_ptr));
++ if (!*md)
++ goto error;
++ md_ptr = (*md) + *md_size;
++ (*md_size)++;
++
++ /* Cleans previous data and fills it with device/node */
++ memset(md_ptr, 0, sizeof(*md_ptr));
++ md_ptr->type = UNKNOWN;
++ md_ptr->device = strdup(device);
++ md_ptr->node = strdup(entry->d_name);
++
++ /* Retrieve major and minor information */
++ get_uevent_info(md_ptr, dname);
++
++ /* Used to identify the type of node */
++ fill(md_ptr);
++ }
++ }
++ err = 0;
++error:
++ closedir(dir);
++ return err;
++}
++
++static int add_v4l_class(struct media_device_entry *md)
++{
++ if (strstr(md->node, "video"))
++ md->type = MEDIA_V4L_VIDEO;
++ else if (strstr(md->node, "vbi"))
++ md->type = MEDIA_V4L_VBI;
++ else if (strstr(md->node, "radio"))
++ md->type = MEDIA_V4L_RADIO;
++ else if (strstr(md->node, "v4l-subdev"))
++ md->type = MEDIA_V4L_SUBDEV;
++
++ return 0;
++}
++
++static int add_snd_class(struct media_device_entry *md)
++{
++ unsigned c = 65535, d = 65535;
++ char node[64];
++
++ if (strstr(md->node, "timer")) {
++ md->type = MEDIA_SND_TIMER;
++ return 0;
++ } else if (strstr(md->node, "seq")) {
++ md->type = MEDIA_SND_SEQ;
++ return 0;
++ } if (strstr(md->node, "card")) {
++ sscanf(md->node, "card%u", &c);
++ md->type = MEDIA_SND_CARD;
++ } else if (strstr(md->node, "hw")) {
++ sscanf(md->node, "hwC%uD%u", &c, &d);
++ md->type = MEDIA_SND_HW;
++ } else if (strstr(md->node, "control")) {
++ sscanf(md->node, "controlC%u", &c);
++ md->type = MEDIA_SND_CONTROL;
++ } else if (strstr(md->node, "pcm")) {
++ sscanf(md->node, "pcmC%uD%u", &c, &d);
++ if (md->node[strlen(md->node) - 1] == 'p')
++ md->type = MEDIA_SND_OUT;
++ else if (md->node[strlen(md->node) - 1] == 'c')
++ md->type = MEDIA_SND_CAP;
++ }
++
++ if (c == 65535)
++ return 0;
++
++ /* Reformat device to be useful for alsa userspace library */
++ if (d == 65535)
++ snprintf(node, sizeof(node), "hw:%u", c);
++ else
++ snprintf(node, sizeof(node), "hw:%u,%u", c, d);
++
++ free(md->node);
++ md->node = strdup(node);
++
++ return 0;
++}
++
++static int add_dvb_class(struct media_device_entry *md)
++{
++ if (strstr(md->node, "video"))
++ md->type = MEDIA_DVB_VIDEO;
++ if (strstr(md->node, "audio"))
++ md->type = MEDIA_DVB_AUDIO;
++ if (strstr(md->node, "sec"))
++ md->type = MEDIA_DVB_SEC;
++ if (strstr(md->node, "frontend"))
++ md->type = MEDIA_DVB_FRONTEND;
++ else if (strstr(md->node, "demux"))
++ md->type = MEDIA_DVB_DEMUX;
++ else if (strstr(md->node, "dvr"))
++ md->type = MEDIA_DVB_DVR;
++ else if (strstr(md->node, "net"))
++ md->type = MEDIA_DVB_NET;
++ else if (strstr(md->node, "ca"))
++ md->type = MEDIA_DVB_CA;
++ else if (strstr(md->node, "osd"))
++ md->type = MEDIA_DVB_OSD;
++
++ return 0;
++}
++
++static int sort_media_device_entry(const void *a, const void *b)
++{
++ const struct media_device_entry *md_a = a;
++ const struct media_device_entry *md_b = b;
++ int cmp;
++
++ cmp = strcmp(md_a->device, md_b->device);
++ if (cmp)
++ return cmp;
++ cmp = (int)md_a->type - (int)md_b->type;
++ if (cmp)
++ return cmp;
++
++ return strcmp(md_a->node, md_b->node);
++}
++
++
++/* Public functions */
++
++void free_media_devices(void *opaque)
++{
++ struct media_devices *md = opaque;
++ struct media_device_entry *md_ptr = md->md_entry;
++ int i;
++ for (i = 0; i < md->md_size; i++) {
++ free(md_ptr->node);
++ free(md_ptr->device);
++ md_ptr++;
++ }
++ free(md->md_entry);
++ free(md);
++}
++
++void *discover_media_devices(void)
++{
++ struct media_devices *md = NULL;
++ struct media_device_entry *md_entry = NULL;
++
++ md = calloc(1, sizeof(*md));
++ if (!md)
++ return NULL;
++
++ md->md_size = 0;
++ if (get_class("video4linux", &md_entry, &md->md_size, add_v4l_class))
++ goto error;
++ if (get_class("sound", &md_entry, &md->md_size, add_snd_class))
++ goto error;
++ if (get_class("dvb", &md_entry, &md->md_size, add_dvb_class))
++ goto error;
++
++ /* There's no media device */
++ if (!md_entry)
++ goto error;
++
++ qsort(md_entry, md->md_size, sizeof(*md_entry), sort_media_device_entry);
++
++ md->md_entry = md_entry;
++
++ return md;
++
++error:
++ free_media_devices(md);
++ return NULL;
++}
++
++const char *media_device_type(enum device_type type)
++{
++ switch(type) {
++ /* V4L nodes */
++ case MEDIA_V4L_VIDEO:
++ return "video";
++ case MEDIA_V4L_VBI:
++ return "vbi";
++ case MEDIA_V4L_RADIO:
++ return "radio";
++ case MEDIA_V4L_SUBDEV:
++ return "v4l subdevice";
++
++ /* DVB nodes */
++ case MEDIA_DVB_VIDEO:
++ return "dvb video";
++ case MEDIA_DVB_AUDIO:
++ return "dvb audio";
++ case MEDIA_DVB_SEC:
++ return "dvb sec";
++ case MEDIA_DVB_FRONTEND:
++ return "dvb frontend";
++ case MEDIA_DVB_DEMUX:
++ return "dvb demux";
++ case MEDIA_DVB_DVR:
++ return "dvb dvr";
++ case MEDIA_DVB_NET:
++ return "dvb net";
++ case MEDIA_DVB_CA:
++ return "dvb conditional access";
++ case MEDIA_DVB_OSD:
++ return "dvb OSD";
++
++ /* Alsa nodes */
++ case MEDIA_SND_CARD:
++ return "sound card";
++ case MEDIA_SND_CAP:
++ return "pcm capture";
++ case MEDIA_SND_OUT:
++ return "pcm output";
++ case MEDIA_SND_CONTROL:
++ return "mixer";
++ case MEDIA_SND_HW:
++ return "sound hardware";
++ case MEDIA_SND_TIMER:
++ return "sound timer";
++ case MEDIA_SND_SEQ:
++ return "sound sequencer";
++
++ default:
++ return "unknown";
++ };
++}
++
++void display_media_devices(void *opaque)
++{
++ struct media_devices *md = opaque;
++ struct media_device_entry *md_ptr = md->md_entry;
++ int i;
++ char *prev = "";
++
++ for (i = 0; i < md->md_size; i++) {
++ if (strcmp(prev, md_ptr->device)) {
++ printf("\nDevice %s:\n\t", md_ptr->device);
++ prev = md_ptr->device;
++ }
++ printf("%s(%s, dev %i:%i) ", md_ptr->node,
++ media_device_type(md_ptr->type),
++ md_ptr->major, md_ptr->minor);
++ md_ptr++;
++ }
++ printf("\n");
++}
++
++const char *get_associated_device(void *opaque,
++ const char *last_seek,
++ const enum device_type desired_type,
++ const char *seek_device,
++ const enum device_type seek_type)
++{
++ struct media_devices *md = opaque;
++ struct media_device_entry *md_ptr = md->md_entry;
++ int i, found = 0;
++ char *prev, *p;
++
++ if (seek_type != NONE && seek_device[0]) {
++ /* Get just the device name */
++ p = strrchr(seek_device, '/');
++ if (p)
++ seek_device = p + 1;
++
++ /* Step 1: Find the seek node */
++ for (i = 0; i < md->md_size; i++, md_ptr++) {
++ if (last_seek && md_ptr->type == seek_type &&
++ !strcmp(md_ptr->node, last_seek)) {
++ found = 1;
++ continue;
++ }
++ if (last_seek && !found)
++ continue;
++ if (md_ptr->type == seek_type &&
++ !strcmp(seek_device, md_ptr->node))
++ break;
++ }
++ if (i == md->md_size)
++ return NULL;
++ i++;
++ prev = md_ptr->device;
++ md_ptr++;
++ /* Step 2: find the associated node */
++ for (; i < md->md_size && !strcmp(prev, md_ptr->device); i++, md_ptr++) {
++ if (last_seek && md_ptr->type == seek_type &&
++ !strcmp(md_ptr->node, last_seek)) {
++ found = 1;
++ continue;
++ }
++ if (last_seek && !found)
++ continue;
++ if (md_ptr->type == desired_type)
++ return md_ptr->node;
++ }
++ } else {
++ for (i = 0; i < md->md_size; i++, md_ptr++) {
++ if (last_seek && !strcmp(md_ptr->node, last_seek)) {
++ found = 1;
++ continue;
++ }
++ if (last_seek && !found)
++ continue;
++ if (md_ptr->type == desired_type)
++ return md_ptr->node;
++ }
++ }
++
++ return NULL;
++}
++
++const char *fget_associated_device(void *opaque,
++ const char *last_seek,
++ const enum device_type desired_type,
++ const int fd_seek_device,
++ const enum device_type seek_type)
++{
++ struct media_devices *md = opaque;
++ struct media_device_entry *md_ptr = md->md_entry;
++ struct stat f_status;
++ unsigned int dev_major, dev_minor;
++ int i, found = 0;
++ char *prev;
++
++ if (fstat(fd_seek_device, &f_status)) {
++ perror("Can't get file status");
++ return NULL;
++ }
++ if (!S_ISCHR(f_status.st_mode)) {
++ fprintf(stderr, "File descriptor is not a char device\n");
++ return NULL;
++ }
++ dev_major = major(f_status.st_rdev);
++ dev_minor = minor(f_status.st_rdev);
++
++ /* Step 1: Find the seek node */
++ for (i = 0; i < md->md_size; i++, md_ptr++) {
++ if (last_seek && md_ptr->type == seek_type
++ && md_ptr->major == dev_major
++ && md_ptr->minor == dev_minor) {
++ found = 1;
++ continue;
++ }
++ if (last_seek && !found)
++ continue;
++ if (md_ptr->type == seek_type
++ && md_ptr->major == dev_major
++ && md_ptr->minor == dev_minor)
++ break;
++ }
++ if (i == md->md_size)
++ return NULL;
++ i++;
++ prev = md_ptr->device;
++ md_ptr++;
++ /* Step 2: find the associated node */
++ for (; i < md->md_size && !strcmp(prev, md_ptr->device); i++, md_ptr++) {
++ if (last_seek && md_ptr->type == seek_type
++ && md_ptr->major == dev_major
++ && md_ptr->minor == dev_minor) {
++ found = 1;
++ continue;
++ }
++ if (last_seek && !found)
++ continue;
++ if (md_ptr->type == desired_type)
++ return md_ptr->node;
++ }
++ return NULL;
++}
++
++const char *get_not_associated_device(void *opaque,
++ const char *last_seek,
++ const enum device_type desired_type,
++ const enum device_type not_desired_type)
++{
++ struct media_devices *md = opaque;
++ struct media_device_entry *md_ptr = md->md_entry;
++ int i, skip = 0, found = 0;
++ char *prev = "", *result = NULL;
++
++ /* Step 1: Find a device without seek_type node */
++ for (i = 0; i < md->md_size; i++, md_ptr++) {
++ if (last_seek && !strcmp(md_ptr->node, last_seek)) {
++ found = 1;
++ continue;
++ }
++ if (last_seek && !found)
++ continue;
++ if (strcmp(prev, md_ptr->device)) {
++ if (!skip && result)
++ break;
++ prev = md_ptr->device;
++ skip = 0;
++ result = NULL;
++ }
++ if (md_ptr->type == not_desired_type)
++ skip = 1;
++ else if (!skip && !result && md_ptr->type == desired_type)
++ result = md_ptr->node;
++ }
++ if (skip)
++ result = NULL;
++
++ return result;
++}
+Index: gnomeradio-1.8/src/get_media_devices.h
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/get_media_devices.h
+@@ -0,0 +1,168 @@
++/*
++ Copyright © 2011 by Mauro Carvalho Chehab
++
++ The get_media_devices is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The libv4l2util Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the libv4l2util Library; if not, write to the Free
++ Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA
++ 02110-1335 USA.
++ */
++
++/*
++ * Version of the API
++ */
++#define GET_MEDIA_DEVICES_VERSION 0x0105
++
++/**
++ * enum device_type - Enumerates the type for each device
++ *
++ * The device_type is used to sort the media devices array.
++ * So, the order is relevant. The first device should be
++ * MEDIA_V4L_VIDEO.
++ */
++enum device_type {
++ UNKNOWN = 65535,
++ NONE = 65534,
++ MEDIA_V4L_VIDEO = 0,
++ MEDIA_V4L_VBI,
++ MEDIA_V4L_RADIO,
++ MEDIA_V4L_SUBDEV,
++
++ MEDIA_DVB_VIDEO = 100,
++ MEDIA_DVB_AUDIO,
++ MEDIA_DVB_SEC,
++ MEDIA_DVB_FRONTEND,
++ MEDIA_DVB_DEMUX,
++ MEDIA_DVB_DVR,
++ MEDIA_DVB_CA,
++ MEDIA_DVB_NET,
++ MEDIA_DVB_OSD,
++
++ MEDIA_SND_CARD = 200,
++ MEDIA_SND_CAP,
++ MEDIA_SND_OUT,
++ MEDIA_SND_CONTROL,
++ MEDIA_SND_HW,
++ MEDIA_SND_TIMER,
++ MEDIA_SND_SEQ,
++ /*
++ * FIXME: not all alsa devices were mapped. missing things like
++ * midi, midiC%iD%i and timer interfaces
++ */
++};
++
++enum bus_type {
++ MEDIA_BUS_UNKNOWN,
++ MEDIA_BUS_VIRTUAL,
++ MEDIA_BUS_PCI,
++ MEDIA_BUS_USB,
++};
++
++/**
++ * discover_media_devices() - Returns a list of the media devices
++ * @md_size: Returns the size of the media devices found
++ *
++ * This function reads the /sys/class nodes for V4L, DVB and sound,
++ * and returns an opaque desciptor that keeps a list of the devices.
++ * The fields on this list is opaque, as they can be changed on newer
++ * releases of this library. So, all access to it should be done via
++ * a function provided by the API. The devices are ordered by device,
++ * type and node. At return, md_size is updated.
++ */
++void *discover_media_devices(void);
++
++/**
++ * free_media_devices() - Frees the media devices array
++ *
++ * @opaque: media devices opaque descriptor
++ *
++ * As discover_media_devices() dynamically allocate space for the
++ * strings, feeing the list requires also to free those data. So,
++ * the safest and recommended way is to call this function.
++ */
++void free_media_devices(void *opaque);
++
++/**
++ * media_device_type() - returns a string with the name of a given type
++ *
++ * @type: media device type
++ */
++const char *media_device_type(const enum device_type type);
++
++/**
++ * display_media_devices() - prints a list of media devices
++ *
++ * @opaque: media devices opaque descriptor
++ */
++void display_media_devices(void *opaque);
++
++/**
++ * get_associated_device() - Return the next device associated with another one
++ *
++ * @opaque: media devices opaque descriptor
++ * @last_seek: last seek result. Use NULL to get the first result
++ * @desired_type: type of the desired device
++ * @seek_device: name of the device with you want to get an association.
++ *@ seek_type: type of the seek device. Using NONE produces the same
++ * result of using NULL for the seek_device.
++ *
++ * This function seeks inside the media_devices struct for the next device
++ * that it is associated with a seek parameter.
++ * It can be used to get an alsa device associated with a video device. If
++ * the seek_device is NULL or seek_type is NONE, it will just search for
++ * devices of the desired_type.
++ */
++const char *get_associated_device(void *opaque,
++ const char *last_seek,
++ const enum device_type desired_type,
++ const char *seek_device,
++ const enum device_type seek_type);
++
++/**
++ * fget_associated_device() - Return the next device associated with another one
++ *
++ * @opaque: media devices opaque descriptor
++ * @last_seek: last seek result. Use NULL to get the first result
++ * @desired_type: type of the desired device
++ * @fd_seek_device: file handler for the device where the association will
++ be made
++ *@ seek_type: type of the seek device. Using NONE produces the same
++ * result of using NULL for the seek_device.
++ *
++ * This function seeks inside the media_devices struct for the next device
++ * that it is associated with a seek parameter.
++ * It can be used to get an alsa device associated with an open file descriptor
++ */
++const char *fget_associated_device(void *opaque,
++ const char *last_seek,
++ const enum device_type desired_type,
++ const int fd_seek_device,
++ const enum device_type seek_type);
++
++/**
++ * get_not_associated_device() - Return the next device not associated with
++ * an specific device type.
++ *
++ * @opaque: media devices opaque descriptor
++ * @last_seek: last seek result. Use NULL to get the first result
++ * @desired_type: type of the desired device
++ * @not_desired_type: type of the seek device
++ *
++ * This function seeks inside the media_devices struct for the next physical
++ * device that doesn't support a non_desired type.
++ * This method is useful for example to return the audio devices that are
++ * provided by the motherboard.
++ */
++const char *get_not_associated_device(void *opaque,
++ const char *last_seek,
++ const enum device_type desired_type,
++ const enum device_type not_desired_type);
+Index: gnomeradio-1.8/configure.in
+===================================================================
+--- gnomeradio-1.8.orig/configure.in
++++ gnomeradio-1.8/configure.in
+@@ -5,7 +5,7 @@ AC_CONFIG_SRCDIR(src/gui.c)
+ AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
+
+ AM_MAINTAINER_MODE
+-AM_CONFIG_HEADER(config.h)
++AC_CONFIG_HEADERS([config.h])
+ AC_CONFIG_MACRO_DIR([m4])
+ AC_PROG_INTLTOOL([0.21])
+
+@@ -22,11 +22,13 @@ GETTEXT_PACKAGE=gnomeradio
+ AC_SUBST(GETTEXT_PACKAGE)
+ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", GETTEXT_PACKAGE)
+
++PKG_CHECK_MODULES(ALSA, alsa >= 1.0.25)
++AC_SUBST(ALSA_CFLAGS)
++AC_SUBST(ALSA_LIBS)
+
+ PKG_CHECK_MODULES(GNOME, dbus-glib-1 gconf-2.0 >= 2.12 gtk+-3.0 libgnome-media-profiles-3.0 >= 3.0)
+ AC_SUBST(GNOME_CFLAGS)
+ AC_SUBST(GNOME_LIBS)
+-AC_SUBST(LIRC)
+
+ PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0 gstreamer-plugins-base-1.0)
+ AC_SUBST(GSTREAMER_CFLAGS)
+@@ -46,6 +48,7 @@ fi
+
+ AM_GCONF_SOURCE_2
+
++AC_SUBST(LIRC)
+ LIRC=""
+ if test "$enable_lirc" != "no"; then
+ AC_CHECK_LIB(lirc_client, lirc_init,
+@@ -58,7 +61,7 @@ AC_ARG_ENABLE(install_schemas,
+ [ --disable-install-schemas Disable installation of the gconf schemas])
+ AM_CONDITIONAL(INSTALL_SCHEMAS, test x$enable_install_schemas != xno)
+
+-AC_OUTPUT([
++AC_CONFIG_FILES([
+ gnomeradio.spec
+ Makefile
+ src/Makefile
+@@ -74,3 +77,5 @@ data/icons/48x48/Makefile
+ data/icons/scalable/Makefile
+ help/Makefile
+ ])
++
++AC_OUTPUT
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -36,6 +36,7 @@
+ #include "lirc.h"
+ #include "prefs.h"
+ #include "record.h"
++
+ #include "../data/pixmaps/digits.xpm"
+ #include "../data/pixmaps/signal.xpm"
+ #include "../data/pixmaps/stereo.xpm"
+@@ -50,6 +51,16 @@
+
+ #define TRANSLATORS "TRANSLATORS"
+
++/* Latency is not a big problem for radio (no video to sync with), and
++ USB radio devices benefit from a larger default latency */
++#define DEFAULT_LATENCY 500
++
++int alsa_loopback = 1;
++char *alsa_playback = NULL;
++char *alsa_capture = NULL;
++int alsa_latency = DEFAULT_LATENCY;
++int alsa_debug = 0;
++
+ GtkWidget* mute_button, *preset_combo;
+ GtkAdjustment *adj;
+ GtkWidget* app;
+@@ -68,7 +79,7 @@ static GtkWidget *prefs_button;
+
+ static int timeout_id, bp_timeout_id = -1, bp_timeout_steps = 0;
+
+-static DBusGProxy * connect_to_session (void);
++static DBusGProxy * connect_to_session (void);
+
+ static gboolean is_first_start(void)
+ {
+@@ -121,7 +132,7 @@ static gboolean initial_frequency_scan_c
+ gtk_label_set_text(GTK_LABEL(fsd->label), text);
+ g_free(text);
+
+- g_print("%.2f is a station\n", freq);
++ g_print("Found a station at %.2f MHz\n", freq);
+
+ *f = freq;
+ fsd->stations = g_list_append(fsd->stations, f);
+@@ -815,17 +826,25 @@ void rec_button_clicked_cb(GtkButton *bu
+ void toggle_volume(void)
+ {
+ static int old_vol;
+- int vol = mixer_get_volume();
++ int muted, vol
++
++ muted = radio_is_muted();
++ vol = mixer_get_volume();
+
+ if (vol) {
+ old_vol = vol;
+ vol = 0;
+ } else {
+ vol = old_vol;
+- }
++ }
++
+ mixer_set_volume(vol);
+ gtk_volume_button_set_value(mute_button, vol);
+- /*gtk_adjustment_set_value(volume, vol);*/
++
++ if (muted)
++ radio_unmute();
++ else
++ radio_mute();
+ }
+
+ /*
+@@ -1221,6 +1240,97 @@ key_press_event_cb(GtkWidget *app, GdkEv
+ return FALSE;
+ }
+
++enum
++{
++ ARG_ALSA_LOOPBACK,
++ ARG_NO_ALSA_LOOPBACK,
++ ARG_ALSA_CAPTURE,
++ ARG_ALSA_PLAYBACK,
++ ARG_ALSA_LATENCY,
++ ARG_ALSA_DEBUG
++};
++
++static gboolean
++parse_one_option (gint opt, const gchar * arg, GError ** err)
++{
++ switch (opt) {
++ case ARG_ALSA_LOOPBACK:
++ alsa_loopback = 1;
++ break;
++ case ARG_NO_ALSA_LOOPBACK:
++ alsa_loopback = 0;
++ break;
++ case ARG_ALSA_CAPTURE:
++ if (!strncmp(arg, "hw:", 3) && isdigit(arg[3]) && arg[4] == ',' && isdigit(arg[5])) {
++ alsa_capture = g_strdup (arg);
++ break;
++ } else {
++ g_set_error(err, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
++ _("invalid argument name '%s', must be e.g. 'hw:1,0'"), arg);
++ return FALSE;
++ }
++ case ARG_ALSA_PLAYBACK:
++ if (!strncmp(arg, "hw:", 3) && isdigit(arg[3]) && arg[4] == ',' && isdigit(arg[5])) {
++ alsa_playback = g_strdup (arg);
++ break;
++ } else {
++ g_set_error(err, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
++ _("invalid argument name '%s', must be e.g. 'hw:0,0'"), arg);
++ return FALSE;
++ }
++ case ARG_ALSA_LATENCY:
++ alsa_latency = atoi (arg);
++ break;
++ case ARG_ALSA_DEBUG:
++ alsa_debug = 1;
++ break;
++ default:
++ g_set_error (err, G_OPTION_ERROR, G_OPTION_ERROR_UNKNOWN_OPTION,
++ _("Unknown option"));
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++static gboolean
++option_alsa_cb (const gchar * opt,
++ const gchar * arg, gpointer data, GError ** err)
++{
++ static const struct
++ {
++ const gchar *opt;
++ int val;
++ } options[] = {
++ {
++ "--alsa-loopback", ARG_ALSA_LOOPBACK}, {
++ "--no-alsa-loopback", ARG_NO_ALSA_LOOPBACK}, {
++ "--alsa-capture", ARG_ALSA_CAPTURE}, {
++ "--alsa-playback", ARG_ALSA_PLAYBACK}, {
++ "--alsa-latency", ARG_ALSA_LATENCY}, {
++ "--alsa-debug", ARG_ALSA_DEBUG}, {
++ NULL}
++ };
++ gint val = 0, n;
++
++ for (n = 0; options[n].opt; n++) {
++ if (!strcmp (opt, options[n].opt)) {
++ val = options[n].val;
++ break;
++ }
++ }
++
++ return parse_one_option (val, arg, err);
++}
++
++G_GNUC_NORETURN static gboolean
++option_version_cb (const gchar * opt,
++ const gchar * arg, gpointer data, GError ** err)
++{
++ g_print ("%s %s\n", PACKAGE, VERSION);
++ exit (0);
++}
++
+ int main(int argc, char* argv[])
+ {
+ GList *ptr;
+@@ -1229,23 +1339,38 @@ int main(int argc, char* argv[])
+ gboolean do_scan = FALSE;
+ GOptionContext *ctx;
+ const GOptionEntry entries[] = {
+- { "scan", 0, 0, G_OPTION_ARG_NONE, &do_scan, N_("Scan for stations"), NULL },
++ { "alsa-loopback", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Enable loopback digital audio from radio device (default: enable)"), NULL },
++ { "no-alsa-loopback", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Disable loopback digital audio from radio device"), NULL },
++ { "alsa-capture", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set capture device for loopback digital audio (default: auto)"), N_("DEVICE") },
++ { "alsa-playback", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set playback device for loopback digital audio (default: default)"), N_("DEVICE") },
++ { "alsa-latency", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set latency for loopback digital audio in ms (default: 500)"), N_("TIME") },
++ { "alsa-debug", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Enable debug output for loopback digital audio"), NULL },
++ { "scan", '\0', 0, G_OPTION_ARG_NONE, &do_scan, N_("Scan for stations"), NULL },
++ { "version", 0, G_OPTION_FLAG_NO_ARG | G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, option_version_cb, NULL, NULL },
+ { NULL }
+ };
++
+ bindtextdomain(PACKAGE, GNOMELOCALEDIR);
+ bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+ textdomain(PACKAGE);
+
+ g_set_application_name(_("Gnomeradio"));
++ g_setenv("PULSE_PROP_media.role", "production", TRUE);
+
+- ctx = g_option_context_new("- Gnomeradio");
+- g_option_context_add_main_entries(ctx, entries, GETTEXT_PACKAGE);
++ ctx = g_option_context_new("- Listen to FM radio");
++ g_option_context_add_main_entries(ctx, entries, GETTEXT_PACKAGE);
++ g_option_context_add_group(ctx, gtk_get_option_group (TRUE));
+ g_option_context_add_group(ctx, gst_init_get_option_group());
+- g_option_context_set_ignore_unknown_options(ctx, TRUE);
++ if (g_option_context_parse(ctx, &argc, &argv, &err) == FALSE) {
++ g_print(_("%s\nRun '%s --help' to see a full list of available command line options.\n"),
++ err->message, argv[0]);
++ g_error_free(err);
++ exit(1);
++ }
++ g_option_context_free(ctx);
+
+ gtk_init(&argc, &argv);
+ gtk_window_set_default_icon_name("gnomeradio");
+- g_setenv("PULSE_PROP_media.role", "production", TRUE);
+ /* Main app */
+ main_visible = FALSE;
+ app = gnome_radio_gui();
+@@ -1268,11 +1393,12 @@ int main(int argc, char* argv[])
+ }
+
+ load_settings();
++
+ start_mixer(FALSE, app);
+ start_radio(FALSE, app);
+ if (is_first_start() || do_scan) {
+ if (!radio_is_init()) {
+- g_message(_("Could not scan. Radio is not initialized."));
++ fprintf(stderr, "Could not scan. Radio is not initialized\n");
+ } else {
+ initial_frequency_scan(app);
+ set_first_time_flag();
+@@ -1305,12 +1431,12 @@ int main(int argc, char* argv[])
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ */
+- g_message(_("Could not start lirc!"));
++ fprintf(stderr, "Could not start lirc\n");
+ }
+ else
+ start_lirc();
+ #endif
+-
++
+ /* Connect the Session Management signals
+ */
+
+@@ -1351,7 +1477,7 @@ static DBusGProxy * connect_to_session (
+ {
+ DBusGConnection *connection;
+ DBusGProxy *proxy;
+- GError *error = NULL;
++ GError *error = NULL;
+
+ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+
+Index: gnomeradio-1.8/src/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/src/Makefile.am
++++ gnomeradio-1.8/src/Makefile.am
+@@ -1,35 +1,39 @@
+-INCLUDES = -I$(top_srcdir) -I$(includedir) \
+- $(GNOME_CFLAGS) $(GSTREAMER_CFLAGS) $(XML_CFLAGS)\
+- -DG_LOG_DOMAIN=\"gnomeradio\" \
+- -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+- -DDATADIR=\""$(datadir)/"\" \
+- -DPREFIX=\""$(prefix)/"\" \
+- -DLIBDIR=\""$(libdir)/"\" \
+- -DSYSCONFDIR=\""$(sysconfdir)/"\"
+-
++INCLUDES = \
++ -I$(top_srcdir) -I$(includedir) \
++ $(ALSA_CFLAGS) $(GNOME_CFLAGS) $(GSTREAMER_CFLAGS) $(XML_CFLAGS) \
++ -DG_LOG_DOMAIN=\"gnomeradio\" \
++ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
++ -DDATADIR=\""$(datadir)/"\" \
++ -DPREFIX=\""$(prefix)/"\" \
++ -DLIBDIR=\""$(libdir)/"\" \
++ -DSYSCONFDIR=\""$(sysconfdir)/"\"
+
+ bin_PROGRAMS = gnomeradio
+
+-gnomeradio_SOURCES = \
+- gui.h \
+- lirc.h \
+- prefs.h \
+- radio.h \
+- rec_tech.h \
+- record.h \
+- tech.h \
+- trayicon.h \
+- v4l1.h \
+- v4l2.h \
+- gui.c \
+- lirc.c \
+- prefs.c \
+- radio.c \
+- rec_tech.c \
+- record.c \
+- tech.c \
+- trayicon.c \
+- v4l1.c \
+- v4l2.c
++gnomeradio_SOURCES = \
++ alsa_stream.h \
++ get_media_devices.h \
++ gui.h \
++ lirc.h \
++ prefs.h \
++ radio.h \
++ rec_tech.h \
++ record.h \
++ tech.h \
++ trayicon.h \
++ v4l1.h \
++ v4l2.h \
++ alsa_stream.c \
++ get_media_devices.c \
++ gui.c \
++ lirc.c \
++ prefs.c \
++ radio.c \
++ rec_tech.c \
++ record.c \
++ tech.c \
++ trayicon.c \
++ v4l1.c \
++ v4l2.c
+
+-gnomeradio_LDADD = $(GNOME_LIBS) $(GSTREAMER_LIBS) $(XML_LIBS) $(LIRC)
++gnomeradio_LDADD = $(ALSA_LIBS) $(GNOME_LIBS) $(GSTREAMER_LIBS) $(XML_LIBS) $(LIRC)
+Index: gnomeradio-1.8/src/radio.c
+===================================================================
+--- gnomeradio-1.8.orig/src/radio.c
++++ gnomeradio-1.8/src/radio.c
+@@ -26,6 +26,14 @@
+ #include "radio.h"
+ #include "v4l1.h"
+ #include "v4l2.h"
++#include "alsa_stream.h"
++#include "get_media_devices.h"
++
++extern int alsa_loopback;
++extern char *alsa_playback;
++extern char *alsa_capture;
++extern int alsa_latency;
++extern int alsa_debug;
+
+ static RadioDev *dev;
+
+@@ -53,6 +61,8 @@ try_v4l1:
+ fprintf(stderr, "Initializing v4l1 failed\n");
+ dev->finalize (dev);
+ dev = NULL;
++ if (alsa_loopback)
++ alsa_loopback = 0;
+ if (driver != DRIVER_ANY)
+ goto failure;
+ } else {
+@@ -66,6 +76,8 @@ try_v4l2:
+ fprintf(stderr, "Initializing v4l2 failed\n");
+ dev->finalize (dev);
+ dev = NULL;
++ if (alsa_loopback)
++ alsa_loopback = 0;
+ if (driver != DRIVER_ANY)
+ goto failure;
+ } else {
+@@ -73,6 +85,33 @@ try_v4l2:
+ }
+
+ success:
++ if (alsa_loopback) {
++ if (alsa_capture == NULL) {
++ void *md = discover_media_devices();
++ const char *p = strrchr(device, '/');
++ if (p)
++ p++;
++ else
++ p = device;
++
++ p = get_associated_device(md, NULL, MEDIA_SND_CAP, p, MEDIA_V4L_RADIO);
++ if (p)
++ alsa_capture = strdup(p);
++ else
++ alsa_loopback = 0;
++
++ free_media_devices(md);
++ }
++
++ if (alsa_loopback) {
++ if (alsa_playback == NULL)
++ alsa_playback = "default";
++
++ fprintf(stderr, "alsa: Using audio loopback device from %s (%s) to %s\n",
++ alsa_capture, device, alsa_playback);
++ }
++ }
++
+ radio_unmute();
+ failure:
+
+@@ -113,12 +152,17 @@ void radio_unmute(void)
+ {
+ if (dev)
+ dev->mute (dev, 0);
++ if (alsa_loopback)
++ alsa_thread_startup(alsa_playback, alsa_capture,
++ alsa_latency, stderr, alsa_debug);
+ }
+
+ void radio_mute(void)
+ {
+ if (dev)
+ dev->mute (dev, 1);
++ if (alsa_loopback)
++ alsa_thread_stop();
+ }
+
+ int radio_is_muted(void)
diff -pruN 1.8-2/debian/patches/gnomeradio-auto_device.patch 1.8-2ubuntu32/debian/patches/gnomeradio-auto_device.patch
--- 1.8-2/debian/patches/gnomeradio-auto_device.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-auto_device.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,224 @@
+Description: Added option to auto detect radio device.
+Author: POJAR GEORGE
+
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -30,6 +30,8 @@
+ #include "rb_gst_media_types.h"
+ #include "rb_missing_plugins.h"
+
++extern int autodetect;
++
+ extern GtkWidget *preset_combo;
+ extern GtkAdjustment *adj;
+
+@@ -67,7 +69,10 @@ gboolean save_settings(void)
+ return FALSE;
+
+ /* Store general settings */
+- gconf_client_set_string(client, "/apps/gnomeradio/device", settings.device, NULL);
++ if (autodetect)
++ gconf_client_set_string(client, "/apps/gnomeradio/device", "auto", NULL);
++ else
++ gconf_client_set_string(client, "/apps/gnomeradio/device", settings.device, NULL);
+ gconf_client_set_string(client, "/apps/gnomeradio/driver", settings.driver, NULL);
+ gconf_client_set_string(client, "/apps/gnomeradio/mixer", settings.mixer, NULL);
+ gconf_client_set_bool(client, "/apps/gnomeradio/muted", settings.muted, NULL);
+@@ -128,7 +133,7 @@ gboolean load_settings(void)
+ /* Load general settings */
+ settings.device = gconf_client_get_string(client, "/apps/gnomeradio/device" , NULL);
+ if (!settings.device)
+- settings.device = g_strdup("/dev/radio0");
++ settings.device = g_strdup("auto");
+ settings.driver = gconf_client_get_string(client, "/apps/gnomeradio/driver" , NULL);
+ if (!settings.driver)
+ settings.driver = g_strdup("any");
+@@ -223,6 +228,24 @@ static gboolean device_entry_activate_cb
+ return FALSE;
+ }
+
++static void
++device_entry_auto_activate_cb(GtkEntry* entry, const gchar* text, gpointer data)
++{
++ GtkEditable *editable;
++
++ editable = GTK_EDITABLE (entry);
++
++ text = gtk_entry_get_text(GTK_ENTRY(device_entry));
++
++ autodetect = 0;
++ if (0 == strcmp(text, "auto")) {
++ g_signal_emit_by_name(G_OBJECT (editable), "activate");
++ autodetect = 1;
++
++ gtk_widget_grab_focus(add_button);
++ }
++}
++
+ static gboolean mixer_entry_activate_cb(GtkWidget *widget, gpointer data)
+ {
+ const gchar *text;
+@@ -1246,7 +1269,10 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_grid_attach (GTK_GRID (grid), label, 1, 1, 1, 1);
+
+ device_entry = gtk_entry_new();
+- gtk_entry_set_text(GTK_ENTRY(device_entry), settings.device);
++ if (autodetect)
++ gtk_entry_set_placeholder_text(GTK_ENTRY(device_entry), "auto");
++ else
++ gtk_entry_set_text(GTK_ENTRY(device_entry), settings.device);
+ gtk_grid_attach(GTK_GRID(grid), device_entry, 2, 1, 1, 1);
+
+ label = gtk_label_new (_("Mixer Source:"));
+@@ -1264,6 +1290,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+
+ g_signal_connect(G_OBJECT(device_entry), "hide", G_CALLBACK(device_entry_activate_cb), app);
+ g_signal_connect(G_OBJECT(device_entry), "activate", G_CALLBACK(device_entry_activate_cb), NULL);
++ g_signal_connect(G_OBJECT(device_entry), "changed", G_CALLBACK(device_entry_auto_activate_cb), NULL);
+ g_signal_connect(G_OBJECT(mixer_entry), "hide", G_CALLBACK(mixer_entry_activate_cb), app);
+ g_signal_connect(G_OBJECT(mixer_entry), "activate", G_CALLBACK(mixer_entry_activate_cb), NULL);
+ g_signal_connect(G_OBJECT(mute_on_exit_cb), "toggled", G_CALLBACK(mute_on_exit_toggled_cb), NULL);
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -59,6 +59,8 @@
+ USB radio devices benefit from a larger default latency */
+ #define DEFAULT_LATENCY 500
+
++int autodetect;
++
+ int alsa_loopback = 1;
+ char *alsa_playback = NULL;
+ char *alsa_capture = NULL;
+@@ -387,10 +389,22 @@ void start_radio(gboolean restart, GtkWi
+ driver = DRIVER_V4L2;
+ }
+
++ autodetect = 0;
++ if (0 == strcmp(settings.device, "auto"))
++ autodetect = 1;
++
+ if (!radio_init(settings.device, driver)) {
+- char *caption = g_strdup_printf(_("Could not open radio device \"%s\"!"), settings.device);
+- char *detail = g_strdup_printf(_("Check your settings and make sure that no other program is using %s.\n"
+- "Also make sure that you have read access to it."), settings.device);
++ char *caption, *detail;
++
++ if (autodetect) {
++ caption = g_strdup_printf (_("Could not detect radio device!"));
++ detail = g_strdup_printf (_("To listen to the FM radio, you will need an FM tuner connected to or installed "
++ "in the computer, and an antenna connected to the tuner to receive a signal."));
++ } else {
++ caption = g_strdup_printf (_("Could not open radio device \"%s\"!"), settings.device);
++ detail = g_strdup_printf (_("You can auto detect radio device typing \"auto\" in the device settings field."));
++ }
++
+ show_error_message(caption, detail);
+ g_free(caption);
+ g_free(detail);
+Index: gnomeradio-1.8/src/radio.c
+===================================================================
+--- gnomeradio-1.8.orig/src/radio.c
++++ gnomeradio-1.8/src/radio.c
+@@ -29,6 +29,8 @@
+ #include "alsa_stream.h"
+ #include "get_media_devices.h"
+
++extern int autodetect;
++
+ extern int alsa_loopback;
+ extern char *alsa_playback;
+ extern char *alsa_capture;
+@@ -40,11 +42,35 @@ static RadioDev *dev;
+ /*
+ * These functions handle the radio device
+ */
+-
+ int radio_init(char *device, DriverType driver)
+ {
+ int rv = -1;
+
++ if (autodetect) {
++ void *md;
++ const char *p = NULL;
++
++ *device = 0;
++ md = discover_media_devices();
++ if (!md) {
++ fprintf (stderr, "open: Failed to open \"auto\" device");
++ if (*device)
++ fprintf (stderr, " at %s\n", device);
++ else
++ fprintf (stderr, "\n");
++ goto failure;
++ }
++
++ while (1) {
++ p = get_associated_device(md, p, MEDIA_V4L_RADIO, NULL, NONE);
++ if (!p)
++ break;
++ asprintf(&device, "/dev/%s", p);
++ }
++
++ free_media_devices(md);
++ }
++
+ switch (driver) {
+ case DRIVER_ANY:
+ case DRIVER_V4L2:
+@@ -58,7 +84,7 @@ try_v4l1:
+ dev = v4l1_radio_dev_new();
+ rv = dev->init (dev, device);
+ if (rv == 0) {
+- fprintf(stderr, "Initializing v4l1 failed\n");
++ fprintf(stderr, "v4l1: Initialization failed\n");
+ dev->finalize (dev);
+ dev = NULL;
+ if (alsa_loopback)
+@@ -73,7 +99,7 @@ try_v4l2:
+ dev = v4l2_radio_dev_new();
+ rv = dev->init (dev, device);
+ if (rv == 0) {
+- fprintf(stderr, "Initializing v4l2 failed\n");
++ fprintf(stderr, "v4l2: Initialization failed\n");
+ dev->finalize (dev);
+ dev = NULL;
+ if (alsa_loopback)
+@@ -85,6 +111,9 @@ try_v4l2:
+ }
+
+ success:
++ if (autodetect)
++ fprintf(stderr, "open: Using radio device: %s\n", device);
++
+ if (alsa_loopback) {
+ if (alsa_capture == NULL) {
+ void *md = discover_media_devices();
+@@ -113,8 +142,10 @@ success:
+ }
+
+ radio_unmute();
+-failure:
+
++failure:
++ if (autodetect)
++ free (device);
+ return rv;
+ }
+
+Index: gnomeradio-1.8/data/gnomeradio.schemas.in
+===================================================================
+--- gnomeradio-1.8.orig/data/gnomeradio.schemas.in
++++ gnomeradio-1.8/data/gnomeradio.schemas.in
+@@ -29,7 +29,7 @@
+ /apps/gnomeradio/device
+ gnomeradio
+ string
+- /dev/radio0
++ auto
+
+ Radio device
+ The radio device to use (e.g. /dev/radio0)
diff -pruN 1.8-2/debian/patches/gnomeradio-automake.patch 1.8-2ubuntu32/debian/patches/gnomeradio-automake.patch
--- 1.8-2/debian/patches/gnomeradio-automake.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-automake.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,267 @@
+Description: Fix build with Automake 1.13.
+Author: POJAR GEORGE
+
+Index: gnomeradio-1.8/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/Makefile.am
++++ gnomeradio-1.8/Makefile.am
+@@ -1,4 +1,4 @@
+-distuninstallcheck_listfiles = find . -type f -print | grep -v '^\./var/scrollkeeper'
++ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
+
+ SUBDIRS = help data po src
+
+Index: gnomeradio-1.8/configure.ac
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/configure.ac
+@@ -0,0 +1,95 @@
++AC_PREREQ([2.69])
++
++AC_INIT([gnomeradio],[1.8],[http://bugzilla.gnome.org/enter_bug.cgi?product=gnomeradio],[gnomeradio],[http://projects.gnome.org/gnomeradio/])
++
++AM_MAINTAINER_MODE([enable])
++AC_CONFIG_SRCDIR([src/gui.c])
++AC_CONFIG_HEADERS([config.h])
++AC_CONFIG_MACRO_DIR([m4])
++
++AM_INIT_AUTOMAKE([1.11 dist-xz tar-ustar no-dist-gzip check-news])
++
++AM_SILENT_RULES([yes])
++
++GETTEXT_PACKAGE=gnomeradio
++AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, ["$GETTEXT_PACKAGE"], [Define to the Gettext package name])
++AC_SUBST(GETTEXT_PACKAGE)
++IT_PROG_INTLTOOL([0.40.0])
++
++YELP_HELP_INIT
++
++AC_PROG_CXX
++AC_PROG_CC
++AC_PROG_CPP
++AC_PROG_INSTALL
++AC_PROG_LN_S
++AC_PROG_MAKE_SET
++
++LT_PREREQ([2.2])
++LT_INIT
++
++AC_CHECK_HEADERS([fcntl.h limits.h memory.h stdlib.h string.h sys/ioctl.h sys/time.h unistd.h])
++
++AC_TYPE_SSIZE_T
++AC_CHECK_MEMBERS([struct stat.st_rdev])
++
++AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
++AC_HEADER_MAJOR
++AC_FUNC_MALLOC
++AC_FUNC_REALLOC
++AC_CHECK_FUNCS([memset realpath rint strcasecmp strchr strcspn strdup strncasecmp strrchr strstr])
++
++PKG_CHECK_MODULES(ALSA, alsa >= 1.0.25)
++AC_SUBST(ALSA_CFLAGS)
++AC_SUBST(ALSA_LIBS)
++
++PKG_CHECK_MODULES(GNOME, dbus-glib-1 gconf-2.0 >= 2.12 gtk+-3.0)
++AC_SUBST(GNOME_CFLAGS)
++AC_SUBST(GNOME_LIBS)
++
++PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0 >= 1.0.5 gstreamer-plugins-base-1.0 >= 1.0.5 gstreamer-pbutils-1.0 >= 1.0.5)
++AC_SUBST(GSTREAMER_CFLAGS)
++AC_SUBST(GSTREAMER_LIBS)
++
++PKG_CHECK_MODULES(XML, libxml-2.0 >= 2.4)
++AC_SUBST(XML_CFLAGS)
++AC_SUBST(XML_LIBS)
++
++AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
++
++if test x"$GCONFTOOL" = xno; then
++ AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
++fi
++
++AM_GCONF_SOURCE_2
++
++AC_SUBST(LIRC)
++LIRC=""
++if test "$enable_lirc" != "no"; then
++ AC_CHECK_LIB(lirc_client, lirc_init,
++ AC_DEFINE(HAVE_LIRC, 1, "Is LIRC installed") LIRC="-llirc_client",,)
++else
++ echo "*** lirc disabled"
++fi
++
++AC_ARG_ENABLE(install_schemas,
++ [ --disable-install-schemas Disable installation of the gconf schemas])
++AM_CONDITIONAL(INSTALL_SCHEMAS, test x$enable_install_schemas != xno)
++
++AC_CONFIG_FILES([gnomeradio.spec
++ Makefile
++ data/Makefile
++ data/icons/16x16/Makefile
++ data/icons/22x22/Makefile
++ data/icons/24x24/Makefile
++ data/icons/32x32/Makefile
++ data/icons/48x48/Makefile
++ data/icons/Makefile
++ data/icons/scalable/Makefile
++ data/pixmaps/Makefile
++ help/Makefile
++ po/Makefile.in
++ src/Makefile])
++
++AC_OUTPUT
++
+Index: gnomeradio-1.8/configure.in
+===================================================================
+--- gnomeradio-1.8.orig/configure.in
++++ /dev/null
+@@ -1,83 +0,0 @@
+-AC_PREREQ(2.52)
+-
+-AC_INIT(gnomeradio, 1.8, http://mfcn.ilo.de/gnomeradio)
+-AC_CONFIG_SRCDIR(src/gui.c)
+-AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
+-
+-AM_MAINTAINER_MODE
+-AC_CONFIG_HEADERS([config.h])
+-AC_CONFIG_MACRO_DIR([m4])
+-AC_PROG_INTLTOOL([0.21])
+-
+-AM_PROG_LIBTOOL
+-AC_ISC_POSIX
+-AC_PROG_CC
+-AC_PROG_INSTALL
+-AC_PROG_MAKE_SET
+-
+-
+-ALL_LINGUAS="ar am az be bg ca cs da de dz en_CA en_GB es eu fi fr he hr hu it ja lv mk ml mn ms nb nl oc pa pl pt pt_BR ru rw sk sr sr@Latn sv tr uk vi zh_CN zh_TW"
+-AM_GLIB_GNU_GETTEXT
+-GETTEXT_PACKAGE=gnomeradio
+-AC_SUBST(GETTEXT_PACKAGE)
+-AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", GETTEXT_PACKAGE)
+-
+-PKG_CHECK_MODULES(ALSA, alsa >= 1.0.25)
+-AC_SUBST(ALSA_CFLAGS)
+-AC_SUBST(ALSA_LIBS)
+-
+-PKG_CHECK_MODULES(GNOME, dbus-glib-1 gconf-2.0 >= 2.12 gtk+-3.0)
+-AC_SUBST(GNOME_CFLAGS)
+-AC_SUBST(GNOME_LIBS)
+-
+-PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0 >= 1.0.5 gstreamer-plugins-base-1.0 >= 1.0.5 gstreamer-pbutils-1.0 >= 1.0.5)
+-AC_SUBST(GSTREAMER_CFLAGS)
+-AC_SUBST(GSTREAMER_LIBS)
+-
+-PKG_CHECK_MODULES(XML, libxml-2.0 >= 2.4)
+-AC_SUBST(XML_CFLAGS)
+-AC_SUBST(XML_LIBS)
+-
+-AM_SILENT_RULES([yes])
+-
+-YELP_HELP_INIT
+-
+-AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
+-
+-if test x"$GCONFTOOL" = xno; then
+- AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
+-fi
+-
+-AM_GCONF_SOURCE_2
+-
+-AC_SUBST(LIRC)
+-LIRC=""
+-if test "$enable_lirc" != "no"; then
+- AC_CHECK_LIB(lirc_client, lirc_init,
+- AC_DEFINE(HAVE_LIRC, 1, "Is LIRC installed") LIRC="-llirc_client",,)
+-else
+- echo "*** lirc disabled"
+-fi
+-
+-AC_ARG_ENABLE(install_schemas,
+- [ --disable-install-schemas Disable installation of the gconf schemas])
+-AM_CONDITIONAL(INSTALL_SCHEMAS, test x$enable_install_schemas != xno)
+-
+-AC_CONFIG_FILES([
+-gnomeradio.spec
+-Makefile
+-src/Makefile
+-po/Makefile.in
+-data/Makefile
+-data/pixmaps/Makefile
+-data/icons/Makefile
+-data/icons/16x16/Makefile
+-data/icons/22x22/Makefile
+-data/icons/24x24/Makefile
+-data/icons/32x32/Makefile
+-data/icons/48x48/Makefile
+-data/icons/scalable/Makefile
+-help/Makefile
+-])
+-
+-AC_OUTPUT
+Index: gnomeradio-1.8/po/LINGUAS
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/po/LINGUAS
+@@ -0,0 +1,45 @@
++ar
++am
++az
++be
++bg
++ca
++cs
++da
++de
++dz
++en_CA
++en_GB
++es
++eu
++fi
++fr
++he
++hr
++hu
++it
++ja
++lv
++mk
++ml
++mn
++ms
++nb
++nl
++oc
++pa
++pl
++pt
++pt_BR
++ru
++rw
++sk
++sr
++sr@Latn
++sv
++tr
++uk
++vi
++zh_CN
++zh_TW
++
+Index: gnomeradio-1.8/src/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/src/Makefile.am
++++ gnomeradio-1.8/src/Makefile.am
+@@ -1,4 +1,4 @@
+-INCLUDES = \
++AM_CPPFLAGS = \
+ -I$(top_srcdir) -I$(includedir) \
+ $(ALSA_CFLAGS) $(GNOME_CFLAGS) $(GSTREAMER_CFLAGS) $(XML_CFLAGS) \
+ -DG_LOG_DOMAIN=\"gnomeradio\" \
+@@ -44,4 +44,4 @@ gnomeradio_SOURCES = \
+ v4l1.c \
+ v4l2.c
+
+-gnomeradio_LDADD = $(ALSA_LIBS) $(GNOME_LIBS) $(GSTREAMER_LIBS) $(XML_LIBS) $(LIRC)
++gnomeradio_LDADD = $(ALSA_LIBS) $(GNOME_LIBS) $(GSTREAMER_LIBS) $(XML_LIBS) $(LIRC) -lpthread
diff -pruN 1.8-2/debian/patches/gnomeradio-build.patch 1.8-2ubuntu32/debian/patches/gnomeradio-build.patch
--- 1.8-2/debian/patches/gnomeradio-build.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-build.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,70 @@
+## Description: Fix build in amd64, due to casting gpointers to (gint). Now we use the GPOINTER_TO_INT macro wherever it's needed.
+## Origin: upstream, no
+## Author: Pojar George
+## Forwarded: no
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -537,7 +537,7 @@ static gboolean poll_volume_change(gpoin
+
+ static void change_frequency(gpointer data)
+ {
+- gboolean increase = (gboolean)data;
++ gboolean increase = (gboolean) GPOINTER_TO_INT (data);
+ gint v = gtk_adjustment_get_value(adj);
+
+ if (increase)
+@@ -590,7 +590,7 @@ static void step_button_released_cb(GtkB
+ static gboolean scan_freq(gpointer data)
+ {
+ static gint start, mom, max;
+- gint dir = (gint)(data);
++ gint dir = GPOINTER_TO_INT (data);
+
+ if (!max) {
+ max = (FREQ_MAX - FREQ_MIN) * STEPS;
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -322,7 +322,7 @@ static void add_button_clicked_cb(GtkWid
+ menuitem = gtk_menu_item_new_with_label(ps->title);
+
+ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, mom_ps);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, (gpointer)mom_ps);
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (mom_ps));
+ gtk_widget_show(menuitem);
+ }
+
+@@ -430,7 +430,7 @@ static void name_cell_edited_cb(GtkCellR
+ menuitem = gtk_menu_item_new_with_label(ps->title);
+
+ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, *row);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, (gpointer)mom_ps);
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (mom_ps));
+ gtk_widget_show(menuitem);
+ }
+
+Index: gnomeradio-1.8/src/trayicon.c
+===================================================================
+--- gnomeradio-1.8.orig/src/trayicon.c
++++ gnomeradio-1.8/src/trayicon.c
+@@ -56,7 +56,7 @@ static void quit_menuitem_activate_cb(Gt
+ void preset_menuitem_activate_cb(GtkMenuItem *menuitem, gpointer user_data)
+ {
+ preset* ps;
+- mom_ps = (int)user_data;
++ mom_ps = GPOINTER_TO_INT (user_data);
+
+ g_assert(mom_ps >= 0 && mom_ps < g_list_length(settings.presets));
+
+@@ -76,7 +76,7 @@ void create_tray_menu(GtkWidget *app) {
+ GtkWidget *menuitem = gtk_menu_item_new_with_label(ps->title);
+
+ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, i);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, (gpointer)i);
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (i));
+ gtk_widget_show(menuitem);
+ }
+
diff -pruN 1.8-2/debian/patches/gnomeradio-crash.patch 1.8-2ubuntu32/debian/patches/gnomeradio-crash.patch
--- 1.8-2/debian/patches/gnomeradio-crash.patch 2011-10-28 19:58:55.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-crash.patch 2015-04-13 18:42:54.000000000 +0000
@@ -11,10 +11,10 @@ Subject: Don't update menus while main-v
svn path=/trunk/; revision=208
---
-diff --git a/ChangeLog b/ChangeLog
-index 973a754..814a52d 100644
---- a/ChangeLog
-+++ b/ChangeLog
+Index: b/ChangeLog
+===================================================================
+--- a/ChangeLog 2012-12-03 10:14:50.230899947 +0000
++++ b/ChangeLog 2012-12-03 10:14:53.066899862 +0000
@@ -1,5 +1,12 @@
2008-09-13 Jörgen Scheibengruber
@@ -28,11 +28,11 @@ index 973a754..814a52d 100644
* configure.in:
* src/Makefile.am:
-diff --git a/src/gui.c b/src/gui.c
-index faca2b7..6c2155f 100644
---- a/src/gui.c
-+++ b/src/gui.c
-@@ -54,6 +54,8 @@ GtkTooltips *tooltips;
+Index: b/src/gui.c
+===================================================================
+--- a/src/gui.c 2012-12-03 10:14:52.710899873 +0000
++++ b/src/gui.c 2012-12-03 10:14:53.066899862 +0000
+@@ -54,6 +54,8 @@
int mom_ps;
gnomeradio_settings settings;
@@ -41,7 +41,7 @@ index faca2b7..6c2155f 100644
static GtkWidget *drawing_area;
static GdkPixmap *digits, *signal_s, *stereo;
static GtkWidget *freq_scale;
-@@ -1110,6 +1112,7 @@ int main(int argc, char* argv[])
+@@ -1110,6 +1112,7 @@
NULL);
gtk_window_set_default_icon_name("gnomeradio");
/* Main app */
@@ -49,7 +49,7 @@ index faca2b7..6c2155f 100644
app = gnome_radio_gui();
/* Initizialize GStreamer */
-@@ -1150,6 +1153,7 @@ int main(int argc, char* argv[])
+@@ -1150,6 +1153,7 @@
preset_combo_set_item(mom_ps);
gtk_widget_show_all(app);
@@ -57,11 +57,11 @@ index faca2b7..6c2155f 100644
/* Create an tray icon */
create_tray_icon(app);
-diff --git a/src/prefs.c b/src/prefs.c
-index 425d116..7b8ee20 100644
---- a/src/prefs.c
-+++ b/src/prefs.c
-@@ -30,6 +30,8 @@ extern GtkTooltips *tooltips;
+Index: b/src/prefs.c
+===================================================================
+--- a/src/prefs.c 2012-12-03 10:14:50.230899947 +0000
++++ b/src/prefs.c 2012-12-03 10:14:53.066899862 +0000
+@@ -30,6 +30,8 @@
extern int mom_ps;
extern gnomeradio_settings settings;
@@ -70,7 +70,7 @@ index 425d116..7b8ee20 100644
static GtkWidget *device_entry;
static GtkWidget *mixer_combo;
static GtkWidget *mute_on_exit_cb;
-@@ -310,16 +312,18 @@ static void add_button_clicked_cb(GtkWidget *widget, gpointer data)
+@@ -310,16 +312,18 @@
v_scb = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(list_view));
gtk_adjustment_set_value(v_scb, v_scb->upper);
@@ -99,7 +99,7 @@ index 425d116..7b8ee20 100644
buffer = g_strdup_printf("%d", g_list_length(settings.presets) - 1);
path = gtk_tree_path_new_from_string(buffer);
-@@ -356,15 +360,17 @@ static void del_button_clicked_cb(GtkWidget *widget, gpointer data)
+@@ -356,15 +360,17 @@
gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path);
gtk_list_store_remove(list_store, &iter);
@@ -107,16 +107,17 @@ index 425d116..7b8ee20 100644
- if (--mom_ps < 0) mom_ps = 0;
- if (!g_list_length(settings.presets)) mom_ps = -1;
- preset_combo_set_item(mom_ps);
+-
+- menuitems = GTK_MENU_SHELL(tray_menu)->children;
+- g_assert(*row < g_list_length(menuitems));
+- menuitem = g_list_nth_data(menuitems, *row);
+- gtk_widget_destroy(menuitem);
+ if (main_visible) {
+ gtk_combo_box_remove_text(GTK_COMBO_BOX(preset_combo), *row + 1);
+ if (--mom_ps < 0) mom_ps = 0;
+ if (!g_list_length(settings.presets)) mom_ps = -1;
+ preset_combo_set_item(mom_ps);
-
-- menuitems = GTK_MENU_SHELL(tray_menu)->children;
-- g_assert(*row < g_list_length(menuitems));
-- menuitem = g_list_nth_data(menuitems, *row);
-- gtk_widget_destroy(menuitem);
++
+ menuitems = GTK_MENU_SHELL(tray_menu)->children;
+ g_assert(*row < g_list_length(menuitems));
+ menuitem = g_list_nth_data(menuitems, *row);
@@ -125,7 +126,7 @@ index 425d116..7b8ee20 100644
gtk_tree_path_prev(path);
gtk_tree_view_set_cursor(GTK_TREE_VIEW(list_view), path, NULL, FALSE);
-@@ -420,20 +426,22 @@ static void name_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *pa
+@@ -420,20 +426,22 @@
if (ps->title) g_free(ps->title);
ps->title = g_strdup(new_val);
@@ -162,5 +163,3 @@ index 425d116..7b8ee20 100644
gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path);
gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, new_val, -1);
---
-cgit v0.8.3.1
diff -pruN 1.8-2/debian/patches/gnomeradio.desktop.patch 1.8-2ubuntu32/debian/patches/gnomeradio.desktop.patch
--- 1.8-2/debian/patches/gnomeradio.desktop.patch 2011-10-28 19:37:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio.desktop.patch 2015-04-13 18:42:54.000000000 +0000
@@ -1,12 +1,24 @@
-diff -Nur trunk/data/gnomeradio.desktop.in trunk.new/data/gnomeradio.desktop.in
---- trunk/data/gnomeradio.desktop.in 2006-11-25 13:06:06.000000000 +0100
-+++ trunk.new/data/gnomeradio.desktop.in 2007-10-07 19:14:06.000000000 +0200
-@@ -3,7 +3,7 @@
- _Comment=Listen to FM-radio
+Index: gnomeradio-1.8/data/gnomeradio.desktop.in
+===================================================================
+--- gnomeradio-1.8.orig/data/gnomeradio.desktop.in 2013-09-25 13:05:41.526733873 +0000
++++ gnomeradio-1.8/data/gnomeradio.desktop.in 2013-09-25 13:09:07.518727749 +0000
+@@ -1,13 +1,14 @@
+ [Desktop Entry]
+-_Name=FM-Radio Tuner
+-_Comment=Listen to FM-radio
++_Name=Gnomeradio
++_Comment=Listen to FM radio
++_Keywords=Radio;Tuner;FM;
Exec=gnomeradio
Icon=gnomeradio
-Categories=Application;AudioVideo;
-+Categories=AudioVideo;Audio;Tuner
- StartupNotify=true
+-StartupNotify=true
Terminal=false
Type=Application
++Categories=GNOME;GTK;AudioVideo;Audio;Tuner;
++X-GNOME-DocPath=gnomeradio/gnomeradio.xml
+ X-GNOME-Bugzilla-Bugzilla=GNOME
+ X-GNOME-Bugzilla-Product=gnomeradio
+ X-GNOME-Bugzilla-Component=general
+-X-GNOME-DocPath=gnomeradio/gnomeradio.xml
++StartupNotify=true
diff -pruN 1.8-2/debian/patches/gnomeradio-device.patch 1.8-2ubuntu32/debian/patches/gnomeradio-device.patch
--- 1.8-2/debian/patches/gnomeradio-device.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-device.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,462 @@
+Description: Don't stop radio twice to avoid double free or corruption.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1110660
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/v4l2.c
+===================================================================
+--- gnomeradio-1.8.orig/src/v4l2.c
++++ gnomeradio-1.8/src/v4l2.c
+@@ -93,13 +93,35 @@ v4l2_radio_is_init(RadioDev *radio_dev)
+ return (dev->fd >= 0);
+ }
+
++static double
++v4l2_radio_get_freq(RadioDev *radio_dev)
++{
++ V4L2RadioDev *dev = (V4L2RadioDev*)radio_dev;
++ struct v4l2_frequency freq;
++
++ if (dev->fd < 0)
++ return -1;
++
++ memset(&freq, 0, sizeof(freq));
++ freq.tuner = 0;
++ freq.type = V4L2_TUNER_RADIO;
++
++ if (ioctl (dev->fd, VIDIOC_G_FREQUENCY, &freq) < 0) {
++ perror ("VIDIOC_G_FREQUENCY");
++ return -1;
++ }
++
++ double result = freq.frequency / (double) dev->freq_fact;
++ return round(result * 100) / 100;
++}
++
+ static void
+ v4l2_radio_set_freq(RadioDev *radio_dev, float frequency)
+ {
+ V4L2RadioDev *dev = (V4L2RadioDev*)radio_dev;
+ struct v4l2_frequency freq;
+
+- if (dev->fd<0)
++ if (dev->fd < 0)
+ return;
+
+ memset(&freq, 0, sizeof(freq));
+@@ -120,7 +142,7 @@ v4l2_radio_mute(RadioDev *radio_dev, int
+ V4L2RadioDev *dev = (V4L2RadioDev*)radio_dev;
+ struct v4l2_control control;
+
+- if (dev->fd<0)
++ if (dev->fd < 0)
+ return;
+
+ memset(&control, 0, sizeof(control));
+@@ -131,12 +153,32 @@ v4l2_radio_mute(RadioDev *radio_dev, int
+ }
+
+ static int
++v4l2_radio_is_muted(RadioDev *radio_dev)
++{
++ V4L2RadioDev *dev = (V4L2RadioDev*)radio_dev;
++ struct v4l2_control control;
++
++ if (dev->fd < 0)
++ return -1;
++
++ memset(&control, 0, sizeof(control));
++ control.id = V4L2_CID_AUDIO_MUTE;
++
++ if (ioctl (dev->fd, VIDIOC_G_CTRL, &control) < 0) {
++ perror ("VIDIOC_S_CTRL");
++ return -1;
++ }
++
++ return control.value;
++}
++
++static int
+ v4l2_radio_get_stereo(RadioDev *radio_dev)
+ {
+ V4L2RadioDev *dev = (V4L2RadioDev*)radio_dev;
+ struct v4l2_tuner tuner;
+
+- if (dev->fd<0)
++ if (dev->fd < 0)
+ return -1;
+
+ memset(&tuner, 0, sizeof(tuner));
+@@ -155,7 +197,7 @@ v4l2_radio_get_signal(RadioDev *radio_de
+ V4L2RadioDev *dev = (V4L2RadioDev*)radio_dev;
+ struct v4l2_tuner tuner;
+
+- if (dev->fd<0)
++ if (dev->fd < 0)
+ return -1;
+
+ memset(&tuner, 0, sizeof(tuner));
+@@ -181,7 +223,7 @@ v4l2_radio_finalize(RadioDev *radio_dev)
+ RadioDev*
+ v4l2_radio_dev_new (void)
+ {
+- RadioDev *dev;
++ RadioDev *dev;
+ V4L2RadioDev *v4l2_dev;
+
+ v4l2_dev = malloc (sizeof (V4L2RadioDev));
+@@ -190,8 +232,10 @@ v4l2_radio_dev_new (void)
+ dev = (RadioDev*)v4l2_dev;
+ dev->init = v4l2_radio_init;
+ dev->is_init = v4l2_radio_is_init;
++ dev->get_freq = v4l2_radio_get_freq;
+ dev->set_freq = v4l2_radio_set_freq;
+ dev->mute = v4l2_radio_mute;
++ dev->is_muted = v4l2_radio_is_muted;
+ dev->get_stereo = v4l2_radio_get_stereo;
+ dev->get_signal = v4l2_radio_get_signal;
+ dev->finalize = v4l2_radio_finalize;
+Index: gnomeradio-1.8/src/v4l1.c
+===================================================================
+--- gnomeradio-1.8.orig/src/v4l1.c
++++ gnomeradio-1.8/src/v4l1.c
+@@ -45,10 +45,9 @@ v4l1_radio_init(RadioDev *radio_dev, cha
+ return 0;
+
+ tuner.tuner = 0;
+- if (ioctl (dev->fd, VIDIOCGTUNER, &tuner) < 0)
++ if (ioctl (dev->fd, VIDIOCGTUNER, &tuner) < 0) {
+ dev->freq_fact = 16;
+- else
+- {
++ } else {
+ if ((tuner.flags & VIDEO_TUNER_LOW) == 0)
+ dev->freq_fact = 16;
+ else
+@@ -64,19 +63,33 @@ int v4l1_radio_is_init(RadioDev *radio_d
+ return (dev->fd >= 0);
+ }
+
++static double
++v4l1_radio_get_freq(RadioDev *radio_dev)
++{
++ V4L1RadioDev *dev = (V4L1RadioDev*)radio_dev;
++ long freq;
++
++ if (dev->fd < 0)
++ return -1;
++
++ if (ioctl (dev->fd, VIDIOCGFREQ, &freq)) {
++ perror ("VIDIOCGFREQ");
++ return -1;
++ }
++
++ return freq / (double) dev->freq_fact;
++}
++
+ static void
+ v4l1_radio_set_freq(RadioDev *radio_dev, float freq)
+ {
+ V4L1RadioDev *dev = (V4L1RadioDev*)radio_dev;
+- int ifreq;
++ int ifreq;
+
+- if (dev->fd<0)
+- return;
++ if (dev->fd < 0)
++ return;
+
+ ifreq = (freq+1.0/32)*dev->freq_fact;
+-#if 0
+- printf("Setting to %i (= %.2f)\n", ifreq, freq);
+-#endif
+
+ /* FIXME: Do we need really need these checks? */
+ if ((freq > 108) || (freq < 65))
+@@ -84,7 +97,7 @@ v4l1_radio_set_freq(RadioDev *radio_dev,
+
+ assert ((freq <= 108) && (freq > 65));
+
+- if (ioctl(dev->fd, VIDIOCSFREQ, &ifreq) < 0)
++ if (ioctl(dev->fd, VIDIOCSFREQ, &ifreq) < 0)
+ perror ("VIDIOCSFREQ");
+ }
+
+@@ -92,37 +105,54 @@ static void
+ v4l1_radio_mute(RadioDev *radio_dev, int mute)
+ {
+ V4L1RadioDev *dev = (V4L1RadioDev*)radio_dev;
+- struct video_audio vid_aud;
++ struct video_audio vid_aud;
+
+- if (dev->fd<0)
+- return;
++ if (dev->fd < 0)
++ return;
+
+- if (ioctl(dev->fd, VIDIOCGAUDIO, &vid_aud)) {
++ if (ioctl(dev->fd, VIDIOCGAUDIO, &vid_aud)) {
+ perror("VIDIOCGAUDIO");
+ memset (&vid_aud, 0, sizeof (struct video_audio));
+ }
+ if (mute) {
+- vid_aud.flags |= VIDEO_AUDIO_MUTE;
++ vid_aud.flags |= VIDEO_AUDIO_MUTE;
+ } else {
+ vid_aud.volume = 0xFFFF;
+ vid_aud.flags &= ~VIDEO_AUDIO_MUTE;
+ vid_aud.mode = VIDEO_SOUND_STEREO;
+ }
+- if (ioctl(dev->fd, VIDIOCSAUDIO, &vid_aud))
++ if (ioctl(dev->fd, VIDIOCSAUDIO, &vid_aud))
+ perror("VIDIOCSAUDIO");
+ }
+
+ static int
++v4l1_radio_is_muted(RadioDev *radio_dev)
++{
++ V4L1RadioDev *dev = (V4L1RadioDev*)radio_dev;
++ struct video_audio vid_aud;
++
++ if (dev->fd < 0)
++ return -1;
++
++ if (ioctl (dev->fd, VIDIOCGAUDIO, &vid_aud)) {
++ perror ("VIDIOCGAUDIO");
++ return -1;
++ }
++
++ return (vid_aud.flags & VIDEO_AUDIO_MUTE);
++}
++
++static int
+ v4l1_radio_get_stereo(RadioDev *radio_dev)
+ {
+ V4L1RadioDev *dev = (V4L1RadioDev*)radio_dev;
+- struct video_audio va;
+- va.mode=-1;
++ struct video_audio va;
++ va.mode=-1;
+
+- if (dev->fd<0)
+- return -1;
++ if (dev->fd < 0)
++ return -1;
+
+- if (ioctl (dev->fd, VIDIOCGAUDIO, &va) < 0)
++ if (ioctl (dev->fd, VIDIOCGAUDIO, &va) < 0)
+ return -1;
+ if (va.mode == VIDEO_SOUND_STEREO)
+ return 1;
+@@ -134,17 +164,17 @@ static int
+ v4l1_radio_get_signal(RadioDev *radio_dev)
+ {
+ V4L1RadioDev *dev = (V4L1RadioDev*)radio_dev;
+- struct video_tuner vt;
+- int signal;
++ struct video_tuner vt;
++ int signal;
+
+- if (dev->fd<0)
+- return -1;
++ if (dev->fd < 0)
++ return -1;
+
+- memset(&vt,0,sizeof(vt));
+- ioctl (dev->fd, VIDIOCGTUNER, &vt);
+- signal=vt.signal>>13;
++ memset(&vt,0,sizeof(vt));
++ ioctl (dev->fd, VIDIOCGTUNER, &vt);
++ signal=vt.signal>>13;
+
+- return signal;
++ return signal;
+ }
+
+ static void
+@@ -160,7 +190,7 @@ v4l1_radio_finalize(RadioDev *radio_dev)
+ RadioDev*
+ v4l1_radio_dev_new (void)
+ {
+- RadioDev *dev;
++ RadioDev *dev;
+ V4L1RadioDev *v4l1_dev;
+
+ v4l1_dev = malloc(sizeof(V4L1RadioDev));
+@@ -169,8 +199,10 @@ v4l1_radio_dev_new (void)
+
+ dev->init = v4l1_radio_init;
+ dev->is_init = v4l1_radio_is_init;
++ dev->get_freq = v4l1_radio_get_freq;
+ dev->set_freq = v4l1_radio_set_freq;
+ dev->mute = v4l1_radio_mute;
++ dev->is_muted = v4l1_radio_is_muted;
+ dev->get_stereo = v4l1_radio_get_stereo;
+ dev->get_signal = v4l1_radio_get_signal;
+ dev->finalize = v4l1_radio_finalize;
+Index: gnomeradio-1.8/src/radio.c
+===================================================================
+--- gnomeradio-1.8.orig/src/radio.c
++++ gnomeradio-1.8/src/radio.c
+@@ -35,10 +35,7 @@ static RadioDev *dev;
+
+ int radio_init(char *device, DriverType driver)
+ {
+- int rv = -1;
+- if (dev) {
+- radio_stop();
+- }
++ int rv = -1;
+
+ switch (driver) {
+ case DRIVER_ANY:
+@@ -84,42 +81,68 @@ failure:
+
+ int radio_is_init(void)
+ {
+- if (dev) return dev->is_init (dev);
+- else return 0;
++ if (dev)
++ return dev->is_init (dev);
++ else
++ return 0;
+ }
+
+ void radio_stop(void)
+ {
+ radio_mute();
+
+- if (dev) dev->finalize (dev);
++ if (dev)
++ dev->finalize (dev);
++}
++
++double radio_get_freq(void)
++{
++ if (dev)
++ return dev->get_freq (dev);
++ else
++ return -1;
+ }
+
+ void radio_set_freq(float frequency)
+ {
+- if (dev) dev->set_freq (dev, frequency);
++ if (dev)
++ dev->set_freq (dev, frequency);
+ }
+
+ void radio_unmute(void)
+ {
+- if (dev) dev->mute (dev, 0);
++ if (dev)
++ dev->mute (dev, 0);
+ }
+
+ void radio_mute(void)
+ {
+- if (dev) dev->mute (dev, 1);
++ if (dev)
++ dev->mute (dev, 1);
++}
++
++int radio_is_muted(void)
++{
++ if (dev)
++ return dev->is_muted (dev);
++ else
++ return -1;
+ }
+
+ int radio_get_stereo(void)
+ {
+- if (dev) return dev->get_stereo (dev);
+- else return -1;
++ if (dev)
++ return dev->get_stereo (dev);
++ else
++ return -1;
+ }
+
+ int radio_get_signal(void)
+ {
+- if (dev) return dev->get_signal (dev);
+- else return -1;
++ if (dev)
++ return dev->get_signal (dev);
++ else
++ return -1;
+ }
+
+ int radio_check_station(float freq)
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -448,10 +448,8 @@ static gboolean draw_cb(GtkWidget *widge
+ void exit_gnome_radio(void)
+ {
+ if (settings.mute_on_exit)
+- {
+- radio_mute();
+ radio_stop();
+- }
++
+ mixer_close();
+ save_settings();
+ gtk_main_quit();
+@@ -1153,10 +1151,8 @@ static void
+ session_die_cb(void)
+ {
+ if (settings.mute_on_exit)
+- {
+- radio_mute();
+ radio_stop();
+- }
++
+ mixer_close();
+ gtk_main_quit();
+ exit (0);
+Index: gnomeradio-1.8/src/radio.h
+===================================================================
+--- gnomeradio-1.8.orig/src/radio.h
++++ gnomeradio-1.8/src/radio.h
+@@ -20,13 +20,15 @@
+ typedef struct _RadioDev RadioDev;
+ struct _RadioDev
+ {
+- int (*init) (RadioDev *dev, char *device);
+- int (*is_init) (RadioDev *dev);
+- void (*set_freq) (RadioDev *dev, float freq);
+- void (*mute) (RadioDev *dev, int mute);
+- int (*get_stereo) (RadioDev *dev);
+- int (*get_signal) (RadioDev *dev);
+- void (*finalize) (RadioDev *dev);
++ int (*init) (RadioDev *dev, char *device);
++ int (*is_init) (RadioDev *dev);
++ double (*get_freq) (RadioDev *dev);
++ void (*set_freq) (RadioDev *dev, float freq);
++ void (*mute) (RadioDev *dev, int mute);
++ int (*is_muted) (RadioDev *dev);
++ int (*get_stereo) (RadioDev *dev);
++ int (*get_signal) (RadioDev *dev);
++ void (*finalize) (RadioDev *dev);
+ };
+
+ typedef enum _DriverType DriverType;
+@@ -43,6 +45,8 @@ int radio_is_init(void);
+
+ void radio_stop(void);
+
++double radio_get_freq(void);
++
+ void radio_set_freq(float freq);
+
+ int radio_check_station(float freq);
+@@ -51,6 +55,8 @@ void radio_unmute(void);
+
+ void radio_mute(void);
+
++int radio_is_muted(void);
++
+ int radio_get_stereo(void);
+
+ int radio_get_signal(void);
diff -pruN 1.8-2/debian/patches/gnomeradio-dialog.patch 1.8-2ubuntu32/debian/patches/gnomeradio-dialog.patch
--- 1.8-2/debian/patches/gnomeradio-dialog.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-dialog.patch 2015-04-13 18:43:38.000000000 +0000
@@ -0,0 +1,152 @@
+Description: Make sure dialogs has a transient parent.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1441768
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -46,6 +46,7 @@ extern gnomeradio_settings settings;
+
+ extern gboolean main_visible;
+
++static GtkWidget *dialog;
+ static GtkWidget *device_entry;
+ static GtkWidget *mixer_entry;
+ static GtkWidget *audio_box;
+@@ -1077,51 +1078,31 @@ presets_load (void)
+ }
+
+ static void
+-add_default_file_filters (GtkWidget *file_chooser)
+-{
+- GtkFileFilter *file_filter_all;
+- GtkFileFilter *file_filter_xml;
+-
+- file_filter_all = gtk_file_filter_new ();
+- gtk_file_filter_set_name(file_filter_all, _("All files"));
+- gtk_file_filter_add_pattern (file_filter_all, "*");
+-
+- file_filter_xml = gtk_file_filter_new ();
+- gtk_file_filter_set_name (file_filter_xml, _("XML files"));
+- gtk_file_filter_add_pattern (file_filter_xml, "*.xml");
+- gtk_file_filter_add_pattern (file_filter_xml, "*.XML");
+- gtk_file_filter_add_mime_type (file_filter_xml, "text/xml");
+-
+- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_chooser), file_filter_all);
+- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_chooser), file_filter_xml);
+-
+- gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (file_chooser), file_filter_xml);
+-}
+-
+-static void
+ save_to_file_cb (GtkWidget *button, gpointer data)
+ {
+- GtkWidget *dialog;
++ GtkWidget *chooser;
++ GtkFileFilter *filter;
+
+ save_to_file = TRUE;
+
+- dialog = gtk_file_chooser_dialog_new (_("Select file name"),
+- NULL,
+- GTK_FILE_CHOOSER_ACTION_SAVE,
+- _("_Save"), GTK_RESPONSE_ACCEPT,
+- _("_Cancel"), GTK_RESPONSE_CANCEL,
+- NULL);
+-
++ chooser = gtk_file_chooser_dialog_new (_("Select File"),
++ GTK_WINDOW (dialog),
++ GTK_FILE_CHOOSER_ACTION_SAVE,
++ _("_Save"), GTK_RESPONSE_ACCEPT,
++ _("_Cancel"), GTK_RESPONSE_CANCEL,
++ NULL);
++
++ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser), GNOMERADIO_XML_FILENAME);
++ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(chooser), TRUE);
++
++ filter = gtk_file_filter_new();
++ gtk_file_filter_add_pattern(filter, "*.xml");
++ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(chooser), filter);
+
+-
+- gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dialog), TRUE);
+- add_default_file_filters (dialog);
+- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), "gnomeradio.xml");
+-
+- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
++ if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) {
+ gchar *filename;
+
+- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog));
++ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser));
+ if (!g_str_has_suffix (filename, ".xml")) {
+ gchar *tmp_file;
+
+@@ -1134,7 +1115,7 @@ save_to_file_cb (GtkWidget *button, gpoi
+ g_free (filename);
+ }
+
+- gtk_widget_destroy (dialog);
++ gtk_widget_destroy (chooser);
+
+ save_to_file = FALSE;
+ }
+@@ -1142,28 +1123,31 @@ save_to_file_cb (GtkWidget *button, gpoi
+ static void
+ load_from_file_cb (GtkWidget *button, gpointer data)
+ {
+- GtkWidget *dialog;
++ GtkWidget *chooser;
++ GtkFileFilter *filter;
+
+ load_from_file = TRUE;
+
+- dialog = gtk_file_chooser_dialog_new (_("Select file name"),
+- NULL,
+- GTK_FILE_CHOOSER_ACTION_OPEN,
+- _("_Open"), GTK_RESPONSE_ACCEPT,
+- _("_Cancel"), GTK_RESPONSE_CANCEL,
+- NULL);
++ chooser = gtk_file_chooser_dialog_new(_("Select File"),
++ GTK_WINDOW(dialog),
++ GTK_FILE_CHOOSER_ACTION_OPEN,
++ _("_Cancel"), GTK_RESPONSE_CANCEL,
++ _("_Open"), GTK_RESPONSE_ACCEPT,
++ NULL);
+
+- add_default_file_filters (dialog);
++ filter = gtk_file_filter_new();
++ gtk_file_filter_add_pattern(filter, "*.xml");
++ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(chooser), filter);
+
+- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
++ if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) {
+ gchar *filename;
+
+- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
++ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
+ presets_file_parse (filename);
+ g_free (filename);
+ }
+
+- gtk_widget_destroy (dialog);
++ gtk_widget_destroy (chooser);
+
+ load_from_file = FALSE;
+ }
+@@ -1189,7 +1173,6 @@ gboolean action_mode (gint mode)
+
+ GtkWidget* prefs_window(GtkWidget *app)
+ {
+- GtkWidget *dialog;
+ GtkWidget *content_area;
+ GtkWidget *box;
+ GtkWidget *grid;
+@@ -1329,7 +1312,6 @@ GtkWidget* prefs_window(GtkWidget *app)
+
+ list_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+ tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
+- gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(tree_view), TRUE);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
diff -pruN 1.8-2/debian/patches/gnomeradio-documentation.patch 1.8-2ubuntu32/debian/patches/gnomeradio-documentation.patch
--- 1.8-2/debian/patches/gnomeradio-documentation.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-documentation.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,7939 @@
+Description: Use new documentation infrastructure.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1091476
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/Makefile.am
++++ gnomeradio-1.8/Makefile.am
+@@ -1,22 +1,20 @@
+-SUBDIRS = help data po src
++distuninstallcheck_listfiles = find . -type f -print | grep -v '^\./var/scrollkeeper'
+
+-distuninstallcheck_listfiles = find . -type f -print | grep -v scrollkeeper
++SUBDIRS = help data po src
+
+-EXTRA_DIST = intltool-update.in \
+- intltool-merge.in \
+- intltool-extract.in \
+- README \
+- README.lirc \
+- README.recording \
+- gnomeradio.spec.in \
+- gnomeradio.spec \
+- gnome-doc-utils.make
++EXTRA_DIST = \
++ intltool-update.in \
++ intltool-merge.in \
++ intltool-extract.in \
++ README \
++ README.lirc \
++ README.recording \
++ gnomeradio.spec.in \
++ gnomeradio.spec
+
+ CLEANFILES = gnomeradio.spec
+
+-DISTCLEANFILES = gnome-doc-utils.make \
+- intltool-extract \
+- intltool-merge \
+- intltool-update
+-
+-DISTCHECK_CONFIGURE_FLAGS = --disable-scrollkeeper
++DISTCLEANFILES = \
++ intltool-extract \
++ intltool-merge \
++ intltool-update
+Index: gnomeradio-1.8/help/C/gnomeradio.xml
+===================================================================
+--- gnomeradio-1.8.orig/help/C/gnomeradio.xml
++++ /dev/null
+@@ -1,826 +0,0 @@
+-
+-
+-
+-
+-
+-
+-]>
+-
+-
+-
+-
+-
+-
+-
+- &app; Manual V&manrevision;
+-
+- 2002
+-
+- Jörgen Scheibengruber
+-
+-
+-
+-
+- Gnomeradio is a FM-tuner application for the GNOME desktop.
+-
+-
+-
+- GNOME Documentation Project
+-
+-
+-&legal;
+-
+-
+-
+-
+- Jörgen
+- Scheibengruber
+-
+- GNOME Documentation Project
+- mfcn@gmx.de
+-
+-
+-
+-
+-
+-
+- 1.0
+- 2002
+-
+- Jörgen Scheibengruber
+- mfcn@gmx.de
+- GNOME Documentation Project
+-
+-
+-
+- This manual describes version &appversion; of &app;.
+-
+-
+- Feedback
+- To report a bug or make a suggestion regarding &app; or this
+- manual, send a e-mail to Jörgen Scheibengruber .
+-
+-
+-
+- &app;
+-
+-
+-
+-
+-
+-Introduction
+-
+-&app; is a FM-Tuner application for the GNOME desktop.
+-It should work with all tuner hardware that is supported by the
+-video4linux drivers.
+-
+-
+-To start &app; open the applications menu, then choose
+-
+-Multimedia
+-&app;
+-
+-or type gnomeradio in a shell.
+-
+-
+-
+-
+-
+-Usage
+-
+-
+-Status window
+-
+- The black box in the upper left of &app; is the status window
+-
+-
+-
+-
+-
+- The black box in the upper left of &app; is the status window.
+-
+-
+-
+-
+-
+-The status window is located in the upper left corner of the &app; main window. It consists of:
+-
+-
+-
+-
+- a label showing wether the reception is mono or stereo,
+-
+-
+-
+-
+- an icon indicating the quality of the reception and
+-
+-
+-
+-
+- the current frequency.
+-
+-
+-
+-
+-
+-
+-
+-Frequency controls
+-
+- Use these controls to change the frequency
+-
+-
+-
+-
+-
+- Use these controls to change the frequency.
+-
+-
+-
+-
+-
+-The following controls are available to change the frequency:
+-
+-
+-
+-
+- Using the slider you can change the frequency very quick.
+-
+-
+-
+-
+- The scan backwards button (left-arrow with bar) will decrease the frequency until if detects the next radio station with good reception.
+-
+-
+-
+-
+- The 0.05 MHz backwards button (left-arrow without bar) decreases the frequency by 0.05 MHz.
+-
+-
+-
+-
+- The 0.05 MHz forward button (right-arrow without bar) increases the frequency by 0.05 MHz.
+-
+-
+-
+-
+- The scan forwards button (right-arrow with bar) does the same as the "scan backwards" button, but it increases
+- the frequency.
+-
+-
+-
+-
+-
+-
+-
+-Volume controls
+-
+- Use these controls to change the volume
+-
+-
+-
+-
+-
+- Use these controls to change the volume.
+-
+-
+-
+-
+-
+-Controls available to change the volume:
+-
+-
+-
+-
+- Use the slider to adjust the volume. Note that it will only work if you have picked the right mixer
+- source , in the Dialog.
+-
+-
+-
+-
+- Toggling the button showing the speaker will mute/unmute &app;.
+-
+-
+-
+-
+-
+-
+-
+-Presets menubutton
+-
+- Choose a preset using the menubutton
+-
+-
+-
+-
+-
+- Choose a preset using the menubutton.
+-
+-
+-
+-
+-
+-Use the menubutton in the upper right to choose a radio station preset.
+-You can edit presets in the Dialog.
+-
+-
+-
+-
+-
+-Misc. controls
+-
+- Remaining controls
+-
+-
+-
+-
+-
+- Remaining controls.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- The record button opens the Dialog.
+-
+-
+-
+-
+- Clicking the about button will show a window with some credits.
+-
+-
+-
+-
+- Behind the settings button hides the Dialog.
+-
+-
+-
+-
+- The quit button will terminate &app;
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-Preferences
+-
+-To open the preferences dialog, click the preferences button in the main window.
+-
+-
+-If you are finished click OK to accept your changes
+-or Cancel to undo the changes.
+-
+-
+-
+-General preferences
+-
+- General preferences
+-
+-
+-
+-
+-
+- General preferences.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Radio Device: Enter your radio device. Unless you have several radio
+- tuners installed this is usually /dev/radio.
+-
+-
+-
+-
+- Mixer Source: Choose the mixer source that is able to control the volume
+- of your radio tuner. The combobox lists all devices that you can choose as a recording source.
+- You should usually pick one of these, otherwise you won't be able to record radio. If you have
+- set up own names for the sources in gnome volume control, these names will be shown in paranthesis
+- behind the "official" name.
+-
+-
+-
+-
+- Mute on Exit: Uncheck this checkbox, if you want that the radio keeps on
+- playing after you have terminated &app;.
+-
+-
+-
+-
+-
+-
+-Editing presets
+-
+- Editing presets
+-
+-
+-
+-
+-
+- Editing presets.
+-
+-
+-
+-
+-
+-Here you can add some preset radio stations. You can select one of these
+-using the or your
+- remote control.
+-
+-
+-
+-
+- Name: Enter a name for the preset (usually the name
+- of the radio station).
+-
+-
+-
+-
+- Frequency: Choose the frequency for the radio station.
+-
+-
+-
+-
+- Click the button add preset (shows a +) to add the preset
+- to the list.
+-
+-
+-
+-
+- The button remove preset (shows a -) will remove the currently
+- selected preset from the list.
+-
+-
+-
+-
+- Use the button update preset to update the selected preset with
+- the values currently entered in the name and frequency entries.
+-
+-
+-
+-
+-
+-
+-
+-
+-Recording
+-
+-You can use gnomeradio to (live)record radio. In this dialog you
+-have to give some information, on how this shall be done.
+-
+-You need the external application sox
+-installed in order to use the recording functionality of &app;.
+-If you want to record as MP3,
+-you have to install a MP3 encoder, too. Currently the MP3 encoders
+-lame and
+-bladeenc are supported.
+-To record files as ogg vorbis you need
+-oggenc .
+-
+-
+-To open this dialog, click the record button in the main window.
+-
+-
+-Use the Start button to start recording.
+-Otherwise click Cancel to close the dialog.
+-
+-
+-
+-General settings
+-
+- General recording settings
+-
+-
+-
+-
+-
+- General recording settings.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Audio Device: Enter your audio device. Unless you have several soundcards
+- installed this is usually /dev/audio.
+-
+-
+-
+-
+- Filename: Choose a filename and destination for the file in which the audio
+- data should be stored. This file should usually have the suffix ".wav", in case you want to record
+- as wave data, ".mp3", in case the audio should be stored in the mp3-format or ".ogg", for ogg vorbis
+- files.
+-
+-
+-
+-
+- Record as: Select Wave (.wav) , if you want the audio
+- data to be stored in the wave format (uncompressed - about 10 megabyte per minute playlength).
+- Otherwise choose MP3/Ogg (.mp3/.ogg) which will lead to a much lower filesize, but
+- also a little bit lower audio quality.
+-
+-
+-
+-
+-
+-
+-
+-Wave settings
+-
+- The wave settings
+-
+-
+-
+-
+-
+- The wave settings.
+-
+-
+-
+-
+-
+-These settings apply to the mp3 file, too.
+-
+-
+-
+-
+- Sample rate: Choose a sample rate for the recording audio file. Higher sampling
+- rate means better quality. 44100 kHz is a good default (aprox. CD quality). If the reception
+- is bad you can take a lower sampling rate, because the quality won't be that good anyways.
+-
+-
+-
+-
+- Sample format: Available options are 8 or 16 bit. Usually you want to
+- take 16 bit.
+-
+-
+-
+-
+- Record in: Select stereo , if you want to record in
+- stereo or mono otherwise. It probably doen't make much sense to record
+- in stereo, if the reception is only mono.
+-
+-
+-
+-
+-
+-
+-
+-MP3/Ogg settings
+-
+- The MP3/Ogg settings
+-
+-
+-
+-
+-
+- The MP3 settings.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Encoder: A list of supported MP3/Ogg encoders that you have installed. Choose the one you like the
+- best. Currently lame ,
+- bladeenc and
+- oggenc are supported.
+- The encoder must be in your PATH, otherwise &app; can't find it.
+-
+-
+-
+-
+- Bitrate: Choose a bitrate. This will have the largest impact
+- on the size and quality of the resulting MP3/Ogg file. The higher the bitrate the better the
+- quality. 128 kb/s is usually a good value which will result in files that are aprox. 1 MB
+- per minute playlength.
+-
+-
+-
+-
+-
+-
+-Recording status window
+-
+- The status window
+-
+-
+-
+-
+-
+- The status window.
+-
+-
+-
+-
+-
+-Click Stop Recording to stop the recording and return to
+-the main window. The window shows the name and size of the file in which the audio
+-data is being stored.
+-
+-
+-
+-
+-
+-
+-Keybindings
+-
+-&app; has a few keybindings.
+-
+-
+- Keyboard shortcuts in &app;
+-
+-
+-
+-
+-
+- Shortcut
+- Description
+-
+-
+-
+-
+-
+- F1
+-
+-
+- Open this help.
+-
+-
+-
+-
+- r
+-
+-
+- Start recording.
+-
+-
+-
+-
+- s
+-
+-
+- Stop recording.
+-
+-
+-
+-
+- m
+-
+-
+- Mute/unmute the volume.
+-
+-
+-
+-
+- q
+-
+-
+- Terminate &app;.
+-
+-
+-
+-
+- f
+-
+-
+- Scan forward.
+-
+-
+-
+-
+- b
+-
+-
+- Scan backwards.
+-
+-
+-
+-
+- n
+-
+-
+- Select next preset.
+-
+-
+-
+-
+- p
+-
+-
+- Select previous preset.
+-
+-
+-
+-
+- +
+-
+-
+- Increase volume.
+-
+-
+-
+-
+- -
+-
+-
+- Decrease volume.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-LIRC
+-
+-You can use a remote control supported by LIRC
+-(Linux infrared remote control) to control &app; .
+-
+-
+-Your remote control will only work if &app; has been compiled with
+-LIRC support enabled. If you are unsure wether this is the case or not, check the about dialog.
+-
+-
+-
+-
+-The .lircrc config file
+-
+-In the file .lircrc in your home directory, you set up which keys
+-on your remote control you want to associate with actions in &app;. A typical
+-section in the file looks like this:
+-
+-Example for a .lircrc section
+-
+-begin
+- prog = gnomeradio
+- button = VOL+
+- config = volume up
+- repeat = 1
+-end
+-
+-
+-
+-This associates the button VOL+ (Attention: Buttonnames are remote control specific)
+-with the command "volume up". "repeat = 1" means that in case you keep the button of
+-your remote control pressed, the command is repeated as long as you press the button.
+-It's of by default.
+-
+-
+-For more information, please consult the LIRC documentation.
+-
+-
+-
+-
+-
+-Available commands
+-
+-The following commands are available in &app;:
+-
+-
+- LIRC commands
+-
+-
+-
+-
+-
+- Command
+- Description
+-
+-
+-
+-
+-
+- tune up
+-
+-
+- Scan forward
+-
+-
+-
+-
+- tune down
+-
+-
+- Scan backwards
+-
+-
+-
+-
+- preset up
+-
+-
+- Select next preset
+-
+-
+-
+-
+- preset down
+-
+-
+- Select previous preset
+-
+-
+-
+-
+- volume up
+-
+-
+- Increase the volume
+-
+-
+-
+-
+- volume down
+-
+-
+- Decrease the volume
+-
+-
+-
+-
+- mute
+-
+-
+- Mute/unmute the volume
+-
+-
+-
+-
+- tv
+-
+-
+- Select TV mode (supported TV applications: tvtime, xawtv, zapping)
+-
+-
+-
+-
+- quit
+-
+-
+- Terminate &app;
+-
+-
+-
+-
+- toggle visible
+-
+-
+- Show/hide &app; window
+-
+-
+-
+-
+-
+- preset x
+-
+-
+- Select preset x + 1 (where x is between 0 and 9)
+-
+-
+-
+-
+-
+-
+-
+-
+Index: gnomeradio-1.8/help/C/index.docbook
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/help/C/index.docbook
+@@ -0,0 +1,825 @@
++
++
++
++
++
++
++]>
++
++
++
++
++
++
++
++ &app; Manual V&manrevision;
++
++ 2002
++
++ Jörgen Scheibengruber
++
++
++
++
++ Listen to FM radio
++
++
++
++ GNOME Documentation Project
++
++
++&legal;
++
++
++
++
++ Jörgen
++ Scheibengruber
++
++ GNOME Documentation Project
++ mfcn@gmx.de
++
++
++
++
++
++
++ 1.0
++ 2002
++
++ Jörgen Scheibengruber
++ mfcn@gmx.de
++ GNOME Documentation Project
++
++
++
++ This manual describes version &appversion; of &app;.
++
++
++ Feedback
++ To report a bug or make a suggestion regarding &app; or this
++ manual, send a e-mail to Jörgen Scheibengruber .
++
++
++
++ &app;
++
++
++
++
++
++Introduction
++&app; is a FM radio tuner for the GNOME desktop. It should work with
++every FM tuner card that is supported by video4linux. Remote controls are
++supported via (optional) LIRC support. Gnomeradio can also record radio using
++GStreamer backend.
++
++To start &app; open the applications menu, then choose
++
++Multimedia
++&app;
++
++or type gnomeradio in a shell.
++
++
++
++
++
++Usage
++
++
++Status window
++
++ The black box in the upper left of &app; is the status window
++
++
++
++
++
++ The black box in the upper left of &app; is the status window.
++
++
++
++
++
++The status window is located in the upper left corner of the &app; main window. It consists of:
++
++
++
++
++ a label showing wether the reception is mono or stereo,
++
++
++
++
++ an icon indicating the quality of the reception and
++
++
++
++
++ the current frequency.
++
++
++
++
++
++
++
++Frequency controls
++
++ Use these controls to change the frequency
++
++
++
++
++
++ Use these controls to change the frequency.
++
++
++
++
++
++The following controls are available to change the frequency:
++
++
++
++
++ Using the slider you can change the frequency very quick.
++
++
++
++
++ The scan backwards button (left-arrow with bar) will decrease the frequency until if detects the next radio station with good reception.
++
++
++
++
++ The 0.05 MHz backwards button (left-arrow without bar) decreases the frequency by 0.05 MHz.
++
++
++
++
++ The 0.05 MHz forward button (right-arrow without bar) increases the frequency by 0.05 MHz.
++
++
++
++
++ The scan forwards button (right-arrow with bar) does the same as the "scan backwards" button, but it increases
++ the frequency.
++
++
++
++
++
++
++
++Volume controls
++
++ Use these controls to change the volume
++
++
++
++
++
++ Use these controls to change the volume.
++
++
++
++
++
++Controls available to change the volume:
++
++
++
++
++ Use the slider to adjust the volume. Note that it will only work if you have picked the right mixer
++ source , in the Dialog.
++
++
++
++
++ Toggling the button showing the speaker will mute/unmute &app;.
++
++
++
++
++
++
++
++Presets menubutton
++
++ Choose a preset using the menubutton
++
++
++
++
++
++ Choose a preset using the menubutton.
++
++
++
++
++
++Use the menubutton in the upper right to choose a radio station preset.
++You can edit presets in the Dialog.
++
++
++
++
++
++Misc. controls
++
++ Remaining controls
++
++
++
++
++
++ Remaining controls.
++
++
++
++
++
++
++
++
++
++ The record button opens the Dialog.
++
++
++
++
++ Clicking the about button will show a window with some credits.
++
++
++
++
++ Behind the settings button hides the Dialog.
++
++
++
++
++ The quit button will terminate &app;
++
++
++
++
++
++
++
++
++
++Preferences
++
++To open the preferences dialog, click the preferences button in the main window.
++
++
++If you are finished click OK to accept your changes
++or Cancel to undo the changes.
++
++
++
++General preferences
++
++ General preferences
++
++
++
++
++
++ General preferences.
++
++
++
++
++
++
++
++
++
++ Radio Device: Enter your radio device. Unless you have several radio
++ tuners installed this is usually /dev/radio.
++
++
++
++
++ Mixer Source: Choose the mixer source that is able to control the volume
++ of your radio tuner. The combobox lists all devices that you can choose as a recording source.
++ You should usually pick one of these, otherwise you won't be able to record radio. If you have
++ set up own names for the sources in gnome volume control, these names will be shown in paranthesis
++ behind the "official" name.
++
++
++
++
++ Mute on Exit: Uncheck this checkbox, if you want that the radio keeps on
++ playing after you have terminated &app;.
++
++
++
++
++
++
++Editing presets
++
++ Editing presets
++
++
++
++
++
++ Editing presets.
++
++
++
++
++
++Here you can add some preset radio stations. You can select one of these
++using the or your
++ remote control.
++
++
++
++
++ Name: Enter a name for the preset (usually the name
++ of the radio station).
++
++
++
++
++ Frequency: Choose the frequency for the radio station.
++
++
++
++
++ Click the button add preset (shows a +) to add the preset
++ to the list.
++
++
++
++
++ The button remove preset (shows a -) will remove the currently
++ selected preset from the list.
++
++
++
++
++ Use the button update preset to update the selected preset with
++ the values currently entered in the name and frequency entries.
++
++
++
++
++
++
++
++
++Recording
++
++You can use gnomeradio to (live)record radio. In this dialog you
++have to give some information, on how this shall be done.
++
++You need the external application sox
++installed in order to use the recording functionality of &app;.
++If you want to record as MP3,
++you have to install a MP3 encoder, too. Currently the MP3 encoders
++lame and
++bladeenc are supported.
++To record files as ogg vorbis you need
++oggenc .
++
++
++To open this dialog, click the record button in the main window.
++
++
++Use the Start button to start recording.
++Otherwise click Cancel to close the dialog.
++
++
++
++General settings
++
++ General recording settings
++
++
++
++
++
++ General recording settings.
++
++
++
++
++
++
++
++
++
++ Audio Device: Enter your audio device. Unless you have several soundcards
++ installed this is usually /dev/audio.
++
++
++
++
++ Filename: Choose a filename and destination for the file in which the audio
++ data should be stored. This file should usually have the suffix ".wav", in case you want to record
++ as wave data, ".mp3", in case the audio should be stored in the mp3-format or ".ogg", for ogg vorbis
++ files.
++
++
++
++
++ Record as: Select Wave (.wav) , if you want the audio
++ data to be stored in the wave format (uncompressed - about 10 megabyte per minute playlength).
++ Otherwise choose MP3/Ogg (.mp3/.ogg) which will lead to a much lower filesize, but
++ also a little bit lower audio quality.
++
++
++
++
++
++
++
++Wave settings
++
++ The wave settings
++
++
++
++
++
++ The wave settings.
++
++
++
++
++
++These settings apply to the mp3 file, too.
++
++
++
++
++ Sample rate: Choose a sample rate for the recording audio file. Higher sampling
++ rate means better quality. 44100 kHz is a good default (aprox. CD quality). If the reception
++ is bad you can take a lower sampling rate, because the quality won't be that good anyways.
++
++
++
++
++ Sample format: Available options are 8 or 16 bit. Usually you want to
++ take 16 bit.
++
++
++
++
++ Record in: Select stereo , if you want to record in
++ stereo or mono otherwise. It probably doen't make much sense to record
++ in stereo, if the reception is only mono.
++
++
++
++
++
++
++
++MP3/Ogg settings
++
++ The MP3/Ogg settings
++
++
++
++
++
++ The MP3 settings.
++
++
++
++
++
++
++
++
++
++ Encoder: A list of supported MP3/Ogg encoders that you have installed. Choose the one you like the
++ best. Currently lame ,
++ bladeenc and
++ oggenc are supported.
++ The encoder must be in your PATH, otherwise &app; can't find it.
++
++
++
++
++ Bitrate: Choose a bitrate. This will have the largest impact
++ on the size and quality of the resulting MP3/Ogg file. The higher the bitrate the better the
++ quality. 128 kb/s is usually a good value which will result in files that are aprox. 1 MB
++ per minute playlength.
++
++
++
++
++
++
++Recording status window
++
++ The status window
++
++
++
++
++
++ The status window.
++
++
++
++
++
++Click Stop Recording to stop the recording and return to
++the main window. The window shows the name and size of the file in which the audio
++data is being stored.
++
++
++
++
++
++
++Keybindings
++
++&app; has a few keybindings.
++
++
++ Keyboard shortcuts in &app;
++
++
++
++
++
++ Shortcut
++ Description
++
++
++
++
++
++ F1
++
++
++ Open this help.
++
++
++
++
++ r
++
++
++ Start recording.
++
++
++
++
++ s
++
++
++ Stop recording.
++
++
++
++
++ m
++
++
++ Mute/unmute the volume.
++
++
++
++
++ q
++
++
++ Terminate &app;.
++
++
++
++
++ f
++
++
++ Scan forward.
++
++
++
++
++ b
++
++
++ Scan backwards.
++
++
++
++
++ n
++
++
++ Select next preset.
++
++
++
++
++ p
++
++
++ Select previous preset.
++
++
++
++
++ +
++
++
++ Increase volume.
++
++
++
++
++ -
++
++
++ Decrease volume.
++
++
++
++
++
++
++
++
++
++
++LIRC
++
++You can use a remote control supported by LIRC
++(Linux infrared remote control) to control &app; .
++
++
++Your remote control will only work if &app; has been compiled with
++LIRC support enabled. If you are unsure wether this is the case or not, check the about dialog.
++
++
++
++
++The .lircrc config file
++
++In the file .lircrc in your home directory, you set up which keys
++on your remote control you want to associate with actions in &app;. A typical
++section in the file looks like this:
++
++Example for a .lircrc section
++
++begin
++ prog = gnomeradio
++ button = VOL+
++ config = volume up
++ repeat = 1
++end
++
++
++
++This associates the button VOL+ (Attention: Buttonnames are remote control specific)
++with the command "volume up". "repeat = 1" means that in case you keep the button of
++your remote control pressed, the command is repeated as long as you press the button.
++It's of by default.
++
++
++For more information, please consult the LIRC documentation.
++
++
++
++
++
++Available commands
++
++The following commands are available in &app;:
++
++
++ LIRC commands
++
++
++
++
++
++ Command
++ Description
++
++
++
++
++
++ tune up
++
++
++ Scan forward
++
++
++
++
++ tune down
++
++
++ Scan backwards
++
++
++
++
++ preset up
++
++
++ Select next preset
++
++
++
++
++ preset down
++
++
++ Select previous preset
++
++
++
++
++ volume up
++
++
++ Increase the volume
++
++
++
++
++ volume down
++
++
++ Decrease the volume
++
++
++
++
++ mute
++
++
++ Mute/unmute the volume
++
++
++
++
++ tv
++
++
++ Select TV mode (supported TV applications: tvtime, xawtv, zapping)
++
++
++
++
++ quit
++
++
++ Terminate &app;
++
++
++
++
++ toggle visible
++
++
++ Show/hide &app; window
++
++
++
++
++
++ preset x
++
++
++ Select preset x + 1 (where x is between 0 and 9)
++
++
++
++
++
++
++
++
+Index: gnomeradio-1.8/help/C/legal.xml
+===================================================================
+--- gnomeradio-1.8.orig/help/C/legal.xml
++++ gnomeradio-1.8/help/C/legal.xml
+@@ -6,7 +6,7 @@
+ by the Free Software Foundation with no Invariant Sections,
+ no Front-Cover Texts, and no Back-Cover Texts. You can find
+ a copy of the GFDL at this link or in the file COPYING-DOCS
++ url="help:fdl">link or in the file COPYING-DOCS
+ distributed with this manual.
+
+ This manual is part of a collection of GNOME manuals
+Index: gnomeradio-1.8/help/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/help/Makefile.am
++++ gnomeradio-1.8/help/Makefile.am
+@@ -1,20 +1,22 @@
+-include $(top_srcdir)/gnome-doc-utils.make
+-dist-hook: doc-dist-hook
++@YELP_HELP_RULES@
+
+-DOC_MODULE = gnomeradio
+-DOC_ENTITIES = legal.xml
+-DOC_INCLUDES =
+-DOC_FIGURES = \
+-figures/freq-controls.png \
+-figures/misc-controls.png \
+-figures/presets-box.png \
+-figures/recording-general.png \
+-figures/recording-mp3.png \
+-figures/recording-wav.png \
+-figures/recording_status.png \
+-figures/settings-misc.png \
+-figures/settings-presets.png \
+-figures/status-window.png \
+-figures/volume-controls.png
++HELP_ID = gnomeradio
+
+-DOC_LINGUAS = es fr oc sv
++HELP_FILES = \
++ index.docbook \
++ legal.xml
++
++HELP_MEDIA = \
++ figures/freq-controls.png \
++ figures/misc-controls.png \
++ figures/presets-box.png \
++ figures/recording-general.png \
++ figures/recording-mp3.png \
++ figures/recording-wav.png \
++ figures/recording_status.png \
++ figures/settings-misc.png \
++ figures/settings-presets.png \
++ figures/status-window.png \
++ figures/volume-controls.png
++
++HELP_LINGUAS = es fr oc sv
+Index: gnomeradio-1.8/help/gnomeradio.omf.in
+===================================================================
+--- gnomeradio-1.8.orig/help/gnomeradio.omf.in
++++ /dev/null
+@@ -1,9 +0,0 @@
+-
+-
+-
+-
+- manual
+-
+-
+-
+-
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -961,21 +961,24 @@ void display_help_cb(char *topic)
+ char *uri;
+
+ if (topic)
+- uri = g_strdup_printf("ghelp:gnomeradio?%s", topic);
++ uri = g_strdup_printf ("help:gnomeradio/%s", topic);
+ else
+- uri = "ghelp:gnomeradio";
++ uri = g_strdup ("help:gnomeradio");
+
+ gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, &error);
++
+ if (error)
+ {
+ GtkWidget *dialog;
+- dialog = gtk_message_dialog_new(NULL, DIALOG_FLAGS, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+- "%s", error->message);
++ dialog = gtk_message_dialog_new (NULL, DIALOG_FLAGS, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
++ _("Failed to open %s: %s"), uri, error->message);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ g_error_free (error);
+ error = NULL;
+ }
++
++ g_free (uri);
+ }
+
+ void toggle_mainwindow_visibility(GtkWidget *app)
+@@ -1534,8 +1537,8 @@ static void show_message(GtkMessageType
+
+ g_assert(text);
+
+- dialog = gtk_message_dialog_new(NULL, DIALOG_FLAGS, type, GTK_BUTTONS_CLOSE,
+- "%s", text);
++ dialog = gtk_message_dialog_new (NULL, DIALOG_FLAGS, type, GTK_BUTTONS_CLOSE,
++ "%s", text);
+ if (details) {
+ gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", details);
+ }
+Index: gnomeradio-1.8/help/es/gnomeradio.xml
+===================================================================
+--- gnomeradio-1.8.orig/help/es/gnomeradio.xml
++++ /dev/null
+@@ -1,611 +0,0 @@
+-
+-
+-
+-
+-
+-
+-]>
+-
+-
+-
+-
+-
+- Manual de Gnomeradio V1.0
+-
+- 2002
+-
+- Jörgen Scheibengruber
+- 2008. Daniel Mustieles (daniel.mustieles@gmail.com) 2008. Jorge González (jorgegonz@svn.gnome.org)
+-
+-
+-
+- Gnomeradio es una aplicación de sintonización de FM para el escritorio GNOME.
+-
+-
+-
+- Proyecto de documentación de GNOME
+-
+-
+-
+- Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre de GNU, Versión 1.1 o cualquier otra versión posterior publicada por la Free Software Foundation; sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de Cubierta Trasera. Puede encontrar una copia de la licencia GFDL en este enlace o en el archivo COPYING-DOCS distribuido con este manual.
+- Este manual es parte de una colección de manuales de GNOME distribuido bajo la GFDL. Si quiere distribuir este manual por separado de la colección, puede hacerlo añadiendo una copia de la licencia al manual, tal como se describe en la sección 6 de la licencia.
+-
+- Muchos de los nombres utilizados por las empresas para distinguir sus productos y servicios se consideran marcas comerciales. Cuando estos nombres aparezcan en la documentación de GNOME, y siempre que se haya informado a los miembros del Proyecto de documentación de GNOME de dichas marcas comerciales, los nombres aparecerán en mayúsculas o con las iniciales en mayúsculas.
+-
+- ESTE DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO SE PROPORCIONAN SEGÚN LAS CONDICIONES ESTABLECIDAS EN LA LICENCIA DE DOCUMENTACIÓN LIBRE DE GNU (GFDL) Y TENIENDO EN CUENTA QUE:
+-
+- EL DOCUMENTO SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, NI EXPLÍCITA NI IMPLÍCITA INCLUYENDO, SIN LIMITACIÓN, GARANTÍA DE QUE EL DOCUMENTO O VERSIÓN MODIFICADA DE ÉSTE CAREZCA DE DEFECTOS COMERCIALES, SEA ADECUADO A UN FIN CONCRETO O INCUMPLA ALGUNA NORMATIVA. TODO EL RIESGO RELATIVO A LA CALIDAD, PRECISIÓN Y UTILIDAD DEL DOCUMENTO O SU VERSIÓN MODIFICADA RECAE EN USTED. SI CUALQUIER DOCUMENTO O VERSIÓN MODIFICADA DE AQUÉL RESULTARA DEFECTUOSO EN CUALQUIER ASPECTO, USTED (Y NO EL REDACTOR INICIAL, AUTOR O CONTRIBUYENTE) ASUMIRÁ LOS COSTES DE TODA REPARACIÓN, MANTENIMIENTO O CORRECCIÓN NECESARIOS. ESTA RENUNCIA DE GARANTÍA ES UNA PARTE ESENCIAL DE ESTA LICENCIA. NO SE AUTORIZA EL USO DE NINGÚN DOCUMENTO NI VERSIÓN MODIFICADA DE ÉSTE POR EL PRESENTE, SALVO DENTRO DEL CUMPLIMIENTO DE LA RENUNCIA;Y
+-
+-
+- EN NINGUNA CIRCUNSTANCIA NI SEGÚN NINGÚN ARGUMENTO LEGAL, SEA POR MOTIVOS CULPOSOS (INCLUIDA LA NEGLIGENCIA), CONTRACTUALES O DE OTRO TIPO, NI EL AUTOR, NI EL REDACTOR INICIAL, NI CUALQUIER COLABORADOR, NI CUALQUIER DISTRIBUIDOR DEL DOCUMENTO O VERSIÓN MODIFICADA DEL MISMO, NI CUALQUIER PROVEEDOR DE CUALQUIERA DE DICHAS PARTES, SERÁN RESPONSABLES, ANTE NINGÚN TERCERO, DE NINGÚN DAÑO O PERJUICIO DIRECTO, INDIRECTO, ESPECIAL, INCIDENTAL O CONSIGUIENTE DE NINGÚN TIPO, INCLUIDOS, SIN LIMITACIÓN, LOS DAÑOS POR PÉRDIDA DE FONDO DE COMERCIO, INTERRUPCIÓN DEL TRABAJO, FALLO O MAL FUNCIONAMIENTO INFORMÁTICO, NI CUALQUIER OTRO DAÑO O PÉRDIDA DERIVADOS DEL USO DEL DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO, O RELACIONADO CON ELLO, INCLUSO SI SE HABÍA COMUNICADO A AQUELLA PARTE LA POSIBILIDAD DE TALES DAÑOS.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Jörgen
+- Scheibengruber
+-
+- Proyecto de documentación de GNOME
+- mfcn@gmx.de
+-
+-
+-
+-
+-
+-
+- 1.0
+- 2002
+-
+- Jörgen Scheibengruber mfcn@gmx.de
+- Proyecto de documentación de GNOME
+-
+-
+-
+- Este manual describe la versión 1.3 de Gnomeradio.
+-
+- Comentarios
+- Para informar de un error o hacer una sugerencia acerca de Gnomeradio o de este manual, envíe un correo electrónico a Jörgen Scheibengruber .
+-
+-
+-
+- Gnomeradio
+-
+-
+-
+-
+-
+-Introducción
+-Gnomeradio es una aplicación de sintonización de FM para el escritorio GNOME. Debería funcionar con todo el hardware de sintonización soportado porlos controladores video4linux .
+-Para iniciar Gnomeradio abra el menú de aplicaciones, y seleccione Sonido y vídeo Gnomeradio o escriba gnomeradio en una consola.
+-
+-
+-
+-
+-Uso
+-
+-
+-Ventana de estado
+-
+- El cuadro negro en la parte superior izquierda de Gnomeradio es la ventana de estado
+-
+-
+-
+-
+-
+- El cuadro negro en la parte superior izquierda de Gnomeradio es la ventana de estado.
+-
+-
+-
+-
+-La ventana de estado está ubicada en la esquina superior izquierda de la ventana principal de Gnomeradio. Consta de:
+-
+-
+- una etiqueta que muestra si la recepción es mono o estéreo,
+-
+-
+- un icono indicando la calidad de la recepción y
+-
+-
+- la frecuencia actual.
+-
+-
+-
+-
+-
+-
+-Controles de frecuencia
+-
+- Use estos controles para cambiar la frecuencia
+-
+-
+-
+-
+-
+- Use estos controles para cambiar la frecuencia.
+-
+-
+-
+-
+-Los siguientes controles están disponibles para cambiar la frecuencia:
+-
+-
+- Usando el deslizador puede cambiar la frecuencia rápidamente.
+-
+-
+- El botón buscar hacia atrás (flecha izquierda con barra) disminuye la frecuencia hasta que detecte la siguiente emisora de radio con buena recepción.
+-
+-
+- El botón 0.05 MHz hacia atrás (flecha izquierda sin barra) disminuye la frecuencia 0.05 MHz.
+-
+-
+- El botón 0.05 MHz hacia adelante (flecha derecha sin barra) aumenta la frecuencia 0.05 MHz.
+-
+-
+- El botón buscar hacia adelante (flecha derecha con barra) hace lo mismo que el botón «buscar hacia atrás», pero aumenta la frecuencia.
+-
+-
+-
+-
+-
+-
+-Controles de volumen
+-
+- Use estos controles para cambiar el volumen
+-
+-
+-
+-
+-
+- Use estos controles para cambiar el volumen.
+-
+-
+-
+-
+-Controles disponibles para cambiar el volumen:
+-
+-
+- Use la barra deslizante para ajustar el volumen. Tenga en cuenta que esto sólo funcionará si ha marcado la entrada de sonido correcta, en el diálogo .
+-
+-
+- Pulsar el botón que muestra el altavoz silenciará/dará voz a Gnomeradio.
+-
+-
+-
+-
+-
+-
+-Botón del menú de emisoras
+-
+- Seleccione una emisora usando el botón del menú
+-
+-
+-
+-
+-
+- Seleccione una emisora usando el botón del menú.
+-
+-
+-
+-
+-Use los botones del menú situados arriba a la derecha para seleccionar una emisora de radio. Puede editar emisoras en el diálogo .
+-
+-
+-
+-
+-Controles varios
+-
+- Controles restantes
+-
+-
+-
+-
+-
+- Controles restantes.
+-
+-
+-
+-
+-
+-
+-
+-
+- El botón grabar abre el diálogo .
+-
+-
+- Al pulsar en el botón acerca de se mostrará una ventana con algunos créditos.
+-
+-
+- Detrás del botón configuración se esconde el diálogo .
+-
+-
+- El botón salir cerrará Gnomeradio
+-
+-
+-
+-
+-
+-
+-
+-
+-Preferencias
+-Para abrir el diálogo de preferencias, pulse en preferencias en la ventana principal.
+-Si ha terminado, pulse Aceptar para guardar los cambios o Cancelar para deshacer los cambios.
+-
+-
+-Preferencias generales
+-
+- Preferencias generales
+-
+-
+-
+-
+-
+- Preferencias generales.
+-
+-
+-
+-
+-
+-
+-
+-
+- Dispositivo de radio: Introduzca el dispositivo de radio. Salvo que tenga varios sintonizadores de radio instalados, habitualmente es /dev/radio.
+-
+-
+- Entrada de sonido: Seleccione la entrada de sonido capaz de controlar de controlar el volumen de su sintonizador de radio. La caja combinada lista todos los dispositivos que puede seleccionar como fuente de grabación. Habitualmente debería escoger uno de ellos, de otra forma no podrá grabar radio. Si ha configurado sus propios nombres para las fuentes en el control de volumen de gnome, estos nombres deberán mostrarse entre paréntesis detrás del nombre «oficial».
+-
+-
+- Silenciar al salir: Desmarque esta casilla si quiere que la radio se siga reproduciendo después que haya cerrado Gnomeradio.
+-
+-
+-
+-
+-
+-Editar emisoras
+-
+- Editar emisoras
+-
+-
+-
+-
+-
+- Editar emisoras.
+-
+-
+-
+-
+-Aquí puede añadir algunas emisoras de radio. Puede seleccionar una de ellas usando el control remoto o su .
+-
+-
+- Nombre: Introduzca un nombre para la emisora (habitualmente el nombre de la emisora de radio).
+-
+-
+- Frecuencia: Seleccione la frecuencia para la emisora de radio.
+-
+-
+- Pulse el botón añadir emisora (muestra un +) para añadir la emisora a la lista.
+-
+-
+- El botón eliminar emisora (muestra un -) eliminará la emisora seleccionada actualmente de la lista.
+-
+-
+- Utilice el botón actualizar emisora para actualizar la emisora seleccionada con los valores introducidos actualmente en las entradas nombre y frecuencia.
+-
+-
+-
+-
+-
+-
+-
+-Grabación
+-Puede usar gnomeradio para grabar radio (en directo). En este diálogo debe proporcionar cierta información, sobre cómo se hará esto.
+-Necesita tener instalada la aplicación externa sox para poder usar la funcionalidad de grabación de Gnomeradio. Si quiere grabar en MP3, deberá instalar también un codificador de MP3. Actualmente los codificadores de MP3 lame y bladeenc están soportados. Para grabar archivos en ogg vorbis necesita oggenc .
+-Para abrir este diálogo, pulse el botón grabar en la ventana principal.
+-Use el botón Iniciar para iniciar la grabación. Si no pulse en Cancelar para cerrar el diálogo.
+-
+-
+-Configuración generales
+-
+- Configuración general de grabación
+-
+-
+-
+-
+-
+- Configuración general de grabación.
+-
+-
+-
+-
+-
+-
+-
+-
+- Dispositivo de sonido: Introduzca el nombre de su dispositivo de sonido. Salvo que tenga varias tarjetas de sonido instaladas, habitualmente es /dev/audio.
+-
+-
+- Nombre de archivo: Seleccione un nombre de archivo y un destino para el archivo donde se guardarán los datos de sonido. Normalmente, este archivo tendrá el sufijo «.wav», en caso de que quiera grabar datos de onda, «.mp3» en caso de que el sonido deba ser grabado en formato mp3 u «.ogg», para archivos ogg vorbis.
+-
+-
+- Grabar como: Seleccione onda (.wav) , si quiere grabar los datos de sonido en formato de onda (sin comprimir - aproximadamente 10 megabytes por minuto de duración). En otro caso, seleccione MP3/Ogg (.mp3/.ogg) que saltará a un tamaño mucho meno, pero también con una calidad de sonido ligeramente inferior.
+-
+-
+-
+-
+-
+-
+-Configuración de onda
+-
+- La configuración de onda
+-
+-
+-
+-
+-
+- La configuración de onda.
+-
+-
+-
+-
+-Estos ajustes se aplican también al archivo mp3.
+-
+-
+- Tamaño de la muestra: Seleccione una tamaño de muestra para el archivo de grabación de audio. Un mayor tamaño de muestra significa mejor calidad. 44100 kHz es un buen valor predeterminado (aproximadamente calidad de CD). Si la recepción es mala puede obtener un menor tamaño de muestra, porque la calidad no será buena de ninguna manera.
+-
+-
+- Formato de muestra: Las opciones disponibles son 8 o 16 bits. Habitualmente querrá escoger 16 bits.
+-
+-
+- Grabar en: Seleccione estéreo , si quiere grabar en estéreo o mono en otro caso. Probablemente no tenga mucho sentido grabar en estéreo, si la recepción es solamente mono,
+-
+-
+-
+-
+-
+-
+-Configuración de MP3/Ogg
+-
+- Configuración de MP3/Ogg
+-
+-
+-
+-
+-
+- Configuración de MP3.
+-
+-
+-
+-
+-
+-
+-
+-
+- Codificador: Una lista de los codificadores MP3/Ogg soportados que tiene instalados. Seleccione el que prefiera. Actualmente lame , bladeenc y oggenc están soportados. El codificador debe estar en su PATH, si no Gnomeradio no podrá encontrarlo.
+-
+-
+- Tasa de bits: Seleccione una tasa de bits. Esto será lo que mayor impacto tenga en el tamaño y la calidad del archivo MP3/Ogg resultante. Cuanto más grande sea la tasa de bits, mayor será la calidad. 128 kb/s es habitualmente un valor adecuado, tendrá como resultados archivos de 1 MiB por minuto de duración.
+-
+-
+-
+-
+-
+-Ventana de estado de la grabación
+-
+- La ventana de estado
+-
+-
+-
+-
+-
+- La ventana de estado.
+-
+-
+-
+-
+-Pulse Detener la grabación para detener la grabación y volver a la ventana principal. La ventana mostrará el nombre y el tamaño del archivo en el que se guardará el sonido.
+-
+-
+-
+-
+-
+-Combinaciones de teclas
+-Gnomeradio tiene algunas combinaciones de teclas.
+-
+- Atajos de teclado en Gnomeradio
+-
+-
+-
+-
+-
+- Atajos
+- Descripción
+-
+-
+-
+-
+-
+- F1
+-
+- Abre esta ayuda.
+-
+-
+-
+- r
+-
+- Abrir el diálogo de grabación.
+-
+-
+-
+- m
+-
+- Silenciar/activar el sonido.
+-
+-
+-
+- q
+-
+- Salir de Gnomeradio.
+-
+-
+-
+- f
+-
+- Buscar hacia adelante.
+-
+-
+-
+- b
+-
+- Buscar hacia atrás.
+-
+-
+-
+- n
+-
+- Seleccione la siguiente emisora.
+-
+-
+-
+- p
+-
+- Seleccione la emisora anterior.
+-
+-
+-
+- +
+-
+- Subir el volumen.
+-
+-
+-
+- -
+-
+- Bajar el volumen.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-LIRC
+-Puede usar un control remoto soportado por LIRC (Control remoto por infrarrojos de Linux) para controlar Gnomeradio .
+-
+-Su control remoto sólo funcionará si Gnomeradio se ha compilado con el soporte LIRC habilitado. Si no está seguro de si es éste el caso o no, compruebe el diálogo acerca de.
+-
+-
+-
+-El archivo de configuración .lircrc
+-En el archivo .lircrc en su carpeta de inicio, puede configurar qué teclas de su control remoto quiere asociar con acciones en Gnomeradio. Una sección habitual en el archivo es similar a esta:
+-Ejemplo de una sección .lircrc
+-
+-begin
+- prog = gnomeradio
+- button = VOL+
+- config = subir volumen
+- repeat = 1
+-end
+-
+-
+-Esto asocia el botón VOL+ (atención: Los nombres de los botones son específicos del control remoto) con el comando «subir volumen» «repetir = 1» significa que en caso de que mantenga pulsado el botón de su control remoto, el comando se repite mientras se mantiene presionado el botón. Este comportamiento es el predeterminado.
+-Para obtener más información, consulte la documentación de LIRC.
+-
+-
+-
+-
+-Comandos disponibles
+-Los siguientes comandos están disponibles en Gnomeradio:
+-
+- Comandos LIRC
+-
+-
+-
+-
+-
+- Comando
+- Descripción
+-
+-
+-
+-
+-
+- subir sintonización
+-
+- Buscar hacia adelante.
+-
+-
+-
+- bajar sintonización
+-
+- Buscar hacia atrás.
+-
+-
+-
+- subir emisora
+-
+- Seleccione la siguiente emisora.
+-
+-
+-
+- bajar emisora
+-
+- Seleccione la emisora anterior.
+-
+-
+-
+- subir volumen
+-
+- Aumentar el volumen.
+-
+-
+-
+- bajar volumen
+-
+- Reducir el volumen.
+-
+-
+-
+- silenciar
+-
+- Silenciar/activar el sonido.
+-
+-
+-
+- salir
+-
+- Salir de Gnomeradio.
+-
+-
+-
+- emisora x
+-
+- Seleccione la emisora x + 1 (donde x está entre 0 y 9)
+-
+-
+-
+-
+-
+-
+-
+Index: gnomeradio-1.8/help/es/index.docbook
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/help/es/index.docbook
+@@ -0,0 +1,611 @@
++
++
++
++
++
++
++]>
++
++
++
++
++
++ Manual de Gnomeradio V1.0
++
++ 2002
++
++ Jörgen Scheibengruber
++ 2008. Daniel Mustieles (daniel.mustieles@gmail.com) 2008. Jorge González (jorgegonz@svn.gnome.org)
++
++
++
++ Gnomeradio es una aplicación de sintonización de FM para el escritorio GNOME.
++
++
++
++ Proyecto de documentación de GNOME
++
++
++
++ Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre de GNU, Versión 1.1 o cualquier otra versión posterior publicada por la Free Software Foundation; sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de Cubierta Trasera. Puede encontrar una copia de la licencia GFDL en este enlace o en el archivo COPYING-DOCS distribuido con este manual.
++ Este manual es parte de una colección de manuales de GNOME distribuido bajo la GFDL. Si quiere distribuir este manual por separado de la colección, puede hacerlo añadiendo una copia de la licencia al manual, tal como se describe en la sección 6 de la licencia.
++
++ Muchos de los nombres utilizados por las empresas para distinguir sus productos y servicios se consideran marcas comerciales. Cuando estos nombres aparezcan en la documentación de GNOME, y siempre que se haya informado a los miembros del Proyecto de documentación de GNOME de dichas marcas comerciales, los nombres aparecerán en mayúsculas o con las iniciales en mayúsculas.
++
++ ESTE DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO SE PROPORCIONAN SEGÚN LAS CONDICIONES ESTABLECIDAS EN LA LICENCIA DE DOCUMENTACIÓN LIBRE DE GNU (GFDL) Y TENIENDO EN CUENTA QUE:
++
++ EL DOCUMENTO SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, NI EXPLÍCITA NI IMPLÍCITA INCLUYENDO, SIN LIMITACIÓN, GARANTÍA DE QUE EL DOCUMENTO O VERSIÓN MODIFICADA DE ÉSTE CAREZCA DE DEFECTOS COMERCIALES, SEA ADECUADO A UN FIN CONCRETO O INCUMPLA ALGUNA NORMATIVA. TODO EL RIESGO RELATIVO A LA CALIDAD, PRECISIÓN Y UTILIDAD DEL DOCUMENTO O SU VERSIÓN MODIFICADA RECAE EN USTED. SI CUALQUIER DOCUMENTO O VERSIÓN MODIFICADA DE AQUÉL RESULTARA DEFECTUOSO EN CUALQUIER ASPECTO, USTED (Y NO EL REDACTOR INICIAL, AUTOR O CONTRIBUYENTE) ASUMIRÁ LOS COSTES DE TODA REPARACIÓN, MANTENIMIENTO O CORRECCIÓN NECESARIOS. ESTA RENUNCIA DE GARANTÍA ES UNA PARTE ESENCIAL DE ESTA LICENCIA. NO SE AUTORIZA EL USO DE NINGÚN DOCUMENTO NI VERSIÓN MODIFICADA DE ÉSTE POR EL PRESENTE, SALVO DENTRO DEL CUMPLIMIENTO DE LA RENUNCIA;Y
++
++
++ EN NINGUNA CIRCUNSTANCIA NI SEGÚN NINGÚN ARGUMENTO LEGAL, SEA POR MOTIVOS CULPOSOS (INCLUIDA LA NEGLIGENCIA), CONTRACTUALES O DE OTRO TIPO, NI EL AUTOR, NI EL REDACTOR INICIAL, NI CUALQUIER COLABORADOR, NI CUALQUIER DISTRIBUIDOR DEL DOCUMENTO O VERSIÓN MODIFICADA DEL MISMO, NI CUALQUIER PROVEEDOR DE CUALQUIERA DE DICHAS PARTES, SERÁN RESPONSABLES, ANTE NINGÚN TERCERO, DE NINGÚN DAÑO O PERJUICIO DIRECTO, INDIRECTO, ESPECIAL, INCIDENTAL O CONSIGUIENTE DE NINGÚN TIPO, INCLUIDOS, SIN LIMITACIÓN, LOS DAÑOS POR PÉRDIDA DE FONDO DE COMERCIO, INTERRUPCIÓN DEL TRABAJO, FALLO O MAL FUNCIONAMIENTO INFORMÁTICO, NI CUALQUIER OTRO DAÑO O PÉRDIDA DERIVADOS DEL USO DEL DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO, O RELACIONADO CON ELLO, INCLUSO SI SE HABÍA COMUNICADO A AQUELLA PARTE LA POSIBILIDAD DE TALES DAÑOS.
++
++
++
++
++
++
++
++
++
++ Jörgen
++ Scheibengruber
++
++ Proyecto de documentación de GNOME
++ mfcn@gmx.de
++
++
++
++
++
++
++ 1.0
++ 2002
++
++ Jörgen Scheibengruber mfcn@gmx.de
++ Proyecto de documentación de GNOME
++
++
++
++ Este manual describe la versión 1.3 de Gnomeradio.
++
++ Comentarios
++ Para informar de un error o hacer una sugerencia acerca de Gnomeradio o de este manual, envíe un correo electrónico a Jörgen Scheibengruber .
++
++
++
++ Gnomeradio
++
++
++
++
++
++Introducción
++Gnomeradio es una aplicación de sintonización de FM para el escritorio GNOME. Debería funcionar con todo el hardware de sintonización soportado porlos controladores video4linux .
++Para iniciar Gnomeradio abra el menú de aplicaciones, y seleccione Sonido y vídeo Gnomeradio o escriba gnomeradio en una consola.
++
++
++
++
++Uso
++
++
++Ventana de estado
++
++ El cuadro negro en la parte superior izquierda de Gnomeradio es la ventana de estado
++
++
++
++
++
++ El cuadro negro en la parte superior izquierda de Gnomeradio es la ventana de estado.
++
++
++
++
++La ventana de estado está ubicada en la esquina superior izquierda de la ventana principal de Gnomeradio. Consta de:
++
++
++ una etiqueta que muestra si la recepción es mono o estéreo,
++
++
++ un icono indicando la calidad de la recepción y
++
++
++ la frecuencia actual.
++
++
++
++
++
++
++Controles de frecuencia
++
++ Use estos controles para cambiar la frecuencia
++
++
++
++
++
++ Use estos controles para cambiar la frecuencia.
++
++
++
++
++Los siguientes controles están disponibles para cambiar la frecuencia:
++
++
++ Usando el deslizador puede cambiar la frecuencia rápidamente.
++
++
++ El botón buscar hacia atrás (flecha izquierda con barra) disminuye la frecuencia hasta que detecte la siguiente emisora de radio con buena recepción.
++
++
++ El botón 0.05 MHz hacia atrás (flecha izquierda sin barra) disminuye la frecuencia 0.05 MHz.
++
++
++ El botón 0.05 MHz hacia adelante (flecha derecha sin barra) aumenta la frecuencia 0.05 MHz.
++
++
++ El botón buscar hacia adelante (flecha derecha con barra) hace lo mismo que el botón «buscar hacia atrás», pero aumenta la frecuencia.
++
++
++
++
++
++
++Controles de volumen
++
++ Use estos controles para cambiar el volumen
++
++
++
++
++
++ Use estos controles para cambiar el volumen.
++
++
++
++
++Controles disponibles para cambiar el volumen:
++
++
++ Use la barra deslizante para ajustar el volumen. Tenga en cuenta que esto sólo funcionará si ha marcado la entrada de sonido correcta, en el diálogo .
++
++
++ Pulsar el botón que muestra el altavoz silenciará/dará voz a Gnomeradio.
++
++
++
++
++
++
++Botón del menú de emisoras
++
++ Seleccione una emisora usando el botón del menú
++
++
++
++
++
++ Seleccione una emisora usando el botón del menú.
++
++
++
++
++Use los botones del menú situados arriba a la derecha para seleccionar una emisora de radio. Puede editar emisoras en el diálogo .
++
++
++
++
++Controles varios
++
++ Controles restantes
++
++
++
++
++
++ Controles restantes.
++
++
++
++
++
++
++
++
++ El botón grabar abre el diálogo .
++
++
++ Al pulsar en el botón acerca de se mostrará una ventana con algunos créditos.
++
++
++ Detrás del botón configuración se esconde el diálogo .
++
++
++ El botón salir cerrará Gnomeradio
++
++
++
++
++
++
++
++
++Preferencias
++Para abrir el diálogo de preferencias, pulse en preferencias en la ventana principal.
++Si ha terminado, pulse Aceptar para guardar los cambios o Cancelar para deshacer los cambios.
++
++
++Preferencias generales
++
++ Preferencias generales
++
++
++
++
++
++ Preferencias generales.
++
++
++
++
++
++
++
++
++ Dispositivo de radio: Introduzca el dispositivo de radio. Salvo que tenga varios sintonizadores de radio instalados, habitualmente es /dev/radio.
++
++
++ Entrada de sonido: Seleccione la entrada de sonido capaz de controlar de controlar el volumen de su sintonizador de radio. La caja combinada lista todos los dispositivos que puede seleccionar como fuente de grabación. Habitualmente debería escoger uno de ellos, de otra forma no podrá grabar radio. Si ha configurado sus propios nombres para las fuentes en el control de volumen de gnome, estos nombres deberán mostrarse entre paréntesis detrás del nombre «oficial».
++
++
++ Silenciar al salir: Desmarque esta casilla si quiere que la radio se siga reproduciendo después que haya cerrado Gnomeradio.
++
++
++
++
++
++Editar emisoras
++
++ Editar emisoras
++
++
++
++
++
++ Editar emisoras.
++
++
++
++
++Aquí puede añadir algunas emisoras de radio. Puede seleccionar una de ellas usando el control remoto o su .
++
++
++ Nombre: Introduzca un nombre para la emisora (habitualmente el nombre de la emisora de radio).
++
++
++ Frecuencia: Seleccione la frecuencia para la emisora de radio.
++
++
++ Pulse el botón añadir emisora (muestra un +) para añadir la emisora a la lista.
++
++
++ El botón eliminar emisora (muestra un -) eliminará la emisora seleccionada actualmente de la lista.
++
++
++ Utilice el botón actualizar emisora para actualizar la emisora seleccionada con los valores introducidos actualmente en las entradas nombre y frecuencia.
++
++
++
++
++
++
++
++Grabación
++Puede usar gnomeradio para grabar radio (en directo). En este diálogo debe proporcionar cierta información, sobre cómo se hará esto.
++Necesita tener instalada la aplicación externa sox para poder usar la funcionalidad de grabación de Gnomeradio. Si quiere grabar en MP3, deberá instalar también un codificador de MP3. Actualmente los codificadores de MP3 lame y bladeenc están soportados. Para grabar archivos en ogg vorbis necesita oggenc .
++Para abrir este diálogo, pulse el botón grabar en la ventana principal.
++Use el botón Iniciar para iniciar la grabación. Si no pulse en Cancelar para cerrar el diálogo.
++
++
++Configuración generales
++
++ Configuración general de grabación
++
++
++
++
++
++ Configuración general de grabación.
++
++
++
++
++
++
++
++
++ Dispositivo de sonido: Introduzca el nombre de su dispositivo de sonido. Salvo que tenga varias tarjetas de sonido instaladas, habitualmente es /dev/audio.
++
++
++ Nombre de archivo: Seleccione un nombre de archivo y un destino para el archivo donde se guardarán los datos de sonido. Normalmente, este archivo tendrá el sufijo «.wav», en caso de que quiera grabar datos de onda, «.mp3» en caso de que el sonido deba ser grabado en formato mp3 u «.ogg», para archivos ogg vorbis.
++
++
++ Grabar como: Seleccione onda (.wav) , si quiere grabar los datos de sonido en formato de onda (sin comprimir - aproximadamente 10 megabytes por minuto de duración). En otro caso, seleccione MP3/Ogg (.mp3/.ogg) que saltará a un tamaño mucho meno, pero también con una calidad de sonido ligeramente inferior.
++
++
++
++
++
++
++Configuración de onda
++
++ La configuración de onda
++
++
++
++
++
++ La configuración de onda.
++
++
++
++
++Estos ajustes se aplican también al archivo mp3.
++
++
++ Tamaño de la muestra: Seleccione una tamaño de muestra para el archivo de grabación de audio. Un mayor tamaño de muestra significa mejor calidad. 44100 kHz es un buen valor predeterminado (aproximadamente calidad de CD). Si la recepción es mala puede obtener un menor tamaño de muestra, porque la calidad no será buena de ninguna manera.
++
++
++ Formato de muestra: Las opciones disponibles son 8 o 16 bits. Habitualmente querrá escoger 16 bits.
++
++
++ Grabar en: Seleccione estéreo , si quiere grabar en estéreo o mono en otro caso. Probablemente no tenga mucho sentido grabar en estéreo, si la recepción es solamente mono,
++
++
++
++
++
++
++Configuración de MP3/Ogg
++
++ Configuración de MP3/Ogg
++
++
++
++
++
++ Configuración de MP3.
++
++
++
++
++
++
++
++
++ Codificador: Una lista de los codificadores MP3/Ogg soportados que tiene instalados. Seleccione el que prefiera. Actualmente lame , bladeenc y oggenc están soportados. El codificador debe estar en su PATH, si no Gnomeradio no podrá encontrarlo.
++
++
++ Tasa de bits: Seleccione una tasa de bits. Esto será lo que mayor impacto tenga en el tamaño y la calidad del archivo MP3/Ogg resultante. Cuanto más grande sea la tasa de bits, mayor será la calidad. 128 kb/s es habitualmente un valor adecuado, tendrá como resultados archivos de 1 MiB por minuto de duración.
++
++
++
++
++
++Ventana de estado de la grabación
++
++ La ventana de estado
++
++
++
++
++
++ La ventana de estado.
++
++
++
++
++Pulse Detener la grabación para detener la grabación y volver a la ventana principal. La ventana mostrará el nombre y el tamaño del archivo en el que se guardará el sonido.
++
++
++
++
++
++Combinaciones de teclas
++Gnomeradio tiene algunas combinaciones de teclas.
++
++ Atajos de teclado en Gnomeradio
++
++
++
++
++
++ Atajos
++ Descripción
++
++
++
++
++
++ F1
++
++ Abre esta ayuda.
++
++
++
++ r
++
++ Abrir el diálogo de grabación.
++
++
++
++ m
++
++ Silenciar/activar el sonido.
++
++
++
++ q
++
++ Salir de Gnomeradio.
++
++
++
++ f
++
++ Buscar hacia adelante.
++
++
++
++ b
++
++ Buscar hacia atrás.
++
++
++
++ n
++
++ Seleccione la siguiente emisora.
++
++
++
++ p
++
++ Seleccione la emisora anterior.
++
++
++
++ +
++
++ Subir el volumen.
++
++
++
++ -
++
++ Bajar el volumen.
++
++
++
++
++
++
++
++
++
++LIRC
++Puede usar un control remoto soportado por LIRC (Control remoto por infrarrojos de Linux) para controlar Gnomeradio .
++
++Su control remoto sólo funcionará si Gnomeradio se ha compilado con el soporte LIRC habilitado. Si no está seguro de si es éste el caso o no, compruebe el diálogo acerca de.
++
++
++
++El archivo de configuración .lircrc
++En el archivo .lircrc en su carpeta de inicio, puede configurar qué teclas de su control remoto quiere asociar con acciones en Gnomeradio. Una sección habitual en el archivo es similar a esta:
++Ejemplo de una sección .lircrc
++
++begin
++ prog = gnomeradio
++ button = VOL+
++ config = subir volumen
++ repeat = 1
++end
++
++
++Esto asocia el botón VOL+ (atención: Los nombres de los botones son específicos del control remoto) con el comando «subir volumen» «repetir = 1» significa que en caso de que mantenga pulsado el botón de su control remoto, el comando se repite mientras se mantiene presionado el botón. Este comportamiento es el predeterminado.
++Para obtener más información, consulte la documentación de LIRC.
++
++
++
++
++Comandos disponibles
++Los siguientes comandos están disponibles en Gnomeradio:
++
++ Comandos LIRC
++
++
++
++
++
++ Comando
++ Descripción
++
++
++
++
++
++ subir sintonización
++
++ Buscar hacia adelante.
++
++
++
++ bajar sintonización
++
++ Buscar hacia atrás.
++
++
++
++ subir emisora
++
++ Seleccione la siguiente emisora.
++
++
++
++ bajar emisora
++
++ Seleccione la emisora anterior.
++
++
++
++ subir volumen
++
++ Aumentar el volumen.
++
++
++
++ bajar volumen
++
++ Reducir el volumen.
++
++
++
++ silenciar
++
++ Silenciar/activar el sonido.
++
++
++
++ salir
++
++ Salir de Gnomeradio.
++
++
++
++ emisora x
++
++ Seleccione la emisora x + 1 (donde x está entre 0 y 9)
++
++
++
++
++
++
++
+Index: gnomeradio-1.8/help/fr/gnomeradio.xml
+===================================================================
+--- gnomeradio-1.8.orig/help/fr/gnomeradio.xml
++++ /dev/null
+@@ -1,611 +0,0 @@
+-
+-
+-
+-
+-
+-
+-]>
+-
+-
+-
+-
+-
+- Manuel de Gnomeradio v1.0
+-
+- 2002
+-
+- Jörgen Scheibengruber
+- 2008 Bruno Brouard (annoa.b@gmail.com) 2008 Claude Paroz (claude@2xlibre.net)
+-
+-
+-
+- Gnomeradio est un syntoniseur FM pour le bureau GNOME.
+-
+-
+-
+- Projet de documentation GNOME
+-
+-
+-
+- Permission vous est donnée de copier, distribuer et/ou modifier ce document selon les termes de la Licence GNU Free Documentation License, Version 1.1 ou ultérieure publiée par la Free Software Foundation sans section inaltérable, sans texte de première page de couverture ni texte de dernière page de couverture. Vous trouverez un exemplaire de cette licence en suivant ce lien ou dans le fichier COPYING-DOCS fourni avec le présent manuel.
+- Ce manuel fait partie de la collection de manuels GNOME distribués selon les termes de la licence de documentation libre GNU. Si vous souhaitez distribuer ce manuel indépendamment de la collection, vous devez joindre un exemplaire de la licence au document, comme indiqué dans la section 6 de celle-ci.
+-
+- La plupart des noms utilisés par les entreprises pour distinguer leurs produits et services sont des marques déposées. Lorsque ces noms apparaissent dans la documentation GNOME et que les membres du projet de Documentation GNOME sont informés de l'existence de ces marques déposées, soit ces noms entiers, soit leur première lettre est en majuscule.
+-
+- LE PRÉSENT DOCUMENT ET SES VERSIONS MODIFIÉES SONT FOURNIS SELON LES TERMES DE LA LICENCE DE DOCUMENTATION LIBRE GNU SACHANT QUE :
+-
+- LE PRÉSENT DOCUMENT EST FOURNI « TEL QUEL », SANS AUCUNE GARANTIE, EXPRESSE OU IMPLICITE, Y COMPRIS, ET SANS LIMITATION, LES GARANTIES DE MARCHANDABILITÉ, D'ADÉQUATION À UN OBJECTIF PARTICULIER OU DE NON INFRACTION DU DOCUMENT OU DE SA VERSION MODIFIÉE. L'UTILISATEUR ASSUME TOUT RISQUE RELATIF À LA QUALITÉ, À LA PERTINENCE ET À LA PERFORMANCE DU DOCUMENT OU DE SA VERSION DE MISE À JOUR. SI LE DOCUMENT OU SA VERSION MODIFIÉE S'AVÉRAIT DÉFECTUEUSE, L'UTILISATEUR (ET NON LE RÉDACTEUR INITIAL, L'AUTEUR, NI TOUT AUTRE PARTICIPANT) ENDOSSERA LES COÛTS DE TOUTE INTERVENTION, RÉPARATION OU CORRECTION NÉCESSAIRE. CETTE DÉNÉGATION DE RESPONSABILITÉ CONSTITUE UNE PARTIE ESSENTIELLE DE CETTE LICENCE. AUCUNE UTILISATION DE CE DOCUMENT OU DE SA VERSION MODIFIÉE N'EST AUTORISÉE AUX TERMES DU PRÉSENT ACCORD, EXCEPTÉ SOUS CETTE DÉNÉGATION DE RESPONSABILITÉ ;
+-
+-
+- EN AUCUNE CIRCONSTANCE ET SOUS AUCUNE INTERPRÉTATION DE LA LOI, QU'IL S'AGISSE D'UN DÉLIT CIVIL (Y COMPRIS LA NÉGLIGENCE), CONTRACTUEL OU AUTRE, L'AUTEUR, LE RÉDACTEUR INITIAL, TOUT PARTICIPANT OU TOUT DISTRIBUTEUR DE CE DOCUMENT OU DE SA VERSION MODIFIÉE, OU TOUT FOURNISSEUR DE L'UNE DE CES PARTIES NE POURRA ÊTRE TENU RESPONSABLE À L'ÉGARD DE QUICONQUE POUR TOUT DOMMAGE DIRECT, INDIRECT, PARTICULIER, OU ACCIDENTEL DE TOUT TYPE Y COMPRIS, SANS LIMITATION, LES DOMMAGES LIÉS À LA PERTE DE CLIENTÈLE, À UN ARRÊT DE TRAVAIL, À UNE DÉFAILLANCE OU UN MAUVAIS FONCTIONNEMENT INFORMATIQUE, OU À TOUT AUTRE DOMMAGE OU PERTE LIÉE À L'UTILISATION DU DOCUMENT ET DE SES VERSIONS MODIFIÉES, MÊME SI LADITE PARTIE A ÉTÉ INFORMÉE DE L'ÉVENTUALITÉ DE TELS DOMMAGES.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Jörgen
+- Scheibengruber
+-
+- Projet de documentation GNOME
+- mfcn@gmx.de
+-
+-
+-
+-
+-
+-
+- 1.0
+- 2002
+-
+- Jörgen Scheibengruber mfcn@gmx.de
+- Projet de documentation GNOME
+-
+-
+-
+- Ce manuel documente la version 1.3 de Gnomeradio.
+-
+- Votre avis
+- Pour signaler une anomalie ou émettre une suggestion concernant Gnomeradio ou ce manuel, envoyez un courriel à Jörgen Scheibengruber .
+-
+-
+-
+- Gnomeradio
+-
+-
+-
+-
+-
+-Introduction
+-Gnomeradio est un syntoniseur FM pour le bureau GNOME. Il devrait fonctionner avec tout matériel de syntonisation compatible avec les pilotes video4linux .
+-Pour démarrer Gnomeradio ouvrez le menu Applications, puis choisissez Son et vidéo FM-Radio Tuner ou saisissez la commande gnomeradio dans un terminal.
+-
+-
+-
+-
+-Utilisation
+-
+-
+-Fenêtre d'état
+-
+- La boîte noire en haut à gauche de Gnomeradio est la fenêtre d'état
+-
+-
+-
+-
+-
+- La boîte noire en haut à gauche de Gnomeradio est la fenêtre d'état.
+-
+-
+-
+-
+-La fenêtre d'état est située dans le coin supérieur gauche de la fenêtre principale de Gnomeradio. Elle comprend :
+-
+-
+- un message affichant si la réception est mono ou stéréo ;
+-
+-
+- une icône informant de la qualité de la réception ;
+-
+-
+- la fréquence actuelle.
+-
+-
+-
+-
+-
+-
+-Contrôle de la fréquence
+-
+- Outils à utiliser pour modifier la fréquence
+-
+-
+-
+-
+-
+- Outils à utiliser pour modifier la fréquence.
+-
+-
+-
+-
+-Les outils suivants permettent de modifier la fréquence :
+-
+-
+- La fréquence peut être modifiée très rapidement en utilisant la glissière.
+-
+-
+- Le bouton Recherche en arrière (flèche gauche avec barre) fait diminuer la fréquence jusqu'à la prochaine station radio bien captée.
+-
+-
+- Le bouton Reculer de 0.5 MHz (flèche gauche sans barre) diminue la fréquence de 0,5 MHz.
+-
+-
+- Le bouton Avancer de 0.5 MHz (flèche droite sans barre) augmente la fréquence de 0,5 MHz.
+-
+-
+- Le bouton Recherche en avant (flèche droite avec barre) fait la même chose que le bouton « Recherche en arrière » mais en augmentant la fréquence.
+-
+-
+-
+-
+-
+-
+-Contrôle du volume
+-
+- Outils à utiliser pour modifier le volume
+-
+-
+-
+-
+-
+- Outils à utiliser pour modifier le volume.
+-
+-
+-
+-
+-Outils disponibles pour modifier le volume :
+-
+-
+- Utilisez la glissière pour ajuster le volume. Notez que cela ne fonctionne que si vous avez sélectionné la bonne source de mixage dans la boîte de dialogue .
+-
+-
+- Activez/désactivez le bouton montrant un haut-parleur pour couper ou activer le son dans Gnomeradio.
+-
+-
+-
+-
+-
+-
+-Bouton de menu des stations
+-
+- Outil pour choisir une station
+-
+-
+-
+-
+-
+- Outil pour choisir une station.
+-
+-
+-
+-
+-Utilisez le bouton de menu en haut à droite pour sélectionner une station pré-réglée. Vous pouvez modifier les stations dans la boîte de dialogue .
+-
+-
+-
+-
+-Outils divers
+-
+- Outils restants
+-
+-
+-
+-
+-
+- Outils restants.
+-
+-
+-
+-
+-
+-
+-
+-
+- Le bouton Enregistrer ouvre la fenêtre .
+-
+-
+- Un clic sur le bouton À propos affiche une fenêtre contenant les crédits.
+-
+-
+- Derrière le bouton Paramètres se cache la boîte de dialogue .
+-
+-
+- Le bouton Quitter permet de quitter Gnomeradio.
+-
+-
+-
+-
+-
+-
+-
+-
+-Préférences
+-Pour ouvrir la boîte de dialogue des préférences, cliquez sur le bouton Préférences de la fenêtre principale.
+-Une fois terminé, cliquez sur Valider pour enregistrer les modifications ou sur Annuler pour annuler les modifications.
+-
+-
+-Préférences générales
+-
+- Préférences générales
+-
+-
+-
+-
+-
+- Préférences générales.
+-
+-
+-
+-
+-
+-
+-
+-
+- Périphérique radio : saisissez le nom de votre périphérique radio. À moins d'avoir plusieurs syntoniseurs installés, il s'agit habituellement de /dev/radio.
+-
+-
+- Source de mixage : choisissez la source de mixage capable de contrôler le volume de votre syntoniseur. La liste déroulante propose tous les périphériques disponibles pour un enregistrement. Vous devez en général choisir l'un d'entre eux sinon vous ne pourrez pas enregistrer la radio. Si vous avez paramétré les noms des sources de manière personnelle grâce au contrôle de volume GNOME, ces noms apparaissent entre parenthèses derrière le nom « officiel ».
+-
+-
+- Arrêter l'écoute en quittant : décochez cette case si vous désirez que la radio continue de fonctionner après avoir quitté Gnomeradio.
+-
+-
+-
+-
+-
+-Modification des stations
+-
+- Modification des stations
+-
+-
+-
+-
+-
+- Modification des stations.
+-
+-
+-
+-
+-Vous pouvez ajouter ici des stations préréglées. Vous pouvez en sélectionner une en utilisant ou votre télécommande .
+-
+-
+- Nom : saisissez un nom pour la station (en général le nom de la station de radio).
+-
+-
+- Fréquence : choisissez la fréquence de la station de radio.
+-
+-
+- Cliquez sur le bouton Ajouter une station (signe +) pour ajouter une station dans la liste.
+-
+-
+- Cliquez sur le bouton Supprimer une station (signe -) pour supprimer la station sélectionnée de la liste.
+-
+-
+- Utilisez le button Mettre à jour la station pour mettre à jour la station sélectionnée à l'aide des fréquences et noms actuellement saisis.
+-
+-
+-
+-
+-
+-
+-
+-Enregistrement
+-Vous pouvez utiliser Gnomeradio pour enregistrer en direct une radio. Il est nécessaire de fournir quelques informations sur la manière de procéder dans cette boîte de dialogue.
+-L'application externe sox doit être installée afin d'avoir la possibilité d'enregistrer avec Gnomeradio. Si vous désirez enregistrer au format MP3, il faut également installer un codeur MP3. Actuellement les codeurs MP3 lame et bladeenc sont pris en charge. Pour enregistrer des fichiers au format ogg vorbis, il est nécessaire d'installer oggenc .
+-Pour ouvrir cette boîte de dialogue, cliquez sur le bouton Enregistrer de la fenêtre principale.
+-Pressez le bouton Démarrer pour lancer l'enregistrement. Cliquez sur Annuler pour fermer la fenêtre.
+-
+-
+-Paramètres généraux
+-
+- Paramètres d'enregistrement généraux
+-
+-
+-
+-
+-
+- Paramètres d'enregistrement généraux.
+-
+-
+-
+-
+-
+-
+-
+-
+- Périphérique audio : saisissez le nom de votre périphérique audio. À moins de posséder plusieurs cartes son installées, il s'agit habituellement de /dev/audio.
+-
+-
+- Nom de fichier : saisissez un nom de fichier et un dossier de destination pour le fichier. Ce fichier doit posséder l'extension « .wav » si vous désirez enregistrer au format wave, « .mp3 » pour le format mp3 ou « .ogg » pour le format ogg vorbis.
+-
+-
+- Enregistrer comme : choisissez Wave (.wav) si vous voulez que les données soient enregistrées au format Wave (non compressé, env. 10 Mio par minute de son). Sinon choisissez MP3/Ogg (.mp3/.ogg) pour obtenir des fichiers de taille beaucoup plus réduite mais aussi de qualité inférieure.
+-
+-
+-
+-
+-
+-
+-Paramètres du signal
+-
+- Les paramètres du signal
+-
+-
+-
+-
+-
+- Les paramètres du signal.
+-
+-
+-
+-
+-Ces réglages s'appliquent également aux fichiers mp3.
+-
+-
+- Taux d'échantillonnage : choisissez un taux d'échantillonnage pour le fichier d'enregistrement audio. Un taux plus élevé signifie une qualité meilleure. 44100 Hz est un bon choix par défaut (proche de la qualité CD). Si la réception est mauvaise, vous pouvez choisir un taux d'échantillonnage plus faible parce que la qualité sera de toute façon mauvaise.
+-
+-
+- Format des échantillons : les options disponibles sont 8 ou 16 bits. Il est d'usage de choisir 16 bits.
+-
+-
+- Enregistrement : choisissez stéréo si vous voulez enregistrer en stéréo ou mono sinon. Il ne sert à rien d'enregistrer en stéréo si la réception est mono.
+-
+-
+-
+-
+-
+-
+-Paramètres MP3/Ogg
+-
+- Les paramètres MP3/Ogg
+-
+-
+-
+-
+-
+- Les paramètres MP3/Ogg.
+-
+-
+-
+-
+-
+-
+-
+-
+- Codeur : liste des codeurs MP3/Ogg pris en charge et installés. Choisissez celui que vous préférez. Actuellement lame , bladeenc et oggenc sont pris en charge. Le codeur doit se trouver dans votre chemin (PATH) sinon Gnomeradio ne peut l'utiliser.
+-
+-
+- Débit binaire : choisissez un débit binaire. Ceci aura la plus grande influence sur la taille et la qualité du fichier MP3/Ogg résultant. Plus le débit est élevé, meilleure est la qualité. 128 kio/s est habituellement un bon choix qui donne comme résultat des fichiers qui font approximativement 1 Mio par minute de son.
+-
+-
+-
+-
+-
+-Fenêtre d'état d'enregistrement
+-
+- La fenêtre d'état
+-
+-
+-
+-
+-
+- La fenêtre d'état.
+-
+-
+-
+-
+-Cliquez sur Arrêter l'enregistrement pour mettre fin à l'enregistrement et retourner à la fenêtre principale. La fenêtre affiche le nom et la taille du fichier dans lequel les données sont enregistrées.
+-
+-
+-
+-
+-
+-Raccourcis clavier
+-Gnomeradio possède quelques raccourcis clavier.
+-
+- Raccourcis clavier de Gnomeradio
+-
+-
+-
+-
+-
+- Raccourci
+- Description
+-
+-
+-
+-
+-
+- F1
+-
+- Ouvrir cette aide.
+-
+-
+-
+- r
+-
+- Ouvrir la fenêtre d'enregistrement.
+-
+-
+-
+- m
+-
+- Couper/activer le volume.
+-
+-
+-
+- q
+-
+- Quitter Gnomeradio.
+-
+-
+-
+- f
+-
+- Rechercher en avant.
+-
+-
+-
+- b
+-
+- Rechercher en arrière.
+-
+-
+-
+- n
+-
+- Choisir la station suivante.
+-
+-
+-
+- p
+-
+- Choisir la station précédente.
+-
+-
+-
+- +
+-
+- Augmenter le volume.
+-
+-
+-
+- -
+-
+- Diminuer le volume.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-LIRC
+-Vous pouvez utiliser une télécommande prise en charge par LIRC (Linux infrared remote control) pour piloter Gnomeradio .
+-
+-Votre télécommande ne fonctionnera que si Gnomeradio a été compilé avec la prise en charge de LIRC. Vous pouvez le vérifier grâce à la boîte de dialogue À propos.
+-
+-
+-
+-Le fichier de configuration .lircrc
+-Dans le fichier .lircrc de votre dossier personnel, vous pouvez indiquer quelles touches de votre télécommande sont associées à des actions dans Gnomeradio. Une section type de ce fichier ressemble à ceci :
+-Exemple de section .lircrc
+-
+-begin
+- prog = gnomeradio
+- button = VOL+
+- config = volume up
+- repeat = 1
+-end
+-
+-
+-Ceci permet d'associer le bouton VOL+ (attention, les noms des boutons sont spécifiques à la télécommande) à la commande « volume up ». « repeat = 1 » signifie qu'au cas où vous maintenez le bouton de votre télécommande enfoncé, la commande est répétée jusqu'à ce que vous relâchiez le bouton. Par défaut, cette fonction n'est pas activée.
+-Pour plus d'informations, consultez la documentation LIRC.
+-
+-
+-
+-
+-Commandes disponibles
+-Les commandes suivantes sont disponibles dans Gnomeradio :
+-
+- Commandes LIRC
+-
+-
+-
+-
+-
+- Commande
+- Description
+-
+-
+-
+-
+-
+- tune up
+-
+- Rechercher en avant.
+-
+-
+-
+- tune down
+-
+- Rechercher en arrière.
+-
+-
+-
+- preset up
+-
+- Choisir la station suivante.
+-
+-
+-
+- preset down
+-
+- Choisir la station précédente.
+-
+-
+-
+- volume up
+-
+- Augmenter le volume.
+-
+-
+-
+- volume down
+-
+- Diminuer le volume.
+-
+-
+-
+- mute
+-
+- Couper/activer le volume.
+-
+-
+-
+- quit
+-
+- Quitter Gnomeradio.
+-
+-
+-
+- preset x
+-
+- Choisir la station x + 1 (où x est compris entre 0 et 9)
+-
+-
+-
+-
+-
+-
+-
+Index: gnomeradio-1.8/help/fr/index.docbook
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/help/fr/index.docbook
+@@ -0,0 +1,611 @@
++
++
++
++
++
++
++]>
++
++
++
++
++
++ Manuel de Gnomeradio v1.0
++
++ 2002
++
++ Jörgen Scheibengruber
++ 2008 Bruno Brouard (annoa.b@gmail.com) 2008 Claude Paroz (claude@2xlibre.net)
++
++
++
++ Gnomeradio est un syntoniseur FM pour le bureau GNOME.
++
++
++
++ Projet de documentation GNOME
++
++
++
++ Permission vous est donnée de copier, distribuer et/ou modifier ce document selon les termes de la Licence GNU Free Documentation License, Version 1.1 ou ultérieure publiée par la Free Software Foundation sans section inaltérable, sans texte de première page de couverture ni texte de dernière page de couverture. Vous trouverez un exemplaire de cette licence en suivant ce lien ou dans le fichier COPYING-DOCS fourni avec le présent manuel.
++ Ce manuel fait partie de la collection de manuels GNOME distribués selon les termes de la licence de documentation libre GNU. Si vous souhaitez distribuer ce manuel indépendamment de la collection, vous devez joindre un exemplaire de la licence au document, comme indiqué dans la section 6 de celle-ci.
++
++ La plupart des noms utilisés par les entreprises pour distinguer leurs produits et services sont des marques déposées. Lorsque ces noms apparaissent dans la documentation GNOME et que les membres du projet de Documentation GNOME sont informés de l'existence de ces marques déposées, soit ces noms entiers, soit leur première lettre est en majuscule.
++
++ LE PRÉSENT DOCUMENT ET SES VERSIONS MODIFIÉES SONT FOURNIS SELON LES TERMES DE LA LICENCE DE DOCUMENTATION LIBRE GNU SACHANT QUE :
++
++ LE PRÉSENT DOCUMENT EST FOURNI « TEL QUEL », SANS AUCUNE GARANTIE, EXPRESSE OU IMPLICITE, Y COMPRIS, ET SANS LIMITATION, LES GARANTIES DE MARCHANDABILITÉ, D'ADÉQUATION À UN OBJECTIF PARTICULIER OU DE NON INFRACTION DU DOCUMENT OU DE SA VERSION MODIFIÉE. L'UTILISATEUR ASSUME TOUT RISQUE RELATIF À LA QUALITÉ, À LA PERTINENCE ET À LA PERFORMANCE DU DOCUMENT OU DE SA VERSION DE MISE À JOUR. SI LE DOCUMENT OU SA VERSION MODIFIÉE S'AVÉRAIT DÉFECTUEUSE, L'UTILISATEUR (ET NON LE RÉDACTEUR INITIAL, L'AUTEUR, NI TOUT AUTRE PARTICIPANT) ENDOSSERA LES COÛTS DE TOUTE INTERVENTION, RÉPARATION OU CORRECTION NÉCESSAIRE. CETTE DÉNÉGATION DE RESPONSABILITÉ CONSTITUE UNE PARTIE ESSENTIELLE DE CETTE LICENCE. AUCUNE UTILISATION DE CE DOCUMENT OU DE SA VERSION MODIFIÉE N'EST AUTORISÉE AUX TERMES DU PRÉSENT ACCORD, EXCEPTÉ SOUS CETTE DÉNÉGATION DE RESPONSABILITÉ ;
++
++
++ EN AUCUNE CIRCONSTANCE ET SOUS AUCUNE INTERPRÉTATION DE LA LOI, QU'IL S'AGISSE D'UN DÉLIT CIVIL (Y COMPRIS LA NÉGLIGENCE), CONTRACTUEL OU AUTRE, L'AUTEUR, LE RÉDACTEUR INITIAL, TOUT PARTICIPANT OU TOUT DISTRIBUTEUR DE CE DOCUMENT OU DE SA VERSION MODIFIÉE, OU TOUT FOURNISSEUR DE L'UNE DE CES PARTIES NE POURRA ÊTRE TENU RESPONSABLE À L'ÉGARD DE QUICONQUE POUR TOUT DOMMAGE DIRECT, INDIRECT, PARTICULIER, OU ACCIDENTEL DE TOUT TYPE Y COMPRIS, SANS LIMITATION, LES DOMMAGES LIÉS À LA PERTE DE CLIENTÈLE, À UN ARRÊT DE TRAVAIL, À UNE DÉFAILLANCE OU UN MAUVAIS FONCTIONNEMENT INFORMATIQUE, OU À TOUT AUTRE DOMMAGE OU PERTE LIÉE À L'UTILISATION DU DOCUMENT ET DE SES VERSIONS MODIFIÉES, MÊME SI LADITE PARTIE A ÉTÉ INFORMÉE DE L'ÉVENTUALITÉ DE TELS DOMMAGES.
++
++
++
++
++
++
++
++
++
++ Jörgen
++ Scheibengruber
++
++ Projet de documentation GNOME
++ mfcn@gmx.de
++
++
++
++
++
++
++ 1.0
++ 2002
++
++ Jörgen Scheibengruber mfcn@gmx.de
++ Projet de documentation GNOME
++
++
++
++ Ce manuel documente la version 1.3 de Gnomeradio.
++
++ Votre avis
++ Pour signaler une anomalie ou émettre une suggestion concernant Gnomeradio ou ce manuel, envoyez un courriel à Jörgen Scheibengruber .
++
++
++
++ Gnomeradio
++
++
++
++
++
++Introduction
++Gnomeradio est un syntoniseur FM pour le bureau GNOME. Il devrait fonctionner avec tout matériel de syntonisation compatible avec les pilotes video4linux .
++Pour démarrer Gnomeradio ouvrez le menu Applications, puis choisissez Son et vidéo FM-Radio Tuner ou saisissez la commande gnomeradio dans un terminal.
++
++
++
++
++Utilisation
++
++
++Fenêtre d'état
++
++ La boîte noire en haut à gauche de Gnomeradio est la fenêtre d'état
++
++
++
++
++
++ La boîte noire en haut à gauche de Gnomeradio est la fenêtre d'état.
++
++
++
++
++La fenêtre d'état est située dans le coin supérieur gauche de la fenêtre principale de Gnomeradio. Elle comprend :
++
++
++ un message affichant si la réception est mono ou stéréo ;
++
++
++ une icône informant de la qualité de la réception ;
++
++
++ la fréquence actuelle.
++
++
++
++
++
++
++Contrôle de la fréquence
++
++ Outils à utiliser pour modifier la fréquence
++
++
++
++
++
++ Outils à utiliser pour modifier la fréquence.
++
++
++
++
++Les outils suivants permettent de modifier la fréquence :
++
++
++ La fréquence peut être modifiée très rapidement en utilisant la glissière.
++
++
++ Le bouton Recherche en arrière (flèche gauche avec barre) fait diminuer la fréquence jusqu'à la prochaine station radio bien captée.
++
++
++ Le bouton Reculer de 0.5 MHz (flèche gauche sans barre) diminue la fréquence de 0,5 MHz.
++
++
++ Le bouton Avancer de 0.5 MHz (flèche droite sans barre) augmente la fréquence de 0,5 MHz.
++
++
++ Le bouton Recherche en avant (flèche droite avec barre) fait la même chose que le bouton « Recherche en arrière » mais en augmentant la fréquence.
++
++
++
++
++
++
++Contrôle du volume
++
++ Outils à utiliser pour modifier le volume
++
++
++
++
++
++ Outils à utiliser pour modifier le volume.
++
++
++
++
++Outils disponibles pour modifier le volume :
++
++
++ Utilisez la glissière pour ajuster le volume. Notez que cela ne fonctionne que si vous avez sélectionné la bonne source de mixage dans la boîte de dialogue .
++
++
++ Activez/désactivez le bouton montrant un haut-parleur pour couper ou activer le son dans Gnomeradio.
++
++
++
++
++
++
++Bouton de menu des stations
++
++ Outil pour choisir une station
++
++
++
++
++
++ Outil pour choisir une station.
++
++
++
++
++Utilisez le bouton de menu en haut à droite pour sélectionner une station pré-réglée. Vous pouvez modifier les stations dans la boîte de dialogue .
++
++
++
++
++Outils divers
++
++ Outils restants
++
++
++
++
++
++ Outils restants.
++
++
++
++
++
++
++
++
++ Le bouton Enregistrer ouvre la fenêtre .
++
++
++ Un clic sur le bouton À propos affiche une fenêtre contenant les crédits.
++
++
++ Derrière le bouton Paramètres se cache la boîte de dialogue .
++
++
++ Le bouton Quitter permet de quitter Gnomeradio.
++
++
++
++
++
++
++
++
++Préférences
++Pour ouvrir la boîte de dialogue des préférences, cliquez sur le bouton Préférences de la fenêtre principale.
++Une fois terminé, cliquez sur Valider pour enregistrer les modifications ou sur Annuler pour annuler les modifications.
++
++
++Préférences générales
++
++ Préférences générales
++
++
++
++
++
++ Préférences générales.
++
++
++
++
++
++
++
++
++ Périphérique radio : saisissez le nom de votre périphérique radio. À moins d'avoir plusieurs syntoniseurs installés, il s'agit habituellement de /dev/radio.
++
++
++ Source de mixage : choisissez la source de mixage capable de contrôler le volume de votre syntoniseur. La liste déroulante propose tous les périphériques disponibles pour un enregistrement. Vous devez en général choisir l'un d'entre eux sinon vous ne pourrez pas enregistrer la radio. Si vous avez paramétré les noms des sources de manière personnelle grâce au contrôle de volume GNOME, ces noms apparaissent entre parenthèses derrière le nom « officiel ».
++
++
++ Arrêter l'écoute en quittant : décochez cette case si vous désirez que la radio continue de fonctionner après avoir quitté Gnomeradio.
++
++
++
++
++
++Modification des stations
++
++ Modification des stations
++
++
++
++
++
++ Modification des stations.
++
++
++
++
++Vous pouvez ajouter ici des stations préréglées. Vous pouvez en sélectionner une en utilisant ou votre télécommande .
++
++
++ Nom : saisissez un nom pour la station (en général le nom de la station de radio).
++
++
++ Fréquence : choisissez la fréquence de la station de radio.
++
++
++ Cliquez sur le bouton Ajouter une station (signe +) pour ajouter une station dans la liste.
++
++
++ Cliquez sur le bouton Supprimer une station (signe -) pour supprimer la station sélectionnée de la liste.
++
++
++ Utilisez le button Mettre à jour la station pour mettre à jour la station sélectionnée à l'aide des fréquences et noms actuellement saisis.
++
++
++
++
++
++
++
++Enregistrement
++Vous pouvez utiliser Gnomeradio pour enregistrer en direct une radio. Il est nécessaire de fournir quelques informations sur la manière de procéder dans cette boîte de dialogue.
++L'application externe sox doit être installée afin d'avoir la possibilité d'enregistrer avec Gnomeradio. Si vous désirez enregistrer au format MP3, il faut également installer un codeur MP3. Actuellement les codeurs MP3 lame et bladeenc sont pris en charge. Pour enregistrer des fichiers au format ogg vorbis, il est nécessaire d'installer oggenc .
++Pour ouvrir cette boîte de dialogue, cliquez sur le bouton Enregistrer de la fenêtre principale.
++Pressez le bouton Démarrer pour lancer l'enregistrement. Cliquez sur Annuler pour fermer la fenêtre.
++
++
++Paramètres généraux
++
++ Paramètres d'enregistrement généraux
++
++
++
++
++
++ Paramètres d'enregistrement généraux.
++
++
++
++
++
++
++
++
++ Périphérique audio : saisissez le nom de votre périphérique audio. À moins de posséder plusieurs cartes son installées, il s'agit habituellement de /dev/audio.
++
++
++ Nom de fichier : saisissez un nom de fichier et un dossier de destination pour le fichier. Ce fichier doit posséder l'extension « .wav » si vous désirez enregistrer au format wave, « .mp3 » pour le format mp3 ou « .ogg » pour le format ogg vorbis.
++
++
++ Enregistrer comme : choisissez Wave (.wav) si vous voulez que les données soient enregistrées au format Wave (non compressé, env. 10 Mio par minute de son). Sinon choisissez MP3/Ogg (.mp3/.ogg) pour obtenir des fichiers de taille beaucoup plus réduite mais aussi de qualité inférieure.
++
++
++
++
++
++
++Paramètres du signal
++
++ Les paramètres du signal
++
++
++
++
++
++ Les paramètres du signal.
++
++
++
++
++Ces réglages s'appliquent également aux fichiers mp3.
++
++
++ Taux d'échantillonnage : choisissez un taux d'échantillonnage pour le fichier d'enregistrement audio. Un taux plus élevé signifie une qualité meilleure. 44100 Hz est un bon choix par défaut (proche de la qualité CD). Si la réception est mauvaise, vous pouvez choisir un taux d'échantillonnage plus faible parce que la qualité sera de toute façon mauvaise.
++
++
++ Format des échantillons : les options disponibles sont 8 ou 16 bits. Il est d'usage de choisir 16 bits.
++
++
++ Enregistrement : choisissez stéréo si vous voulez enregistrer en stéréo ou mono sinon. Il ne sert à rien d'enregistrer en stéréo si la réception est mono.
++
++
++
++
++
++
++Paramètres MP3/Ogg
++
++ Les paramètres MP3/Ogg
++
++
++
++
++
++ Les paramètres MP3/Ogg.
++
++
++
++
++
++
++
++
++ Codeur : liste des codeurs MP3/Ogg pris en charge et installés. Choisissez celui que vous préférez. Actuellement lame , bladeenc et oggenc sont pris en charge. Le codeur doit se trouver dans votre chemin (PATH) sinon Gnomeradio ne peut l'utiliser.
++
++
++ Débit binaire : choisissez un débit binaire. Ceci aura la plus grande influence sur la taille et la qualité du fichier MP3/Ogg résultant. Plus le débit est élevé, meilleure est la qualité. 128 kio/s est habituellement un bon choix qui donne comme résultat des fichiers qui font approximativement 1 Mio par minute de son.
++
++
++
++
++
++Fenêtre d'état d'enregistrement
++
++ La fenêtre d'état
++
++
++
++
++
++ La fenêtre d'état.
++
++
++
++
++Cliquez sur Arrêter l'enregistrement pour mettre fin à l'enregistrement et retourner à la fenêtre principale. La fenêtre affiche le nom et la taille du fichier dans lequel les données sont enregistrées.
++
++
++
++
++
++Raccourcis clavier
++Gnomeradio possède quelques raccourcis clavier.
++
++ Raccourcis clavier de Gnomeradio
++
++
++
++
++
++ Raccourci
++ Description
++
++
++
++
++
++ F1
++
++ Ouvrir cette aide.
++
++
++
++ r
++
++ Ouvrir la fenêtre d'enregistrement.
++
++
++
++ m
++
++ Couper/activer le volume.
++
++
++
++ q
++
++ Quitter Gnomeradio.
++
++
++
++ f
++
++ Rechercher en avant.
++
++
++
++ b
++
++ Rechercher en arrière.
++
++
++
++ n
++
++ Choisir la station suivante.
++
++
++
++ p
++
++ Choisir la station précédente.
++
++
++
++ +
++
++ Augmenter le volume.
++
++
++
++ -
++
++ Diminuer le volume.
++
++
++
++
++
++
++
++
++
++LIRC
++Vous pouvez utiliser une télécommande prise en charge par LIRC (Linux infrared remote control) pour piloter Gnomeradio .
++
++Votre télécommande ne fonctionnera que si Gnomeradio a été compilé avec la prise en charge de LIRC. Vous pouvez le vérifier grâce à la boîte de dialogue À propos.
++
++
++
++Le fichier de configuration .lircrc
++Dans le fichier .lircrc de votre dossier personnel, vous pouvez indiquer quelles touches de votre télécommande sont associées à des actions dans Gnomeradio. Une section type de ce fichier ressemble à ceci :
++Exemple de section .lircrc
++
++begin
++ prog = gnomeradio
++ button = VOL+
++ config = volume up
++ repeat = 1
++end
++
++
++Ceci permet d'associer le bouton VOL+ (attention, les noms des boutons sont spécifiques à la télécommande) à la commande « volume up ». « repeat = 1 » signifie qu'au cas où vous maintenez le bouton de votre télécommande enfoncé, la commande est répétée jusqu'à ce que vous relâchiez le bouton. Par défaut, cette fonction n'est pas activée.
++Pour plus d'informations, consultez la documentation LIRC.
++
++
++
++
++Commandes disponibles
++Les commandes suivantes sont disponibles dans Gnomeradio :
++
++ Commandes LIRC
++
++
++
++
++
++ Commande
++ Description
++
++
++
++
++
++ tune up
++
++ Rechercher en avant.
++
++
++
++ tune down
++
++ Rechercher en arrière.
++
++
++
++ preset up
++
++ Choisir la station suivante.
++
++
++
++ preset down
++
++ Choisir la station précédente.
++
++
++
++ volume up
++
++ Augmenter le volume.
++
++
++
++ volume down
++
++ Diminuer le volume.
++
++
++
++ mute
++
++ Couper/activer le volume.
++
++
++
++ quit
++
++ Quitter Gnomeradio.
++
++
++
++ preset x
++
++ Choisir la station x + 1 (où x est compris entre 0 et 9)
++
++
++
++
++
++
++
+Index: gnomeradio-1.8/help/oc/gnomeradio.xml
+===================================================================
+--- gnomeradio-1.8.orig/help/oc/gnomeradio.xml
++++ /dev/null
+@@ -1,873 +0,0 @@
+-
+-
+-
+-
+-
+-
+-]>
+-
+-
+-
+-
+-
+- Gnomeradio Manual V1.0
+-
+- 2002
+-
+- Jörgen Scheibengruber
+-
+-
+-
+-
+- Gnomeradio is a FM-tuner application for the GNOME desktop.
+-
+-
+-
+- Projècte de documentacion de GNOME
+-
+-
+-
+-
+- Permission is granted to copy, distribute and/or modify this
+- document under the terms of the GNU Free Documentation
+- License (GFDL), Version 1.1 or any later version published
+- by the Free Software Foundation with no Invariant Sections,
+- no Front-Cover Texts, and no Back-Cover Texts. You can find
+- a copy of the GFDL at this link or in the file COPYING-DOCS
+- distributed with this manual.
+-
+- This manual is part of a collection of GNOME manuals
+- distributed under the GFDL. If you want to distribute this
+- manual separately from the collection, you can do so by
+- adding a copy of the license to the manual, as described in
+- section 6 of the license.
+-
+-
+-
+- Many of the names used by companies to distinguish their
+- products and services are claimed as trademarks. Where those
+- names appear in any GNOME documentation, and the members of
+- the GNOME Documentation Project are made aware of those
+- trademarks, then the names are in capital letters or initial
+- capital letters.
+-
+-
+-
+- DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED
+- UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE
+- WITH THE FURTHER UNDERSTANDING THAT:
+-
+-
+-
+- DOCUMENT IS PROVIDED ON AN "AS IS" BASIS,
+- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
+- IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+- THAT THE DOCUMENT OR MODIFIED VERSION OF THE
+- DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR
+- A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE
+- RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE
+- OF THE DOCUMENT OR MODIFIED VERSION OF THE
+- DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR
+- MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT,
+- YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY
+- CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
+- SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+- OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
+- LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED
+- VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER
+- EXCEPT UNDER THIS DISCLAIMER; AND
+-
+-
+-
+- UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
+- THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE),
+- CONTRACT, OR OTHERWISE, SHALL THE AUTHOR,
+- INITIAL WRITER, ANY CONTRIBUTOR, OR ANY
+- DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION
+- OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH
+- PARTIES, BE LIABLE TO ANY PERSON FOR ANY
+- DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
+- CONSEQUENTIAL DAMAGES OF ANY CHARACTER
+- INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS
+- OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR
+- MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR
+- LOSSES ARISING OUT OF OR RELATING TO USE OF THE
+- DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT,
+- EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF
+- THE POSSIBILITY OF SUCH DAMAGES.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Jörgen
+- Scheibengruber
+-
+- Projècte de documentacion de GNOME
+- mfcn@gmx.de
+-
+-
+-
+-
+-
+-
+- 1.0
+- 2002
+-
+- Jörgen Scheibengruber
+- mfcn@gmx.de
+- Projècte de documentacion de GNOME
+-
+-
+-
+- This manual describes version 1.3 of Gnomeradio.
+-
+-
+- Feedback
+- To report a bug or make a suggestion regarding Gnomeradio or this
+- manual, send a e-mail to Jörgen Scheibengruber .
+-
+-
+-
+- Gnomeradio
+-
+-
+-
+-
+-
+-Introduccion
+-
+-Gnomeradio is a FM-Tuner application for the GNOME desktop.
+-It should work with all tuner hardware that is supported by the
+-video4linux drivers.
+-
+-
+-To start Gnomeradio open the applications menu, then choose
+-
+-Multimedia
+-Gnomeradio
+-
+-or type gnomeradio in a shell.
+-
+-
+-
+-
+-
+-Utilizacion
+-
+-
+-Status window
+-
+- The black box in the upper left of Gnomeradio is the status window
+-
+-
+-
+-
+-
+- The black box in the upper left of Gnomeradio is the status window.
+-
+-
+-
+-
+-
+-The status window is located in the upper left corner of the Gnomeradio main window. It consists of:
+-
+-
+-
+-
+- a label showing wether the reception is mono or stereo,
+-
+-
+-
+-
+- an icon indicating the quality of the reception and
+-
+-
+-
+-
+- the current frequency.
+-
+-
+-
+-
+-
+-
+-
+-Frequency controls
+-
+- Use these controls to change the frequency
+-
+-
+-
+-
+-
+- Use these controls to change the frequency.
+-
+-
+-
+-
+-
+-The following controls are available to change the frequency:
+-
+-
+-
+-
+- Using the slider you can change the frequency very quick.
+-
+-
+-
+-
+- The scan backwards button (left-arrow with bar) will decrease the frequency until if detects the next radio station with good reception.
+-
+-
+-
+-
+- The 0.5 MHz backwards button (left-arrow without bar) decreases the frequency by 0.5 MHz.
+-
+-
+-
+-
+- The 0.5 MHz forward button (right-arrow without bar) increases the frequency by 0.5 MHz.
+-
+-
+-
+-
+- The scan forwards button (right-arrow with bar) does the same as the "scan backwards" button, but it increases
+- the frequency.
+-
+-
+-
+-
+-
+-
+-
+-Volume controls
+-
+- Use these controls to change the volume
+-
+-
+-
+-
+-
+- Use these controls to change the volume.
+-
+-
+-
+-
+-
+-Controls available to change the volume:
+-
+-
+-
+-
+- Use the slider to adjust the volume. Note that it will only work if you have picked the right mixer
+- source , in the Dialog.
+-
+-
+-
+-
+- Toggling the button showing the speaker will mute/unmute Gnomeradio.
+-
+-
+-
+-
+-
+-
+-
+-Presets menubutton
+-
+- Choose a preset using the menubutton
+-
+-
+-
+-
+-
+- Choose a preset using the menubutton.
+-
+-
+-
+-
+-
+-Use the menubutton in the upper right to choose a radio station preset.
+-You can edit presets in the Dialog.
+-
+-
+-
+-
+-
+-Misc. controls
+-
+- Remaining controls
+-
+-
+-
+-
+-
+- Remaining controls.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- The record button opens the Dialog.
+-
+-
+-
+-
+- Clicking the about button will show a window with some credits.
+-
+-
+-
+-
+- Behind the settings button hides the Dialog.
+-
+-
+-
+-
+- The quit button will terminate Gnomeradio
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-Preferéncias
+-
+-To open the preferences dialog, click the preferences button in the main window.
+-
+-
+-If you are finished click OK to accept your changes
+-or Cancel to undo the changes.
+-
+-
+-
+-General preferences
+-
+- General preferences
+-
+-
+-
+-
+-
+- General preferences.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Radio Device: Enter your radio device. Unless you have several radio
+- tuners installed this is usually /dev/radio.
+-
+-
+-
+-
+- Mixer Source: Choose the mixer source that is able to control the volume
+- of your radio tuner. The combobox lists all devices that you can choose as a recording source.
+- You should usually pick one of these, otherwise you won't be able to record radio. If you have
+- set up own names for the sources in gnome volume control, these names will be shown in paranthesis
+- behind the "official" name.
+-
+-
+-
+-
+- Mute on Exit: Uncheck this checkbox, if you want that the radio keeps on
+- playing after you have terminated Gnomeradio.
+-
+-
+-
+-
+-
+-
+-Editing presets
+-
+- Editing presets
+-
+-
+-
+-
+-
+- Editing presets.
+-
+-
+-
+-
+-
+-Here you can add some preset radio stations. You can select one of these
+-using the or your
+- remote control.
+-
+-
+-
+-
+- Name: Enter a name for the preset (usually the name
+- of the radio station).
+-
+-
+-
+-
+- Frequency: Choose the frequency for the radio station.
+-
+-
+-
+-
+- Click the button add preset (shows a +) to add the preset
+- to the list.
+-
+-
+-
+-
+- The button remove preset (shows a -) will remove the currently
+- selected preset from the list.
+-
+-
+-
+-
+- Use the button update preset to update the selected preset with
+- the values currently entered in the name and frequency entries.
+-
+-
+-
+-
+-
+-
+-
+-
+-Recording
+-
+-You can use gnomeradio to (live)record radio. In this dialog you
+-have to give some information, on how this shall be done.
+-
+-You need the external application sox
+-installed in order to use the recording functionality of Gnomeradio.
+-If you want to record as MP3,
+-you have to install a MP3 encoder, too. Currently the MP3 encoders
+-lame and
+-bladeenc are supported.
+-To record files as ogg vorbis you need
+-oggenc .
+-
+-
+-To open this dialog, click the record button in the main window.
+-
+-
+-Use the Start button to start recording.
+-Otherwise click Cancel to close the dialog.
+-
+-
+-
+-General settings
+-
+- General recording settings
+-
+-
+-
+-
+-
+- General recording settings.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Audio Device: Enter your audio device. Unless you have several soundcards
+- installed this is usually /dev/audio.
+-
+-
+-
+-
+- Filename: Choose a filename and destination for the file in which the audio
+- data should be stored. This file should usually have the suffix ".wav", in case you want to record
+- as wave data, ".mp3", in case the audio should be stored in the mp3-format or ".ogg", for ogg vorbis
+- files.
+-
+-
+-
+-
+- Record as: Select Wave (.wav) , if you want the audio
+- data to be stored in the wave format (uncompressed - about 10 megabyte per minute playlength).
+- Otherwise choose MP3/Ogg (.mp3/.ogg) which will lead to a much lower filesize, but
+- also a little bit lower audio quality.
+-
+-
+-
+-
+-
+-
+-
+-Wave settings
+-
+- The wave settings
+-
+-
+-
+-
+-
+- The wave settings.
+-
+-
+-
+-
+-
+-These settings apply to the mp3 file, too.
+-
+-
+-
+-
+- Sample rate: Choose a sample rate for the recording audio file. Higher sampling
+- rate means better quality. 44100 kHz is a good default (aprox. CD quality). If the reception
+- is bad you can take a lower sampling rate, because the quality won't be that good anyways.
+-
+-
+-
+-
+- Sample format: Available options are 8 or 16 bit. Usually you want to
+- take 16 bit.
+-
+-
+-
+-
+- Record in: Select stereo , if you want to record in
+- stereo or mono otherwise. It probably doen't make much sense to record
+- in stereo, if the reception is only mono.
+-
+-
+-
+-
+-
+-
+-
+-MP3/Ogg settings
+-
+- The MP3/Ogg settings
+-
+-
+-
+-
+-
+- The MP3 settings.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Encoder: A list of supported MP3/Ogg encoders that you have installed. Choose the one you like the
+- best. Currently lame ,
+- bladeenc and
+- oggenc are supported.
+- The encoder must be in your PATH, otherwise Gnomeradio can't find it.
+-
+-
+-
+-
+- Bitrate: Choose a bitrate. This will have the largest impact
+- on the size and quality of the resulting MP3/Ogg file. The higher the bitrate the better the
+- quality. 128 kb/s is usually a good value which will result in files that are aprox. 1 MB
+- per minute playlength.
+-
+-
+-
+-
+-
+-
+-Recording status window
+-
+- The status window
+-
+-
+-
+-
+-
+- The status window.
+-
+-
+-
+-
+-
+-Click Stop Recording to stop the recording and return to
+-the main window. The window shows the name and size of the file in which the audio
+-data is being stored.
+-
+-
+-
+-
+-
+-
+-Keybindings
+-
+-Gnomeradio has a few keybindings.
+-
+-
+- Keyboard shortcuts in Gnomeradio
+-
+-
+-
+-
+-
+- Acorchi
+- Descripcion
+-
+-
+-
+-
+-
+- F1
+-
+-
+- Open this help.
+-
+-
+-
+-
+- r
+-
+-
+- Open the recording dialog.
+-
+-
+-
+-
+- m
+-
+-
+- Mute/unmute the volume.
+-
+-
+-
+-
+- q
+-
+-
+- Terminate Gnomeradio.
+-
+-
+-
+-
+- f
+-
+-
+- Scan forward.
+-
+-
+-
+-
+- b
+-
+-
+- Scan backwards.
+-
+-
+-
+-
+- n
+-
+-
+- Select next preset.
+-
+-
+-
+-
+- p
+-
+-
+- Select previous preset.
+-
+-
+-
+-
+- +
+-
+-
+- Increase volume.
+-
+-
+-
+-
+- -
+-
+-
+- Decrease volume.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-LIRC
+-
+-You can use a remote control supported by LIRC
+-(Linux infrared remote control) to control Gnomeradio .
+-
+-
+-Your remote control will only work if Gnomeradio has been compiled with
+-LIRC support enabled. If you are unsure wether this is the case or not, check the about dialog.
+-
+-
+-
+-
+-The .lircrc config file
+-
+-In the file .lircrc in your home directory, you set up which keys
+-on your remote control you want to associate with actions in Gnomeradio. A typical
+-section in the file looks like this:
+-
+-Example for a .lircrc section
+-
+-begin
+- prog = gnomeradio
+- button = VOL+
+- config = volume up
+- repeat = 1
+-end
+-
+-
+-
+-This associates the button VOL+ (Attention: Buttonnames are remote control specific)
+-with the command "volume up". "repeat = 1" means that in case you keep the button of
+-your remote control pressed, the command is repeated as long as you press the button.
+-It's of by default.
+-
+-
+-For more information, please consult the LIRC documentation.
+-
+-
+-
+-
+-
+-Available commands
+-
+-The following commands are available in Gnomeradio:
+-
+-
+- LIRC commands
+-
+-
+-
+-
+-
+- Comanda
+- Descripcion
+-
+-
+-
+-
+-
+- tune up
+-
+-
+- Scan forward.
+-
+-
+-
+-
+- tune down
+-
+-
+- Scan backwards.
+-
+-
+-
+-
+- preset up
+-
+-
+- Select next preset.
+-
+-
+-
+-
+- preset down
+-
+-
+- Select previous preset.
+-
+-
+-
+-
+- volume up
+-
+-
+- Increase the volume.
+-
+-
+-
+-
+- volume down
+-
+-
+- Decrease the volume.
+-
+-
+-
+-
+- mute
+-
+-
+- Mute/unmute the volume.
+-
+-
+-
+-
+- sortir
+-
+-
+- Terminate Gnomeradio.
+-
+-
+-
+-
+- preset x
+-
+-
+- Select preset x + 1 (where x is between 0 and 9)
+-
+-
+-
+-
+-
+-
+-
+-
+Index: gnomeradio-1.8/help/oc/index.docbook
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/help/oc/index.docbook
+@@ -0,0 +1,873 @@
++
++
++
++
++
++
++]>
++
++
++
++
++
++ Gnomeradio Manual V1.0
++
++ 2002
++
++ Jörgen Scheibengruber
++
++
++
++
++ Gnomeradio is a FM-tuner application for the GNOME desktop.
++
++
++
++ Projècte de documentacion de GNOME
++
++
++
++
++ Permission is granted to copy, distribute and/or modify this
++ document under the terms of the GNU Free Documentation
++ License (GFDL), Version 1.1 or any later version published
++ by the Free Software Foundation with no Invariant Sections,
++ no Front-Cover Texts, and no Back-Cover Texts. You can find
++ a copy of the GFDL at this link or in the file COPYING-DOCS
++ distributed with this manual.
++
++ This manual is part of a collection of GNOME manuals
++ distributed under the GFDL. If you want to distribute this
++ manual separately from the collection, you can do so by
++ adding a copy of the license to the manual, as described in
++ section 6 of the license.
++
++
++
++ Many of the names used by companies to distinguish their
++ products and services are claimed as trademarks. Where those
++ names appear in any GNOME documentation, and the members of
++ the GNOME Documentation Project are made aware of those
++ trademarks, then the names are in capital letters or initial
++ capital letters.
++
++
++
++ DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED
++ UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE
++ WITH THE FURTHER UNDERSTANDING THAT:
++
++
++
++ DOCUMENT IS PROVIDED ON AN "AS IS" BASIS,
++ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
++ IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
++ THAT THE DOCUMENT OR MODIFIED VERSION OF THE
++ DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR
++ A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE
++ RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE
++ OF THE DOCUMENT OR MODIFIED VERSION OF THE
++ DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR
++ MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT,
++ YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY
++ CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
++ SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
++ OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
++ LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED
++ VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER
++ EXCEPT UNDER THIS DISCLAIMER; AND
++
++
++
++ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
++ THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE),
++ CONTRACT, OR OTHERWISE, SHALL THE AUTHOR,
++ INITIAL WRITER, ANY CONTRIBUTOR, OR ANY
++ DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION
++ OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH
++ PARTIES, BE LIABLE TO ANY PERSON FOR ANY
++ DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
++ CONSEQUENTIAL DAMAGES OF ANY CHARACTER
++ INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS
++ OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR
++ MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR
++ LOSSES ARISING OUT OF OR RELATING TO USE OF THE
++ DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT,
++ EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF
++ THE POSSIBILITY OF SUCH DAMAGES.
++
++
++
++
++
++
++
++
++
++
++
++ Jörgen
++ Scheibengruber
++
++ Projècte de documentacion de GNOME
++ mfcn@gmx.de
++
++
++
++
++
++
++ 1.0
++ 2002
++
++ Jörgen Scheibengruber
++ mfcn@gmx.de
++ Projècte de documentacion de GNOME
++
++
++
++ This manual describes version 1.3 of Gnomeradio.
++
++
++ Feedback
++ To report a bug or make a suggestion regarding Gnomeradio or this
++ manual, send a e-mail to Jörgen Scheibengruber .
++
++
++
++ Gnomeradio
++
++
++
++
++
++Introduccion
++
++Gnomeradio is a FM-Tuner application for the GNOME desktop.
++It should work with all tuner hardware that is supported by the
++video4linux drivers.
++
++
++To start Gnomeradio open the applications menu, then choose
++
++Multimedia
++Gnomeradio
++
++or type gnomeradio in a shell.
++
++
++
++
++
++Utilizacion
++
++
++Status window
++
++ The black box in the upper left of Gnomeradio is the status window
++
++
++
++
++
++ The black box in the upper left of Gnomeradio is the status window.
++
++
++
++
++
++The status window is located in the upper left corner of the Gnomeradio main window. It consists of:
++
++
++
++
++ a label showing wether the reception is mono or stereo,
++
++
++
++
++ an icon indicating the quality of the reception and
++
++
++
++
++ the current frequency.
++
++
++
++
++
++
++
++Frequency controls
++
++ Use these controls to change the frequency
++
++
++
++
++
++ Use these controls to change the frequency.
++
++
++
++
++
++The following controls are available to change the frequency:
++
++
++
++
++ Using the slider you can change the frequency very quick.
++
++
++
++
++ The scan backwards button (left-arrow with bar) will decrease the frequency until if detects the next radio station with good reception.
++
++
++
++
++ The 0.5 MHz backwards button (left-arrow without bar) decreases the frequency by 0.5 MHz.
++
++
++
++
++ The 0.5 MHz forward button (right-arrow without bar) increases the frequency by 0.5 MHz.
++
++
++
++
++ The scan forwards button (right-arrow with bar) does the same as the "scan backwards" button, but it increases
++ the frequency.
++
++
++
++
++
++
++
++Volume controls
++
++ Use these controls to change the volume
++
++
++
++
++
++ Use these controls to change the volume.
++
++
++
++
++
++Controls available to change the volume:
++
++
++
++
++ Use the slider to adjust the volume. Note that it will only work if you have picked the right mixer
++ source , in the Dialog.
++
++
++
++
++ Toggling the button showing the speaker will mute/unmute Gnomeradio.
++
++
++
++
++
++
++
++Presets menubutton
++
++ Choose a preset using the menubutton
++
++
++
++
++
++ Choose a preset using the menubutton.
++
++
++
++
++
++Use the menubutton in the upper right to choose a radio station preset.
++You can edit presets in the Dialog.
++
++
++
++
++
++Misc. controls
++
++ Remaining controls
++
++
++
++
++
++ Remaining controls.
++
++
++
++
++
++
++
++
++
++ The record button opens the Dialog.
++
++
++
++
++ Clicking the about button will show a window with some credits.
++
++
++
++
++ Behind the settings button hides the Dialog.
++
++
++
++
++ The quit button will terminate Gnomeradio
++
++
++
++
++
++
++
++
++
++Preferéncias
++
++To open the preferences dialog, click the preferences button in the main window.
++
++
++If you are finished click OK to accept your changes
++or Cancel to undo the changes.
++
++
++
++General preferences
++
++ General preferences
++
++
++
++
++
++ General preferences.
++
++
++
++
++
++
++
++
++
++ Radio Device: Enter your radio device. Unless you have several radio
++ tuners installed this is usually /dev/radio.
++
++
++
++
++ Mixer Source: Choose the mixer source that is able to control the volume
++ of your radio tuner. The combobox lists all devices that you can choose as a recording source.
++ You should usually pick one of these, otherwise you won't be able to record radio. If you have
++ set up own names for the sources in gnome volume control, these names will be shown in paranthesis
++ behind the "official" name.
++
++
++
++
++ Mute on Exit: Uncheck this checkbox, if you want that the radio keeps on
++ playing after you have terminated Gnomeradio.
++
++
++
++
++
++
++Editing presets
++
++ Editing presets
++
++
++
++
++
++ Editing presets.
++
++
++
++
++
++Here you can add some preset radio stations. You can select one of these
++using the or your
++ remote control.
++
++
++
++
++ Name: Enter a name for the preset (usually the name
++ of the radio station).
++
++
++
++
++ Frequency: Choose the frequency for the radio station.
++
++
++
++
++ Click the button add preset (shows a +) to add the preset
++ to the list.
++
++
++
++
++ The button remove preset (shows a -) will remove the currently
++ selected preset from the list.
++
++
++
++
++ Use the button update preset to update the selected preset with
++ the values currently entered in the name and frequency entries.
++
++
++
++
++
++
++
++
++Recording
++
++You can use gnomeradio to (live)record radio. In this dialog you
++have to give some information, on how this shall be done.
++
++You need the external application sox
++installed in order to use the recording functionality of Gnomeradio.
++If you want to record as MP3,
++you have to install a MP3 encoder, too. Currently the MP3 encoders
++lame and
++bladeenc are supported.
++To record files as ogg vorbis you need
++oggenc .
++
++
++To open this dialog, click the record button in the main window.
++
++
++Use the Start button to start recording.
++Otherwise click Cancel to close the dialog.
++
++
++
++General settings
++
++ General recording settings
++
++
++
++
++
++ General recording settings.
++
++
++
++
++
++
++
++
++
++ Audio Device: Enter your audio device. Unless you have several soundcards
++ installed this is usually /dev/audio.
++
++
++
++
++ Filename: Choose a filename and destination for the file in which the audio
++ data should be stored. This file should usually have the suffix ".wav", in case you want to record
++ as wave data, ".mp3", in case the audio should be stored in the mp3-format or ".ogg", for ogg vorbis
++ files.
++
++
++
++
++ Record as: Select Wave (.wav) , if you want the audio
++ data to be stored in the wave format (uncompressed - about 10 megabyte per minute playlength).
++ Otherwise choose MP3/Ogg (.mp3/.ogg) which will lead to a much lower filesize, but
++ also a little bit lower audio quality.
++
++
++
++
++
++
++
++Wave settings
++
++ The wave settings
++
++
++
++
++
++ The wave settings.
++
++
++
++
++
++These settings apply to the mp3 file, too.
++
++
++
++
++ Sample rate: Choose a sample rate for the recording audio file. Higher sampling
++ rate means better quality. 44100 kHz is a good default (aprox. CD quality). If the reception
++ is bad you can take a lower sampling rate, because the quality won't be that good anyways.
++
++
++
++
++ Sample format: Available options are 8 or 16 bit. Usually you want to
++ take 16 bit.
++
++
++
++
++ Record in: Select stereo , if you want to record in
++ stereo or mono otherwise. It probably doen't make much sense to record
++ in stereo, if the reception is only mono.
++
++
++
++
++
++
++
++MP3/Ogg settings
++
++ The MP3/Ogg settings
++
++
++
++
++
++ The MP3 settings.
++
++
++
++
++
++
++
++
++
++ Encoder: A list of supported MP3/Ogg encoders that you have installed. Choose the one you like the
++ best. Currently lame ,
++ bladeenc and
++ oggenc are supported.
++ The encoder must be in your PATH, otherwise Gnomeradio can't find it.
++
++
++
++
++ Bitrate: Choose a bitrate. This will have the largest impact
++ on the size and quality of the resulting MP3/Ogg file. The higher the bitrate the better the
++ quality. 128 kb/s is usually a good value which will result in files that are aprox. 1 MB
++ per minute playlength.
++
++
++
++
++
++
++Recording status window
++
++ The status window
++
++
++
++
++
++ The status window.
++
++
++
++
++
++Click Stop Recording to stop the recording and return to
++the main window. The window shows the name and size of the file in which the audio
++data is being stored.
++
++
++
++
++
++
++Keybindings
++
++Gnomeradio has a few keybindings.
++
++
++ Keyboard shortcuts in Gnomeradio
++
++
++
++
++
++ Acorchi
++ Descripcion
++
++
++
++
++
++ F1
++
++
++ Open this help.
++
++
++
++
++ r
++
++
++ Open the recording dialog.
++
++
++
++
++ m
++
++
++ Mute/unmute the volume.
++
++
++
++
++ q
++
++
++ Terminate Gnomeradio.
++
++
++
++
++ f
++
++
++ Scan forward.
++
++
++
++
++ b
++
++
++ Scan backwards.
++
++
++
++
++ n
++
++
++ Select next preset.
++
++
++
++
++ p
++
++
++ Select previous preset.
++
++
++
++
++ +
++
++
++ Increase volume.
++
++
++
++
++ -
++
++
++ Decrease volume.
++
++
++
++
++
++
++
++
++
++
++LIRC
++
++You can use a remote control supported by LIRC
++(Linux infrared remote control) to control Gnomeradio .
++
++
++Your remote control will only work if Gnomeradio has been compiled with
++LIRC support enabled. If you are unsure wether this is the case or not, check the about dialog.
++
++
++
++
++The .lircrc config file
++
++In the file .lircrc in your home directory, you set up which keys
++on your remote control you want to associate with actions in Gnomeradio. A typical
++section in the file looks like this:
++
++Example for a .lircrc section
++
++begin
++ prog = gnomeradio
++ button = VOL+
++ config = volume up
++ repeat = 1
++end
++
++
++
++This associates the button VOL+ (Attention: Buttonnames are remote control specific)
++with the command "volume up". "repeat = 1" means that in case you keep the button of
++your remote control pressed, the command is repeated as long as you press the button.
++It's of by default.
++
++
++For more information, please consult the LIRC documentation.
++
++
++
++
++
++Available commands
++
++The following commands are available in Gnomeradio:
++
++
++ LIRC commands
++
++
++
++
++
++ Comanda
++ Descripcion
++
++
++
++
++
++ tune up
++
++
++ Scan forward.
++
++
++
++
++ tune down
++
++
++ Scan backwards.
++
++
++
++
++ preset up
++
++
++ Select next preset.
++
++
++
++
++ preset down
++
++
++ Select previous preset.
++
++
++
++
++ volume up
++
++
++ Increase the volume.
++
++
++
++
++ volume down
++
++
++ Decrease the volume.
++
++
++
++
++ mute
++
++
++ Mute/unmute the volume.
++
++
++
++
++ sortir
++
++
++ Terminate Gnomeradio.
++
++
++
++
++ preset x
++
++
++ Select preset x + 1 (where x is between 0 and 9)
++
++
++
++
++
++
++
++
+Index: gnomeradio-1.8/help/sv/gnomeradio.xml
+===================================================================
+--- gnomeradio-1.8.orig/help/sv/gnomeradio.xml
++++ /dev/null
+@@ -1,611 +0,0 @@
+-
+-
+-
+-
+-
+-
+-]>
+-
+-
+-
+-
+-
+- Handbok för Gnomeradio v1.0
+-
+- 2002
+-
+- Jörgen Scheibengruber
+- 2006 Daniel Nylander (po@danielnylander.se)
+-
+-
+-
+- Gnomeradio is a FM-tuner application for the GNOME desktop.
+-
+-
+-
+- Dokumentationsprojekt för GNOME
+-
+-
+-
+- Tillstånd att kopiera, distribuera och/eller modifiera detta dokument ges under villkoren i GNU Free Documentation License (GFDL), version 1.1 eller senare, utgivet av Free Software Foundation utan standardavsnitt och omslagstexter. En kopia av GFDL finns att hämta på denna länk eller i filen COPYING-DOCS som medföljer denna handbok.
+- Denna handbok utgör en av flera GNOME-handböcker som distribueras under villkoren i GFDL. Om du vill distribuera denna handbok separat från övriga handböcker kan du göra detta genom att lägga till en kopia av licensavtalet i handboken enligt instruktionerna i avsnitt 6 i licensavtalet.
+-
+- Flera namn på produkter och tjänster är registrerade varumärken. I de fall dessa namn förekommer i GNOME-dokumentation - och medlemmarna i GNOME-dokumentationsprojektet är medvetna om dessa varumärken - är de skrivna med versaler eller med inledande versal.
+-
+- DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET TILLHANDAHÅLLS UNDER VILLKOREN I GNU FREE DOCUMENTATION LICENSE ENDAST UNDER FÖLJANDE FÖRUTSÄTTNINGAR:
+-
+- DOKUMENTET TILLHANDAHÅLLS I "BEFINTLIGT SKICK" UTAN NÅGRA SOM HELST GARANTIER, VARE SIG UTTRYCKLIGA ELLER UNDERFÖRSTÅDDA, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, GARANTIER ATT DOKUMENTET ELLER EN MODIFIERAD VERSION AV DOKUMENTET INTE INNEHÅLLER NÅGRA FELAKTIGHETER, ÄR LÄMPLIGT FÖR ETT VISST ÄNDAMÅL ELLER INTE STRIDER MOT LAG. HELA RISKEN VAD GÄLLER KVALITET, EXAKTHET OCH UTFÖRANDE AV DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET LIGGER HELT OCH HÅLLET PÅ ANVÄNDAREN. OM ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT SKULLE VISA SIG INNEHÅLLA FELAKTIGHETER I NÅGOT HÄNSEENDE ÄR DET DU (INTE DEN URSPRUNGLIGA SKRIBENTEN, FÖRFATTAREN ELLER NÅGON ANNAN MEDARBETARE) SOM FÅR STÅ FÖR ALLA EVENTUELLA KOSTNADER FÖR SERVICE, REPARATIONER ELLER KORRIGERINGAR. DENNA GARANTIFRISKRIVNING UTGÖR EN VÄSENTLIG DEL AV DETTA LICENSAVTAL. DETTA INNEBÄR ATT ALL ANVÄNDNING AV ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT BEVILJAS ENDAST UNDER DENNA ANSVARSFRISKRIVNING;
+-
+-
+- UNDER INGA OMSTÄNDIGHETER ELLER INOM RAMEN FÖR NÅGON LAGSTIFTNING, OAVSETT OM DET GÄLLER KRÄNKNING (INKLUSIVE VÅRDSLÖSHET), KONTRAKT ELLER DYLIKT, SKA FÖRFATTAREN, DEN URSPRUNGLIGA SKRIBENTEN ELLER ANNAN MEDARBETARE ELLER ÅTERFÖRSÄLJARE AV DOKUMENTET ELLER AV EN MODIFIERAD VERSION AV DOKUMENTET ELLER NÅGON LEVERANTÖR TILL NÅGON AV NÄMNDA PARTER STÄLLAS ANSVARIG GENTEMOT NÅGON FÖR NÅGRA DIREKTA, INDIREKTA, SÄRSKILDA ELLER OFÖRUTSEDDA SKADOR ELLER FÖLJDSKADOR AV NÅGOT SLAG, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, SKADOR BETRÄFFANDE FÖRLORAD GOODWILL, HINDER I ARBETET, DATORHAVERI ELLER NÅGRA ANDRA TÄNKBARA SKADOR ELLER FÖRLUSTER SOM KAN UPPKOMMA PÅ GRUND AV ELLER RELATERAT TILL ANVÄNDNINGEN AV DOKUMENTET ELLER MODIFIERADE VERSIONER AV DOKUMENTET, ÄVEN OM PART SKA HA BLIVIT INFORMERAD OM MÖJLIGHETEN TILL SÅDANA SKADOR.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- Jörgen
+- Scheibengruber
+-
+- Dokumentationsprojekt för GNOME
+- mfcn@gmx.de
+-
+-
+-
+-
+-
+-
+- 1.0
+- 2002
+-
+- Jörgen Scheibengruber mfcn@gmx.de
+- Dokumentationsprojekt för GNOME
+-
+-
+-
+- Den här handboken beskriver version 1.3 av Gnomeradio.
+-
+- Återkoppling
+- För att rapportera ett fel eller komma med förslag angående Gnomeradio eller den här handboken, skicka e-post till Jörgen Scheibengruber .
+-
+-
+-
+- Gnomeradio
+-
+-
+-
+-
+-
+-Introduktion
+-Gnomeradio är ett FM-mottagarprogram för GNOME-skrivbordet. Det bör fungera med all mottagarhårdvara som stöds av video4linux -drivrutinerna.
+-För att starta Gnomeradio , öppna programmenyn, välj sedan Multimedia Gnomeradio eller skriv in gnomeradio i ett skal.
+-
+-
+-
+-
+-Användning
+-
+-
+-Statusfönster
+-
+- Den svarta rutan i övre vänstra hörnet i Gnomeradio är statusfönstret
+-
+-
+-
+-
+-
+- Den svarta rutan i övre vänstra hörnet i Gnomeradio är statusfönstret.
+-
+-
+-
+-
+-Statusfönstret är placerat i övre vänstra hörnet av Gnomeradios huvudfönster. Det innehåller:
+-
+-
+- en etikett visar huruvida mottagningen är i mono eller stereo,
+-
+-
+- en ikon indikerar kvaliteten på mottagningen och
+-
+-
+- aktuell frekvens.
+-
+-
+-
+-
+-
+-
+-Frekvenskontroller
+-
+- Använd dessa kontroller för att ändra frekvensen
+-
+-
+-
+-
+-
+- Använd dessa kontroller för att ändra frekvensen.
+-
+-
+-
+-
+-Följande kontroller finns tillgängliga för att ändra frekvensen:
+-
+-
+- Du kan ändra frekvensen mycket snabbt med draglisten.
+-
+-
+- Knappen sök bakåt (vänsterpil) kommer att sänka frekvensen tills den detekterar nästa radiostation med bra mottagning.
+-
+-
+- Knappen 0.5 MHz bakåt (vänsterpil utan list) sänker frekvensen med 0.5 MHz.
+-
+-
+- Knappen 0.5 MHz framåt (högerpil utan list) ökar frekvensen med 0.5 MHz.
+-
+-
+- Knappen sök framåt (högerpil) gör samma sak som "sök bakåt"-knappen, men den ökar frekvensen.
+-
+-
+-
+-
+-
+-
+-Volymkontroller
+-
+- Använd dessa kontroller för att ändra volymen
+-
+-
+-
+-
+-
+- Använd dessa kontroller för att ändra volymen.
+-
+-
+-
+-
+-Kontroller tillgängliga för att ändra volymen:
+-
+-
+- Använd draglisten för att justera volymen. Observera att det endast fungerar om du har valt rätt mixerkälla i dialogrutan .
+-
+-
+- Växling av knappen som visar högtalaren kommer att ge tyst/normal volym i Gnomeradio.
+-
+-
+-
+-
+-
+-
+-Programmenyknappen
+-
+- Välj ett program med menyknappen
+-
+-
+-
+-
+-
+- Välj ett program med menyknappen.
+-
+-
+-
+-
+-Använd menyknappen i övre högra hörnet för att välja en förinställd radiostation. Du kan redigera programmen i dialogrutan .
+-
+-
+-
+-
+-Diverse kontroller
+-
+- Återstående kontroller
+-
+-
+-
+-
+-
+- Återstående kontroller.
+-
+-
+-
+-
+-
+-
+-
+-
+- Knappen spela in öppnar dialogrutan .
+-
+-
+- Klicka på knappen om kommer att visa ett fönster med bidragsgivare.
+-
+-
+- Bakom knappen inställningar döljer sig dialogrutan .
+-
+-
+- Knappen avsluta kommer att avsluta Gnomeradio
+-
+-
+-
+-
+-
+-
+-
+-
+-Inställningar
+-Klicka på knappen inställningar i huvudfönstret för att öppna inställningsdialogrutan.
+-Om du är färdig kan du klicka på OK för att acceptera dina ändringar eller Avbryt för att ångra ändringarna.
+-
+-
+-Allmänna inställningar
+-
+- Allmänna inställningar
+-
+-
+-
+-
+-
+- Allmänna inställningar.
+-
+-
+-
+-
+-
+-
+-
+-
+- Radioenhet: Ange din radioenhet. Det här är vanligtvis /dev/radio såvida du inte har flera radiomottagare installerade.
+-
+-
+- Mixerkälla: Välj den mixerkälla som kan kontrollera volymen för din radiomottagare. Kombinationsrutan listar alla enheter som du kan välja som en inspelningskälla. Du bör vanligtvis välja en av dessa, annars kommer du inte kunna spela in radio. Om du har ställt in egna namn för källorna i Gnomes volymkontroller kommer dessa namn att visas inom parantes efter det "officiella" namnet.
+-
+-
+- Stäng av ljudet när programmet stängs: Kryssa inte för den här rutan om du vill att radion ska fortsätta att spela efter att du har avslutat Gnomeradio.
+-
+-
+-
+-
+-
+-Redigera program
+-
+- Redigera program
+-
+-
+-
+-
+-
+- Redigera program.
+-
+-
+-
+-
+-Här kan du lägga till några förinställda radiostationer. Du kan välja en av dessa med eller med din -fjärrkontroll.
+-
+-
+- Namn: Ange ett namn för programmet (vanligtvis namnet på radiostationen).
+-
+-
+- Frekvens: Välj frekvensen för radiostationen.
+-
+-
+- Klicka på knappen lägg till program (visas som +) för att lägga till programmet till listan.
+-
+-
+- Knappen ta bort program (visas som -) kommer att ta bort det markerade programmet från listan.
+-
+-
+- Använd knappen uppdatera program för att uppdatera det valda programmet med de värden som för närvarande har matats in för namn och frekvens.
+-
+-
+-
+-
+-
+-
+-
+-Spela in
+-Du kan använda Gnomeradio för att spela in radio. I den här dialogrutan kan du ange information om hur det ska göras.
+-Du behöver det externa programmet sox installert för att kunna spela in i Gnomeradio. Om du vill spela in som MP3 måste du installera en MP3-kodare också. För närvarande stöds lame och bladeenc . För att spela in filer som Ogg Vorbis behöver du oggenc .
+-Klicka på knappen spela in i huvudfönstret för att öppna den här dialogrutan.
+-Använd knappen Start för att påbörja inspelningen. Om inte, klicka på Avbryt för att stänga dialogrutan.
+-
+-
+-Allmänna inställningar
+-
+- Allmänna inspelningsinställningar
+-
+-
+-
+-
+-
+- Allmänna inspelningsinställningar.
+-
+-
+-
+-
+-
+-
+-
+-
+- Ljudenhet: Ange din ljudenhet. Det här är vanligtvis /dev/audio såvida du inte har flera ljudkort installerade.
+-
+-
+- Filnamn: Välj ett filnamn och mål för filen i vilken ljuddatat ska lagras. Den här filen bör normalt sett ha ändelsen ".wav", om du vill spela in som wav-data, ".mp3", om du vill att ljudet ska lagras i mp3-formatet eller ".ogg", för Ogg Vorbis-filer.
+-
+-
+- Spela in som: Välj Wave (.wav) , om du vill att ljuddatat ska lagras i Wave-formatet (okomprimerat - ungefär 10 megabyte per minut speltid). Välj annars MP3/Ogg (.mp3/.ogg) som innebär en mycket mindre filstorlek, men även en lite försämrad ljudkvalitet.
+-
+-
+-
+-
+-
+-
+-Wave-inställningar
+-
+- Wave-inställningarna
+-
+-
+-
+-
+-
+- Wave-inställningarna.
+-
+-
+-
+-
+-Dessa inställningar gäller för mp3-filen också.
+-
+-
+- Samplingsfrekvens: Välj en samplingsfrekvens för ljudfilen som ska spelas in. Högre samplingsfrekvens betyder bättre kvalitet. 44100 kHz är ett bra standardvärde (ungefär som cd-kvalitet). Om mottagningen är dålig kan du använda en lägre samplingsfrekvens därför att kvaliteten inte kommer att bli så bra ändå.
+-
+-
+- Samplingsformat: Tillgängliga alternativ är 8 eller 16 bitar. Vanligtvis används 16 bitar.
+-
+-
+- Spela in i: Välj stereo , om du vill spela in i stereo eller annars mono . Det är ganska meningslöst att spela in i stereo om mottagningen bara är i mono.
+-
+-
+-
+-
+-
+-
+-MP3/Ogg-inställningar
+-
+- MP3/Ogg-inställningarna
+-
+-
+-
+-
+-
+- MP3-inställningarna.
+-
+-
+-
+-
+-
+-
+-
+-
+- Kodare: En lista över MP3/Ogg-kodare som stöds och som du har installerade. Välj den som du tycker är bäst. För närvarande stöds lame , bladeenc och oggenc . Kodaren måste finnas i din PATH, annars kommer Gnomeradio inte att hitta den.
+-
+-
+- Bitfrekvens: Välj en bitfrekvens. Det här kommer att ha störst påverkan på storleken och kvaliteten på den resulterande MP3/Ogg-filen. Ju högre bitfrekvens, desto bättre kvalitet. 128 kbit/s är vanligtvis ett bra värde som kommer att resultera i att filerna är ungefär 1 MB per minut av speltid.
+-
+-
+-
+-
+-
+-Fönster för inspelningsstatus
+-
+- Statusfönstret
+-
+-
+-
+-
+-
+- Statusfönstret.
+-
+-
+-
+-
+-Klicka på Stoppa inspelning för att stoppa inspelningen och återvända till huvudfönstret. Fönstret visar namnet och storleken på filen som ljuddatat har lagrats i.
+-
+-
+-
+-
+-
+-Snabbtangenter
+-Gnomeradio har ett antal snabbtangenter.
+-
+- Snabbtangenter i Gnomeradio
+-
+-
+-
+-
+-
+- Snabbtangent
+- Beskrivning
+-
+-
+-
+-
+-
+- F1
+-
+- Öppna den här hjälpen.
+-
+-
+-
+- r
+-
+- Öppna inspelningsdialogrutan.
+-
+-
+-
+- m
+-
+- Tyst/normal volym.
+-
+-
+-
+- q
+-
+- Avsluta Gnomeradio.
+-
+-
+-
+- f
+-
+- Sök framåt.
+-
+-
+-
+- b
+-
+- Sök bakåt.
+-
+-
+-
+- n
+-
+- Välj nästa program.
+-
+-
+-
+- p
+-
+- Välj föregående program.
+-
+-
+-
+- +
+-
+- Höj volymen.
+-
+-
+-
+- -
+-
+- Sänk volymen.
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-LIRC
+-Du kan använda en fjärrkontroll som stöds av LIRC (Linux infrared remote control) för att kontrollera Gnomeradio .
+-
+-Din fjärrkontroll kommer endast att fungera om Gnomeradio har byggts med stöd för LIRC. Om du är osäker huruvida så är fallet, titta i Om-dialogrutan.
+-
+-
+-
+-Konfigurationsfilen .lircrc
+-Du ställer in vilka knappar på din fjärrkontroll som du vill ska motsvara åtgärderna i Gnomeradio i filen .lircrc , som finns i din hemkatalog. En typisk sektion i den filen ser ut så här:
+-Exempel på en .lircrc-sektion
+-
+-begin
+- prog = gnomeradio
+- button = VOL+
+- config = volume up
+- repeat = 1
+-end
+-
+-
+-Det här associerar knappen VOL+ (Varning: Knappnamnen är fjärrkontrollspecifika) med kommandot "volume up". "repeat = 1" betyder att om du håller ner knappen på din fjärrkontroll kommer kommandot att upprepas så länge som du håller ner knappen. Det är inaktiverat som standard.
+-För mer information, konsultera LIRC-dokumentationen.
+-
+-
+-
+-
+-Tillgängliga kommandon
+-Följande kommandon finns tillgängliga i Gnomeradio:
+-
+- LIRC-kommandon
+-
+-
+-
+-
+-
+- Kommando
+- Beskrivning
+-
+-
+-
+-
+-
+- tune up
+-
+- Sök framåt.
+-
+-
+-
+- tune down
+-
+- Sök bakåt.
+-
+-
+-
+- preset up
+-
+- Välj nästa program.
+-
+-
+-
+- preset down
+-
+- Välj föregående program.
+-
+-
+-
+- volume up
+-
+- Höj volymen.
+-
+-
+-
+- volume down
+-
+- Sänk volymen.
+-
+-
+-
+- mute
+-
+- Tyst/normal volym.
+-
+-
+-
+- quit
+-
+- Avsluta Gnomeradio.
+-
+-
+-
+- preset x
+-
+- Välj program x + 1 (där x är mellan 0 och 9)
+-
+-
+-
+-
+-
+-
+-
+Index: gnomeradio-1.8/help/sv/index.docbook
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/help/sv/index.docbook
+@@ -0,0 +1,611 @@
++
++
++
++
++
++
++]>
++
++
++
++
++
++ Handbok för Gnomeradio v1.0
++
++ 2002
++
++ Jörgen Scheibengruber
++ 2006 Daniel Nylander (po@danielnylander.se)
++
++
++
++ Gnomeradio is a FM-tuner application for the GNOME desktop.
++
++
++
++ Dokumentationsprojekt för GNOME
++
++
++
++ Tillstånd att kopiera, distribuera och/eller modifiera detta dokument ges under villkoren i GNU Free Documentation License (GFDL), version 1.1 eller senare, utgivet av Free Software Foundation utan standardavsnitt och omslagstexter. En kopia av GFDL finns att hämta på denna länk eller i filen COPYING-DOCS som medföljer denna handbok.
++ Denna handbok utgör en av flera GNOME-handböcker som distribueras under villkoren i GFDL. Om du vill distribuera denna handbok separat från övriga handböcker kan du göra detta genom att lägga till en kopia av licensavtalet i handboken enligt instruktionerna i avsnitt 6 i licensavtalet.
++
++ Flera namn på produkter och tjänster är registrerade varumärken. I de fall dessa namn förekommer i GNOME-dokumentation - och medlemmarna i GNOME-dokumentationsprojektet är medvetna om dessa varumärken - är de skrivna med versaler eller med inledande versal.
++
++ DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET TILLHANDAHÅLLS UNDER VILLKOREN I GNU FREE DOCUMENTATION LICENSE ENDAST UNDER FÖLJANDE FÖRUTSÄTTNINGAR:
++
++ DOKUMENTET TILLHANDAHÅLLS I "BEFINTLIGT SKICK" UTAN NÅGRA SOM HELST GARANTIER, VARE SIG UTTRYCKLIGA ELLER UNDERFÖRSTÅDDA, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, GARANTIER ATT DOKUMENTET ELLER EN MODIFIERAD VERSION AV DOKUMENTET INTE INNEHÅLLER NÅGRA FELAKTIGHETER, ÄR LÄMPLIGT FÖR ETT VISST ÄNDAMÅL ELLER INTE STRIDER MOT LAG. HELA RISKEN VAD GÄLLER KVALITET, EXAKTHET OCH UTFÖRANDE AV DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET LIGGER HELT OCH HÅLLET PÅ ANVÄNDAREN. OM ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT SKULLE VISA SIG INNEHÅLLA FELAKTIGHETER I NÅGOT HÄNSEENDE ÄR DET DU (INTE DEN URSPRUNGLIGA SKRIBENTEN, FÖRFATTAREN ELLER NÅGON ANNAN MEDARBETARE) SOM FÅR STÅ FÖR ALLA EVENTUELLA KOSTNADER FÖR SERVICE, REPARATIONER ELLER KORRIGERINGAR. DENNA GARANTIFRISKRIVNING UTGÖR EN VÄSENTLIG DEL AV DETTA LICENSAVTAL. DETTA INNEBÄR ATT ALL ANVÄNDNING AV ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT BEVILJAS ENDAST UNDER DENNA ANSVARSFRISKRIVNING;
++
++
++ UNDER INGA OMSTÄNDIGHETER ELLER INOM RAMEN FÖR NÅGON LAGSTIFTNING, OAVSETT OM DET GÄLLER KRÄNKNING (INKLUSIVE VÅRDSLÖSHET), KONTRAKT ELLER DYLIKT, SKA FÖRFATTAREN, DEN URSPRUNGLIGA SKRIBENTEN ELLER ANNAN MEDARBETARE ELLER ÅTERFÖRSÄLJARE AV DOKUMENTET ELLER AV EN MODIFIERAD VERSION AV DOKUMENTET ELLER NÅGON LEVERANTÖR TILL NÅGON AV NÄMNDA PARTER STÄLLAS ANSVARIG GENTEMOT NÅGON FÖR NÅGRA DIREKTA, INDIREKTA, SÄRSKILDA ELLER OFÖRUTSEDDA SKADOR ELLER FÖLJDSKADOR AV NÅGOT SLAG, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, SKADOR BETRÄFFANDE FÖRLORAD GOODWILL, HINDER I ARBETET, DATORHAVERI ELLER NÅGRA ANDRA TÄNKBARA SKADOR ELLER FÖRLUSTER SOM KAN UPPKOMMA PÅ GRUND AV ELLER RELATERAT TILL ANVÄNDNINGEN AV DOKUMENTET ELLER MODIFIERADE VERSIONER AV DOKUMENTET, ÄVEN OM PART SKA HA BLIVIT INFORMERAD OM MÖJLIGHETEN TILL SÅDANA SKADOR.
++
++
++
++
++
++
++
++
++
++ Jörgen
++ Scheibengruber
++
++ Dokumentationsprojekt för GNOME
++ mfcn@gmx.de
++
++
++
++
++
++
++ 1.0
++ 2002
++
++ Jörgen Scheibengruber mfcn@gmx.de
++ Dokumentationsprojekt för GNOME
++
++
++
++ Den här handboken beskriver version 1.3 av Gnomeradio.
++
++ Återkoppling
++ För att rapportera ett fel eller komma med förslag angående Gnomeradio eller den här handboken, skicka e-post till Jörgen Scheibengruber .
++
++
++
++ Gnomeradio
++
++
++
++
++
++Introduktion
++Gnomeradio är ett FM-mottagarprogram för GNOME-skrivbordet. Det bör fungera med all mottagarhårdvara som stöds av video4linux -drivrutinerna.
++För att starta Gnomeradio , öppna programmenyn, välj sedan Multimedia Gnomeradio eller skriv in gnomeradio i ett skal.
++
++
++
++
++Användning
++
++
++Statusfönster
++
++ Den svarta rutan i övre vänstra hörnet i Gnomeradio är statusfönstret
++
++
++
++
++
++ Den svarta rutan i övre vänstra hörnet i Gnomeradio är statusfönstret.
++
++
++
++
++Statusfönstret är placerat i övre vänstra hörnet av Gnomeradios huvudfönster. Det innehåller:
++
++
++ en etikett visar huruvida mottagningen är i mono eller stereo,
++
++
++ en ikon indikerar kvaliteten på mottagningen och
++
++
++ aktuell frekvens.
++
++
++
++
++
++
++Frekvenskontroller
++
++ Använd dessa kontroller för att ändra frekvensen
++
++
++
++
++
++ Använd dessa kontroller för att ändra frekvensen.
++
++
++
++
++Följande kontroller finns tillgängliga för att ändra frekvensen:
++
++
++ Du kan ändra frekvensen mycket snabbt med draglisten.
++
++
++ Knappen sök bakåt (vänsterpil) kommer att sänka frekvensen tills den detekterar nästa radiostation med bra mottagning.
++
++
++ Knappen 0.5 MHz bakåt (vänsterpil utan list) sänker frekvensen med 0.5 MHz.
++
++
++ Knappen 0.5 MHz framåt (högerpil utan list) ökar frekvensen med 0.5 MHz.
++
++
++ Knappen sök framåt (högerpil) gör samma sak som "sök bakåt"-knappen, men den ökar frekvensen.
++
++
++
++
++
++
++Volymkontroller
++
++ Använd dessa kontroller för att ändra volymen
++
++
++
++
++
++ Använd dessa kontroller för att ändra volymen.
++
++
++
++
++Kontroller tillgängliga för att ändra volymen:
++
++
++ Använd draglisten för att justera volymen. Observera att det endast fungerar om du har valt rätt mixerkälla i dialogrutan .
++
++
++ Växling av knappen som visar högtalaren kommer att ge tyst/normal volym i Gnomeradio.
++
++
++
++
++
++
++Programmenyknappen
++
++ Välj ett program med menyknappen
++
++
++
++
++
++ Välj ett program med menyknappen.
++
++
++
++
++Använd menyknappen i övre högra hörnet för att välja en förinställd radiostation. Du kan redigera programmen i dialogrutan .
++
++
++
++
++Diverse kontroller
++
++ Återstående kontroller
++
++
++
++
++
++ Återstående kontroller.
++
++
++
++
++
++
++
++
++ Knappen spela in öppnar dialogrutan .
++
++
++ Klicka på knappen om kommer att visa ett fönster med bidragsgivare.
++
++
++ Bakom knappen inställningar döljer sig dialogrutan .
++
++
++ Knappen avsluta kommer att avsluta Gnomeradio
++
++
++
++
++
++
++
++
++Inställningar
++Klicka på knappen inställningar i huvudfönstret för att öppna inställningsdialogrutan.
++Om du är färdig kan du klicka på OK för att acceptera dina ändringar eller Avbryt för att ångra ändringarna.
++
++
++Allmänna inställningar
++
++ Allmänna inställningar
++
++
++
++
++
++ Allmänna inställningar.
++
++
++
++
++
++
++
++
++ Radioenhet: Ange din radioenhet. Det här är vanligtvis /dev/radio såvida du inte har flera radiomottagare installerade.
++
++
++ Mixerkälla: Välj den mixerkälla som kan kontrollera volymen för din radiomottagare. Kombinationsrutan listar alla enheter som du kan välja som en inspelningskälla. Du bör vanligtvis välja en av dessa, annars kommer du inte kunna spela in radio. Om du har ställt in egna namn för källorna i Gnomes volymkontroller kommer dessa namn att visas inom parantes efter det "officiella" namnet.
++
++
++ Stäng av ljudet när programmet stängs: Kryssa inte för den här rutan om du vill att radion ska fortsätta att spela efter att du har avslutat Gnomeradio.
++
++
++
++
++
++Redigera program
++
++ Redigera program
++
++
++
++
++
++ Redigera program.
++
++
++
++
++Här kan du lägga till några förinställda radiostationer. Du kan välja en av dessa med eller med din -fjärrkontroll.
++
++
++ Namn: Ange ett namn för programmet (vanligtvis namnet på radiostationen).
++
++
++ Frekvens: Välj frekvensen för radiostationen.
++
++
++ Klicka på knappen lägg till program (visas som +) för att lägga till programmet till listan.
++
++
++ Knappen ta bort program (visas som -) kommer att ta bort det markerade programmet från listan.
++
++
++ Använd knappen uppdatera program för att uppdatera det valda programmet med de värden som för närvarande har matats in för namn och frekvens.
++
++
++
++
++
++
++
++Spela in
++Du kan använda Gnomeradio för att spela in radio. I den här dialogrutan kan du ange information om hur det ska göras.
++Du behöver det externa programmet sox installert för att kunna spela in i Gnomeradio. Om du vill spela in som MP3 måste du installera en MP3-kodare också. För närvarande stöds lame och bladeenc . För att spela in filer som Ogg Vorbis behöver du oggenc .
++Klicka på knappen spela in i huvudfönstret för att öppna den här dialogrutan.
++Använd knappen Start för att påbörja inspelningen. Om inte, klicka på Avbryt för att stänga dialogrutan.
++
++
++Allmänna inställningar
++
++ Allmänna inspelningsinställningar
++
++
++
++
++
++ Allmänna inspelningsinställningar.
++
++
++
++
++
++
++
++
++ Ljudenhet: Ange din ljudenhet. Det här är vanligtvis /dev/audio såvida du inte har flera ljudkort installerade.
++
++
++ Filnamn: Välj ett filnamn och mål för filen i vilken ljuddatat ska lagras. Den här filen bör normalt sett ha ändelsen ".wav", om du vill spela in som wav-data, ".mp3", om du vill att ljudet ska lagras i mp3-formatet eller ".ogg", för Ogg Vorbis-filer.
++
++
++ Spela in som: Välj Wave (.wav) , om du vill att ljuddatat ska lagras i Wave-formatet (okomprimerat - ungefär 10 megabyte per minut speltid). Välj annars MP3/Ogg (.mp3/.ogg) som innebär en mycket mindre filstorlek, men även en lite försämrad ljudkvalitet.
++
++
++
++
++
++
++Wave-inställningar
++
++ Wave-inställningarna
++
++
++
++
++
++ Wave-inställningarna.
++
++
++
++
++Dessa inställningar gäller för mp3-filen också.
++
++
++ Samplingsfrekvens: Välj en samplingsfrekvens för ljudfilen som ska spelas in. Högre samplingsfrekvens betyder bättre kvalitet. 44100 kHz är ett bra standardvärde (ungefär som cd-kvalitet). Om mottagningen är dålig kan du använda en lägre samplingsfrekvens därför att kvaliteten inte kommer att bli så bra ändå.
++
++
++ Samplingsformat: Tillgängliga alternativ är 8 eller 16 bitar. Vanligtvis används 16 bitar.
++
++
++ Spela in i: Välj stereo , om du vill spela in i stereo eller annars mono . Det är ganska meningslöst att spela in i stereo om mottagningen bara är i mono.
++
++
++
++
++
++
++MP3/Ogg-inställningar
++
++ MP3/Ogg-inställningarna
++
++
++
++
++
++ MP3-inställningarna.
++
++
++
++
++
++
++
++
++ Kodare: En lista över MP3/Ogg-kodare som stöds och som du har installerade. Välj den som du tycker är bäst. För närvarande stöds lame , bladeenc och oggenc . Kodaren måste finnas i din PATH, annars kommer Gnomeradio inte att hitta den.
++
++
++ Bitfrekvens: Välj en bitfrekvens. Det här kommer att ha störst påverkan på storleken och kvaliteten på den resulterande MP3/Ogg-filen. Ju högre bitfrekvens, desto bättre kvalitet. 128 kbit/s är vanligtvis ett bra värde som kommer att resultera i att filerna är ungefär 1 MB per minut av speltid.
++
++
++
++
++
++Fönster för inspelningsstatus
++
++ Statusfönstret
++
++
++
++
++
++ Statusfönstret.
++
++
++
++
++Klicka på Stoppa inspelning för att stoppa inspelningen och återvända till huvudfönstret. Fönstret visar namnet och storleken på filen som ljuddatat har lagrats i.
++
++
++
++
++
++Snabbtangenter
++Gnomeradio har ett antal snabbtangenter.
++
++ Snabbtangenter i Gnomeradio
++
++
++
++
++
++ Snabbtangent
++ Beskrivning
++
++
++
++
++
++ F1
++
++ Öppna den här hjälpen.
++
++
++
++ r
++
++ Öppna inspelningsdialogrutan.
++
++
++
++ m
++
++ Tyst/normal volym.
++
++
++
++ q
++
++ Avsluta Gnomeradio.
++
++
++
++ f
++
++ Sök framåt.
++
++
++
++ b
++
++ Sök bakåt.
++
++
++
++ n
++
++ Välj nästa program.
++
++
++
++ p
++
++ Välj föregående program.
++
++
++
++ +
++
++ Höj volymen.
++
++
++
++ -
++
++ Sänk volymen.
++
++
++
++
++
++
++
++
++
++LIRC
++Du kan använda en fjärrkontroll som stöds av LIRC (Linux infrared remote control) för att kontrollera Gnomeradio .
++
++Din fjärrkontroll kommer endast att fungera om Gnomeradio har byggts med stöd för LIRC. Om du är osäker huruvida så är fallet, titta i Om-dialogrutan.
++
++
++
++Konfigurationsfilen .lircrc
++Du ställer in vilka knappar på din fjärrkontroll som du vill ska motsvara åtgärderna i Gnomeradio i filen .lircrc , som finns i din hemkatalog. En typisk sektion i den filen ser ut så här:
++Exempel på en .lircrc-sektion
++
++begin
++ prog = gnomeradio
++ button = VOL+
++ config = volume up
++ repeat = 1
++end
++
++
++Det här associerar knappen VOL+ (Varning: Knappnamnen är fjärrkontrollspecifika) med kommandot "volume up". "repeat = 1" betyder att om du håller ner knappen på din fjärrkontroll kommer kommandot att upprepas så länge som du håller ner knappen. Det är inaktiverat som standard.
++För mer information, konsultera LIRC-dokumentationen.
++
++
++
++
++Tillgängliga kommandon
++Följande kommandon finns tillgängliga i Gnomeradio:
++
++ LIRC-kommandon
++
++
++
++
++
++ Kommando
++ Beskrivning
++
++
++
++
++
++ tune up
++
++ Sök framåt.
++
++
++
++ tune down
++
++ Sök bakåt.
++
++
++
++ preset up
++
++ Välj nästa program.
++
++
++
++ preset down
++
++ Välj föregående program.
++
++
++
++ volume up
++
++ Höj volymen.
++
++
++
++ volume down
++
++ Sänk volymen.
++
++
++
++ mute
++
++ Tyst/normal volym.
++
++
++
++ quit
++
++ Avsluta Gnomeradio.
++
++
++
++ preset x
++
++ Välj program x + 1 (där x är mellan 0 och 9)
++
++
++
++
++
++
++
+Index: gnomeradio-1.8/help/es/es.po
+===================================================================
+--- gnomeradio-1.8.orig/help/es/es.po
++++ gnomeradio-1.8/help/es/es.po
+@@ -110,7 +110,7 @@ msgid ""
+ "the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any "
+ "later version published by the Free Software Foundation with no Invariant "
+ "Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy "
+-"of the GFDL at this link or "
++"of the GFDL at this link or "
+ "in the file COPYING-DOCS distributed with this manual."
+ msgstr ""
+ "Se otorga permiso para copiar, distribuir y/o modificar este documento bajo "
+@@ -118,7 +118,7 @@ msgstr ""
+ "cualquier otra versión posterior publicada por la Free Software Foundation; "
+ "sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de "
+ "Cubierta Trasera. Puede encontrar una copia de la licencia GFDL en este "
+-"enlace o en el archivo "
++"enlace o en el archivo "
+ "COPYING-DOCS distribuido con este manual."
+
+ #: C/gnomeradio.xml:12(para)
+Index: gnomeradio-1.8/help/fr/fr.po
+===================================================================
+--- gnomeradio-1.8.orig/help/fr/fr.po
++++ gnomeradio-1.8/help/fr/fr.po
+@@ -104,14 +104,14 @@ msgid "GNOME Documentation Project"
+ msgstr "Projet de documentation GNOME"
+
+ #: C/gnomeradio.xml:2(para)
+-msgid "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual."
++msgid "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual."
+ msgstr ""
+ "Permission vous est donnée de copier, distribuer et/ou modifier ce document "
+ "selon les termes de la Licence GNU Free Documentation License, Version 1.1 "
+ "ou ultérieure publiée par la Free Software Foundation sans section "
+ "inaltérable, sans texte de première page de couverture ni texte de dernière "
+ "page de couverture. Vous trouverez un exemplaire de cette licence en suivant "
+-"ce lien ou dans le fichier "
++"ce lien ou dans le fichier "
+ "COPYING-DOCS fourni avec le présent manuel."
+
+ #: C/gnomeradio.xml:12(para)
+Index: gnomeradio-1.8/help/oc/oc.po
+===================================================================
+--- gnomeradio-1.8.orig/help/oc/oc.po
++++ gnomeradio-1.8/help/oc/oc.po
+@@ -109,7 +109,7 @@ msgid ""
+ "the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any "
+ "later version published by the Free Software Foundation with no Invariant "
+ "Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy "
+-"of the GFDL at this link or "
++"of the GFDL at this link or "
+ "in the file COPYING-DOCS distributed with this manual."
+ msgstr ""
+
+Index: gnomeradio-1.8/help/sv/sv.po
+===================================================================
+--- gnomeradio-1.8.orig/help/sv/sv.po
++++ gnomeradio-1.8/help/sv/sv.po
+@@ -95,8 +95,8 @@ msgid "GNOME Documentation Project"
+ msgstr "Dokumentationsprojekt för GNOME"
+
+ #: C/gnomeradio.xml:2(para)
+-msgid "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual."
+-msgstr "Tillstånd att kopiera, distribuera och/eller modifiera detta dokument ges under villkoren i GNU Free Documentation License (GFDL), version 1.1 eller senare, utgivet av Free Software Foundation utan standardavsnitt och omslagstexter. En kopia av GFDL finns att hämta på denna länk eller i filen COPYING-DOCS som medföljer denna handbok."
++msgid "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual."
++msgstr "Tillstånd att kopiera, distribuera och/eller modifiera detta dokument ges under villkoren i GNU Free Documentation License (GFDL), version 1.1 eller senare, utgivet av Free Software Foundation utan standardavsnitt och omslagstexter. En kopia av GFDL finns att hämta på denna länk eller i filen COPYING-DOCS som medföljer denna handbok."
+
+ #: C/gnomeradio.xml:12(para)
+ msgid "This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license."
+Index: gnomeradio-1.8/gnome-doc-utils.make
+===================================================================
+--- gnomeradio-1.8.orig/gnome-doc-utils.make
++++ /dev/null
+@@ -1,574 +0,0 @@
+-# gnome-doc-utils.make - make magic for building documentation
+-# Copyright (C) 2004-2005 Shaun McCance
+-#
+-# This program is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
+-# (at your option) any later version.
+-#
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-# GNU General Public License for more details.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software Foundation,
+-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+-#
+-# As a special exception to the GNU General Public License, if you
+-# distribute this file as part of a program that contains a
+-# configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
+-
+-################################################################################
+-## @@ Generating Header Files
+-
+-## @ DOC_H_FILE
+-## The name of the header file to generate
+-DOC_H_FILE ?=
+-
+-## @ DOC_H_DOCS
+-## The input DocBook files for generating the header file
+-DOC_H_DOCS ?=
+-
+-$(DOC_H_FILE): $(DOC_H_DOCS);
+- @rm -f $@.tmp; touch $@.tmp;
+- echo 'const gchar* documentation_credits[] = {' >> $@.tmp
+- list='$(DOC_H_DOCS)'; for doc in $$list; do \
+- xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \
+- if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \
+- xsltproc --path "$$xmlpath" $(_credits) $$doc; \
+- done | sort | uniq \
+- | awk 'BEGIN{s=""}{n=split($$0,w,"<");if(s!=""&&s!=substr(w[1],1,length(w[1])-1)){print s};if(n>1){print $$0;s=""}else{s=$$0}};END{if(s!=""){print s}}' \
+- | sed -e 's/\\/\\\\/' -e 's/"/\\"/' -e 's/\(.*\)/\t"\1",/' >> $@.tmp
+- echo ' NULL' >> $@.tmp
+- echo '};' >> $@.tmp
+- echo >> $@.tmp
+- list='$(DOC_H_DOCS)'; for doc in $$list; do \
+- xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \
+- if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \
+- docid=`echo "$$doc" | sed -e 's/.*\/\([^/]*\)\.xml/\1/' \
+- | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`; \
+- echo $$xmlpath; \
+- ids=`xsltproc --xinclude --path "$$xmlpath" $(_ids) $$doc`; \
+- for id in $$ids; do \
+- echo '#define HELP_'`echo $$docid`'_'`echo $$id \
+- | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`' "'$$id'"' >> $@.tmp; \
+- done; \
+- echo >> $@.tmp; \
+- done;
+- cp $@.tmp $@ && rm -f $@.tmp
+-
+-dist-check-gdu:
+-if !HAVE_GNOME_DOC_UTILS
+- @echo "*** GNOME Doc Utils must be installed in order to make dist"
+- @false
+-endif
+-
+-.PHONY: dist-doc-header
+-dist-doc-header: $(DOC_H_FILE)
+- @if test -f "$(DOC_H_FILE)"; then d=; else d="$(srcdir)/"; fi; \
+- echo "$(INSTALL_DATA) $${d}$(DOC_H_FILE) $(distdir)/$(DOC_H_FILE)"; \
+- $(INSTALL_DATA) "$${d}$(DOC_H_FILE)" "$(distdir)/$(DOC_H_FILE)";
+-
+-doc-dist-hook: dist-check-gdu $(if $(DOC_H_FILE),dist-doc-header)
+-
+-.PHONY: clean-doc-header
+-_clean_doc_header = $(if $(DOC_H_FILE),clean-doc-header)
+-clean-local: $(_clean_doc_header)
+-distclean-local: $(_clean_doc_header)
+-mostlyclean-local: $(_clean_doc_header)
+-maintainer-clean-local: $(_clean_doc_header)
+-clean-doc-header:
+- rm -f $(DOC_H_FILE)
+-
+-all: $(DOC_H_FILE)
+-
+-
+-################################################################################
+-## @@ Generating Documentation Files
+-
+-## @ DOC_MODULE
+-## The name of the document being built
+-DOC_MODULE ?=
+-
+-## @ DOC_ENTITIES
+-## Files included with a SYSTEM entity
+-DOC_ENTITIES ?=
+-
+-## @ DOC_INCLUDES
+-## Files included with XInclude
+-DOC_INCLUDES ?=
+-
+-## @ DOC_FIGURES
+-## Figures and other external data
+-DOC_FIGURES ?=
+-
+-## @ DOC_FORMATS
+-## The default formats to be built and installed
+-DOC_FORMATS ?= docbook
+-_DOC_REAL_FORMATS = $(if $(DOC_USER_FORMATS),$(DOC_USER_FORMATS),$(DOC_FORMATS))
+-
+-## @ DOC_LINGUAS
+-## The languages this document is translated into
+-DOC_LINGUAS ?=
+-_DOC_REAL_LINGUAS = $(if $(filter environment,$(origin LINGUAS)), \
+- $(filter $(LINGUAS),$(DOC_LINGUAS)), \
+- $(DOC_LINGUAS))
+-
+-_DOC_ABS_SRCDIR = @abs_srcdir@
+-
+-
+-################################################################################
+-## Variables for Bootstrapping
+-
+-_xml2po ?= `which xml2po`
+-
+-_db2html ?= `$(PKG_CONFIG) --variable db2html gnome-doc-utils`
+-_db2omf ?= `$(PKG_CONFIG) --variable db2omf gnome-doc-utils`
+-_chunks ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/chunks.xsl
+-_credits ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/credits.xsl
+-_ids ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/ids.xsl
+-
+-if ENABLE_SK
+-_ENABLE_SK = true
+-_skpkgdatadir ?= `scrollkeeper-config --pkgdatadir`
+-_sklocalstatedir ?= `scrollkeeper-config --pkglocalstatedir`
+-_skcontentslist ?= $(_skpkgdatadir)/Templates/C/scrollkeeper_cl.xml
+-endif
+-
+-
+-################################################################################
+-## @@ Rules for OMF Files
+-
+-db2omf_args = \
+- --stringparam db2omf.basename $(DOC_MODULE) \
+- --stringparam db2omf.format $(3) \
+- --stringparam db2omf.dtd \
+- $(shell xmllint --format $(2) | grep -h PUBLIC | head -n 1 \
+- | sed -e 's/.*PUBLIC \(\"[^\"]*\"\).*/\1/') \
+- --stringparam db2omf.lang $(notdir $(patsubst %/$(notdir $(2)),%,$(2))) \
+- --stringparam db2omf.omf_dir "$(OMF_DIR)" \
+- --stringparam db2omf.help_dir "$(HELP_DIR)" \
+- --stringparam db2omf.omf_in "$(_DOC_OMF_IN)" \
+- $(if $(_ENABLE_SK), \
+- --stringparam db2omf.scrollkeeper_cl "$(_skcontentslist)") \
+- $(_db2omf) $(2)
+-
+-## @ _DOC_OMF_IN
+-## The OMF input file
+-_DOC_OMF_IN = $(if $(DOC_MODULE),$(wildcard $(_DOC_ABS_SRCDIR)/$(DOC_MODULE).omf.in))
+-
+-## @ _DOC_OMF_DB
+-## The OMF files for DocBook output
+-_DOC_OMF_DB = $(if $(_DOC_OMF_IN), \
+- $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-$(lc).omf))
+-
+-$(_DOC_OMF_DB) : $(_DOC_OMF_IN)
+-$(_DOC_OMF_DB) : $(DOC_MODULE)-%.omf : %/$(DOC_MODULE).xml
+- @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \
+- echo "The file '$(_skcontentslist)' does not exist." >&2; \
+- echo "Please check your ScrollKeeper installation." >&2; \
+- exit 1; }
+- xsltproc -o $@ $(call db2omf_args,$@,$<,'docbook') || { rm -f "$@"; exit 1; }
+-
+-## @ _DOC_OMF_HTML
+-## The OMF files for HTML output
+-_DOC_OMF_HTML = $(if $(_DOC_OMF_IN), \
+- $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-html-$(lc).omf))
+-
+-$(_DOC_OMF_HTML) : $(_DOC_OMF_IN)
+-$(_DOC_OMF_HTML) : $(DOC_MODULE)-html-%.omf : %/$(DOC_MODULE).xml
+-if ENABLE_SK
+- @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \
+- echo "The file '$(_skcontentslist)' does not exist" >&2; \
+- echo "Please check your ScrollKeeper installation." >&2; \
+- exit 1; }
+-endif
+- xsltproc -o $@ $(call db2omf_args,$@,$<,'xhtml') || { rm -f "$@"; exit 1; }
+-
+-## @ _DOC_OMF_ALL
+-## All OMF output files to be built
+-# FIXME
+-_DOC_OMF_ALL = \
+- $(if $(filter docbook,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_DB)) \
+- $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_HTML))
+-
+-.PHONY: omf
+-omf: $(_DOC_OMF_ALL)
+-
+-
+-################################################################################
+-## @@ C Locale Documents
+-
+-## @ _DOC_C_MODULE
+-## The top-level documentation file in the C locale
+-_DOC_C_MODULE = $(if $(DOC_MODULE),C/$(DOC_MODULE).xml)
+-
+-## @ _DOC_C_ENTITIES
+-## Files included with a SYSTEM entity in the C locale
+-_DOC_C_ENTITIES = $(foreach ent,$(DOC_ENTITIES),C/$(ent))
+-
+-## @ _DOC_C_XINCLUDES
+-## Files included with XInclude in the C locale
+-_DOC_C_INCLUDES = $(foreach inc,$(DOC_INCLUDES),C/$(inc))
+-
+-## @ _DOC_C_DOCS
+-## All documentation files in the C locale
+-_DOC_C_DOCS = \
+- $(_DOC_C_ENTITIES) $(_DOC_C_INCLUDES) \
+- $(_DOC_C_MODULE)
+-
+-## @ _DOC_C_DOCS_NOENT
+-## All documentation files in the C locale,
+-## except files included with a SYSTEM entity
+-_DOC_C_DOCS_NOENT = \
+- $(_DOC_C_MODULE) $(_DOC_C_INCLUDES)
+-
+-## @ _DOC_C_FIGURES
+-## All figures and other external data in the C locale
+-_DOC_C_FIGURES = $(if $(DOC_FIGURES), \
+- $(foreach fig,$(DOC_FIGURES),C/$(fig)), \
+- $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/C/figures/*.png)))
+-
+-## @ _DOC_C_HTML
+-## All HTML documentation in the C locale
+-# FIXME: probably have to shell escape to determine the file names
+-_DOC_C_HTML = $(foreach f, \
+- $(shell xsltproc --xinclude \
+- --stringparam db.chunk.basename "$(DOC_MODULE)" \
+- $(_chunks) "C/$(DOC_MODULE).xml"), \
+- C/$(f).xhtml)
+-
+-###############################################################################
+-## @@ Other Locale Documentation
+-
+-## @ _DOC_POFILES
+-## The .po files used for translating the document
+-_DOC_POFILES = $(if $(DOC_MODULE), \
+- $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(lc).po))
+-
+-.PHONY: po
+-po: $(_DOC_POFILES)
+-
+-## @ _DOC_LC_MODULES
+-## The top-level documentation files in all other locales
+-_DOC_LC_MODULES = $(if $(DOC_MODULE), \
+- $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xml))
+-
+-## @ _DOC_LC_XINCLUDES
+-## Files included with XInclude in all other locales
+-_DOC_LC_INCLUDES = \
+- $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach inc,$(_DOC_C_INCLUDES), \
+- $(lc)/$(notdir $(inc)) ))
+-
+-## @ _DOC_LC_HTML
+-## All HTML documentation in all other locales
+-# FIXME: probably have to shell escape to determine the file names
+-_DOC_LC_HTML = \
+- $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach doc,$(_DOC_C_HTML), \
+- $(lc)/$(notdir $(doc)) ))
+-
+-## @ _DOC_LC_DOCS
+-## All documentation files in all other locales
+-_DOC_LC_DOCS = \
+- $(_DOC_LC_MODULES) $(_DOC_LC_INCLUDES) \
+- $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_LC_HTML))
+-
+-## @ _DOC_LC_FIGURES
+-## All figures and other external data in all other locales
+-_DOC_LC_FIGURES = $(foreach lc,$(_DOC_REAL_LINGUAS), \
+- $(patsubst C/%,$(lc)/%,$(_DOC_C_FIGURES)) )
+-
+-_DOC_SRC_FIGURES = \
+- $(foreach fig,$(_DOC_C_FIGURES), $(foreach lc,C $(_DOC_REAL_LINGUAS), \
+- $(wildcard $(srcdir)/$(lc)/$(patsubst C/%,%,$(fig))) ))
+-
+-$(_DOC_POFILES):
+- @if ! test -d $(dir $@); then \
+- echo "mkdir $(dir $@)"; \
+- mkdir "$(dir $@)"; \
+- fi
+- @if test ! -f $@ -a -f $(srcdir)/$@; then \
+- echo "cp $(srcdir)/$@ $@"; \
+- cp "$(srcdir)/$@" "$@"; \
+- fi;
+- @docs=; \
+- list='$(_DOC_C_DOCS_NOENT)'; for doc in $$list; do \
+- docs="$$docs $(_DOC_ABS_SRCDIR)/$$doc"; \
+- done; \
+- if ! test -f $@; then \
+- echo "(cd $(dir $@) && \
+- $(_xml2po) -e $$docs > $(notdir $@).tmp && \
+- cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp)"; \
+- (cd $(dir $@) && \
+- $(_xml2po) -e $$docs > $(notdir $@).tmp && \
+- cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp); \
+- else \
+- echo "(cd $(dir $@) && \
+- $(_xml2po) -e -u $(notdir $@) $$docs)"; \
+- (cd $(dir $@) && \
+- $(_xml2po) -e -u $(notdir $@) $$docs); \
+- fi
+-
+-# FIXME: fix the dependancy
+-# FIXME: hook xml2po up
+-$(_DOC_LC_DOCS) : $(_DOC_POFILES)
+-$(_DOC_LC_DOCS) : $(_DOC_C_DOCS)
+- if ! test -d $(dir $@); then mkdir $(dir $@); fi
+- if [ -f "C/$(notdir $@)" ]; then d="../"; else d="$(_DOC_ABS_SRCDIR)/"; fi; \
+- (cd $(dir $@) && \
+- $(_xml2po) -e -p \
+- "$${d}$(dir $@)$(patsubst %/$(notdir $@),%,$@).po" \
+- "$${d}C/$(notdir $@)" > $(notdir $@).tmp && \
+- cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp)
+-
+-## @ _DOC_POT
+-## A pot file
+-_DOC_POT = $(if $(DOC_MODULE),$(DOC_MODULE).pot)
+-.PHONY: pot
+-pot: $(_DOC_POT)
+-$(_DOC_POT): $(_DOC_C_DOCS_NOENT)
+- $(_xml2po) -e -o $@ $^
+-
+-
+-################################################################################
+-## @@ All Documentation
+-
+-## @ _DOC_HTML_ALL
+-## All HTML documentation, only if it's built
+-_DOC_HTML_ALL = $(if $(filter html HTML,$(_DOC_REAL_FORMATS)), \
+- $(_DOC_C_HTML) $(_DOC_LC_HTML))
+-
+-_DOC_HTML_TOPS = $(foreach lc,C $(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xhtml)
+-
+-$(_DOC_HTML_TOPS): $(_DOC_C_DOCS) $(_DOC_LC_DOCS)
+- xsltproc -o $@ --xinclude --param db.chunk.chunk_top "false()" --stringparam db.chunk.basename "$(DOC_MODULE)" --stringparam db.chunk.extension ".xhtml" $(_db2html) $(patsubst %.xhtml,%.xml,$@)
+-
+-
+-################################################################################
+-
+-all: \
+- $(_DOC_C_DOCS) $(_DOC_LC_DOCS) \
+- $(_DOC_OMF_ALL) $(_DOC_DSK_ALL) \
+- $(_DOC_HTML_ALL) $(_DOC_POFILES)
+-
+-
+-.PHONY: clean-doc-omf clean-doc-dsk clean-doc-lc clean-doc-dir
+-
+-clean-doc-omf: ; rm -f $(_DOC_OMF_DB) $(_DOC_OMF_HTML)
+-clean-doc-dsk: ; rm -f $(_DOC_DSK_DB) $(_DOC_DSK_HTML)
+-clean-doc-lc:
+- rm -f $(_DOC_LC_DOCS)
+- @list='$(_DOC_POFILES)'; for po in $$list; do \
+- if ! test "$$po" -ef "$(srcdir)/$$po"; then \
+- echo "rm -f $$po"; \
+- rm -f "$$po"; \
+- fi; \
+- done
+- @for lc in C $(_DOC_REAL_LINGUAS); do \
+- if test -f "$$lc/.xml2po.mo"; then \
+- echo "rm -f $$lc/.xml2po.mo"; \
+- rm -f "$$lc/.xml2po.mo"; \
+- fi; \
+- done
+-clean-doc-dir:
+- @for lc in C $(_DOC_REAL_LINGUAS); do \
+- for dir in `find $$lc -depth -type d`; do \
+- if ! test $$dir -ef $(srcdir)/$$dir; then \
+- echo "rmdir $$dir"; \
+- rmdir "$$dir"; \
+- fi; \
+- done; \
+- done
+-
+-_clean_omf = $(if $(_DOC_OMF_IN),clean-doc-omf)
+-_clean_dsk = $(if $(_DOC_DSK_IN),clean-doc-dsk)
+-_clean_lc = $(if $(_DOC_REAL_LINGUAS),clean-doc-lc)
+-_clean_dir = $(if $(DOC_MODULE),clean-doc-dir)
+-
+-clean-local: \
+- $(_clean_omf) $(_clean_dsk) \
+- $(_clean_lc) $(_clean_dir)
+-distclean-local: \
+- $(_clean_omf) $(_clean_dsk) \
+- $(_clean_lc) $(_clean_dir)
+-mostlyclean-local: \
+- $(_clean_omf) $(_clean_dsk) \
+- $(_clean_lc) $(_clean_dir)
+-maintainer-clean-local: \
+- $(_clean_omf) $(_clean_dsk) \
+- $(_clean_lc) $(_clean_dir)
+-
+-
+-.PHONY: dist-doc-docs dist-doc-figs dist-doc-omf dist-doc-dsk
+-doc-dist-hook: \
+- $(if $(DOC_MODULE),dist-doc-docs) \
+- $(if $(_DOC_C_FIGURES),dist-doc-figs) \
+- $(if $(_DOC_OMF_IN),dist-doc-omf)
+-# $(if $(_DOC_DSK_IN),dist-doc-dsk)
+-
+-dist-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES)
+- @for lc in C $(_DOC_REAL_LINGUAS); do \
+- echo " $(mkinstalldirs) $(distdir)/$$lc"; \
+- $(mkinstalldirs) "$(distdir)/$$lc"; \
+- done
+- @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES)'; \
+- for doc in $$list; do \
+- if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \
+- docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \
+- if ! test -d "$(distdir)/$$docdir"; then \
+- echo "$(mkinstalldirs) $(distdir)/$$docdir"; \
+- $(mkinstalldirs) "$(distdir)/$$docdir"; \
+- fi; \
+- echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \
+- $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \
+- done
+-
+-dist-doc-figs: $(_DOC_SRC_FIGURES)
+- @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; \
+- for fig in $$list; do \
+- if test -f "$$fig"; then d=; else d="$(srcdir)/"; fi; \
+- if test -f "$$d$$fig"; then \
+- figdir=`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \
+- if ! test -d "$(distdir)/$$figdir"; then \
+- echo "$(mkinstalldirs) $(distdir)/$$figdir"; \
+- $(mkinstalldirs) "$(distdir)/$$figdir"; \
+- fi; \
+- echo "$(INSTALL_DATA) $$d$$fig $(distdir)/$$fig"; \
+- $(INSTALL_DATA) "$$d$$fig" "$(distdir)/$$fig"; \
+- fi; \
+- done;
+-
+-dist-doc-omf:
+- @if test -f "$(_DOC_OMF_IN)"; then d=; else d="$(srcdir)/"; fi; \
+- echo "$(INSTALL_DATA) $$d$(_DOC_OMF_IN) $(distdir)/$(notdir $(_DOC_OMF_IN))"; \
+- $(INSTALL_DATA) "$$d$(_DOC_OMF_IN)" "$(distdir)/$(notdir $(_DOC_OMF_IN))"
+-
+-dist-doc-dsk:
+- @if test -f "$(_DOC_DSK_IN)"; then d=; else d="$(srcdir)/"; fi; \
+- echo "$(INSTALL_DATA) $$d$(_DOC_DSK_IN) $(distdir)/$(notdir $(_DOC_DSK_IN))"; \
+- $(INSTALL_DATA) "$$d$(_DOC_DSK_IN)" "$(distdir)/$(notdir $(_DOC_DSK_IN))"
+-
+-
+-.PHONY: check-doc-docs check-doc-omf
+-check: \
+- $(if $(DOC_MODULE),check-doc-docs) \
+- $(if $(_DOC_OMF_IN),check-doc-omf)
+-
+-check-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS)
+- @for lc in C $(_DOC_REAL_LINGUAS); do \
+- if test -f "$$lc"; \
+- then d=; \
+- xmlpath="$$lc"; \
+- else \
+- d="$(srcdir)/"; \
+- xmlpath="$$lc:$(srcdir)/$$lc"; \
+- fi; \
+- echo "xmllint --noout --noent --path $$xmlpath --xinclude --postvalid $$d$$lc/$(DOC_MODULE).xml"; \
+- xmllint --noout --noent --path "$$xmlpath" --xinclude --postvalid "$$d$$lc/$(DOC_MODULE).xml"; \
+- done
+-
+-check-doc-omf: $(_DOC_OMF_ALL)
+- @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \
+- echo "xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf"; \
+- xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf; \
+- done
+-
+-
+-.PHONY: install-doc-docs install-doc-html install-doc-figs install-doc-omf install-doc-dsk
+-install-data-local: \
+- $(if $(DOC_MODULE),install-doc-docs) \
+- $(if $(_DOC_HTML_ALL),install-doc-html) \
+- $(if $(_DOC_C_FIGURES),install-doc-figs) \
+- $(if $(_DOC_OMF_IN),install-doc-omf)
+-# $(if $(_DOC_DSK_IN),install-doc-dsk)
+-
+-install-doc-docs:
+- @for lc in C $(_DOC_REAL_LINGUAS); do \
+- echo "$(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$lc"; \
+- $(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$lc; \
+- done
+- @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS)'; for doc in $$list; do \
+- if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \
+- docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \
+- docdir="$(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$docdir"; \
+- if ! test -d "$$docdir"; then \
+- echo "$(mkinstalldirs) $$docdir"; \
+- $(mkinstalldirs) "$$docdir"; \
+- fi; \
+- echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$doc"; \
+- $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$doc; \
+- done
+-
+-install-doc-figs:
+- @list='$(patsubst C/%,%,$(_DOC_C_FIGURES))'; for fig in $$list; do \
+- for lc in C $(_DOC_REAL_LINGUAS); do \
+- if test -f "$$lc/$$fig"; then \
+- figfile="$$lc/$$fig"; \
+- elif test -f "$(srcdir)/$$lc/$$fig"; then \
+- figfile="$(srcdir)/$$lc/$$fig"; \
+- elif test -f "C/$$fig"; then \
+- figfile="C/$$fig"; \
+- else \
+- figfile="$(srcdir)/C/$$fig"; \
+- fi; \
+- figdir="$$lc/"`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \
+- figdir="$(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$figdir"; \
+- if ! test -d "$$figdir"; then \
+- echo "$(mkinstalldirs) $$figdir"; \
+- $(mkinstalldirs) "$$figdir"; \
+- fi; \
+- figbase=`echo $$fig | sed -e 's/^.*\///'`; \
+- echo "$(INSTALL_DATA) $$figfile $$figdir$$figbase"; \
+- $(INSTALL_DATA) "$$figfile" "$$figdir$$figbase"; \
+- done; \
+- done
+-
+-install-doc-html:
+- echo install-html
+-
+-install-doc-omf:
+- $(mkinstalldirs) $(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)
+- @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \
+- echo "$(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)/$$omf"; \
+- $(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)/$$omf; \
+- done
+- @if test "x$(_ENABLE_SK)" = "xtrue"; then \
+- echo "scrollkeeper-update -p $(DESTDIR)$(_sklocalstatedir) -o $(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)"; \
+- scrollkeeper-update -p "$(DESTDIR)$(_sklocalstatedir)" -o "$(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)"; \
+- fi;
+-
+-install-doc-dsk:
+- echo install-dsk
+-
+-
+-.PHONY: uninstall-doc-docs uninstall-doc-html uninstall-doc-figs uninstall-doc-omf uninstall-doc-dsk
+-uninstall-local: \
+- $(if $(DOC_MODULE),uninstall-doc-docs) \
+- $(if $(_DOC_HTML_ALL),uninstall-doc-html) \
+- $(if $(_DOC_C_FIGURES),uninstall-doc-figs) \
+- $(if $(_DOC_OMF_IN),uninstall-doc-omf)
+-# $(if $(_DOC_DSK_IN),uninstall-doc-dsk)
+-
+-uninstall-doc-docs:
+- @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS)'; for doc in $$list; do \
+- echo " rm -f $(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$doc"; \
+- rm -f "$(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$doc"; \
+- done
+-
+-uninstall-doc-figs:
+- @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; for fig in $$list; do \
+- echo "rm -f $(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$fig"; \
+- rm -f "$(DESTDIR)$(HELP_DIR)/$(DOC_MODULE)/$$fig"; \
+- done;
+-
+-uninstall-doc-omf:
+- @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \
+- if test "x$(_ENABLE_SK)" = "xtrue"; then \
+- echo "scrollkeeper-uninstall -p $(_sklocalstatedir) $(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)/$$omf"; \
+- scrollkeeper-uninstall -p "$(_sklocalstatedir)" "$(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)/$$omf"; \
+- fi; \
+- echo "rm -f $(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)/$$omf"; \
+- rm -f "$(DESTDIR)$(OMF_DIR)/$(DOC_MODULE)/$$omf"; \
+- done
+Index: gnomeradio-1.8/configure.in
+===================================================================
+--- gnomeradio-1.8.orig/configure.in
++++ gnomeradio-1.8/configure.in
+@@ -38,7 +38,9 @@ PKG_CHECK_MODULES(XML, libxml-2.0 >= 2.4
+ AC_SUBST(XML_CFLAGS)
+ AC_SUBST(XML_LIBS)
+
+-GNOME_DOC_INIT
++AM_SILENT_RULES([yes])
++
++YELP_HELP_INIT
+
+ AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
+
diff -pruN 1.8-2/debian/patches/gnomeradio-draw_signal.patch 1.8-2ubuntu32/debian/patches/gnomeradio-draw_signal.patch
--- 1.8-2/debian/patches/gnomeradio-draw_signal.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-draw_signal.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,39 @@
+## Description: Fixed problems with Gtk3 events and signals.
+## Origin: upstream, https://launchpadlibrarian.net/97002557/gnomeradio-draw_signal.patch
+## Bug-Ubuntu: http://launchpad.net/bugs/955462
+## Bug-Debian:
+## Author: Pojar George
+## Forwarded: not-needed
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c 2013-07-05 06:20:20.068561000 +0000
++++ gnomeradio-1.8/src/gui.c 2013-07-05 06:27:37.645212997 +0000
+@@ -349,7 +349,7 @@
+ /* window = gdk_pixmap_new(real_window, win_width, win_height, -1); */
+
+ cr = gdk_cairo_create (real_window);
+- cairo_set_source_rgb (cr, 1, 1, 1);
++ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_paint (cr);
+
+ win_width -= 5;
+@@ -401,9 +401,8 @@
+
+ return TRUE;
+ }
+-
+
+-static gboolean expose_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
++static gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
+ {
+ redraw_status_window();
+ return TRUE;
+@@ -1042,7 +1041,7 @@
+ g_signal_connect(G_OBJECT(about_button), "clicked", G_CALLBACK(about_button_clicked_cb), NULL);
+ g_signal_connect(G_OBJECT(rec_button), "clicked", G_CALLBACK(rec_button_clicked_cb), (gpointer) app);
+ g_signal_connect(G_OBJECT(prefs_button), "clicked", G_CALLBACK(prefs_button_clicked_cb), (gpointer) app);
+- g_signal_connect(G_OBJECT(drawing_area), "expose-event", G_CALLBACK(expose_event_cb), NULL);
++ g_signal_connect(G_OBJECT(drawing_area), "draw", G_CALLBACK(draw_cb), NULL);
+
+ gtk_widget_set_tooltip_text(scbw_button, _("Scan Backwards"));
+ gtk_widget_set_tooltip_text(scfw_button, _("Scan Forwards"));
diff -pruN 1.8-2/debian/patches/gnomeradio-eos_message.patch 1.8-2ubuntu32/debian/patches/gnomeradio-eos_message.patch
--- 1.8-2/debian/patches/gnomeradio-eos_message.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-eos_message.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,23 @@
+## Description: Send EOS before we stop recording.
+## Origin: upstream, no
+## Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1079625
+## Author: Pojar George
+## Forwarded: no
+Index: b/src/rec_tech.c
+===================================================================
+--- a/src/rec_tech.c 2012-12-03 10:14:56.906899748 +0000
++++ b/src/rec_tech.c 2012-12-03 10:14:58.126899712 +0000
+@@ -250,6 +250,13 @@
+ if (state != GST_STATE_PLAYING) {
+ GST_DEBUG ("pipeline in wrong state: %s", gst_element_state_get_name (state));
+ } else {
++ GstMessage *msg;
++ GST_DEBUG ("Stopping recording source");
++ gst_element_send_event (recording->pipeline, gst_event_new_eos ());
++ /* wait for EOS message on the pipeline bus */
++ msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (recording->pipeline), GST_SECOND, GST_MESSAGE_EOS | GST_MESSAGE_ERROR);
++ gst_message_unref (msg);
++
+ gst_element_set_state(recording->pipeline, GST_STATE_NULL);
+ }
+ gst_object_unref(GST_OBJECT(recording->pipeline));
diff -pruN 1.8-2/debian/patches/gnomeradio-file_chooser.patch 1.8-2ubuntu32/debian/patches/gnomeradio-file_chooser.patch
--- 1.8-2/debian/patches/gnomeradio-file_chooser.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-file_chooser.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,55 @@
+## Description: Switch from a GtkButton to a GtkFileChooserButton, instead of fidling around with the dialog.
+## Origin: upstream, no
+## Author: Pojar George
+## Forwarded: no
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c 2013-05-29 16:41:32.179964469 +0000
++++ gnomeradio-1.8/src/prefs.c 2013-05-29 16:42:36.471962557 +0000
+@@ -379,21 +379,11 @@
+
+ static void destination_button_clicked_cb(GtkWidget *button, gpointer data)
+ {
+- GtkWidget *dialog;
+-
+- dialog = gtk_file_chooser_dialog_new(_("Choose a destination folder"), NULL,
+- GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+- NULL);
+- gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), rec_settings.destination);
+- if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
+- if (rec_settings.destination) g_free(rec_settings.destination);
+- rec_settings.destination = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+- gtk_button_set_label(GTK_BUTTON(button), rec_settings.destination);
++ if (rec_settings.destination)
++ {
++ g_free(rec_settings.destination);
+ }
+-
+- gtk_widget_destroy (dialog);
++ rec_settings.destination = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(button));
+ }
+
+ static gboolean list_view_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+@@ -711,8 +701,9 @@
+ destination_label = gtk_label_new(_("Destination directory:"));
+ gtk_misc_set_alignment(GTK_MISC(destination_label), 0.0f, 0.5f);
+
+- destination_button = gtk_button_new();
+- gtk_button_set_label(GTK_BUTTON(destination_button), rec_settings.destination);
++ destination_button = gtk_file_chooser_button_new(
++ _("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
++ gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(destination_button), rec_settings.destination);
+
+ profile_eb = gtk_event_box_new();
+ profile_combo = gm_audio_profile_choose_new();
+@@ -723,7 +714,7 @@
+ gtk_table_attach_defaults(GTK_TABLE(record_table), destination_button, 1, 2, 0, 1);
+ gtk_table_attach_defaults(GTK_TABLE(record_table), profile_eb, 0, 2, 1, 2);
+
+- g_signal_connect(G_OBJECT(destination_button), "clicked", G_CALLBACK(destination_button_clicked_cb), NULL);
++ g_signal_connect(GTK_FILE_CHOOSER(destination_button), "selection-changed", G_CALLBACK(destination_button_clicked_cb), NULL);
+ g_signal_connect(G_OBJECT(profile_combo), "changed", G_CALLBACK(profile_combo_change_cb), NULL);
+
+ gtk_widget_set_tooltip_text(profile_eb, _("Choose the Media Profile that should be used to record."));
diff -pruN 1.8-2/debian/patches/gnomeradio-g_dbus.patch 1.8-2ubuntu32/debian/patches/gnomeradio-g_dbus.patch
--- 1.8-2/debian/patches/gnomeradio-g_dbus.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-g_dbus.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,131 @@
+Description: Migrate from dbus-glib to glib's GDBus.
+Author: POJAR GEORGE
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1258518
+Index: gnomeradio-1.8/configure.ac
+===================================================================
+--- gnomeradio-1.8.orig/configure.ac
++++ gnomeradio-1.8/configure.ac
+@@ -44,7 +44,7 @@ PKG_CHECK_MODULES(ALSA, alsa >= 1.0.25)
+ AC_SUBST(ALSA_CFLAGS)
+ AC_SUBST(ALSA_LIBS)
+
+-PKG_CHECK_MODULES(GNOME, dbus-glib-1 gtk+-3.0 libxml-2.0 glib-2.0 gio-2.0)
++PKG_CHECK_MODULES(GNOME, gtk+-3.0 libxml-2.0 glib-2.0 gio-2.0)
+ AC_SUBST(GNOME_CFLAGS)
+ AC_SUBST(GNOME_LIBS)
+
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -22,9 +22,8 @@
+
+ #include
+ #include
++#include
+ #include
+-#include
+-#include
+ #include
+ #include
+ #include "gui.h"
+@@ -98,7 +97,7 @@ static gint mode;
+
+ static gboolean do_scan;
+
+-static DBusGProxy *proxy;
++static GDBusProxy *proxy;
+
+ static void connect_to_session (void);
+
+@@ -1212,14 +1211,16 @@ GtkWidget* gnome_radio_gui (void)
+ }
+
+ static void
+-session_die_cb(void)
++session_die_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, gpointer user_data)
+ {
+- if (settings.mute_on_exit)
+- radio_stop();
++ if (g_strcmp0 (signal_name, "SessionOver") == 0) {
++ if (settings.mute_on_exit)
++ radio_stop();
+
+- mixer->close_device();
+- gtk_widget_destroy (GTK_WIDGET (app));
+- exit (0);
++ mixer->close_device();
++ gtk_widget_destroy (GTK_WIDGET (app));
++ exit (0);
++ }
+ }
+
+ /*
+@@ -1490,14 +1491,8 @@ int main (int argc, char **argv)
+
+ g_object_unref (application);
+
+- if (proxy) {
+- DBusGConnection *conn;
+- conn = (DBusGConnection *)g_object_get_data (G_OBJECT (proxy), "connection");
+- if (conn)
+- dbus_g_connection_unref (conn);
+-
++ if (proxy != NULL)
+ g_object_unref (proxy);
+- }
+
+ #ifdef HAVE_LIRC
+ my_lirc_deinit();
+@@ -1508,32 +1503,34 @@ int main (int argc, char **argv)
+
+ static void connect_to_session (void)
+ {
+- DBusGConnection *connection;
++ GDBusConnection *connection;
+ GError *error = NULL;
+
+- connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
++ connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+
+- if (error) {
++ if (connection == NULL) {
+ g_warning ("Could not connect to system bus: %s", error->message);
+- g_error_free(error);
++ g_error_free (error);
+ return;
+ }
+
+- proxy = dbus_g_proxy_new_for_name (connection,
+- "org.gnome.SessionManager",
+- "/org/gnome/SessionManager",
+- "org.gnome.SessionManager");
+-
+- if (!proxy) {
+- g_warning ("Unable to get the SessionManager.");
+- dbus_g_connection_unref (connection);
+- return;
++ proxy = g_dbus_proxy_new_sync (connection,
++ G_DBUS_PROXY_FLAGS_NONE,
++ NULL,
++ "org.gnome.SessionManager",
++ "/org/gnome/SessionManager",
++ "org.gnome.SessionManager",
++ NULL,
++ &error);
++ g_object_unref (connection);
++
++ if (proxy == NULL) {
++ g_warning ("Could not connect to the Session manager: %s", error->message);
++ g_error_free (error);
++ return;
+ }
+
+- dbus_g_proxy_add_signal (proxy, "SessionOver", G_TYPE_INVALID, G_TYPE_INVALID);
+- dbus_g_proxy_connect_signal (proxy, "SessionOver", G_CALLBACK (session_die_cb), NULL, NULL);
+-
+- g_object_set_data (G_OBJECT (proxy), "connection", connection);
++ g_signal_connect (G_OBJECT (proxy), "g-signal", G_CALLBACK (session_die_cb), NULL);
+ }
+
+ static void show_message(GtkMessageType type, const char* text, const char* details)
diff -pruN 1.8-2/debian/patches/gnomeradio-g_list.patch 1.8-2ubuntu32/debian/patches/gnomeradio-g_list.patch
--- 1.8-2/debian/patches/gnomeradio-g_list.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-g_list.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,137 @@
+Description: Don't use g_list_length() to check for empty list + Use g_list_prepend()/g_list_reverse() in a loop.
+Author: POJAR GEORGE
+
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -203,7 +203,7 @@ static void initial_frequency_scan(GtkWi
+ timeout_id = 0;
+ gtk_widget_destroy (data.dialog);
+ } else {
+- if (g_list_length (data.stations) > 0) {
++ if (data.stations != NULL) {
+ GtkWidget *dialog;
+ GList *l;
+ guint num;
+@@ -240,11 +240,14 @@ static void initial_frequency_scan(GtkWi
+ if (response == GTK_RESPONSE_YES) {
+ preset *ps = g_malloc0(sizeof(preset));
+ ps->title = g_strdup(_("unnamed"));
+- ps->freq = *((gfloat*)l->data);
+- settings.presets = g_list_append(settings.presets, ps);
++ ps->freq = *((gfloat*) l->data);
++ settings.presets = g_list_prepend(settings.presets, ps);
+ }
+- g_free(l->data);
+- }
++
++ g_free (l->data);
++ }
++
++ settings.presets = g_list_reverse (settings.presets);
+ }
+ }
+ }
+@@ -1358,7 +1361,7 @@ option_version_cb (const gchar * opt,
+
+ int main(int argc, char* argv[])
+ {
+- GList *ptr;
++ GList *l;
+ DBusGProxy *proxy;
+ GError *err = NULL;
+ gboolean do_scan = FALSE;
+@@ -1433,10 +1436,11 @@ int main(int argc, char* argv[])
+ create_tray_menu(app);
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(preset_combo), _("manual"));
+- for (ptr = settings.presets; ptr; ptr = g_list_next(ptr)) {
+- preset *ps = (preset*)ptr->data;
++ for (l = settings.presets; l; l = l->next) {
++ preset *ps = (preset*) l->data;
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(preset_combo), ps->title);
+ }
++
+ preset_combo_set_item(mom_ps);
+
+ gtk_widget_show_all(app);
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -183,8 +183,10 @@ gboolean load_settings(void)
+ else
+ ps->freq = freq;
+ g_free(buffer);
+- settings.presets = g_list_append(settings.presets, (gpointer)ps);
++ settings.presets = g_list_prepend(settings.presets, (gpointer)ps);
+ }
++ settings.presets = g_list_reverse(settings.presets);
++
+ mom_ps = gconf_client_get_int(client, "/apps/gnomeradio/presets/last", NULL);
+ if (mom_ps >= count)
+ mom_ps = -1;
+@@ -487,7 +489,7 @@ static void remove_button_clicked_cb(Gtk
+ if (main_visible) {
+ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(preset_combo), *row + 1);
+ if (--mom_ps < 0) mom_ps = 0;
+- if (!g_list_length(settings.presets)) mom_ps = -1;
++ if (settings.presets == NULL) mom_ps = -1;
+ preset_combo_set_item(mom_ps);
+
+ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+@@ -500,7 +502,7 @@ static void remove_button_clicked_cb(Gtk
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(list_view), path, NULL, FALSE);
+ gtk_tree_path_free(path);
+
+- if (!g_list_length(settings.presets)) {
++ if (settings.presets == NULL) {
+ gtk_widget_set_sensitive(save_button, FALSE);
+ } else {
+ gtk_widget_set_sensitive(save_button, TRUE);
+@@ -846,13 +848,11 @@ static void list_view_scroll_to_active_p
+ gtk_widget_grab_focus(list_view);
+ }
+
+-static void free_preset_list(gpointer data, gpointer user_data)
++static void free_presets_list (gpointer data)
+ {
+- preset *ps;
+-
+- ps = (preset *) data;
+- g_free(ps->title);
+- g_free(ps);
++ preset *ps = (preset *) data;
++ g_free (ps->title);
++ g_free (ps);
+ }
+
+ /* Go through each row and add its data to the xmlDocPtr */
+@@ -1204,6 +1204,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gint i;
+ char *settings_hdr, *presets_hdr, *record_hdr;
+ preset* ps;
++ GList *l;
+
+ dialog = gtk_dialog_new_with_buttons(_("Gnomeradio Settings"), GTK_WINDOW(app),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+@@ -1319,14 +1320,16 @@ GtkWidget* prefs_window(GtkWidget *app)
+
+ g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(freq_cell_edited_cb), NULL);
+
+- for (i = 0; i < g_list_length(settings.presets); i++) {
++ i = 0;
++ for (l = settings.presets; l != NULL; l = l->next) {
+ GtkTreeIter iter = {0};
+ char *buffer;
+- ps = g_list_nth_data(settings.presets, i);
++ ps = l->data;
+ buffer = g_strdup_printf("%0.2f", ps->freq);
+ gtk_list_store_append(list_store, &iter);
+ gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, ps->title, 1, buffer, -1);
+ g_free(buffer);
++ i++;
+ }
+
+ gtk_grid_attach(GTK_GRID(grid), scrolled_window, 1, 5, 2, 2);
diff -pruN 1.8-2/debian/patches/gnomeradio-gnome-3.0.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gnome-3.0.patch
--- 1.8-2/debian/patches/gnomeradio-gnome-3.0.patch 2011-10-28 19:58:55.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gnome-3.0.patch 2015-04-13 18:42:54.000000000 +0000
@@ -1,7 +1,7 @@
-Index: gnomeradio-1.8/src/prefs.c
+Index: b/src/prefs.c
===================================================================
---- gnomeradio-1.8.orig/src/prefs.c 2011-10-28 17:59:02.136135852 +0200
-+++ gnomeradio-1.8/src/prefs.c 2011-10-28 17:59:04.928100751 +0200
+--- a/src/prefs.c 2012-12-03 10:14:53.066899862 +0000
++++ b/src/prefs.c 2012-12-03 10:14:53.262899857 +0000
@@ -15,7 +15,7 @@
*/
@@ -11,10 +11,10 @@ Index: gnomeradio-1.8/src/prefs.c
#include
#include "config.h"
#include "prefs.h"
-Index: gnomeradio-1.8/src/rec_tech.c
+Index: b/src/rec_tech.c
===================================================================
---- gnomeradio-1.8.orig/src/rec_tech.c 2011-10-28 17:58:54.352233707 +0200
-+++ gnomeradio-1.8/src/rec_tech.c 2011-10-28 17:59:04.928100751 +0200
+--- a/src/rec_tech.c 2012-12-03 10:14:50.118899950 +0000
++++ b/src/rec_tech.c 2012-12-03 10:14:53.266899856 +0000
@@ -17,7 +17,7 @@
#include "rec_tech.h"
@@ -24,10 +24,10 @@ Index: gnomeradio-1.8/src/rec_tech.c
#include
#include
#include
-Index: gnomeradio-1.8/configure.in
+Index: b/configure.in
===================================================================
---- gnomeradio-1.8.orig/configure.in 2011-10-28 17:58:54.368233507 +0200
-+++ gnomeradio-1.8/configure.in 2011-10-28 17:59:24.003860934 +0200
+--- a/configure.in 2012-12-03 10:14:50.118899950 +0000
++++ b/configure.in 2012-12-03 10:14:53.266899856 +0000
@@ -23,7 +23,7 @@
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", GETTEXT_PACKAGE)
diff -pruN 1.8-2/debian/patches/gnomeradio-g_object.patch 1.8-2ubuntu32/debian/patches/gnomeradio-g_object.patch
--- 1.8-2/debian/patches/gnomeradio-g_object.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-g_object.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,479 @@
+Description: Removed useless calls to the G_OBJECT() macro.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1267306
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -284,9 +284,9 @@ set_volume (gdouble volume)
+ {
+ mixer->set_volume (volume);
+
+- g_signal_handler_block (G_OBJECT(volume_button), volume_value_changed_id);
++ g_signal_handler_block (volume_button, volume_value_changed_id);
+ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), volume / 100);
+- g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
++ g_signal_handler_unblock (volume_button, volume_value_changed_id);
+
+ tray_menu_enable_mute_button (mixer->is_muted());
+
+@@ -339,9 +339,9 @@ toggle_volume (void)
+ }
+
+ volume = (gdouble) mixer->get_volume();
+- g_signal_handler_block (G_OBJECT(volume_button), volume_value_changed_id);
++ g_signal_handler_block (volume_button, volume_value_changed_id);
+ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), volume / 100);
+- g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
++ g_signal_handler_unblock (volume_button, volume_value_changed_id);
+
+ tray_menu_enable_mute_button (mixer->is_muted());
+ }
+@@ -446,9 +446,9 @@ void start_mixer(gboolean restart, GtkWi
+
+ if (mixer_set_device(settings.mixer)) {
+ mixer->set_state (settings.muted, settings.unmute_volume);
+- g_signal_handler_block (G_OBJECT(volume_button), volume_value_changed_id);
++ g_signal_handler_block (volume_button, volume_value_changed_id);
+ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), settings.unmute_volume);
+- g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
++ g_signal_handler_unblock (volume_button, volume_value_changed_id);
+
+ tray_menu_enable_mute_button (mixer->is_muted());
+
+@@ -555,7 +555,7 @@ static gboolean redraw_status_window(voi
+ /* gdk_draw_drawable(real_window, gc, window, 0, 0, 0, 0, win_width + 5, win_height); */
+
+ cairo_destroy (cr);
+- /* g_object_unref(G_OBJECT(window)); */
++ /* g_object_unref (window); */
+
+ return TRUE;
+ }
+@@ -832,14 +832,14 @@ static int start_recording(const gchar *
+ g_free (caption);
+ g_free (detail);
+
+- g_object_unref(info);
+- g_object_unref(file);
++ g_object_unref (info);
++ g_object_unref (file);
+
+ return -1;
+ }
+- g_object_unref(info);
++ g_object_unref (info);
+ }
+- g_object_unref(file);
++ g_object_unref (file);
+
+ if (rb_gst_check_missing_plugins (rb_gst_get_encoding_profile (rec_settings.profile), NULL, NULL)) {
+ gchar *extension, *format;
+@@ -970,8 +970,8 @@ static void about_button_clicked_cb(GtkB
+ app_icon);
+
+ gtk_widget_show(about);
+- g_object_add_weak_pointer(G_OBJECT(about), (gpointer)&about);
+- g_object_add_weak_pointer(G_OBJECT(about), (gpointer)&app_icon); */
++ g_object_add_weak_pointer (G_OBJECT (about), (gpointer) &about);
++ g_object_add_weak_pointer (G_OBJECT (about) &app_icon); */
+ }
+
+ static gint delete_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data)
+@@ -1131,8 +1131,8 @@ GtkWidget* gnome_radio_gui (void)
+ gtk_box_pack_start (GTK_BOX (box), vseparator, FALSE, FALSE, 2);
+
+ volume_button = gtk_volume_button_new();
+- g_object_set (G_OBJECT (volume_button), "size", GTK_ICON_SIZE_LARGE_TOOLBAR, NULL);
+- g_object_set (G_OBJECT (volume_button), "use-symbolic", FALSE, NULL);
++ g_object_set (volume_button, "size", GTK_ICON_SIZE_LARGE_TOOLBAR, NULL);
++ g_object_set (volume_button, "use-symbolic", FALSE, NULL);
+ gtk_button_set_relief (GTK_BUTTON (volume_button), GTK_RELIEF_NONE);
+ gtk_widget_set_sensitive(volume_button, FALSE);
+
+@@ -1172,23 +1172,23 @@ GtkWidget* gnome_radio_gui (void)
+
+ gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 4);
+
+- g_signal_connect (G_OBJECT (app), "delete_event", G_CALLBACK (delete_event_cb), NULL);
+- g_signal_connect (G_OBJECT (drawing_area), "draw", G_CALLBACK (draw_cb), NULL);
+- g_signal_connect (G_OBJECT (preset_combo), "changed", G_CALLBACK (preset_combo_change_cb), NULL);
+- g_signal_connect (G_OBJECT (adj), "value-changed", G_CALLBACK (adj_value_changed_cb), (gpointer) app);
+- g_signal_connect (G_OBJECT (scbw_button), "clicked", G_CALLBACK (scbw_button_clicked_cb), NULL);
+- g_signal_connect (G_OBJECT (stbw_button), "pressed", G_CALLBACK (step_button_pressed_cb), (gpointer) FALSE);
+- g_signal_connect (G_OBJECT (stbw_button), "clicked", G_CALLBACK (step_button_clicked_cb), (gpointer) FALSE);
+- g_signal_connect (G_OBJECT (stbw_button), "released", G_CALLBACK (step_button_released_cb), NULL);
+- g_signal_connect (G_OBJECT (stfw_button), "pressed", G_CALLBACK (step_button_pressed_cb), (gpointer) TRUE);
+- g_signal_connect (G_OBJECT (stfw_button), "clicked", G_CALLBACK (step_button_clicked_cb), (gpointer) TRUE);
+- g_signal_connect (G_OBJECT (stfw_button), "released", G_CALLBACK (step_button_released_cb), NULL);
+- g_signal_connect (G_OBJECT (scfw_button), "clicked", G_CALLBACK (scfw_button_clicked_cb), NULL);
+- volume_value_changed_id = g_signal_connect (G_OBJECT (volume_button), "value-changed", G_CALLBACK (volume_value_changed_cb), NULL);
+- g_signal_connect (G_OBJECT (rec_button), "clicked", G_CALLBACK (rec_button_clicked_cb), (gpointer) app);
+- g_signal_connect (G_OBJECT (prefs_button), "clicked", G_CALLBACK (prefs_button_clicked_cb), (gpointer) app);
+- g_signal_connect (G_OBJECT (about_button), "clicked", G_CALLBACK (about_button_clicked_cb), NULL);
+-/* g_signal_connect (G_OBJECT (quit_button), "clicked", G_CALLBACK (quit_button_clicked_cb), NULL); */
++ g_signal_connect (app, "delete_event", G_CALLBACK (delete_event_cb), NULL);
++ g_signal_connect (drawing_area, "draw", G_CALLBACK (draw_cb), NULL);
++ g_signal_connect (preset_combo, "changed", G_CALLBACK (preset_combo_change_cb), NULL);
++ g_signal_connect (adj, "value-changed", G_CALLBACK (adj_value_changed_cb), (gpointer) app);
++ g_signal_connect (scbw_button, "clicked", G_CALLBACK (scbw_button_clicked_cb), NULL);
++ g_signal_connect (stbw_button, "pressed", G_CALLBACK (step_button_pressed_cb), (gpointer) FALSE);
++ g_signal_connect (stbw_button, "clicked", G_CALLBACK (step_button_clicked_cb), (gpointer) FALSE);
++ g_signal_connect (stbw_button, "released", G_CALLBACK (step_button_released_cb), NULL);
++ g_signal_connect (stfw_button, "pressed", G_CALLBACK (step_button_pressed_cb), (gpointer) TRUE);
++ g_signal_connect (stfw_button, "clicked", G_CALLBACK (step_button_clicked_cb), (gpointer) TRUE);
++ g_signal_connect (stfw_button, "released", G_CALLBACK (step_button_released_cb), NULL);
++ g_signal_connect (scfw_button, "clicked", G_CALLBACK (scfw_button_clicked_cb), NULL);
++ volume_value_changed_id = g_signal_connect (volume_button, "value-changed", G_CALLBACK (volume_value_changed_cb), NULL);
++ g_signal_connect (rec_button, "clicked", G_CALLBACK (rec_button_clicked_cb), (gpointer) app);
++ g_signal_connect (prefs_button, "clicked", G_CALLBACK (prefs_button_clicked_cb), (gpointer) app);
++ g_signal_connect (about_button, "clicked", G_CALLBACK (about_button_clicked_cb), NULL);
++/* g_signal_connect (quit_button, "clicked", G_CALLBACK (quit_button_clicked_cb), NULL); */
+
+ gtk_widget_set_tooltip_text (scbw_button, _("Scan Backwards"));
+ gtk_widget_set_tooltip_text (stbw_button, _("0.05 MHz Backwards"));
+@@ -1430,7 +1430,7 @@ startup_cb (GApplication *application, g
+
+ connect_to_session ();
+
+- g_signal_connect (G_OBJECT (app), "key-press-event", G_CALLBACK (key_press_event_cb), NULL);
++ g_signal_connect (app, "key-press-event", G_CALLBACK (key_press_event_cb), NULL);
+
+ g_timeout_add_seconds (3, (GSourceFunc)redraw_status_window, NULL);
+ }
+@@ -1530,7 +1530,7 @@ static void connect_to_session (void)
+ return;
+ }
+
+- g_signal_connect (G_OBJECT (proxy), "g-signal", G_CALLBACK (session_die_cb), NULL);
++ g_signal_connect (proxy, "g-signal", G_CALLBACK (session_die_cb), NULL);
+ }
+
+ static void show_message(GtkMessageType type, const char* text, const char* details)
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -239,7 +239,7 @@ device_entry_auto_activate_cb(GtkEntry*
+
+ autodetect = 0;
+ if (0 == strcmp(text, "auto")) {
+- g_signal_emit_by_name(G_OBJECT (editable), "activate");
++ g_signal_emit_by_name (editable, "activate");
+ autodetect = 1;
+
+ gtk_widget_grab_focus(add_button);
+@@ -272,7 +272,7 @@ static gboolean mixer_entry_activate_cb(
+ gchar *bitrate;
+
+ g_assert(combo);
+- bitrates = g_object_get_data(G_OBJECT(combo), "bitrates");
++ bitrates = g_object_get_data (combo, "bitrates");
+ active = gtk_combo_box_get_active(combo);
+ g_assert(active > -1);
+
+@@ -292,7 +292,7 @@ static gboolean mixer_entry_activate_cb(
+ gchar *encoder;
+
+ g_assert(combo);
+- encoders = g_object_get_data(G_OBJECT(combo), "encoders");
++ encoders = g_object_get_data (combo, "encoders");
+ active = gtk_combo_box_get_active(combo);
+ g_assert(active > -1);
+
+@@ -1301,13 +1301,13 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mute_on_exit), settings.mute_on_exit);
+ gtk_grid_attach(GTK_GRID(grid), mute_on_exit, 0, 4, 2, 1);
+
+- g_signal_connect(G_OBJECT(device_entry), "hide", G_CALLBACK(device_entry_activate_cb), app);
+- g_signal_connect(G_OBJECT(device_entry), "activate", G_CALLBACK(device_entry_activate_cb), NULL);
+- g_signal_connect(G_OBJECT(device_entry), "changed", G_CALLBACK(device_entry_auto_activate_cb), NULL);
+- g_signal_connect(G_OBJECT(mixer_entry), "hide", G_CALLBACK(mixer_entry_activate_cb), app);
+- g_signal_connect(G_OBJECT(mixer_entry), "activate", G_CALLBACK(mixer_entry_activate_cb), NULL);
+- g_signal_connect(G_OBJECT(audio_switch), "notify::active", G_CALLBACK(audio_switch_activate_cb), NULL);
+- g_signal_connect(G_OBJECT(mute_on_exit), "toggled", G_CALLBACK(mute_on_exit_toggled_cb), NULL);
++ g_signal_connect (device_entry, "hide", G_CALLBACK (device_entry_activate_cb), app);
++ g_signal_connect (device_entry, "activate", G_CALLBACK (device_entry_activate_cb), NULL);
++ g_signal_connect (device_entry, "changed", G_CALLBACK (device_entry_auto_activate_cb), NULL);
++ g_signal_connect (mixer_entry, "hide", G_CALLBACK (mixer_entry_activate_cb), app);
++ g_signal_connect (mixer_entry, "activate", G_CALLBACK (mixer_entry_activate_cb), NULL);
++ g_signal_connect (audio_switch, "notify::active", G_CALLBACK (audio_switch_activate_cb), NULL);
++ g_signal_connect (mute_on_exit, "toggled", G_CALLBACK (mute_on_exit_toggled_cb), NULL);
+
+ gtk_widget_set_tooltip_text(device_entry, _("The radio device to use (e.g. /dev/radio0)"));
+ gtk_widget_set_tooltip_text(mixer_entry, _("The mixer device and channel to use (e.g. hw:0/Line)"));
+@@ -1336,35 +1336,35 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+ gtk_container_add(GTK_CONTAINER(scrolled_window), tree_view);
+
+- g_signal_connect(G_OBJECT(tree_view), "button-release-event", G_CALLBACK(button_release_cb), NULL);
+- g_signal_connect(G_OBJECT(tree_view), "key-press-event", G_CALLBACK(tree_view_key_press_event_cb), NULL);
+- g_signal_connect(G_OBJECT(tree_view), "cursor-changed", G_CALLBACK(tree_view_cursor_changed_cb), NULL);
++ g_signal_connect (tree_view, "button-release-event", G_CALLBACK (button_release_cb), NULL);
++ g_signal_connect (tree_view, "key-press-event", G_CALLBACK (tree_view_key_press_event_cb), NULL);
++ g_signal_connect (tree_view, "cursor-changed", G_CALLBACK (tree_view_cursor_changed_cb), NULL);
+
+- g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(tree_view_selection_changed_cb), tree_view);
++ g_signal_connect (selection, "changed", G_CALLBACK (tree_view_selection_changed_cb), tree_view);
+
+ /*gtk_tree_selection_select_path(selection, gtk_tree_path_new_from_string("0"));
+ gtk_tree_selection_set_select_function(selection, (GtkTreeSelectionFunc)tree_view_select_cb, NULL, NULL);*/
+
+ cellrenderer = gtk_cell_renderer_text_new();
+- g_object_set(G_OBJECT(cellrenderer), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
+- g_object_set(G_OBJECT(GTK_CELL_RENDERER_TEXT(cellrenderer)), "editable", TRUE, NULL);
++ g_object_set (cellrenderer, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
++ g_object_set (cellrenderer, "editable", TRUE, NULL);
+ list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 0, NULL);
+ gtk_tree_view_column_set_reorderable(list_column, TRUE);
+ gtk_tree_view_column_set_expand(list_column, TRUE);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), list_column);
+
+- g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(name_cell_edited_cb), NULL);
++ g_signal_connect (cellrenderer, "edited", G_CALLBACK (name_cell_edited_cb), NULL);
+
+ cellrenderer = gtk_cell_renderer_text_new();
+- g_object_set(G_OBJECT(cellrenderer), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
+- g_object_set(G_OBJECT(cellrenderer), "xalign", 1.0, NULL);
+- g_object_set(G_OBJECT(GTK_CELL_RENDERER_TEXT(cellrenderer)), "editable", TRUE, NULL);
++ g_object_set (cellrenderer, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
++ g_object_set (cellrenderer, "xalign", 1.0, NULL);
++ g_object_set (cellrenderer, "editable", TRUE, NULL);
+ list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 1, NULL);
+ gtk_tree_view_column_set_reorderable(list_column, TRUE);
+ gtk_tree_view_column_set_expand(list_column, FALSE);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), list_column);
+
+- g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(freq_cell_edited_cb), NULL);
++ g_signal_connect (cellrenderer, "edited", G_CALLBACK (freq_cell_edited_cb), NULL);
+
+ for (l = settings.presets; l != NULL; l = l->next) {
+ GtkTreeIter iter = {0};
+@@ -1387,7 +1387,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_widget_set_sensitive(move_up_button, FALSE);
+ gtk_widget_set_tooltip_text(move_up_button, _("Move preset up"));
+
+- g_signal_connect(G_OBJECT(move_up_button), "clicked", G_CALLBACK(move_up_button_clicked_cb), NULL);
++ g_signal_connect (move_up_button, "clicked", G_CALLBACK (move_up_button_clicked_cb), NULL);
+
+ move_down_button = gtk_button_new();
+ image = gtk_image_new_from_icon_name ("go-down", GTK_ICON_SIZE_MENU);
+@@ -1396,7 +1396,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_widget_set_sensitive(move_down_button, FALSE);
+ gtk_widget_set_tooltip_text(move_down_button, _("Move preset down"));
+
+- g_signal_connect(G_OBJECT(move_down_button), "clicked", G_CALLBACK(move_down_button_clicked_cb), NULL);
++ g_signal_connect (move_down_button, "clicked", G_CALLBACK (move_down_button_clicked_cb), NULL);
+
+ add_button = gtk_button_new();
+ image = gtk_image_new_from_icon_name ("list-add", GTK_ICON_SIZE_MENU);
+@@ -1404,7 +1404,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_button_set_relief (GTK_BUTTON (add_button), GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(add_button, _("Add preset"));
+
+- g_signal_connect(G_OBJECT(add_button), "clicked", G_CALLBACK(add_button_clicked_cb), NULL);
++ g_signal_connect (add_button, "clicked", G_CALLBACK (add_button_clicked_cb), NULL);
+
+ remove_button = gtk_button_new();
+ image = gtk_image_new_from_icon_name ("list-remove", GTK_ICON_SIZE_MENU);
+@@ -1413,7 +1413,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_widget_set_tooltip_text(remove_button, _("Remove preset"));
+ gtk_widget_set_sensitive(remove_button, FALSE);
+
+- g_signal_connect(G_OBJECT(remove_button), "clicked", G_CALLBACK(remove_button_clicked_cb), NULL);
++ g_signal_connect (remove_button, "clicked", G_CALLBACK (remove_button_clicked_cb), NULL);
+
+ save_button = gtk_button_new();
+ image = gtk_image_new_from_icon_name ("document-save", GTK_ICON_SIZE_MENU);
+@@ -1426,7 +1426,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ else
+ gtk_widget_set_sensitive (save_button, TRUE);
+
+- g_signal_connect(G_OBJECT(save_button), "clicked", G_CALLBACK(save_to_file_cb), NULL);
++ g_signal_connect (save_button, "clicked", G_CALLBACK (save_to_file_cb), NULL);
+
+ open_button = gtk_button_new();
+ image = gtk_image_new_from_icon_name ("document-open", GTK_ICON_SIZE_MENU);
+@@ -1435,7 +1435,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_widget_set_tooltip_text(open_button, _("Load from file\xE2\x80\xA6"));
+ gtk_widget_set_sensitive(open_button, TRUE);
+
+- g_signal_connect(G_OBJECT(open_button), "clicked", G_CALLBACK(load_from_file_cb), NULL);
++ g_signal_connect (open_button, "clicked", G_CALLBACK (load_from_file_cb), NULL);
+
+ gtk_box_pack_end(GTK_BOX(button_box), move_down_button, FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(button_box), move_up_button, FALSE, FALSE, 0);
+@@ -1485,9 +1485,9 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_widget_set_visible (install_button, FALSE);
+ }
+
+- g_signal_connect(GTK_FILE_CHOOSER(destination_button), "selection-changed", G_CALLBACK(destination_button_clicked_cb), NULL);
+- g_signal_connect(G_OBJECT(audio_profile_combo), "changed", G_CALLBACK(audio_profile_combo_change_cb), NULL);
+- g_signal_connect(G_OBJECT(install_button), "clicked", G_CALLBACK(audio_profile_install_plugins_cb), NULL);
++ g_signal_connect (destination_button, "selection-changed", G_CALLBACK (destination_button_clicked_cb), NULL);
++ g_signal_connect (audio_profile_combo, "changed", G_CALLBACK (audio_profile_combo_change_cb), NULL);
++ g_signal_connect (install_button, "clicked", G_CALLBACK (audio_profile_install_plugins_cb), NULL);
+
+ gtk_widget_set_tooltip_text(destination_button, _("The default location to use for the recorded files"));
+ gtk_widget_set_tooltip_text(audio_profile_combo, _("The media type for encoding audio when recording"));
+Index: gnomeradio-1.8/src/rec_tech.c
+===================================================================
+--- gnomeradio-1.8.orig/src/rec_tech.c
++++ gnomeradio-1.8/src/rec_tech.c
+@@ -164,7 +164,7 @@ recording_start(const char* filename)
+
+ level = gst_element_factory_make ("level", NULL);
+ g_return_val_if_fail (level != NULL, NULL);
+- g_object_set(G_OBJECT(level), "message", TRUE, NULL);
++ g_object_set (level, "message", TRUE, NULL);
+
+ filesink = gst_element_factory_make ("filesink", NULL);
+ g_return_val_if_fail (filesink != NULL, NULL);
+@@ -173,10 +173,10 @@ recording_start(const char* filename)
+ encodebin = gst_element_factory_make ("encodebin", NULL);
+ g_return_val_if_fail (encodebin != NULL, NULL);
+
+- g_object_set (G_OBJECT (encodebin),
+- "profile", profile,
+- "queue-time-max", 120 * GST_SECOND,
+- NULL);
++ g_object_set (encodebin,
++ "profile", profile,
++ "queue-time-max", 120 * GST_SECOND,
++ NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), source, level, encodebin, filesink, NULL);
+
+@@ -188,7 +188,7 @@ recording_start(const char* filename)
+ extension = rb_gst_media_type_to_extension(rec_settings.profile);
+ path = g_strdup_printf("%s.%s", filename, extension);
+
+- g_object_set (G_OBJECT(filesink), "location", path, NULL);
++ g_object_set (filesink, "location", path, NULL);
+
+ file = g_file_new_for_path (path);
+ g_free (path);
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -308,9 +308,9 @@ GtkWidget* record_status_window(Recordin
+ gtk_container_add(GTK_CONTAINER(status_dialog), vbox);
+ gtk_widget_grab_focus (button);
+
+- g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(stop_rec_button_clicked_cb), recording);
+- g_signal_connect(G_OBJECT(status_dialog), "delete_event", G_CALLBACK(delete_event_cb), recording);
+- g_signal_connect(G_OBJECT(status_dialog), "key-press-event", G_CALLBACK(key_press_event_cb), recording);
++ g_signal_connect (button, "clicked", G_CALLBACK (stop_rec_button_clicked_cb), recording);
++ g_signal_connect (status_dialog, "delete_event", G_CALLBACK (delete_event_cb), recording);
++ g_signal_connect (status_dialog, "key-press-event", G_CALLBACK (key_press_event_cb), recording);
+
+ gtk_window_set_position(GTK_WINDOW(status_dialog), GTK_WIN_POS_CENTER);
+
+Index: gnomeradio-1.8/src/trayicon.c
+===================================================================
+--- gnomeradio-1.8.orig/src/trayicon.c
++++ gnomeradio-1.8/src/trayicon.c
+@@ -73,9 +73,9 @@ void tray_menu_items_set_sensible(gboole
+ void tray_menu_enable_mute_button (gboolean enable)
+ {
+ if (tray_menu) {
+- g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), enable);
+- g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ g_signal_handler_block (mute_menuitem, mute_menuitem_toggled_cb_id);
++ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mute_menuitem), enable);
++ g_signal_handler_unblock (mute_menuitem, mute_menuitem_toggled_cb_id);
+ }
+ }
+
+@@ -86,7 +86,7 @@ void tray_menu_add_preset (preset* ps, g
+ menuitem = gtk_menu_item_new_with_label(ps->title);
+
+ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, index);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index));
++ g_signal_connect (menuitem, "activate", G_CALLBACK (preset_menuitem_activate_cb), GINT_TO_POINTER (index));
+ gtk_widget_show(menuitem);
+ }
+
+@@ -111,11 +111,11 @@ void tray_menu_move_up_preset (preset* p
+ menuitem = g_list_nth_data(menuitems, index);
+
+ gtk_menu_reorder_child (GTK_MENU(tray_menu), menuitem, GPOINTER_TO_INT (index + 1));
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index + 1));
++ g_signal_connect (menuitem, "activate", G_CALLBACK (preset_menuitem_activate_cb), GINT_TO_POINTER (index + 1));
+
+ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+ menuitem = g_list_nth_data(menuitems, index);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index));
++ g_signal_connect (menuitem, "activate", G_CALLBACK (preset_menuitem_activate_cb), GINT_TO_POINTER (index));
+ }
+
+ void tray_menu_move_down_preset (preset* ps, gint index)
+@@ -128,11 +128,11 @@ void tray_menu_move_down_preset (preset*
+ menuitem = g_list_nth_data(menuitems, index);
+
+ gtk_menu_reorder_child (GTK_MENU(tray_menu), menuitem, GPOINTER_TO_INT (index - 1));
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index - 1));
++ g_signal_connect (menuitem, "activate", G_CALLBACK (preset_menuitem_activate_cb), GINT_TO_POINTER (index - 1));
+
+ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+ menuitem = g_list_nth_data(menuitems, index);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index));
++ g_signal_connect (menuitem, "activate", G_CALLBACK (preset_menuitem_activate_cb), GINT_TO_POINTER (index));
+ }
+
+ void tray_menu_update_preset (preset* ps, gint index)
+@@ -179,7 +179,7 @@ void create_tray_menu(GtkWidget *app) {
+ menuitem = gtk_menu_item_new_with_label(ps->title);
+
+ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, i);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (i));
++ g_signal_connect (menuitem, "activate", G_CALLBACK (preset_menuitem_activate_cb), GINT_TO_POINTER (i));
+ gtk_widget_show(menuitem);
+ }
+
+@@ -188,12 +188,12 @@ void create_tray_menu(GtkWidget *app) {
+ mute_menuitem = gtk_check_menu_item_new_with_label(_("Muted"));
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->get_volume() == 0);
+ gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), mute_menuitem);
+- mute_menuitem_toggled_cb_id = g_signal_connect(G_OBJECT(mute_menuitem), "toggled", (GCallback)mute_menuitem_toggled_cb, (gpointer)app);
++ mute_menuitem_toggled_cb_id = g_signal_connect (mute_menuitem, "toggled", G_CALLBACK (mute_menuitem_toggled_cb), (gpointer) app);
+ gtk_widget_show(mute_menuitem);
+
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Record"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (tray_menu), menuitem);
+- g_signal_connect (G_OBJECT (menuitem), "activate", (GCallback)record_menuitem_activate_cb, app);
++ g_signal_connect (menuitem, "activate", G_CALLBACK (record_menuitem_activate_cb), app);
+ gtk_widget_show (menuitem);
+
+ gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), gtk_separator_menu_item_new());
+@@ -202,12 +202,12 @@ void create_tray_menu(GtkWidget *app) {
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(showwindow_menuitem), TRUE);
+ /*gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(showwindow_menuitem), GTK_WIDGET_VISIBLE(app));*/
+ gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), showwindow_menuitem);
+- g_signal_connect(G_OBJECT(showwindow_menuitem), "activate", (GCallback)showwindow_menuitem_toggled_cb, (gpointer)app);
++ g_signal_connect (showwindow_menuitem, "activate", G_CALLBACK (showwindow_menuitem_toggled_cb), (gpointer) app);
+ gtk_widget_show(showwindow_menuitem);
+
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Quit"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (tray_menu), menuitem);
+- g_signal_connect (G_OBJECT (menuitem), "activate", (GCallback)quit_menuitem_activate_cb, NULL);
++ g_signal_connect (menuitem, "activate", G_CALLBACK (quit_menuitem_activate_cb), NULL);
+ gtk_widget_show (menuitem);
+
+ gtk_widget_show_all(tray_menu);
+@@ -233,9 +233,9 @@ void create_tray_icon(GtkWidget *app)
+ icontheme = gtk_icon_theme_get_default();
+ pixbuf = gtk_icon_theme_load_icon(icontheme, "gnomeradio", 22, 0, NULL);
+ g_return_if_fail(pixbuf);
+- tray_icon = G_OBJECT(gtk_status_icon_new_from_pixbuf(pixbuf));
+- g_object_unref(pixbuf);
++ tray_icon = G_OBJECT (gtk_status_icon_new_from_pixbuf (pixbuf));
++ g_object_unref (pixbuf);
+
+- g_signal_connect (G_OBJECT(tray_icon), "activate", G_CALLBACK (tray_activate_cb), (gpointer)app);
+- g_signal_connect (G_OBJECT(tray_icon), "popup-menu", G_CALLBACK (tray_popup_menu), (gpointer)app);
++ g_signal_connect (tray_icon, "activate", G_CALLBACK (tray_activate_cb), (gpointer) app);
++ g_signal_connect (tray_icon, "popup-menu", G_CALLBACK (tray_popup_menu), (gpointer) app);
+ }
diff -pruN 1.8-2/debian/patches/gnomeradio-gsettings.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gsettings.patch
--- 1.8-2/debian/patches/gnomeradio-gsettings.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gsettings.patch 2015-04-13 18:43:38.000000000 +0000
@@ -0,0 +1,1272 @@
+Description: Port gnomeradio to GSettings.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1256796
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/configure.ac
+===================================================================
+--- gnomeradio-1.8.orig/configure.ac
++++ gnomeradio-1.8/configure.ac
+@@ -24,6 +24,7 @@ AC_PROG_CPP
+ AC_PROG_INSTALL
+ AC_PROG_LN_S
+ AC_PROG_MAKE_SET
++AM_PATH_GLIB_2_0
+
+ LT_PREREQ([2.2])
+ LT_INIT
+@@ -43,7 +44,7 @@ PKG_CHECK_MODULES(ALSA, alsa >= 1.0.25)
+ AC_SUBST(ALSA_CFLAGS)
+ AC_SUBST(ALSA_LIBS)
+
+-PKG_CHECK_MODULES(GNOME, dbus-glib-1 gconf-2.0 >= 2.12 gtk+-3.0)
++PKG_CHECK_MODULES(GNOME, dbus-glib-1 gtk+-3.0 libxml-2.0 glib-2.0 gio-2.0)
+ AC_SUBST(GNOME_CFLAGS)
+ AC_SUBST(GNOME_LIBS)
+
+@@ -55,13 +56,11 @@ PKG_CHECK_MODULES(XML, libxml-2.0 >= 2.4
+ AC_SUBST(XML_CFLAGS)
+ AC_SUBST(XML_LIBS)
+
+-AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
++AC_PATH_PROG(GLIB_COMPILE_SCHEMAS, glib-compile-schemas)
++GLIB_GSETTINGS
+
+-if test x"$GCONFTOOL" = xno; then
+- AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
+-fi
+-
+-AM_GCONF_SOURCE_2
++GLIB_COMPILE_RESOURCES=`$PKG_CONFIG gio-2.0 --variable=glib_compile_resources`
++AC_SUBST(GLIB_COMPILE_RESOURCES)
+
+ AC_SUBST(LIRC)
+ LIRC=""
+@@ -72,10 +71,6 @@ else
+ echo "*** lirc disabled"
+ fi
+
+-AC_ARG_ENABLE(install_schemas,
+- [ --disable-install-schemas Disable installation of the gconf schemas])
+-AM_CONDITIONAL(INSTALL_SCHEMAS, test x$enable_install_schemas != xno)
+-
+ AC_CONFIG_FILES([gnomeradio.spec
+ Makefile
+ data/Makefile
+Index: gnomeradio-1.8/data/org.gnome.gnomeradio.gschema.xml
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/data/org.gnome.gnomeradio.gschema.xml
+@@ -0,0 +1,69 @@
++
++
++
++ false
++ The first time gnomeradio was run
++ Set to true when the user ran the first time gnomeradio
++
++
++ 100.00
++ Last frequency
++ The last frequency (in MHz) in use
++
++
++ 'auto'
++ Radio device
++ The default radio device to use (e.g. /dev/radio0)
++
++
++ 'any'
++ Device driver
++ The default device driver to use (any, v4l1 or v4l2)
++
++
++ 'default/Master'
++ Mixer source
++ The default mixer device and channel to use (e.g. hw:0/Line)
++
++
++ false
++ Muted
++ The muted state in last exited
++
++
++ -1
++ Unmute volume
++ The volume before muting gnomeradio session
++
++
++ true
++ Mute on exit
++ Mute radio device on exit
++
++
++ true
++ The audio loopback mode
++ When set to true will start an audio streaming between the wireless device and the audio output device
++
++
++ 0
++ Number of presets
++ The number of presets
++
++
++ -1
++ Last presets
++ The preset that was enabled when gnomeradio was terminated. Range is 0 ... (presets - 1). None is -1
++
++
++ ''
++ The default location to use for the recorded files
++ The path to the location where gnomeradio should store recorded files. If that value is empty, the HOME folder will be used
++
++
++ 'audio/x-vorbis'
++ The media type for encoding audio when recording
++ The media type for encoding audio when recording (e.g. audio/x-vorbis for Ogg Vorbis, or audio/mpeg for MP3). This is not a MIME type.
++
++
++
+Index: gnomeradio-1.8/data/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/data/Makefile.am
++++ gnomeradio-1.8/data/Makefile.am
+@@ -3,28 +3,27 @@ SUBDIRS = icons pixmaps
+ applicationsdir = $(datadir)/applications/
+ applications_in_files = gnomeradio.desktop.in
+ applications_DATA = $(applications_in_files:.desktop.in=.desktop)
++
+ @INTLTOOL_DESKTOP_RULE@
+
++all-local: $(applications_DATA)
++
+ profilesdir = $(datadir)/gnomeradio
+ profiles_DATA = gnomeradio.gep
+
+-schemadir = @GCONF_SCHEMA_FILE_DIR@
+-schema_in_files = gnomeradio.schemas.in
+-schema_DATA = $(schema_in_files:.schemas.in=.schemas)
+-@INTLTOOL_SCHEMAS_RULE@
++@INTLTOOL_XML_NOMERGE_RULE@
+
+-all-local: $(applications_DATA)
++gsettings_SCHEMAS = org.gnome.gnomeradio.gschema.xml
++
++@GSETTINGS_RULES@
++
++EXTRA_DIST = \
++ $(applications_DATA) \
++ $(applications_in_files) \
++ $(profiles_DATA) \
++ $(gsettings_SCHEMAS) \
++ example.lircrc
++
++CLEANFILES = $(applications_DATA)
+
+-install-data-local:
+-if INSTALL_SCHEMAS
+- GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA)
+-endif
+-
+-EXTRA_DIST = $(applications_DATA) \
+- $(applications_in_files) \
+- $(schema_DATA) \
+- $(schema_in_files) \
+- $(profiles_DATA) \
+- example.lircrc
+
+-CLEANFILES = $(schema_DATA) $(applications_DATA)
+Index: gnomeradio-1.8/po/POTFILES.in
+===================================================================
+--- gnomeradio-1.8.orig/po/POTFILES.in
++++ gnomeradio-1.8/po/POTFILES.in
+@@ -1,4 +1,3 @@
+-data/gnomeradio.schemas.in
+ data/gnomeradio.desktop.in
+ src/prefs.c
+ src/gui.c
+Index: gnomeradio-1.8/src/resources/gnomeradio.dtd
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/resources/gnomeradio.dtd
+@@ -0,0 +1,12 @@
++
++
++
++
++
++
++
++
++
+Index: gnomeradio-1.8/src/gnomeradio-dtd.gresource.xml
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/gnomeradio-dtd.gresource.xml
+@@ -0,0 +1,8 @@
++
++
++
++ gnomeradio.dtd
++
++
++
++
+Index: gnomeradio-1.8/src/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/src/Makefile.am
++++ gnomeradio-1.8/src/Makefile.am
+@@ -10,6 +10,10 @@ AM_CPPFLAGS = \
+
+ bin_PROGRAMS = gnomeradio
+
++GNOMERADIO_RESOURCES = \
++ gnomeradio-dtd-resources.c \
++ gnomeradio-dtd-resources.h
++
+ gnomeradio_SOURCES = \
+ alsa_stream.h \
+ get_media_devices.h \
+@@ -42,6 +46,25 @@ gnomeradio_SOURCES = \
+ trayicon.c \
+ utils.c \
+ v4l1.c \
+- v4l2.c
++ v4l2.c \
++ $(GNOMERADIO_RESOURCES)
++
++RESOURCE_FILES = \
++ resources/gnomeradio.dtd
++
++EXTRA_DIST = \
++ gnomeradio-dtd.gresource.xml \
++ $(RESOURCE_FILES)
++
++gnomeradio-dtd-resources.c: gnomeradio-dtd.gresource.xml $(RESOURCE_FILES)
++ $(AM_V_GEN)glib-compile-resources --target=$@ --sourcedir=$(srcdir)/resources --generate-source --c-name gnomeradio $(srcdir)/gnomeradio-dtd.gresource.xml
++
++gnomeradio-dtd-resources.h: gnomeradio-dtd.gresource.xml $(RESOURCE_FILES)
++ $(AM_V_GEN)glib-compile-resources --target=$@ --sourcedir=$(srcdir)/resources --generate-header --c-name gnomeradio $(srcdir)/gnomeradio-dtd.gresource.xml
++
++BUILT_SOURCES = \
++ $(GNOMERADIO_RESOURCES)
+
+ gnomeradio_LDADD = $(ALSA_LIBS) $(GNOME_LIBS) $(GSTREAMER_LIBS) $(XML_LIBS) $(LIRC) -lpthread
++
++CLEANFILES = $(BUILT_SOURCES)
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -23,7 +23,6 @@
+ #include
+ #include
+ #include
+-#include
+ #include
+ #include
+ #include
+@@ -101,31 +100,27 @@ static DBusGProxy * connect_to_sess
+
+ static gboolean is_first_start(void)
+ {
+- GConfClient *client;
++ GSettings *gsettings;
+ gboolean first_start;
+
+- client = gconf_client_get_default();
+- if (!client)
+- return TRUE;
++ gsettings = g_settings_new ("org.gnome.gnomeradio");
+
+- first_start = gconf_client_get_bool(client, "/apps/gnomeradio/first_time_flag", NULL);
++ first_start = g_settings_get_boolean(gsettings, "first-time-flag");
+
+- g_object_unref (client);
++ g_clear_object (&gsettings);
+
+ return !first_start;
+ }
+
+ static void set_first_time_flag(void)
+ {
+- GConfClient *client;
++ GSettings *gsettings;
+
+- client = gconf_client_get_default();
+- if (!client)
+- return;
++ gsettings = g_settings_new ("org.gnome.gnomeradio");
+
+- gconf_client_set_bool(client, "/apps/gnomeradio/first_time_flag", TRUE, NULL);
++ g_settings_set_boolean(gsettings, "first-time-flag", TRUE);
+
+- g_object_unref (client);
++ g_clear_object (&gsettings);
+ }
+
+ typedef struct {
+@@ -1228,18 +1223,12 @@ session_die_cb(void)
+ static void
+ save_session_cb(gint phase, GnomeSaveStyle save_style,
+ gint is_shutdown, GnomeInteractStyle interact_style,
+- gint is_fast, gpointer client_data)
++ gint is_fast, gpointer gsettings_data)
+ {
+ save_settings();
+ }
+ */
+
+-static void
+-gconf_error_handler(GConfClient *client, GError *error)
+-{
+- g_print("GConf error: %s\n", error->message);
+-}
+-
+ gboolean
+ key_press_event_cb(GtkWidget *app, GdkEventKey *event, gpointer data)
+ {
+@@ -1435,19 +1424,6 @@ int main(int argc, char* argv[])
+
+ rb_missing_plugins_init (GTK_WINDOW (app));
+
+- /* Initizialize Gconf */
+- if (!gconf_init(argc, argv, &err)) {
+- char *details;
+- details = g_strdup_printf(_("%s\n\nChanges to the settings won't be saved."), err->message);
+- show_warning_message(_("Failed to init GConf!"), details);
+- g_error_free(err);
+- g_free(details);
+- err = NULL;
+- } else {
+- gconf_client_set_global_default_error_handler((GConfClientErrorHandlerFunc)gconf_error_handler);
+- gconf_client_set_error_handling(gconf_client_get_default(), GCONF_CLIENT_HANDLE_ALL);
+- }
+-
+ load_settings();
+
+ start_radio(FALSE, app);
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -14,14 +14,15 @@
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+-#include
+ #include
++#include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
++#include
+ #include "config.h"
+ #include "prefs.h"
+ #include "trayicon.h"
+@@ -30,6 +31,9 @@
+ #include "rb_gst_media_types.h"
+ #include "rb_missing_plugins.h"
+
++#define GNOMERADIO_XML_FILENAME "gnomeradio.xml"
++#define GNOMERADIO_DTD_RESOURCENAME "/org/gnome/gnomeradio/gnomeradio.dtd"
++
+ extern int autodetect;
+ extern int can_capture;
+ extern int alsa_loopback;
+@@ -58,162 +62,124 @@ static GtkWidget *remove_button;
+ static GtkWidget *audio_profile_combo;
+ static GtkWidget *install_button;
+
+-gboolean save_settings(void)
++static gboolean save_to_file;
++static gboolean load_from_file;
++
++static void presets_save (void);
++static void presets_load (void);
++
++void save_settings (void)
+ {
+- gint i, count;
+- gchar *buffer;
+- preset *ps;
+- GConfClient* client = NULL;
++ GSettings *gsettings;
++ gint count;
+
+- if (!gconf_is_initialized())
+- return FALSE;
+-
+- client = gconf_client_get_default();
+- if (!client)
+- return FALSE;
++ gsettings = g_settings_new ("org.gnome.gnomeradio");
++ g_settings_delay (gsettings);
+
+ /* Store general settings */
+ if (autodetect)
+- gconf_client_set_string(client, "/apps/gnomeradio/device", "auto", NULL);
++ g_settings_set_string (gsettings, "device", "auto");
+ else
+- gconf_client_set_string(client, "/apps/gnomeradio/device", settings.device, NULL);
+- gconf_client_set_string(client, "/apps/gnomeradio/driver", settings.driver, NULL);
+- gconf_client_set_string(client, "/apps/gnomeradio/mixer", settings.mixer, NULL);
+- gconf_client_set_bool(client, "/apps/gnomeradio/muted", settings.muted, NULL);
+- gconf_client_set_float(client, "/apps/gnomeradio/unmute-volume", settings.unmute_volume, NULL);
+- gconf_client_set_bool(client, "/apps/gnomeradio/mute-on-exit", settings.mute_on_exit, NULL);
+- gconf_client_set_bool(client, "/apps/gnomeradio/audio-loopback", settings.audio_loopback , NULL);
+- /*gconf_client_set_float(client, "/apps/gnomeradio/volume", volume->value, NULL);*/
+- gconf_client_set_float(client, "/apps/gnomeradio/last-freq", gtk_adjustment_get_value(adj)/STEPS, NULL);
++ g_settings_set_string (gsettings, "device", settings.device);
++ g_settings_set_string (gsettings, "driver", settings.driver);
++ g_settings_set_string (gsettings, "mixer", settings.mixer);
++ g_settings_set_boolean (gsettings, "muted", settings.muted);
++ g_settings_set_double (gsettings, "unmute-volume", settings.unmute_volume);
++ g_settings_set_boolean (gsettings, "mute-on-exit", settings.mute_on_exit);
++ g_settings_set_boolean (gsettings, "audio-loopback", settings.audio_loopback);
++ /*g_settings_set_double (gsettings, "volume", volume->value);*/
++ g_settings_set_double (gsettings, "last-freq", gtk_adjustment_get_value(adj)/STEPS);
+
+ /* Store recording settings */
+-/* gconf_client_set_string(client, "/apps/gnomeradio/recording/audiodevice", rec_settings.audiodevice, NULL);
+- gconf_client_set_bool(client, "/apps/gnomeradio/recording/record-as-mp3", rec_settings.mp3, NULL);
+- gconf_client_set_string(client, "/apps/gnomeradio/recording/sample-rate", rec_settings.rate, NULL);
+- gconf_client_set_string(client, "/apps/gnomeradio/recording/sample-format", rec_settings.sample, NULL);
+- gconf_client_set_bool(client, "/apps/gnomeradio/recording/record-in-stereo", rec_settings.stereo, NULL);
+- gconf_client_set_string(client, "/apps/gnomeradio/recording/encoder", rec_settings.encoder, NULL);
+- gconf_client_set_string(client, "/apps/gnomeradio/recording/bitrate", rec_settings.bitrate, NULL);
++/* g_settings_set_string (gsettings, "audiodevice", rec_settings.audiodevice);
++ g_settings_set_boolean (gsettings, "record-as-mp3", rec_settings.mp3);
++ g_settings_set_string (gsettings, "sample-rate", rec_settings.rate);
++ g_settings_set_string (gsettings, "sample-format", rec_settings.sample);
++ g_settings_set_boolean (gsettings, "record-in-stereo", rec_settings.stereo);
++ g_settings_set_string (gsettings, "encoder", rec_settings.encoder);
++ g_settings_set_string (gsettings, "bitrate", rec_settings.bitrate);
+ */
+
+- gconf_client_set_string(client, "/apps/gnomeradio/recording/destination", rec_settings.destination, NULL);
+- gconf_client_set_string(client, "/apps/gnomeradio/recording/profile", rec_settings.profile, NULL);
++ g_settings_set_string (gsettings, "destination", rec_settings.destination);
++ g_settings_set_string (gsettings, "profile", rec_settings.profile);
+
+ /* Store the presets */
+- count = g_list_length(settings.presets);
+- gconf_client_set_int(client, "/apps/gnomeradio/presets/presets", count, NULL);
+- for (i = 0; i < count; i++)
+- {
+- ps = g_list_nth_data(settings.presets, i);
+- buffer = g_strdup_printf("/apps/gnomeradio/presets/%d/name", i);
+- gconf_client_set_string(client, buffer, ps->title, NULL);
+- g_free(buffer);
+- buffer = g_strdup_printf("/apps/gnomeradio/presets/%d/freqency", i);
+- gconf_client_set_float(client, buffer, ps->freq, NULL);
+- g_free(buffer);
+- }
+- gconf_client_set_int(client, "/apps/gnomeradio/presets/last", mom_ps, NULL);
+- /*g_print("Storing Settings in GConf database\n");*/
++ presets_save ();
+
+- g_object_unref (client);
+-
+- return TRUE;
++ count = g_list_length (settings.presets);
++ g_settings_set_int (gsettings, "presets", count);
++ g_settings_set_int (gsettings, "last", mom_ps);
++
++ g_settings_apply (gsettings);
++ g_clear_object (&gsettings);
+ }
+
+-gboolean load_settings(void)
++void load_settings (void)
+ {
+- gint i, count;
+- gchar *buffer;
+- preset *ps;
+- GConfClient *client = NULL;
++ GSettings *gsettings;
++ gint count;
+ double freq;
+
+- settings.presets = NULL;
+-
+- if (!gconf_is_initialized())
+- return FALSE;
+-
+- client = gconf_client_get_default();
+- if (!client)
+- return FALSE;
++ gsettings = g_settings_new ("org.gnome.gnomeradio");
++ g_settings_delay (gsettings);
+
+ /* Load general settings */
+- settings.device = gconf_client_get_string(client, "/apps/gnomeradio/device", NULL);
+- if (!settings.device)
+- settings.device = g_strdup("auto");
+- settings.driver = gconf_client_get_string(client, "/apps/gnomeradio/driver", NULL);
+- if (!settings.driver)
+- settings.driver = g_strdup("any");
+- settings.mixer = gconf_client_get_string(client, "/apps/gnomeradio/mixer", NULL);
+- if (!settings.mixer)
+- settings.mixer = g_strdup("default/Master");
+- settings.muted = gconf_client_get_bool(client, "/apps/gnomeradio/muted", NULL);
+- settings.unmute_volume = gconf_client_get_float(client, "/apps/gnomeradio/unmute-volume", NULL);
+- settings.mute_on_exit = gconf_client_get_bool(client, "/apps/gnomeradio/mute-on-exit", NULL);
+- settings.audio_loopback = gconf_client_get_bool(client, "/apps/gnomeradio/audio-loopback", NULL);
+- /*volume->value = gconf_client_get_float(client, "/apps/gnomeradio/volume", NULL);*/
+- freq = gconf_client_get_float(client, "/apps/gnomeradio/last-freq", NULL);
+- if ((freq < FREQ_MIN) || (freq > FREQ_MAX))
+- gtk_adjustment_set_value(adj, FREQ_MIN * STEPS);
+- else
+- gtk_adjustment_set_value(adj, freq * STEPS);
++ settings.device = g_settings_get_string (gsettings, "device");
++ if ((settings.device == NULL) || (!strcmp (settings.device, "")))
++ settings.device = g_strdup ("auto");
++ settings.driver = g_settings_get_string (gsettings, "driver");
++ if ((settings.driver == NULL) || (!strcmp (settings.driver, "")))
++ settings.driver = g_strdup ("any");
++ settings.mixer = g_settings_get_string (gsettings, "mixer");
++ if ((settings.mixer == NULL) || (!strcmp (settings.mixer, "")))
++ settings.mixer = g_strdup ("default/Master");
++ settings.muted = g_settings_get_boolean (gsettings, "muted");
++ settings.unmute_volume = g_settings_get_double (gsettings, "unmute-volume");
++ settings.mute_on_exit = g_settings_get_boolean (gsettings, "mute-on-exit");
++ settings.audio_loopback = g_settings_get_boolean (gsettings, "audio-loopback");
++ /*volume->value = g_settings_get_double (gsettings, "volume");*/
++ freq = g_settings_get_double (gsettings, "last-freq");
++ if (freq < FREQ_MIN) freq = FREQ_MIN;
++ if (freq > FREQ_MAX) freq = FREQ_MAX;
++ gtk_adjustment_set_value(adj, freq * STEPS);
+
+ /* Load recording settings */
+-/* rec_settings.audiodevice = gconf_client_get_string(client, "/apps/gnomeradio/recording/audiodevice", NULL);
+- if (!rec_settings.audiodevice)
+- rec_settings.audiodevice = g_strdup("/dev/audio");
+- rec_settings.mp3 = gconf_client_get_bool(client, "/apps/gnomeradio/recording/record-as-mp3", NULL);
+- rec_settings.rate = gconf_client_get_string(client, "/apps/gnomeradio/recording/sample-rate", NULL);
+- if (!rec_settings.rate)
+- rec_settings.rate = g_strdup("44100");
+- rec_settings.sample = gconf_client_get_string(client, "/apps/gnomeradio/recording/sample-format", NULL);
+- if (!rec_settings.sample)
+- rec_settings.sample = g_strdup("16");
+- rec_settings.stereo = gconf_client_get_bool(client, "/apps/gnomeradio/recording/record-in-stereo", NULL);
+- rec_settings.encoder = gconf_client_get_string(client, "/apps/gnomeradio/recording/encoder", NULL);
+- if (!rec_settings.encoder)
+- rec_settings.encoder = g_strdup("oggenc");
+- rec_settings.bitrate = gconf_client_get_string(client, "/apps/gnomeradio/recording/bitrate", NULL);
+- if (!rec_settings.bitrate)
+- rec_settings.bitrate = g_strdup("192");*/
+-
+- rec_settings.destination = gconf_client_get_string(client, "/apps/gnomeradio/recording/destination", NULL);
+- if (!rec_settings.destination)
+- rec_settings.destination = g_strdup(g_get_home_dir());
+- rec_settings.profile = gconf_client_get_string(client, "/apps/gnomeradio/recording/profile", NULL);
+- if (!rec_settings.profile)
+- rec_settings.profile = g_strdup("audio/x-vorbis");
++/* rec_settings.audiodevice = g_settings_get_string (gsettings, "audiodevice");
++ if ((rec_settings.audiodevice == NULL) || (!strcmp (rec_settings.audiodevice, "")))
++ rec_settings.audiodevice = g_strdup ("/dev/audio");
++ rec_settings.mp3 = g_settings_get_boolean (gsettings, "record-as-mp3");
++ rec_settings.rate = g_settings_get_string (gsettings, "sample-rate");
++ if ((rec_settings.rate == NULL) || (!strcmp (rec_settings.rate, "")))
++ rec_settings.rate = g_strdup ("44100");
++ rec_settings.sample = g_settings_get_string (gsettings, "sample-format");
++ if ((rec_settings.sample == NULL) || (!strcmp (rec_settings.sample, "")))
++ rec_settings.sample = g_strdup ("16");
++ rec_settings.stereo = g_settings_get_boolean (gsettings, "record-in-stereo");
++ rec_settings.encoder = g_settings_get_string (gsettings, "encoder");
++ if ((rec_settings.encoder == NULL) || (!strcmp (rec_settings.encoder, "")))
++ rec_settings.encoder = g_strdup ("oggenc");
++ rec_settings.bitrate = g_settings_get_string (gsettings, "bitrate");
++ if ((rec_settings.bitrate == NULL) || (!strcmp (rec_settings.bitrate, "")))
++ rec_settings.bitrate = g_strdup ("192");*/
++
++ rec_settings.destination = g_settings_get_string (gsettings, "destination");
++ if ((rec_settings.destination == NULL) || (!strcmp (rec_settings.destination, "")))
++ rec_settings.destination = g_strdup (g_get_home_dir());
++ rec_settings.profile = g_settings_get_string (gsettings, "profile");
++ if ((rec_settings.profile == NULL) || (!strcmp (rec_settings.profile, "")))
++ rec_settings.profile = g_strdup ("audio/x-vorbis");
+
+ /* Load the presets */
+- count = gconf_client_get_int(client, "/apps/gnomeradio/presets/presets", NULL);
+- for (i = 0; i < count; i++)
+- {
+- ps = malloc(sizeof(preset));
+- buffer = g_strdup_printf("/apps/gnomeradio/presets/%d/name", i);
+- ps->title = gconf_client_get_string(client, buffer, NULL);
+- g_free(buffer);
+- if (!ps->title)
+- ps->title = g_strdup(_("unnamed"));
+- buffer = g_strdup_printf("/apps/gnomeradio/presets/%d/freqency", i);
+- freq = gconf_client_get_float(client, buffer, NULL);
+- if ((freq < FREQ_MIN) || (freq > FREQ_MAX))
+- ps->freq = FREQ_MIN;
+- else
+- ps->freq = freq;
+- g_free(buffer);
+- settings.presets = g_list_prepend(settings.presets, (gpointer)ps);
+- }
+- settings.presets = g_list_reverse(settings.presets);
++ presets_load ();
+
+- mom_ps = gconf_client_get_int(client, "/apps/gnomeradio/presets/last", NULL);
++ count = g_settings_get_int (gsettings, "presets");
++ mom_ps = g_settings_get_int (gsettings, "last");
+ if (mom_ps >= count)
+ mom_ps = -1;
+
+- g_object_unref (client);
++ g_clear_object (&gsettings);
++}
+
+- return TRUE;
+-}
+-
+ static void mute_on_exit_toggled_cb(GtkWidget* widget, gpointer data)
+ {
+ settings.mute_on_exit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mute_on_exit));
+@@ -756,7 +722,8 @@ static void freq_cell_edited_cb(GtkCellR
+ double value;
+ gchar *freq_str;
+
+- if (sscanf(new_val, "%lf", &value) != 1) return;
++ if (sscanf(new_val, "%lf", &value) != 1)
++ return;
+
+ if (value < FREQ_MIN) value = FREQ_MIN;
+ if (value > FREQ_MAX) value = FREQ_MAX;
+@@ -871,306 +838,334 @@ static void tree_view_scroll_to_active_p
+ tree_view_switch_to_preset (active);
+ }
+
+-static void free_presets_list (gpointer data)
++static preset *presets_list_new (const gchar *title, const gchar *freq)
++{
++ preset *ps;
++ double value;
++
++ ps = malloc (sizeof (preset));
++
++ if (strcmp (title, "") == 0)
++ ps->title = g_strdup(_("unnamed"));
++ else
++ ps->title = g_strdup (title);
++
++ value = g_strtod (freq, NULL);
++ if (value < FREQ_MIN) value = FREQ_MIN;
++ if (value > FREQ_MAX) value = FREQ_MAX;
++ ps->freq = value;
++
++ return ps;
++}
++
++static void
++presets_list_free (gpointer data)
+ {
+ preset *ps = (preset *) data;
+ g_free (ps->title);
+ g_free (ps);
+ }
+
+-/* Go through each row and add its data to the xmlDocPtr */
+-static gboolean save_to_file_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, xmlNodePtr root, gpointer user_data)
++static gboolean
++gnomeradio_xml_validate_from_resource (xmlDoc *doc, const gchar *dtd_resourcename)
+ {
+- gchar *title, *freq, *position;
+- xmlNodePtr current;
++ GBytes *resourcecontents;
++ gconstpointer resourcedata;
++ gsize resourcesize;
++ xmlParserInputBufferPtr buffer;
++ xmlValidCtxt cvp;
++ xmlDtd *dtd;
++ GError *error = NULL;
++ gboolean ret;
++
++ resourcecontents = g_resources_lookup_data (dtd_resourcename, G_RESOURCE_LOOKUP_FLAGS_NONE, &error);
++ if (error != NULL) {
++ g_warning ("Unable to load dtd resource '%s': %s", dtd_resourcename, error->message);
++ g_error_free (error);
++ return FALSE;
++ }
++ resourcedata = g_bytes_get_data (resourcecontents, &resourcesize);
++ buffer = xmlParserInputBufferCreateStatic (resourcedata, resourcesize, XML_CHAR_ENCODING_UTF8);
+
+- /* get the data stored in the model... */
+- gtk_tree_model_get(model, iter, 0, &title, 1, &freq, -1);
+- /* ...and get the path of the current row */
+- position = gtk_tree_path_to_string(path);
+- /* create a new child of the root node... */
+- /* (note that I'm using a (guchar*) cast; this is because it's the same thing as
+- * an (xmlChar*) cast, but easier to type) */
+- current = xmlNewChild(root, NULL, (guchar*)"station", NULL);
+- /* ...and set some properties */
+- xmlSetProp(current, (guchar*)"name", (guchar*)title);
+- xmlSetProp(current, (guchar*)"freq", (guchar*)freq);
+- xmlSetProp(current, (guchar*)"position", (guchar*)position);
+- /* free our data we retrieved from the model */
+- g_free(title);
+- g_free(freq);
+- g_free(position);
++ memset (&cvp, 0, sizeof (cvp));
++ dtd = xmlIOParseDTD (NULL, buffer, XML_CHAR_ENCODING_UTF8);
++ ret = xmlValidateDtd (&cvp, doc, dtd);
+
+- /* return FALSE to keep iterating */
+- return FALSE;
++ xmlFreeDtd (dtd);
++ g_bytes_unref (resourcecontents);
++
++ return ret;
+ }
+
+-/* Function handle saving an xml file; calls save_to_file_foreach */
+-static void save_to_file(gchar *filename)
++static gboolean
++presets_file_save (const gchar *filename)
+ {
+- GtkTreeModel *model;
+ xmlDocPtr doc;
++ xmlNodePtr comment;
+ xmlNodePtr root;
++ xmlNodePtr node;
++ GList *l;
+
+- /* create a new doc node */
+- doc = xmlNewDoc((guchar*)"1.0");
+- /* create a new root element. */
+- root = xmlNewDocNode(doc, NULL, (guchar*)"gnomeradio", NULL);
+- /* set it as the root element */
+- xmlDocSetRootElement(doc, root);
+- /* get the tree view's model... */
+- model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
+- /* ...and go through it with a foreach */
+- gtk_tree_model_foreach(model, (GtkTreeModelForeachFunc)save_to_file_foreach, (gpointer)root);
+- /* make sure the XML document will be indented */
+- xmlIndentTreeOutput = 1;
+- /* save the actual file */
+- xmlSaveFormatFileEnc(filename, doc, "utf-8", 1);
+- /* free the doc node */
+- xmlFreeDoc(doc);
+-}
++ doc = xmlNewDoc ((const xmlChar *) "1.0");
+
+-/* Callback for the "Save to file" button; calls save_to_file */
+-static void save_to_file_cb(GtkWidget *button, gpointer data)
+-{
+- GtkWidget *dialog;
+- GtkFileFilter *file_filter_all;
+- GtkFileFilter *file_filter_xml;
+- gchar *filename;
++ if (save_to_file)
++ comment = xmlNewDocComment (doc, (const xmlChar *) _("\n"
++ " Listen to FM radio\n"));
++ else
++ comment = xmlNewDocComment (doc, (const xmlChar *) _("\n"
++ " Listen to FM radio\n\n"
++ " This file was automatically generated.\n"
++ " Please MAKE SURE TO BACKUP THIS FILE before making changes.\n"));
++ xmlAddChild ((xmlNodePtr) doc, comment);
++ root = xmlNewNode (NULL, (const xmlChar *) "gnomeradio");
++ xmlDocSetRootElement (doc, root);
++ xmlAddPrevSibling (root, comment);
++
++ for (l = settings.presets; l; l = l->next) {
++ preset *ps = l->data;
++ gchar *buffer;
+
+- dialog = gtk_file_chooser_dialog_new (_("Select file name\xE2\x80\xA6"), NULL,
+- GTK_FILE_CHOOSER_ACTION_SAVE,
+- _("_Save"), GTK_RESPONSE_ACCEPT,
+- _("_Cancel"), GTK_RESPONSE_CANCEL,
+- NULL);
++ node = xmlNewChild (root, NULL, (const xmlChar *) "station", NULL);
+
+- file_filter_all = gtk_file_filter_new();
+- gtk_file_filter_set_name(file_filter_all, _("All Files"));
+- gtk_file_filter_add_pattern(file_filter_all, "*");
+- gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filter_all);
+-
+- file_filter_xml = gtk_file_filter_new();
+- gtk_file_filter_set_name(file_filter_xml, _("XML Files (*.xml)"));
+- gtk_file_filter_add_pattern(file_filter_xml, "*.xml");
+- gtk_file_filter_add_pattern(file_filter_xml, "*.XML");
+- gtk_file_filter_add_mime_type(file_filter_xml, "text/xml");
+- gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filter_xml);
+-
+- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
+- gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), file_filter_xml);
+- gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "gnomeradio.xml");
+-
+- if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
+- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+- /* Check if .xml extension is added, if not add */
+- if (!g_str_has_suffix(filename, ".xml")) {
+- char *tmp_file;
+- /* create copy of filename to release it and create a new one, using old name */
+- tmp_file = g_strdup(filename);
+- g_free(filename);
+- filename = g_strdup_printf("%s.xml", tmp_file);
+- g_free(tmp_file);
+- }
+- save_to_file(filename);
+- g_free(filename);
++ xmlNewProp (node, (const xmlChar *) "name", (const xmlChar *) ps->title);
++ buffer = g_strdup_printf("%0.2f", ps->freq);
++ xmlNewProp (node, (const xmlChar *) "freq", (const xmlChar *) buffer);
++ g_free (buffer);
+ }
+- gtk_widget_destroy(dialog);
+-}
+-
+-/* Gets the parent of a path string.
+-* passing "0:1:2" would return "0:1",
+-* passing "0:1" would return "0",
+-* passing "0" would return NULL */
+-gchar *gtk_tree_path_string_get_parent(gchar *path)
+-{
+- gchar *colon;
+-
+- g_return_val_if_fail(path != NULL, NULL);
+
+- colon = g_strrstr(path, ":");
+- if (colon == NULL)
+- return NULL;
+-
+- return g_strndup(path, colon - path);
+-}
++ xmlIndentTreeOutput = 1;
+
+-/* Make sure that path exists within model */
+-static void gtk_tree_model_generate_path(GtkTreeModel *model, gchar *path)
+-{
+- GtkTreeIter iter, parent;
+- gchar *temp;
++ xmlSaveFormatFileEnc (filename, doc, "UTF-8", 1);
++ xmlFreeDoc (doc);
+
+- while (TRUE) {
+- /* if this returns TRUE, then this path exists and we're fine */
+- if (gtk_tree_model_get_iter_from_string(model, &iter, path))
+- break;
++ xmlMemoryDump ();
+
+- temp = path;
+- path = gtk_tree_path_string_get_parent(path);
+- /* if there's no parent, then it's toplevel */
+- if (path == NULL) {
+- if (GTK_IS_TREE_STORE(model))
+- gtk_tree_store_append(GTK_TREE_STORE(model), &parent, NULL);
+- else
+- gtk_list_store_append(GTK_LIST_STORE(model), &parent);
+- gtk_tree_model_generate_path(model, temp);
+- break;
+- }
+- if (GTK_IS_TREE_STORE(model)) {
+- gtk_tree_model_generate_path(model, path);
+- gtk_tree_model_get_iter_from_string(model, &parent, path);
+- gtk_tree_store_append(GTK_TREE_STORE(model), &iter, &parent);
+- }
+- }
++ return TRUE;
+ }
+
+-/* Function to load from an xml file */
+-static void load_from_file(gchar *filename)
++static void
++presets_file_parse (const gchar *filename)
+ {
++ xmlParserCtxtPtr ctxt;
+ xmlDocPtr doc;
+- xmlNodePtr current;
+- xmlChar *title, *freq, *position;
+- GtkTreeModel *model;
+- GtkTreePath *path = NULL;
+- GtkTreeIter iter;
+- GtkAdjustment* v_scb;
++ xmlNodePtr root;
++ xmlNodePtr node;
++ preset* ps;
+
+- /* load the file */
+- doc = xmlParseFile(filename);
+- /* get the root item */
+- if (doc == NULL)
+- return;
++ ctxt = xmlNewParserCtxt ();
+
+- current = xmlDocGetRootElement(doc);
+- if (current == NULL) {
+- xmlFreeDoc(doc);
++ doc = xmlCtxtReadFile (ctxt, filename, NULL, 0);
++ if (!doc) {
++ g_warning ("Failed to parse file:'%s'", filename);
++ xmlFreeParserCtxt (ctxt);
+ return;
+ }
+
+- if (xmlStrcmp(current->name, (guchar*)"gnomeradio")) {
+- xmlFreeDoc(doc);
++ if (!gnomeradio_xml_validate_from_resource (doc, GNOMERADIO_DTD_RESOURCENAME)) {
++ g_warning ("Failed to validate file:'%s'", filename);
++ xmlFreeDoc (doc);
++ xmlFreeParserCtxt (ctxt);
+ return;
+ }
+
+- /* remove previous presets */
+ if (settings.presets != NULL) {
+- if (main_visible) {
+- gint i, count;
++ if (load_from_file) {
++ gtk_list_store_clear (GTK_LIST_STORE (list_store));
+
+- count = g_list_length (settings.presets);
+- for (i = 0; i < count; i++) {
+- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(preset_combo), 1);
+- tray_menu_remove_preset(0);
+- }
+- }
++ if (main_visible) {
++ gint i, count;
++
++ count = g_list_length (settings.presets);
++ for (i = 0; i < count; i++) {
++ gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (preset_combo), 1);
++ preset_combo_set_item (-1);
+
+- gtk_list_store_clear(GTK_LIST_STORE(list_store));
++ tray_menu_remove_preset (0);
++ }
++ }
++ }
+
+- g_list_free_full (settings.presets, free_presets_list);
++ g_list_free_full (settings.presets, presets_list_free);
+ settings.presets = NULL;
+- }
++ }
+
+- /* get the tree view's model */
+- model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
++ root = xmlDocGetRootElement(doc);
+
+- /* iterate through the root's children items */
+- current = current->xmlChildrenNode;
+- while (current) {
+- if(!xmlIsBlankNode(current)) {
+- /* check for the proper element name */
+- if (!xmlStrcmp(current->name, (guchar*)"station")) {
+- /* get the saved properties */
+- title = xmlGetProp(current, (guchar*)"name");
+- freq = xmlGetProp(current, (guchar*)"freq");
+- position = xmlGetProp(current, (guchar*)"position");
+-
+- if( title && freq && position ) {
+- preset *ps = g_malloc0(sizeof(preset));
+- ps->title = g_strdup((gchar*)title);
+- ps->freq = atof((gchar*)freq);
+-
+- settings.presets = g_list_append(settings.presets, ps);
+-
+- /* make sure that the path exists */
+- gtk_tree_model_generate_path(model, (gchar*)position);
+- /* get an iter to the path */
+- gtk_tree_model_get_iter_from_string(model, &iter, (gchar*)position);
+- /* set the data */
+- gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, title, 1, freq, -1);
+-
+- gtk_tree_selection_unselect_all(selection);
+-
+- v_scb = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(tree_view));
+- gtk_adjustment_set_value(v_scb, gtk_adjustment_get_upper(v_scb));
+-
+- if (main_visible) {
+- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(preset_combo), ps->title);
+- mom_ps = g_list_length(settings.presets) - 1;
+- preset_combo_set_item(mom_ps);
++ node = root->children;
++ while (node) {
++ if (strcmp ((gchar *) node->name, "station") == 0) {
++ gchar *title;
++ gchar *freq;
++
++ title = (gchar *) xmlGetProp (node, (const xmlChar *) "name");
++ freq = (gchar *) xmlGetProp (node, (const xmlChar *) "freq");
++
++ if (title && freq) {
++ ps = presets_list_new (title, freq);
++ settings.presets = g_list_append (settings.presets, ps);
++ }
+
+- tray_menu_add_preset (ps, mom_ps);
+- }
+- }
+- /* free the data */
+- xmlFree(title);
+- xmlFree(freq);
+- xmlFree(position);
++ xmlFree(title);
++ xmlFree(freq);
++ }
++
++ node = node->next;
++ }
++
++ xmlFreeDoc (doc);
++ xmlFreeParserCtxt (ctxt);
++
++ if (load_from_file) {
++ GList *l;
++
++ for (l = settings.presets; l != NULL; l = l->next) {
++ GtkTreeIter iter = {0};
++ gchar *buffer;
++ ps = l->data;
++ buffer = g_strdup_printf ("%0.2f", ps->freq);
++ gtk_list_store_append (list_store, &iter);
++ gtk_list_store_set (GTK_LIST_STORE (list_store), &iter, 0, ps->title, 1, buffer, -1);
++ g_free (buffer);
++
++ if (main_visible) {
++ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(preset_combo), ps->title);
++ mom_ps = g_list_length (settings.presets) - 1;
++ preset_combo_set_item (mom_ps);
++
++ tray_menu_add_preset (ps, mom_ps);
+ }
+- current = current->next;
+ }
++
++ tree_view_scroll_to_active_preset_cb (tree_view, NULL);
++ tree_view_cursor_changed_cb (tree_view, NULL);
++
++ gtk_widget_set_sensitive (save_button, TRUE);
++ gtk_widget_set_sensitive (remove_button, TRUE);
+ }
+- /* free the doc node */
+- xmlFreeDoc(doc);
++}
+
+- if (settings.presets == NULL)
+- return;
++static void
++presets_save (void)
++{
++ gchar *dir;
++ gchar *file_with_path;
+
+- path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
++ dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
++ g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
++ file_with_path = g_build_filename (dir, GNOMERADIO_XML_FILENAME, NULL);
++ g_free (dir);
+
+- gtk_tree_view_set_cursor(GTK_TREE_VIEW (tree_view), path, NULL, FALSE );
+- gtk_tree_path_free(path);
++ presets_file_save (file_with_path);
+
+- gtk_widget_grab_focus(tree_view);
++ g_free (file_with_path);
++}
+
+- tree_view_cursor_changed_cb(tree_view, NULL);
+- gtk_widget_set_sensitive(save_button, TRUE);
+- gtk_widget_set_sensitive(remove_button, TRUE);
++static void
++presets_load (void)
++{
++ gchar *dir;
++ gchar *file_with_path;
++
++ dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
++ file_with_path = g_build_filename (dir, GNOMERADIO_XML_FILENAME, NULL);
++ g_free (dir);
++
++ if (g_file_test (file_with_path, G_FILE_TEST_EXISTS))
++ presets_file_parse (file_with_path);
++
++ g_free (file_with_path);
+ }
+
+-/* Callback for the "Load from file" button; calls load_from_file */
+-static void load_from_file_cb(GtkWidget *button, gpointer data)
++static void
++add_default_file_filters (GtkWidget *file_chooser)
+ {
+- GtkWidget *dialog;
+ GtkFileFilter *file_filter_all;
+ GtkFileFilter *file_filter_xml;
+- gchar *filename;
+
+- dialog = gtk_file_chooser_dialog_new (_("Select file name\xE2\x80\xA6"), NULL,
+- GTK_FILE_CHOOSER_ACTION_OPEN,
+- _("_Open"), GTK_RESPONSE_ACCEPT,
+- _("_Cancel"), GTK_RESPONSE_CANCEL,
+- NULL);
++ file_filter_all = gtk_file_filter_new ();
++ gtk_file_filter_set_name(file_filter_all, _("All files"));
++ gtk_file_filter_add_pattern (file_filter_all, "*");
++
++ file_filter_xml = gtk_file_filter_new ();
++ gtk_file_filter_set_name (file_filter_xml, _("XML files"));
++ gtk_file_filter_add_pattern (file_filter_xml, "*.xml");
++ gtk_file_filter_add_pattern (file_filter_xml, "*.XML");
++ gtk_file_filter_add_mime_type (file_filter_xml, "text/xml");
++
++ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_chooser), file_filter_all);
++ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_chooser), file_filter_xml);
++
++ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (file_chooser), file_filter_xml);
++}
++
++static void
++save_to_file_cb (GtkWidget *button, gpointer data)
++{
++ GtkWidget *dialog;
++
++ save_to_file = TRUE;
++
++ dialog = gtk_file_chooser_dialog_new (_("Select file name"),
++ NULL,
++ GTK_FILE_CHOOSER_ACTION_SAVE,
++ _("_Save"), GTK_RESPONSE_ACCEPT,
++ _("_Cancel"), GTK_RESPONSE_CANCEL,
++ NULL);
++
++
++
++ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dialog), TRUE);
++ add_default_file_filters (dialog);
++ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), "gnomeradio.xml");
++
++ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
++ gchar *filename;
++
++ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog));
++ if (!g_str_has_suffix (filename, ".xml")) {
++ gchar *tmp_file;
+
+- file_filter_all = gtk_file_filter_new();
+- gtk_file_filter_set_name(file_filter_all, _("All Files"));
+- gtk_file_filter_add_pattern(file_filter_all, "*");
+- gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filter_all);
+-
+- file_filter_xml = gtk_file_filter_new();
+- gtk_file_filter_set_name(file_filter_xml, _("XML Files"));
+- gtk_file_filter_add_pattern(file_filter_xml, "*.xml");
+- gtk_file_filter_add_pattern(file_filter_xml, "*.XML");
+- gtk_file_filter_add_mime_type(file_filter_xml, "text/xml");
+- gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filter_xml);
+-
+- gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), file_filter_xml);
+-
+- if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
+- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+- load_from_file(filename);
+- g_free(filename);
++ tmp_file = g_strdup (filename);
++ g_free (filename);
++ filename = g_strdup_printf ("%s.xml", tmp_file);
++ g_free (tmp_file);
++ }
++ presets_file_save (filename);
++ g_free (filename);
++ }
++
++ gtk_widget_destroy (dialog);
++
++ save_to_file = FALSE;
++}
++
++static void
++load_from_file_cb (GtkWidget *button, gpointer data)
++{
++ GtkWidget *dialog;
++
++ load_from_file = TRUE;
++
++ dialog = gtk_file_chooser_dialog_new (_("Select file name"),
++ NULL,
++ GTK_FILE_CHOOSER_ACTION_OPEN,
++ _("_Open"), GTK_RESPONSE_ACCEPT,
++ _("_Cancel"), GTK_RESPONSE_CANCEL,
++ NULL);
++
++ add_default_file_filters (dialog);
++
++ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
++ gchar *filename;
++
++ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
++ presets_file_parse (filename);
++ g_free (filename);
+ }
+- gtk_widget_destroy(dialog);
++
++ gtk_widget_destroy (dialog);
++
++ load_from_file = FALSE;
+ }
+
+ gboolean action_mode (gint mode)
+@@ -1206,10 +1201,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ GtkWidget *open_button;
+ GtkWidget *destination_button;
+ GtkWidget *image;
+-
+ GstEncodingProfile *profile;
+-
+- gint i;
+ gchar *markup;
+ preset* ps;
+ GList *l;
+@@ -1374,7 +1366,6 @@ GtkWidget* prefs_window(GtkWidget *app)
+
+ g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(freq_cell_edited_cb), NULL);
+
+- i = 0;
+ for (l = settings.presets; l != NULL; l = l->next) {
+ GtkTreeIter iter = {0};
+ char *buffer;
+@@ -1383,7 +1374,6 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_list_store_append(list_store, &iter);
+ gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, ps->title, 1, buffer, -1);
+ g_free(buffer);
+- i++;
+ }
+
+ gtk_grid_attach(GTK_GRID(grid), scrolled_window, 0, 6, 2, 1);
+@@ -1499,8 +1489,8 @@ GtkWidget* prefs_window(GtkWidget *app)
+ g_signal_connect(G_OBJECT(audio_profile_combo), "changed", G_CALLBACK(audio_profile_combo_change_cb), NULL);
+ g_signal_connect(G_OBJECT(install_button), "clicked", G_CALLBACK(audio_profile_install_plugins_cb), NULL);
+
+- gtk_widget_set_tooltip_text(destination_button, _("Select a location where to save recorded file."));
+- gtk_widget_set_tooltip_text(audio_profile_combo, _("Choose the format that should be used for recording."));
++ gtk_widget_set_tooltip_text(destination_button, _("The default location to use for the recorded files"));
++ gtk_widget_set_tooltip_text(audio_profile_combo, _("The media type for encoding audio when recording"));
+
+ gtk_widget_show_all(dialog);
+
+Index: gnomeradio-1.8/src/prefs.h
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.h
++++ gnomeradio-1.8/src/prefs.h
+@@ -19,9 +19,9 @@
+
+ #include
+
+-gboolean save_settings(void);
++void save_settings (void);
+
+-gboolean load_settings(void);
++void load_settings (void);
+
+ void audio_box_set_visible (gboolean visible);
+
diff -pruN 1.8-2/debian/patches/gnomeradio-gstreamer-1.0.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gstreamer-1.0.patch
--- 1.8-2/debian/patches/gnomeradio-gstreamer-1.0.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gstreamer-1.0.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,179 @@
+Description: Port to GStreamer 1.0 API.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1085118
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/configure.in
+===================================================================
+--- gnomeradio-1.8.orig/configure.in 2013-09-28 11:13:18.441641316 +0000
++++ gnomeradio-1.8/configure.in 2013-09-28 11:13:18.433641317 +0000
+@@ -28,10 +28,14 @@
+ AC_SUBST(GNOME_LIBS)
+ AC_SUBST(LIRC)
+
+-PKG_CHECK_MODULES(GSTREAMER, gstreamer-0.10 gstreamer-plugins-base-0.10)
++PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0 gstreamer-plugins-base-1.0)
+ AC_SUBST(GSTREAMER_CFLAGS)
+ AC_SUBST(GSTREAMER_LIBS)
+
++PKG_CHECK_MODULES(XML, libxml-2.0 >= 2.4)
++AC_SUBST(XML_CFLAGS)
++AC_SUBST(XML_LIBS)
++
+ GNOME_DOC_INIT
+
+ AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c 2013-09-28 11:13:18.441641316 +0000
++++ gnomeradio-1.8/src/record.c 2013-09-28 11:13:18.433641317 +0000
+@@ -191,13 +191,12 @@
+
+ /* length */
+ GstElement *pipeline;
+- GstFormat fmt = GST_FORMAT_TIME;
+ gint64 val = -1;
+ gint secs;
+
+ pipeline = recording->pipeline;
+
+- if (gst_element_query_position (pipeline, &fmt, &val) && val != -1) {
++ if (gst_element_query_position (pipeline, GST_FORMAT_TIME, &val) && val != -1) {
+ gchar* length;
+ secs = val / GST_SECOND;
+
+Index: gnomeradio-1.8/src/rec_tech.c
+===================================================================
+--- gnomeradio-1.8.orig/src/rec_tech.c 2013-09-28 11:13:18.441641316 +0000
++++ gnomeradio-1.8/src/rec_tech.c 2013-09-28 11:13:18.437641316 +0000
+@@ -25,7 +25,10 @@
+ #include
+ #include
+
++#define DECAY_STEP .15
++
+ GtkWidget *level;
++static gdouble last_input_peak;
+
+ static void
+ show_error_dialog (GtkWindow *win, const gchar *dbg, const gchar * format, ...)
+@@ -62,7 +65,7 @@
+ _("Could not create the GStreamer %s element.\n"
+ "Please install the '%s' plugin from the '%s' module.\n"
+ "Verify that the installation is correct by running\n"
+- " gst-inspect-0.10 %s\n"
++ " gst-inspect-1.0 %s\n"
+ "and then restart gnomeradio."),
+ description, plugin, module, element);
+ }
+@@ -95,34 +98,49 @@
+ }
+
+ static gboolean
+-level_message_handler_cb (GstBus *bus, GstMessage *message, gpointer user_data)
++level_message_cb (GstBus *bus, GstMessage *message, gpointer user_data)
+ {
+ if (message->type == GST_MESSAGE_ELEMENT) {
+ const GstStructure *s = gst_message_get_structure (message);
+ const gchar *name = gst_structure_get_name (s);
+
+- if (g_str_equal (name, "level")) {
++ if (g_strcmp0 (name, "level") == 0) {
+ gint channels;
+ gdouble peak_dB;
+- gdouble norm_peak;
+- const GValue *list;
++ gdouble peak;
++ const GValue *array_val;
+ const GValue *value;
+
++ GValueArray *rms_arr, *peak_arr;
+ gint i;
+- list = gst_structure_get_value (s, "rms");
+- channels = gst_value_list_get_size (list);
++
++ array_val = gst_structure_get_value (s, "rms");
++ rms_arr = (GValueArray *) g_value_get_boxed (array_val);
++
++ array_val = gst_structure_get_value (s, "peak");
++ peak_arr = (GValueArray *) g_value_get_boxed (array_val);
++
++ channels = rms_arr->n_values;
+
+ for (i = 0; i < channels; ++i) {
+- list = gst_structure_get_value (s, "peak");
+- value = gst_value_list_get_value (list, i);
++ value = peak_arr->values + i;
+ peak_dB = g_value_get_double (value);
+- norm_peak = exp (peak_dB / 20);
+- if (norm_peak > 1.0)
+- norm_peak = 1.0;
+- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(level), norm_peak);
++
++ peak = pow (10, peak_dB / 20);
+ }
++
++ if (last_input_peak >= DECAY_STEP) {
++ if (peak < last_input_peak - DECAY_STEP) {
++ peak = last_input_peak - DECAY_STEP;
++ }
++ }
++
++ last_input_peak = peak;
++
++ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (level), peak);
+ }
+ }
++
+ return TRUE;
+ }
+
+@@ -137,10 +155,10 @@
+ gchar *pipeline_desc;
+ const char *name;
+
+- source = gst_element_factory_make ("gconfaudiosrc", "gconfaudiosource");
++ source = gst_element_factory_make ("autoaudiosrc", "autoaudiosource");
+ if (source == NULL) {
+ show_missing_known_element_error (NULL,
+- _("GConf audio recording"), "gconfaudiosrc",
++ _("GConf audio recording"), "autoaudiosrc",
+ "gconfelements", "gst-plugins-good");
+ return FALSE;
+ }
+@@ -226,7 +244,7 @@
+ gst_bus_add_signal_watch(bus);
+
+ g_signal_connect(G_OBJECT(bus), "message::error", G_CALLBACK(pipeline_error_cb), pipeline);
+- g_signal_connect (G_OBJECT(bus), "message::element", G_CALLBACK (level_message_handler_cb), pipeline);
++ g_signal_connect (G_OBJECT(bus), "message::element", G_CALLBACK (level_message_cb), pipeline);
+
+ char* path = g_strdup_printf("%s.%s", filename, gm_audio_profile_get_extension(profile));
+ g_object_set(G_OBJECT(filesink), "location", path, NULL);
+Index: gnomeradio-1.8/src/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/src/Makefile.am 2013-09-28 11:13:18.441641316 +0000
++++ gnomeradio-1.8/src/Makefile.am 2013-09-28 11:13:18.437641316 +0000
+@@ -1,5 +1,5 @@
+ INCLUDES = -I$(top_srcdir) -I$(includedir) \
+- $(GNOME_CFLAGS) $(GSTREAMER_CFLAGS) \
++ $(GNOME_CFLAGS) $(GSTREAMER_CFLAGS) $(XML_CFLAGS)\
+ -DG_LOG_DOMAIN=\"gnomeradio\" \
+ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+ -DDATADIR=\""$(datadir)/"\" \
+@@ -32,4 +32,4 @@
+ v4l1.c \
+ v4l2.c
+
+-gnomeradio_LDADD = $(GNOME_LIBS) $(GSTREAMER_LIBS) $(LIRC)
++gnomeradio_LDADD = $(GNOME_LIBS) $(GSTREAMER_LIBS) $(XML_LIBS) $(LIRC)
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c 2013-09-28 11:13:18.441641316 +0000
++++ gnomeradio-1.8/src/gui.c 2013-09-28 11:13:18.437641316 +0000
+@@ -27,6 +27,7 @@
+ #include
+ #include
+ #include
++#include
+ #include "gui.h"
+ #include "trayicon.h"
+ #include "tech.h"
diff -pruN 1.8-2/debian/patches/gnomeradio-gstreamer.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gstreamer.patch
--- 1.8-2/debian/patches/gnomeradio-gstreamer.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gstreamer.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,110 @@
+## Description: Use standard gstreamer functions to parse a description, see: https://bugzilla.gnome.org/show_bug.cgi?id=566397
+## Origin: upstream, http://bugzilla-attachments.gnome.org/attachment.cgi?id=125675
+## Bug-Ubuntu:
+## Bug-Debian:
+## Author: Thomas Meire
+## Forwarded: not-needed
+Index: b/src/rec_tech.c
+===================================================================
+--- a/src/rec_tech.c 2012-12-03 10:14:53.722899843 +0000
++++ b/src/rec_tech.c 2012-12-03 10:14:54.942899807 +0000
+@@ -24,12 +24,6 @@
+ #include
+ #include
+
+-static GstElement*
+-my_gst_gconf_render_bin_from_description(const gchar * description);
+-
+-static GstPad*
+-my_gst_bin_find_unconnected_pad(GstBin* bin, GstPadDirection direction);
+-
+ static void error_cb(GstBus *bus, GstMessage *message, gpointer user_data)
+ {
+ GError *error = NULL;
+@@ -71,7 +65,7 @@
+ g_signal_connect(G_OBJECT(bus), "message::error", G_CALLBACK(error_cb), pipeline);
+
+ char* pipeline_str = g_strdup_printf("audioconvert ! %s", gm_audio_profile_get_pipeline(profile));
+- encoder = my_gst_gconf_render_bin_from_description(pipeline_str);
++ encoder = gst_parse_bin_from_description(pipeline_str, TRUE, NULL);
+ g_free(pipeline_str);
+ if (!encoder) {
+ char *caption = g_strdup_printf(_("Could not create encoder \"%s\"."), gm_audio_profile_get_name (profile));
+@@ -137,77 +131,6 @@
+ g_free(recording);
+ }
+
+-/* Stolen from gst-plugins-good/ext/gconf/gconf.c */
+-static GstPad *
+-my_gst_bin_find_unconnected_pad (GstBin * bin, GstPadDirection direction)
+-{
+- GstPad *pad = NULL;
+- GList *elements = NULL;
+- const GList *pads = NULL;
+- GstElement *element = NULL;
+-
+- GST_OBJECT_LOCK (bin);
+- elements = bin->children;
+- /* traverse all elements looking for unconnected pads */
+- while (elements && pad == NULL) {
+- element = GST_ELEMENT (elements->data);
+- GST_OBJECT_LOCK (element);
+- pads = element->pads;
+- while (pads) {
+- GstPad *testpad = GST_PAD (pads->data);
+-
+- /* check if the direction matches */
+- if (GST_PAD_DIRECTION (testpad) == direction) {
+- GST_OBJECT_LOCK (testpad);
+- if (GST_PAD_PEER (testpad) == NULL) {
+- GST_OBJECT_UNLOCK (testpad);
+- /* found it ! */
+- pad = testpad;
+- break;
+- }
+- GST_OBJECT_UNLOCK (testpad);
+- }
+- pads = g_list_next (pads);
+- }
+- GST_OBJECT_UNLOCK (element);
+- elements = g_list_next (elements);
+- }
+- GST_OBJECT_UNLOCK (bin);
+-
+- return pad;
+-}
+-
+-/* Stolen from gst-plugins-good/ext/gconf/gconf.c */
+-static GstElement *
+-my_gst_gconf_render_bin_from_description (const gchar * description)
+-{
+- GstElement *bin = NULL;
+- GstPad *pad = NULL;
+- GError *error = NULL;
+- gchar *desc = NULL;
+-
+- /* parse the pipeline to a bin */
+- desc = g_strdup_printf ("bin.( %s )", description);
+- bin = GST_ELEMENT (gst_parse_launch (desc, &error));
+- g_free (desc);
+- if (error) {
+- GST_ERROR ("gstgconf: error parsing pipeline %s\n%s\n",
+- description, error->message);
+- g_error_free (error);
+- return NULL;
+- }
+-
+- /* find pads and ghost them if necessary */
+- if ((pad = my_gst_bin_find_unconnected_pad (GST_BIN (bin), GST_PAD_SRC))) {
+- gst_element_add_pad (bin, gst_ghost_pad_new ("src", pad));
+- }
+- if ((pad = my_gst_bin_find_unconnected_pad (GST_BIN (bin), GST_PAD_SINK))) {
+- gst_element_add_pad (bin, gst_ghost_pad_new ("sink", pad));
+- }
+- return bin;
+-}
+-
+-
+ /*
+ * Miscellanelous functions
+ */
diff -pruN 1.8-2/debian/patches/gnomeradio-g_thread_init_deprecation.patch 1.8-2ubuntu32/debian/patches/gnomeradio-g_thread_init_deprecation.patch
--- 1.8-2/debian/patches/gnomeradio-g_thread_init_deprecation.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-g_thread_init_deprecation.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,17 @@
+## Description: Fix obsolete g_thread_init().
+## Origin: upstream, no
+## Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1013383
+## Author: Pojar George
+## Forwarded: no
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -1213,7 +1213,6 @@ int main(int argc, char* argv[])
+
+ g_set_application_name(_("Gnomeradio"));
+
+- if (!g_thread_supported ()) g_thread_init(NULL);
+ ctx = g_option_context_new("- Gnomeradio");
+ g_option_context_add_main_entries(ctx, entries, GETTEXT_PACKAGE);
+ g_option_context_add_group(ctx, gst_init_get_option_group());
diff -pruN 1.8-2/debian/patches/gnomeradio-gtk3.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gtk3.patch
--- 1.8-2/debian/patches/gnomeradio-gtk3.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gtk3.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,183 @@
+## Description: Resolve build warnings about is used deprecated GTK3 API
+## Origin: upstream, https://launchpadlibrarian.net/97001445/gnomeradio-gtk3.patch
+## Bug-Ubuntu: http://launchpad.net/bugs/954993
+## Bug-Debian:
+## Author: Pojar George
+## Forwarded: not-needed
+Index: b/src/gui.c
+===================================================================
+--- a/src/gui.c 2012-12-03 10:14:54.230899828 +0000
++++ b/src/gui.c 2012-12-03 10:14:54.530899819 +0000
+@@ -928,11 +928,11 @@
+ gtk_container_add(GTK_CONTAINER(rec_button), rec_pixmap);
+ /*gtk_container_add(GTK_CONTAINER(help_button), help_pixmap);*/
+
+- vbox = gtk_vbox_new(FALSE, 0);
+- hbox1 = gtk_hbox_new(FALSE, 0);
+- hbox2 = gtk_hbox_new(FALSE, 0);
+- menubox = gtk_vbox_new(FALSE, 0);
+- freq_vol_box = gtk_hbox_new(FALSE, 0);
++ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
++ hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
++ hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
++ menubox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
++ freq_vol_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+ adj = GTK_ADJUSTMENT(gtk_adjustment_new(SUNSHINE*STEPS, FREQ_MIN*STEPS, FREQ_MAX*STEPS+1, 1, STEPS, 1));
+ /* volume = GTK_ADJUSTMENT(gtk_adjustment_new(100, 0, 101, 1, 10, 1)); */
+@@ -943,7 +943,7 @@
+ gtk_widget_set_size_request(preset_combo, 10, -1);
+ label = gtk_label_new(_("Presets:"));
+
+- freq_scale = gtk_hscale_new(adj);
++ freq_scale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, adj);
+ /*gtk_range_set_update_policy(GTK_RANGE(freq_scale), GTK_UPDATE_DELAYED);*/
+ /*vol_scale = gtk_hscale_new(volume);*/
+
+@@ -968,10 +968,10 @@
+ signal_s = gdk_pixbuf_new_from_xpm_data((const char**)signal_xpm);
+ stereo = gdk_pixbuf_new_from_xpm_data((const char**)stereo_xpm);
+
+- vseparator1 = gtk_vseparator_new();
+- /*vseparator2 = gtk_vseparator_new();*/
+- /*vseparator3 = gtk_vseparator_new();*/
+- vseparator4 = gtk_vseparator_new();
++ vseparator1 = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
++ /*vseparator2 = gtk_vseparator_new();*/
++ /*vseparator3 = gtk_vseparator_new();*/
++ vseparator4 = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
+
+ gtk_scale_set_digits(GTK_SCALE(freq_scale), 0);
+ gtk_scale_set_draw_value(GTK_SCALE(freq_scale), FALSE);
+Index: b/src/prefs.c
+===================================================================
+--- a/src/prefs.c 2012-12-03 10:14:53.722899843 +0000
++++ b/src/prefs.c 2012-12-03 10:14:54.530899819 +0000
+@@ -309,7 +309,7 @@
+ g_free(buffer);
+ gtk_tree_selection_unselect_all(selection);
+
+- v_scb = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(list_view));
++ v_scb = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(list_view));
+ gtk_adjustment_set_value(v_scb, gtk_adjustment_get_upper(v_scb));
+
+ if (main_visible) {
+@@ -544,11 +544,11 @@
+ gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
+ gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
+
+- box = gtk_vbox_new(FALSE, 18);
++ box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
+ gtk_container_set_border_width(GTK_CONTAINER(box), 12);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), box, TRUE, TRUE, 0);
+
+- settings_box = gtk_vbox_new(FALSE, 6);
++ settings_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start(GTK_BOX(box), settings_box, TRUE, TRUE, 0);
+
+ settings_hdr = g_strconcat("", _("General Settings"), " ", NULL);
+@@ -558,7 +558,7 @@
+ g_free(settings_hdr);
+ gtk_box_pack_start(GTK_BOX(settings_box), settings_label, TRUE, TRUE, 0);
+
+- presets_box = gtk_vbox_new(FALSE, 6);
++ presets_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start(GTK_BOX(box), presets_box, TRUE, TRUE, 0);
+
+ presets_hdr = g_strconcat("", _("Presets"), " ", NULL);
+@@ -568,7 +568,7 @@
+ g_free(presets_hdr);
+ gtk_box_pack_start(GTK_BOX(presets_box), presets_label, TRUE, TRUE, 0);
+
+- record_box = gtk_vbox_new(FALSE, 6);
++ record_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start(GTK_BOX(box), record_box, TRUE, TRUE, 0);
+
+ record_hdr = g_strconcat("", _("Record Settings"), " ", NULL);
+@@ -579,7 +579,7 @@
+ gtk_box_pack_start(GTK_BOX(record_box), record_label, TRUE, TRUE, 0);
+
+ /* The general settings part */
+- sbox = gtk_hbox_new(FALSE, 0);
++ sbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start(GTK_BOX(settings_box), sbox, TRUE, TRUE, 0);
+ s_indent_label = gtk_label_new(" ");
+ gtk_box_pack_start(GTK_BOX(sbox), s_indent_label, FALSE, FALSE, 0);
+@@ -630,12 +630,12 @@
+
+
+ /* The presets part */
+- pbox = gtk_hbox_new(FALSE, 0);
++ pbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start(GTK_BOX(presets_box), pbox, TRUE, TRUE, 0);
+ p_indent_label = gtk_label_new(" ");
+ gtk_box_pack_start(GTK_BOX(pbox), p_indent_label, FALSE, FALSE, 0);
+
+- preset_box = gtk_vbox_new(FALSE, 10);
++ preset_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
+ gtk_box_pack_start(GTK_BOX(pbox), preset_box, TRUE, TRUE, 0);
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+@@ -668,7 +668,7 @@
+ gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
+ g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(freq_cell_edited_cb), NULL);
+
+- button_box = gtk_hbox_new(FALSE, 12);
++ button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
+
+ add_button = gtk_button_new_from_stock(GTK_STOCK_ADD);
+ del_button = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+@@ -699,7 +699,7 @@
+
+
+ /* The record settings part */
+- rbox = gtk_hbox_new(FALSE, 0);
++ rbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start(GTK_BOX(record_box), rbox, TRUE, TRUE, 0);
+ r_indent_label = gtk_label_new(" ");
+ gtk_box_pack_start(GTK_BOX(rbox), r_indent_label, FALSE, FALSE, 0);
+Index: b/src/record.c
+===================================================================
+--- a/src/record.c 2012-12-03 10:14:53.722899843 +0000
++++ b/src/record.c 2012-12-03 10:14:54.530899819 +0000
+@@ -110,7 +110,7 @@
+ /*gtk_window_set_resizable(GTK_WINDOW(status_dialog), FALSE);*/
+ gtk_window_set_default_size(GTK_WINDOW(status_dialog), 400, -1);
+
+- vbox = gtk_vbox_new(FALSE, 5);
++ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
+
+ table = gtk_table_new(3, 2, FALSE);
+@@ -153,7 +153,7 @@
+ gtk_table_attach(GTK_TABLE(table), size_lbl, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+
+ button = gtk_button_new();
+- btn_box = gtk_hbox_new(FALSE, 0);
++ btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ btn_label = gtk_label_new(_("Stop Recording"));
+ btn_pixmap = gtk_image_new_from_stock(GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON);
+
+@@ -162,7 +162,7 @@
+
+ gtk_container_add(GTK_CONTAINER(button), btn_box);
+
+- hbox = gtk_hbox_new(FALSE, 0);
++ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_end (GTK_BOX(hbox), button, TRUE, FALSE, 0);
+
+ gtk_box_pack_start (GTK_BOX(vbox), table, TRUE, TRUE, 0);
+Index: b/src/trayicon.c
+===================================================================
+--- a/src/trayicon.c 2012-12-03 10:14:53.722899843 +0000
++++ b/src/trayicon.c 2012-12-03 10:14:54.530899819 +0000
+@@ -134,8 +134,7 @@
+ pixbuf = gtk_icon_theme_load_icon(icontheme, "gnomeradio", 22, 0, NULL);
+ g_return_if_fail(pixbuf);
+ tray_icon = G_OBJECT(gtk_status_icon_new_from_pixbuf(pixbuf));
+- gdk_pixbuf_unref(pixbuf);
+-
++ g_object_unref(pixbuf);
+
+ g_signal_connect(G_OBJECT(tray_icon), "activate",
+ G_CALLBACK(tray_activate_cb), (gpointer)app);
diff -pruN 1.8-2/debian/patches/gnomeradio-gtk_application.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gtk_application.patch
--- 1.8-2/debian/patches/gnomeradio-gtk_application.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gtk_application.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,308 @@
+Description: Use GtkApplication, which provides single-instance support.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1258429
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -96,7 +96,11 @@ static int bp_timeout_steps = 0;
+ static int volume_value_changed_id;
+ static gint mode;
+
+-static DBusGProxy * connect_to_session (void);
++static gboolean do_scan;
++
++static DBusGProxy *proxy;
++
++static void connect_to_session (void);
+
+ static gboolean is_first_start(void)
+ {
+@@ -570,7 +574,7 @@ void exit_gnome_radio(void)
+
+ mixer->close_device();
+ save_settings();
+- gtk_main_quit();
++ gtk_widget_destroy (GTK_WIDGET (app));
+ }
+
+ const char* get_preset(float freq, int *num)
+@@ -1020,9 +1024,8 @@ void toggle_mainwindow_visibility(GtkWid
+ }
+ }
+
+-GtkWidget* gnome_radio_gui(void)
++GtkWidget* gnome_radio_gui (void)
+ {
+- GtkWidget *app;
+ GtkWidget *vbox;
+ GtkWidget *box;
+ GtkWidget *frame;
+@@ -1036,9 +1039,9 @@ GtkWidget* gnome_radio_gui(void)
+ GtkWidget *image;
+ gchar *text;
+
+- app = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+- gtk_window_set_resizable(GTK_WINDOW(app), FALSE);
+- gtk_window_set_wmclass(GTK_WINDOW(app), "gnomeradio", "Gnomeradio");
++ app = gtk_window_new (GTK_WINDOW_TOPLEVEL);
++ gtk_window_set_resizable (GTK_WINDOW(app), FALSE);
++ gtk_window_set_wmclass (GTK_WINDOW(app), "gnomeradio", "Gnomeradio");
+
+ gtk_widget_realize (app);
+ gtk_widget_get_window (app);
+@@ -1215,7 +1218,7 @@ session_die_cb(void)
+ radio_stop();
+
+ mixer->close_device();
+- gtk_main_quit();
++ gtk_widget_destroy (GTK_WIDGET (app));
+ exit (0);
+ }
+
+@@ -1379,120 +1382,113 @@ option_version_cb (const gchar * opt,
+ exit (0);
+ }
+
+-int main(int argc, char* argv[])
++static void
++startup_cb (GApplication *application, gpointer user_data)
+ {
+ GList *l;
+- DBusGProxy *proxy;
+- GError *err = NULL;
+- gboolean do_scan = FALSE;
+- GOptionContext *ctx;
+- const GOptionEntry entries[] = {
+- { "scan", '\0', 0, G_OPTION_ARG_NONE, &do_scan, N_("Scan for available stations"), NULL },
+- { "version", 0, G_OPTION_FLAG_NO_ARG | G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, option_version_cb, NULL, NULL },
+- { NULL }
+- };
+-
+- bindtextdomain(PACKAGE, GNOMELOCALEDIR);
+- bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+- textdomain(PACKAGE);
+
+- g_set_application_name(_("Gnomeradio"));
+- g_setenv("PULSE_PROP_media.role", "production", TRUE);
+-
+- ctx = g_option_context_new("- Listen to FM radio");
+- g_option_context_add_main_entries(ctx, entries, GETTEXT_PACKAGE);
+- g_option_context_add_group(ctx, alsa_get_option_group());
+- g_option_context_add_group(ctx, gtk_get_option_group (TRUE));
+- g_option_context_add_group(ctx, gst_init_get_option_group());
+- if (g_option_context_parse(ctx, &argc, &argv, &err) == FALSE) {
+- g_print(_("%s\nRun '%s --help' to see a full list of available command line options.\n"),
+- err->message, argv[0]);
+- g_option_context_free(ctx);
+- g_error_free(err);
+- exit(1);
+- }
+- g_option_context_free(ctx);
+-
+- gtk_init(&argc, &argv);
+- gtk_window_set_default_icon_name("gnomeradio");
+- /* Main app */
+ main_visible = FALSE;
+- app = gnome_radio_gui();
+-
+- /* Initizialize GStreamer */
+- gst_init(&argc, &argv);
++ app = gnome_radio_gui ();
++ gtk_application_add_window (GTK_APPLICATION (application), GTK_WINDOW (app));
+
+- rb_missing_plugins_init (GTK_WINDOW (app));
+-
+ load_settings();
+
+- start_radio(FALSE, app);
+- start_mixer(FALSE, app);
++ start_radio (FALSE, app);
++ start_mixer (FALSE, app);
+ if (is_first_start() || do_scan) {
+ if (!radio_is_init()) {
+- fprintf(stderr, "Could not scan. Radio is not initialized\n");
++ g_print ("Could not scan. Radio is not initialized\n");
+ } else {
+- initial_frequency_scan(app);
+- set_first_time_flag();
++ initial_frequency_scan (app);
++ set_first_time_flag ();
+ }
+ }
+- create_tray_menu(app);
++
++ create_tray_menu (app);
+
+- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(preset_combo), _("manual"));
++ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (preset_combo), _("manual"));
+ for (l = settings.presets; l; l = l->next) {
+ preset *ps = (preset*) l->data;
+- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(preset_combo), ps->title);
++ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (preset_combo), ps->title);
+ }
+
+- preset_combo_set_item(mom_ps);
+-
+- gtk_widget_show_all(app);
++ gtk_widget_show_all (app);
+ main_visible = TRUE;
+ mode = PRESETS;
+
+- /* Create an tray icon */
+- create_tray_icon(app);
++ create_tray_icon (app);
+
+- adj_value_changed_cb(NULL, (gpointer) app);
++ adj_value_changed_cb (NULL, (gpointer) app);
+
+ #ifdef HAVE_LIRC
+ if(!my_lirc_init())
+- {
+-/* GtkWidget *dialog;
+- dialog = gtk_message_dialog_new(NULL, DIALOG_FLAGS, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+- _("Could not start lirc"));
+- gtk_dialog_run (GTK_DIALOG (dialog));
+- gtk_widget_destroy (dialog);
+-*/
+- fprintf(stderr, "Could not start lirc\n");
+- }
++ g_print ("Could not start lirc.\n");
+ else
+ start_lirc();
+ #endif
+
+-/* Connect the Session Management signals
+- */
++ connect_to_session ();
+
+- proxy = connect_to_session ();
+- g_signal_connect(G_OBJECT(app), "key-press-event",
+- G_CALLBACK(key_press_event_cb), NULL);
+-
+- /* Redraw the status window every 3 seconds
+- * Necessary, because the mono/stereo reception
+- * needs some time to be correctly detected
+- */
+- g_timeout_add_seconds(3, (GSourceFunc)redraw_status_window, NULL);
++ g_signal_connect (G_OBJECT (app), "key-press-event", G_CALLBACK (key_press_event_cb), NULL);
+
+- /* Checks if the volume has been changed by an
+- * external app
+- */
+- /*gtk_timeout_add(100, (GSourceFunc)poll_volume_change, NULL);*/
++ g_timeout_add_seconds (3, (GSourceFunc)redraw_status_window, NULL);
++}
+
+- gtk_main();
+-
+-#ifdef HAVE_LIRC
+- my_lirc_deinit();
+-#endif
++static void
++activate_cb (GApplication *application, gpointer user_data)
++{
++ gtk_window_present (GTK_WINDOW (app));
++}
++
++int main (int argc, char **argv)
++{
++ GtkApplication *application;
++ GError *error = NULL;
++ GOptionContext *ctx;
++ do_scan = FALSE;
++ const GOptionEntry entries[] = {
++ { "scan", '\0', 0, G_OPTION_ARG_NONE, &do_scan, N_("Scan for available stations"), NULL },
++ { "version", 0, G_OPTION_FLAG_NO_ARG | G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, option_version_cb, NULL, NULL },
++ { NULL }
++ };
++
++ guint status = 0;
++
++ bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
++ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
++ textdomain (GETTEXT_PACKAGE);
++
++ g_set_application_name (_("Gnomeradio"));
++ g_setenv ("PULSE_PROP_media.role", "production", TRUE);
++
++ ctx = g_option_context_new (N_("- Listen to FM radio"));
++ g_option_context_add_main_entries (ctx, entries, GETTEXT_PACKAGE);
++ g_option_context_set_translation_domain(ctx, GETTEXT_PACKAGE);
++ g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
++ g_option_context_add_group (ctx, gst_init_get_option_group ());
++ g_option_context_add_group(ctx, alsa_get_option_group());
++ g_option_context_set_ignore_unknown_options (ctx, TRUE);
++
++ g_option_context_parse (ctx, &argc, &argv, &error);
++ if (error != NULL) {
++ g_print(_("%s\nRun '%s --help' to see a full list of available command line options.\n"),
++ error->message, argv[0]);
++ g_error_free (error);
++ exit (1);
++ }
++
++ g_option_context_free (ctx);
++
++ gtk_window_set_default_icon_name ("gnomeradio");
++
++ application = gtk_application_new ("org.gnome.gnomeradio", G_APPLICATION_FLAGS_NONE);
++
++ g_signal_connect (application, "startup", G_CALLBACK (startup_cb), NULL);
++ g_signal_connect (application, "activate", G_CALLBACK (activate_cb), NULL);
++
++ status = g_application_run (G_APPLICATION (application), argc, argv);
++
++ g_object_unref (application);
+
+ if (proxy) {
+ DBusGConnection *conn;
+@@ -1503,23 +1499,26 @@ int main(int argc, char* argv[])
+ g_object_unref (proxy);
+ }
+
+- return 0;
++#ifdef HAVE_LIRC
++ my_lirc_deinit();
++#endif
++
++ return status;
+ }
+
+-static DBusGProxy * connect_to_session (void)
++static void connect_to_session (void)
+ {
+ DBusGConnection *connection;
+- DBusGProxy *proxy;
+- GError *error = NULL;
++ GError *error = NULL;
+
+ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+
+ if (error) {
+ g_warning ("Could not connect to system bus: %s", error->message);
+ g_error_free(error);
+- return NULL;
++ return;
+ }
+- /* Get the current session object */
++
+ proxy = dbus_g_proxy_new_for_name (connection,
+ "org.gnome.SessionManager",
+ "/org/gnome/SessionManager",
+@@ -1528,14 +1527,13 @@ static DBusGProxy * connect_to_session (
+ if (!proxy) {
+ g_warning ("Unable to get the SessionManager.");
+ dbus_g_connection_unref (connection);
+- return NULL;
++ return;
+ }
+
+ dbus_g_proxy_add_signal (proxy, "SessionOver", G_TYPE_INVALID, G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal (proxy, "SessionOver", G_CALLBACK (session_die_cb), NULL, NULL);
+
+ g_object_set_data (G_OBJECT (proxy), "connection", connection);
+- return proxy;
+ }
+
+ static void show_message(GtkMessageType type, const char* text, const char* details)
diff -pruN 1.8-2/debian/patches/gnomeradio-gtk_grid.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gtk_grid.patch
--- 1.8-2/debian/patches/gnomeradio-gtk_grid.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gtk_grid.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,446 @@
+Description: Port to GtkGrid from deprecated GtkTable.
+Origin: upstream, no
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1018398
+Author: Pojar George
+Forwarded: no
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -35,6 +35,7 @@ extern gboolean main_visible;
+ static GtkWidget *device_entry;
+ static GtkWidget *mixer_combo;
+ static GtkWidget *mute_on_exit_cb;
++static GtkWidget *delete_button;
+ static GtkWidget *list_view;
+ static GtkListStore *list_store;
+ static GtkTreeSelection *selection;
+@@ -333,7 +334,7 @@ static void add_button_clicked_cb(GtkWid
+ }
+
+
+-static void del_button_clicked_cb(GtkWidget *widget, gpointer data)
++static void delete_button_clicked_cb(GtkWidget *widget, gpointer data)
+ {
+ GtkTreePath *path = NULL;
+ GtkTreeViewColumn *focus_column = NULL;
+@@ -389,7 +390,7 @@ static void destination_button_clicked_c
+ static gboolean list_view_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+ {
+ if (event->keyval == GDK_KEY_Delete)
+- del_button_clicked_cb(widget, user_data);
++ delete_button_clicked_cb(widget, user_data);
+ if (event->keyval == GDK_KEY_Insert)
+ add_button_clicked_cb(widget, user_data);
+
+@@ -475,8 +476,7 @@ static void freq_cell_edited_cb(GtkCellR
+ gtk_tree_path_free(path);
+ }
+
+-static void
+-list_view_cursor_changed_cb(GtkWidget *widget, gpointer data)
++static void list_view_cursor_changed_cb(GtkWidget *widget, gpointer data)
+ {
+ int *row;
+ GtkTreePath *path = NULL;
+@@ -494,6 +494,15 @@ list_view_cursor_changed_cb(GtkWidget *w
+ return;
+ }
+
++static void list_view_selection_changed_cb(GtkWidget *widget, gpointer data)
++{
++ gboolean sel;
++
++ sel = gtk_tree_selection_get_selected(selection, NULL, NULL);
++
++ gtk_widget_set_sensitive(delete_button, sel);
++}
++
+ static void free_string_list(GList *list)
+ {
+ if (!list) return;
+@@ -504,23 +513,21 @@ static void free_string_list(GList *list
+ GtkWidget* prefs_window(GtkWidget *app)
+ {
+ GtkWidget *dialog;
+- GtkWidget *box, *sbox, *pbox, *rbox;
+- GtkWidget *settings_box, *presets_box, *record_box;
++ GtkWidget *box;
+ GtkWidget *settings_label, *presets_label, *record_label;
+ GtkWidget *s_indent_label, *p_indent_label, *r_indent_label;
+ GtkWidget *destination_label;
+ GtkWidget *destination_button;
+ GtkWidget *profile_combo;
+ GtkWidget *mixer_eb, *profile_eb;
+- GtkWidget *preset_box;
+- GtkWidget *settings_table, *record_table;
++ GtkWidget *grid;
+ GtkWidget *device_label, *mixer_label;
+ GtkWidget *button_box;
+- GtkWidget *add_button, *del_button;
++ GtkWidget *add_button, *add_pixmap, *delete_pixmap;
+ GtkWidget *scrolled_window;
+ GtkCellRenderer *cellrenderer;
+ GtkTreeViewColumn *list_column;
+- GList *mixer_devs, *profiles, *ptr;
++ GList *mixer_devs, *ptr;
+ gint i, active;
+ char *settings_hdr, *presets_hdr, *record_hdr;
+ preset* ps;
+@@ -534,60 +541,35 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
+ gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
+
+- box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
+- gtk_container_set_border_width(GTK_CONTAINER(box), 12);
++ box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
++ gtk_container_set_border_width(GTK_CONTAINER(box), 10);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), box, TRUE, TRUE, 0);
+
+- settings_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+- gtk_box_pack_start(GTK_BOX(box), settings_box, TRUE, TRUE, 0);
++ grid = gtk_grid_new();
++ gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
++ gtk_grid_set_column_spacing(GTK_GRID(grid), 20);
++ gtk_box_pack_start(GTK_BOX(box), grid, TRUE, TRUE, 0);
+
++ /* The general settings part */
+ settings_hdr = g_strconcat("", _("General Settings"), " ", NULL);
+ settings_label = gtk_label_new(settings_hdr);
+- gtk_misc_set_alignment(GTK_MISC(settings_label), 0, 0.5);
++ gtk_widget_set_halign(settings_label, GTK_ALIGN_START);
+ gtk_label_set_use_markup(GTK_LABEL(settings_label), TRUE);
+ g_free(settings_hdr);
+- gtk_box_pack_start(GTK_BOX(settings_box), settings_label, TRUE, TRUE, 0);
+-
+- presets_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+- gtk_box_pack_start(GTK_BOX(box), presets_box, TRUE, TRUE, 0);
+-
+- presets_hdr = g_strconcat("", _("Presets"), " ", NULL);
+- presets_label = gtk_label_new(presets_hdr);
+- gtk_misc_set_alignment(GTK_MISC(presets_label), 0, 0.5);
+- gtk_label_set_use_markup(GTK_LABEL(presets_label), TRUE);
+- g_free(presets_hdr);
+- gtk_box_pack_start(GTK_BOX(presets_box), presets_label, TRUE, TRUE, 0);
++ gtk_grid_attach(GTK_GRID(grid), settings_label, 0, 0, 2, 1);
+
+- record_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+- gtk_box_pack_start(GTK_BOX(box), record_box, TRUE, TRUE, 0);
++ s_indent_label = gtk_label_new("");
++ gtk_grid_attach(GTK_GRID(grid), s_indent_label, 0, 1, 1, 3);
+
+- record_hdr = g_strconcat("", _("Record Settings"), " ", NULL);
+- record_label = gtk_label_new(record_hdr);
+- gtk_misc_set_alignment(GTK_MISC(record_label), 0, 0.5);
+- gtk_label_set_use_markup(GTK_LABEL(record_label), TRUE);
+- g_free(record_hdr);
+- gtk_box_pack_start(GTK_BOX(record_box), record_label, TRUE, TRUE, 0);
+-
+- /* The general settings part */
+- sbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+- gtk_box_pack_start(GTK_BOX(settings_box), sbox, TRUE, TRUE, 0);
+- s_indent_label = gtk_label_new(" ");
+- gtk_box_pack_start(GTK_BOX(sbox), s_indent_label, FALSE, FALSE, 0);
+-
+- settings_table = gtk_table_new(3, 2, FALSE);
+- gtk_table_set_row_spacings(GTK_TABLE(settings_table), 5);
+- gtk_table_set_col_spacings(GTK_TABLE(settings_table), 15);
+- gtk_box_pack_start(GTK_BOX(sbox), settings_table, TRUE, TRUE, 0);
+-
+ device_label = gtk_label_new(_("Radio Device:"));
+- gtk_misc_set_alignment(GTK_MISC(device_label), 0.0f, 0.5f);
++ gtk_widget_set_halign(device_label, GTK_ALIGN_START);
+ device_entry = gtk_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(device_entry), settings.device);
+- gtk_table_attach_defaults(GTK_TABLE(settings_table), device_label, 0, 1, 0, 1);
+- gtk_table_attach_defaults(GTK_TABLE(settings_table), device_entry, 1, 2, 0, 1);
++ gtk_grid_attach(GTK_GRID(grid), device_label, 1, 1, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), device_entry, 2, 1, 1, 1);
+
+ mixer_label = gtk_label_new(_("Mixer Source:"));
+- gtk_misc_set_alignment(GTK_MISC(mixer_label), 0.0f, 0.5f);
++ gtk_widget_set_halign(mixer_label, GTK_ALIGN_START);
+ mixer_eb = gtk_event_box_new();
+ mixer_combo = gtk_combo_box_text_new();
+ gtk_container_add(GTK_CONTAINER(mixer_eb), mixer_combo);
+@@ -600,13 +582,13 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_combo_box_set_active(GTK_COMBO_BOX(mixer_combo), active);
+ g_object_set_data_full(G_OBJECT(mixer_combo), "mixer_devs", mixer_devs, (GDestroyNotify)free_string_list);
+
+- gtk_table_attach_defaults(GTK_TABLE(settings_table), mixer_label, 0, 1, 1, 2);
+- gtk_table_attach_defaults(GTK_TABLE(settings_table), mixer_eb, 1, 2, 1, 2);
++ gtk_grid_attach(GTK_GRID(grid), mixer_label, 1, 2, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), mixer_eb, 2, 2, 1, 1);
+
+- mute_on_exit_cb = gtk_check_button_new_with_label(_("Mute on exit?"));
++ mute_on_exit_cb = gtk_check_button_new_with_label(_("Mute on exit"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mute_on_exit_cb), settings.mute_on_exit);
+
+- gtk_table_attach_defaults(GTK_TABLE(settings_table), mute_on_exit_cb, 0, 2, 2, 3);
++ gtk_grid_attach(GTK_GRID(grid), mute_on_exit_cb, 1, 3, 1, 1);
+
+ g_signal_connect(G_OBJECT(device_entry), "hide", G_CALLBACK(device_entry_activate_cb), app);
+ g_signal_connect(G_OBJECT(device_entry), "activate", G_CALLBACK(device_entry_activate_cb), NULL);
+@@ -618,27 +600,31 @@ GtkWidget* prefs_window(GtkWidget *app)
+ _("Choose the mixer source (line, line1, etc.) that is able to control the volume of your radio"));
+ gtk_widget_set_tooltip_text(mute_on_exit_cb, _("If unchecked, gnomeradio won't mute after exiting"));
+
+-
+ /* The presets part */
+- pbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+- gtk_box_pack_start(GTK_BOX(presets_box), pbox, TRUE, TRUE, 0);
+- p_indent_label = gtk_label_new(" ");
+- gtk_box_pack_start(GTK_BOX(pbox), p_indent_label, FALSE, FALSE, 0);
++ presets_hdr = g_strconcat("", _("Presets"), " ", NULL);
++ presets_label = gtk_label_new(presets_hdr);
++ gtk_widget_set_halign(presets_label, GTK_ALIGN_START);
++ gtk_label_set_use_markup(GTK_LABEL(presets_label), TRUE);
++ g_free(presets_hdr);
++ gtk_grid_attach(GTK_GRID(grid), presets_label, 0, 4, 2, 1);
+
+- preset_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
+- gtk_box_pack_start(GTK_BOX(pbox), preset_box, TRUE, TRUE, 0);
++ p_indent_label = gtk_label_new("");
++ gtk_grid_attach(GTK_GRID(grid), p_indent_label, 0, 5, 1, 2);
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
++ gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolled_window), 75);
+ list_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+ list_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
+- gtk_container_add(GTK_CONTAINER(scrolled_window), list_view);
++ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(list_view), TRUE);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+- gtk_widget_set_size_request(list_view, 200, 150);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list_view), FALSE);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
++ gtk_container_add(GTK_CONTAINER(scrolled_window), list_view);
++ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(list_view_selection_changed_cb), list_view);
++
+ /*gtk_tree_selection_select_path(selection, gtk_tree_path_new_from_string("0"));
+ gtk_tree_selection_set_select_function(selection, (GtkTreeSelectionFunc)list_view_select_cb, NULL, NULL);*/
+
+@@ -652,22 +638,30 @@ GtkWidget* prefs_window(GtkWidget *app)
+
+ cellrenderer = gtk_cell_renderer_text_new();
+ g_object_set(G_OBJECT(cellrenderer), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
+- g_object_set(G_OBJECT(cellrenderer), "xalign", 1.0f, NULL);
++ g_object_set(G_OBJECT(cellrenderer), "xalign", 1.0, NULL);
+ g_object_set(G_OBJECT(GTK_CELL_RENDERER_TEXT(cellrenderer)), "editable", TRUE, NULL);
+ list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
+ g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(freq_cell_edited_cb), NULL);
+
+- button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
++ button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+
+- add_button = gtk_button_new_from_stock(GTK_STOCK_ADD);
+- del_button = gtk_button_new_from_stock(GTK_STOCK_DELETE);
++ add_button = gtk_button_new();
++ add_pixmap = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_SMALL_TOOLBAR);
++ gtk_button_set_relief (GTK_BUTTON (add_button), GTK_RELIEF_NONE);
++ delete_button = gtk_button_new();
++ delete_pixmap = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_SMALL_TOOLBAR);
++ gtk_button_set_relief (GTK_BUTTON (delete_button), GTK_RELIEF_NONE);
++ gtk_widget_set_sensitive(delete_button, FALSE);
+
+- gtk_box_pack_end(GTK_BOX(button_box), del_button, FALSE, FALSE, 0);
++ gtk_box_pack_end(GTK_BOX(button_box), delete_button, FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(button_box), add_button, FALSE, FALSE, 0);
++
++ gtk_container_add(GTK_CONTAINER(add_button), add_pixmap);
++ gtk_container_add(GTK_CONTAINER(delete_button), delete_pixmap);
+
+- gtk_box_pack_start(GTK_BOX(preset_box), scrolled_window, TRUE, TRUE, 0);
+- gtk_box_pack_start(GTK_BOX(preset_box), button_box, TRUE, TRUE, 0);
++ gtk_grid_attach(GTK_GRID(grid), scrolled_window, 1, 5, 2, 2);
++ gtk_grid_attach(GTK_GRID(grid), button_box, 1, 7, 2, 1);
+
+ for (i=0;i", _("Record Settings"), "", NULL);
++ record_label = gtk_label_new(record_hdr);
++ gtk_widget_set_halign(record_label, GTK_ALIGN_START);
++ gtk_label_set_use_markup(GTK_LABEL(record_label), TRUE);
++ g_free(record_hdr);
++ gtk_grid_attach(GTK_GRID(grid), record_label, 0, 8, 2, 1);
++
++ r_indent_label = gtk_label_new("");
++ gtk_grid_attach(GTK_GRID(grid), r_indent_label, 0, 9, 1, 2);
++
++ destination_label = gtk_label_new(_("Destination:"));
++ gtk_widget_set_halign(destination_label, GTK_ALIGN_START);
+
+ destination_button = gtk_file_chooser_button_new(
+ _("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+ gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(destination_button), rec_settings.destination);
+
+ profile_eb = gtk_event_box_new();
++ gtk_widget_set_hexpand(profile_eb, TRUE);
++ gtk_widget_set_halign(profile_eb, GTK_ALIGN_FILL);
+ profile_combo = gm_audio_profile_choose_new();
+ gtk_container_add(GTK_CONTAINER(profile_eb), profile_combo);
+ gm_audio_profile_choose_set_active(profile_combo, rec_settings.profile);
+
+- gtk_table_attach_defaults(GTK_TABLE(record_table), destination_label, 0, 1, 0, 1);
+- gtk_table_attach_defaults(GTK_TABLE(record_table), destination_button, 1, 2, 0, 1);
+- gtk_table_attach_defaults(GTK_TABLE(record_table), profile_eb, 0, 2, 1, 2);
++ gtk_grid_attach(GTK_GRID(grid), destination_label, 1, 9, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), destination_button, 2, 9, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), profile_eb, 1, 10, 2, 1);
+
+ g_signal_connect(GTK_FILE_CHOOSER(destination_button), "selection-changed", G_CALLBACK(destination_button_clicked_cb), NULL);
+ g_signal_connect(G_OBJECT(profile_combo), "changed", G_CALLBACK(profile_combo_change_cb), NULL);
+
++ gtk_widget_set_tooltip_text(destination_button, _("Choose a destination directory for recording file."));
+ gtk_widget_set_tooltip_text(profile_eb, _("Choose the Media Profile that should be used to record."));
+-
+- gtk_box_pack_start(GTK_BOX(rbox), record_table, TRUE, TRUE, 0);
+
+ gtk_widget_show_all(dialog);
+
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -31,7 +31,7 @@
+ #include "rec_tech.h"
+ #include "prefs.h"
+
+-static int timeout_id = -1, wav_io_id = -1, mp3_io_id = -1;
++static int timeout_id = -1;
+ static GtkWidget *file_lbl, *size_lbl;
+ static GtkWidget *status_dialog;
+
+@@ -101,7 +101,7 @@ GtkWidget* record_status_window(Recordin
+ {
+ GtkWidget *btn_label, *btn_pixmap, *button;
+ GtkWidget *vbox, *btn_box, *hbox;
+- GtkWidget *table;
++ GtkWidget *grid;
+ GtkWidget *title, *f_lbl, *s_lbl;
+ char *text, *str;
+
+@@ -113,10 +113,10 @@ GtkWidget* record_status_window(Recordin
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
+
+- table = gtk_table_new(3, 2, FALSE);
+- gtk_table_set_row_spacings(GTK_TABLE(table), 10);
+- gtk_table_set_col_spacings(GTK_TABLE(table), 12);
+- gtk_container_set_border_width(GTK_CONTAINER(table), 6);
++ grid = gtk_grid_new();
++ gtk_grid_set_row_spacing(GTK_GRID(grid), 10);
++ gtk_grid_set_column_spacing(GTK_GRID(grid), 12);
++ gtk_container_set_border_width(GTK_CONTAINER(grid), 6);
+
+ str = g_strdup_printf(_("Recording from station %s"), recording->station);
+ text = g_strdup_printf("%s ", str);
+@@ -137,20 +137,24 @@ GtkWidget* record_status_window(Recordin
+
+ file_lbl = gtk_label_new("");
+ gtk_label_set_ellipsize(GTK_LABEL(file_lbl), PANGO_ELLIPSIZE_START);
++ gtk_widget_set_hexpand(file_lbl, TRUE);
++ gtk_widget_set_halign(file_lbl, GTK_ALIGN_FILL);
+ size_lbl = gtk_label_new("");
++ gtk_widget_set_hexpand(size_lbl, TRUE);
++ gtk_widget_set_halign(size_lbl, GTK_ALIGN_FILL);
+
+- gtk_misc_set_alignment(GTK_MISC(title), 0.0f, 0.0f);
+- gtk_misc_set_alignment(GTK_MISC(f_lbl), 1.0f, 0.5f);
+- gtk_misc_set_alignment(GTK_MISC(s_lbl), 1.0f, 0.5f);
+- gtk_misc_set_alignment(GTK_MISC(file_lbl), 0.0f, 0.5f);
+- gtk_misc_set_alignment(GTK_MISC(size_lbl), 0.0f, 0.5f);
+-
+- gtk_table_attach(GTK_TABLE(table), title, 0, 2, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_EXPAND, 0, 0);
+- gtk_table_attach(GTK_TABLE(table), f_lbl, 0, 1, 1, 2, GTK_FILL | GTK_SHRINK, GTK_FILL, 0, 0);
+- gtk_table_attach(GTK_TABLE(table), s_lbl, 0, 1, 2, 3, GTK_FILL | GTK_SHRINK, GTK_FILL, 0, 0);
++ gtk_widget_set_halign(title, GTK_ALIGN_START);
++ gtk_widget_set_halign(f_lbl, GTK_ALIGN_START);
++ gtk_widget_set_halign(s_lbl, GTK_ALIGN_START);
++ gtk_widget_set_halign(file_lbl, GTK_ALIGN_START);
++ gtk_widget_set_halign(size_lbl, GTK_ALIGN_START);
++
++ gtk_grid_attach(GTK_GRID(grid), title, 0, 0, 2, 1);
++ gtk_grid_attach(GTK_GRID(grid), f_lbl, 0, 1, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), s_lbl, 0, 2, 1, 1);
+
+- gtk_table_attach(GTK_TABLE(table), file_lbl, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+- gtk_table_attach(GTK_TABLE(table), size_lbl, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
++ gtk_grid_attach(GTK_GRID(grid), file_lbl, 1, 1, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), size_lbl, 1, 2, 1, 1);
+
+ button = gtk_button_new();
+ btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+@@ -165,7 +169,7 @@ GtkWidget* record_status_window(Recordin
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_end (GTK_BOX(hbox), button, TRUE, FALSE, 0);
+
+- gtk_box_pack_start (GTK_BOX(vbox), table, TRUE, TRUE, 0);
++ gtk_box_pack_start (GTK_BOX(vbox), grid, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+ gtk_container_add(GTK_CONTAINER(status_dialog), vbox);
+Index: gnomeradio-1.8/src/trayicon.c
+===================================================================
+--- gnomeradio-1.8.orig/src/trayicon.c
++++ gnomeradio-1.8/src/trayicon.c
+@@ -126,7 +126,6 @@ static void tray_popup_menu (GtkStatusIc
+ void create_tray_icon(GtkWidget *app)
+ {
+ GdkPixbuf *pixbuf;
+- GtkWidget *eventbox;
+ GtkIconTheme *icontheme;
+ char *text;
+
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -157,7 +157,7 @@ static void initial_frequency_scan(GtkWi
+ gtk_container_set_border_width (GTK_CONTAINER (box), 8);
+
+ label = gtk_label_new (NULL);
+- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ markup = g_strdup_printf ("%s ", _("Scanning for available stations"));
+ gtk_label_set_markup (GTK_LABEL (label), markup);
+ g_free (markup);
+@@ -167,7 +167,7 @@ static void initial_frequency_scan(GtkWi
+ gtk_box_pack_start (GTK_BOX (box), data.progress, FALSE, FALSE, 0);
+
+ data.label = gtk_label_new (_("No stations found"));
+- gtk_misc_set_alignment (GTK_MISC (data.label), 0, 0.5);
++ gtk_widget_set_halign (data.label, GTK_ALIGN_START);
+ gtk_box_pack_start (GTK_BOX (box), data.label, FALSE, FALSE, 0);
+
+ gtk_container_add (GTK_CONTAINER (content_area), box);
diff -pruN 1.8-2/debian/patches/gnomeradio-gtk.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gtk.patch
--- 1.8-2/debian/patches/gnomeradio-gtk.patch 2011-10-28 19:58:55.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gtk.patch 2015-04-13 18:42:54.000000000 +0000
@@ -1,7 +1,8 @@
-diff -up gnomeradio-1.8/src/bacon-volume.c.gtk gnomeradio-1.8/src/bacon-volume.c
---- gnomeradio-1.8/src/bacon-volume.c.gtk 2007-02-25 00:33:36.000000000 +0100
-+++ gnomeradio-1.8/src/bacon-volume.c 2010-08-12 01:14:00.616442010 +0200
-@@ -242,19 +242,23 @@ bacon_volume_button_scroll (GtkWidget
+Index: b/src/bacon-volume.c
+===================================================================
+--- a/src/bacon-volume.c 2012-12-03 10:14:50.018899953 +0000
++++ b/src/bacon-volume.c 2012-12-03 10:14:53.474899850 +0000
+@@ -242,19 +242,23 @@
BaconVolumeButton *button = BACON_VOLUME_BUTTON (widget);
GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
float d;
@@ -31,7 +32,7 @@ diff -up gnomeradio-1.8/src/bacon-volume
}
bacon_volume_button_set_value (button, d);
-@@ -270,55 +274,59 @@ bacon_volume_button_press (GtkWidget
+@@ -270,55 +274,59 @@
gint x, y, m, dx, dy, sx, sy, ystartoff, mouse_y;
float v;
GdkEventButton *e;
@@ -111,7 +112,7 @@ diff -up gnomeradio-1.8/src/bacon-volume
gtk_widget_event (button->scale, (GdkEvent *) e);
e->window = event->window;
gdk_event_free ((GdkEvent *) e);
-@@ -345,12 +353,12 @@ cb_button_timeout (gpointer data)
+@@ -345,12 +353,12 @@
val = bacon_volume_button_get_value (button);
val += button->direction;
@@ -128,7 +129,7 @@ diff -up gnomeradio-1.8/src/bacon-volume
}
bacon_volume_button_set_value (button, val);
-@@ -373,7 +381,7 @@ cb_button_press (GtkWidget * widget
+@@ -373,7 +381,7 @@
if (button->click_id != 0)
g_source_remove (button->click_id);
button->direction = (widget == button->plus) ?
@@ -137,7 +138,7 @@ diff -up gnomeradio-1.8/src/bacon-volume
button->click_id = g_timeout_add (CLICK_TIMEOUT,
(GSourceFunc) cb_button_timeout, button);
cb_button_timeout (button);
-@@ -416,7 +424,7 @@ bacon_volume_release_grab (BaconVolumeBu
+@@ -416,7 +424,7 @@
button->timeout = FALSE;
e = (GdkEventButton *) gdk_event_copy ((GdkEvent *) event);
@@ -146,7 +147,7 @@ diff -up gnomeradio-1.8/src/bacon-volume
e->type = GDK_BUTTON_RELEASE;
gtk_widget_event (GTK_WIDGET (button), (GdkEvent *) e);
e->window = event->window;
-@@ -571,7 +579,7 @@ bacon_volume_scale_value_changed (GtkRan
+@@ -571,7 +579,7 @@
BaconVolumeScale *scale = BACON_VOLUME_SCALE (range);
BaconVolumeButton *button = scale->button;
GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
@@ -155,7 +156,7 @@ diff -up gnomeradio-1.8/src/bacon-volume
float val = gtk_range_get_value (range);
gint w, h;
#ifdef HAVE_GTK_ONLY
-@@ -585,13 +593,13 @@ bacon_volume_scale_value_changed (GtkRan
+@@ -585,13 +593,13 @@
const char *s;
GdkPixbuf *buf;
@@ -173,9 +174,10 @@ diff -up gnomeradio-1.8/src/bacon-volume
s = "stock_volume-med";
else
s = "stock_volume-max";
-diff -up gnomeradio-1.8/src/gui.c.gtk gnomeradio-1.8/src/gui.c
---- gnomeradio-1.8/src/gui.c.gtk 2010-08-11 20:55:53.000000000 +0200
-+++ gnomeradio-1.8/src/gui.c 2010-08-12 00:51:33.652692968 +0200
+Index: b/src/gui.c
+===================================================================
+--- a/src/gui.c 2012-12-03 10:14:53.066899862 +0000
++++ b/src/gui.c 2012-12-03 10:14:53.474899850 +0000
@@ -22,6 +22,7 @@
#include
@@ -184,7 +186,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
#include
#include
#include "bacon-volume.h"
-@@ -139,14 +140,14 @@ static void initial_frequency_scan(GtkWi
+@@ -139,14 +140,14 @@
gtk_misc_set_alignment(GTK_MISC(title), 0, 0.5);
gtk_label_set_use_markup(GTK_LABEL(title), TRUE);
g_free(title_hdr);
@@ -202,7 +204,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
gtk_widget_show_all(data.dialog);
-@@ -162,7 +163,7 @@ static void initial_frequency_scan(GtkWi
+@@ -162,7 +163,7 @@
} else {
if (g_list_length(data.stations) > 0) {
gfloat f = *((gfloat*)data.stations->data);
@@ -211,7 +213,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
radio_set_freq(f);
GtkWidget *dialog;
-@@ -310,7 +311,7 @@ static gboolean redraw_status_window(voi
+@@ -310,7 +311,7 @@
int win_width, win_height;
int val, freq[5], signal_strength, is_stereo;
@@ -220,7 +222,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
freq[0] = val / 10000;
freq[1] = (val % 10000) / 1000;
-@@ -325,7 +326,7 @@ static gboolean redraw_status_window(voi
+@@ -325,7 +326,7 @@
if (signal_strength < 0) signal_strength = 0;
is_stereo = (is_stereo == 1) ? 1 : 0;
@@ -229,7 +231,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
if (real_window == NULL)
/* UI has not been realized yet */
return TRUE;
-@@ -400,7 +401,7 @@ const char* get_preset(float freq, int *
+@@ -400,7 +401,7 @@
static void adj_value_changed_cb(GtkAdjustment* data, gpointer window)
{
char *buffer;
@@ -238,7 +240,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
const char *preset_title = get_preset(freq, &mom_ps);
preset_combo_set_item(mom_ps);
-@@ -419,7 +420,7 @@ static void adj_value_changed_cb(GtkAdju
+@@ -419,7 +420,7 @@
gtk_tooltips_set_tip(tooltips, freq_scale, buffer, NULL);
g_free(buffer);
@@ -247,7 +249,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
}
static void volume_value_changed_cb(BaconVolumeButton *button, gpointer user_data)
-@@ -460,20 +461,21 @@ static gboolean poll_volume_change(gpoin
+@@ -460,20 +461,21 @@
static void change_frequency(gpointer data)
{
gboolean increase = (gboolean)data;
@@ -273,7 +275,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
}
}
-@@ -517,14 +519,14 @@ static gboolean scan_freq(gpointer data)
+@@ -517,14 +519,14 @@
max = (FREQ_MAX - FREQ_MIN) * STEPS;
}
@@ -290,7 +292,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
}
if (mom > FREQ_MAX*STEPS)
-@@ -610,7 +612,7 @@ void tray_icon_items_set_sensible(gboole
+@@ -610,7 +612,7 @@
int i, cnt = g_list_length(settings.presets);
@@ -299,7 +301,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
g_assert(cnt + 6 == g_list_length(menuitems));
-@@ -683,7 +685,7 @@ void rec_button_clicked_cb(GtkButton *bu
+@@ -683,7 +685,7 @@
strftime(time_str, 100, _("%B-%d-%Y_%H-%M-%S"), localtime(&t));
if (mom_ps < 0) {
@@ -308,7 +310,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
} else {
g_assert(mom_ps < g_list_length(settings.presets));
preset* ps = g_list_nth_data(settings.presets, mom_ps);
-@@ -797,7 +799,7 @@ void display_help_cb(char *topic)
+@@ -797,7 +799,7 @@
void toggle_mainwindow_visibility(GtkWidget *app)
{
static gint posx, posy;
@@ -317,7 +319,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
{
gtk_window_get_position(GTK_WINDOW(app), &posx, &posy);
gtk_widget_hide(app);
-@@ -813,6 +815,7 @@ void toggle_mainwindow_visibility(GtkWid
+@@ -813,6 +815,7 @@
GtkWidget* gnome_radio_gui(void)
{
GtkWidget *app;
@@ -325,7 +327,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
GtkWidget *prefs_button, *quit_button, *scfw_button, *scbw_button;
GtkWidget *stfw_button, *stbw_button, *about_button, *rec_button;
GtkWidget *prefs_pixmap, *quit_pixmap, *scfw_pixmap, *scbw_pixmap;
-@@ -901,10 +904,11 @@ GtkWidget* gnome_radio_gui(void)
+@@ -901,10 +904,11 @@
/*gtk_widget_set_size_request(freq_scale, 160, -1);*/
gtk_widget_realize(app);
@@ -340,7 +342,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
vseparator1 = gtk_vseparator_new();
vseparator2 = gtk_vseparator_new();
-@@ -993,7 +997,7 @@ GtkWidget* gnome_radio_gui(void)
+@@ -993,7 +997,7 @@
gtk_tooltips_set_tip(tooltips, prefs_button, _("Edit your Preferences"), NULL);
gtk_tooltips_set_tip(tooltips, mute_button, _("Adjust the Volume"), NULL);
gtk_tooltips_set_tip(tooltips, quit_button, _("Quit"), NULL);
@@ -349,7 +351,7 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
gtk_tooltips_set_tip(tooltips, freq_scale, text, NULL);
g_free(text);
/* text = g_strdup_printf(_("Volume: %d%%"), (gint)volume->value);
-@@ -1206,7 +1210,7 @@ int main(int argc, char* argv[])
+@@ -1206,7 +1210,7 @@
return 0;
}
@@ -358,10 +360,11 @@ diff -up gnomeradio-1.8/src/gui.c.gtk gn
{
GtkWidget *dialog;
-diff -up gnomeradio-1.8/src/prefs.c.gtk gnomeradio-1.8/src/prefs.c
---- gnomeradio-1.8/src/prefs.c.gtk 2010-08-11 20:55:53.000000000 +0200
-+++ gnomeradio-1.8/src/prefs.c 2010-08-12 01:06:06.886442378 +0200
-@@ -60,7 +60,7 @@ gboolean save_settings(void)
+Index: b/src/prefs.c
+===================================================================
+--- a/src/prefs.c 2012-12-03 10:14:53.262899857 +0000
++++ b/src/prefs.c 2012-12-03 10:14:53.478899850 +0000
+@@ -60,7 +60,7 @@
gconf_client_set_string(client, "/apps/gnomeradio/mixer-device", settings.mixer_dev, NULL);
gconf_client_set_bool(client, "/apps/gnomeradio/mute-on-exit", settings.mute_on_exit, NULL);
/*gconf_client_set_float(client, "/apps/gnomeradio/volume", volume->value, NULL);*/
@@ -370,7 +373,7 @@ diff -up gnomeradio-1.8/src/prefs.c.gtk
/* Store recording settings */
/* gconf_client_set_string(client, "/apps/gnomeradio/recording/audiodevice", rec_settings.audiodevice, NULL);
-@@ -128,9 +128,9 @@ gboolean load_settings(void)
+@@ -128,9 +128,9 @@
/*volume->value = gconf_client_get_float(client, "/apps/gnomeradio/volume", NULL);*/
freq = gconf_client_get_float(client, "/apps/gnomeradio/last-freq", NULL);
if ((freq < FREQ_MIN) || (freq > FREQ_MAX))
@@ -382,7 +385,7 @@ diff -up gnomeradio-1.8/src/prefs.c.gtk
/* Load recording settings */
/* rec_settings.audiodevice = gconf_client_get_string(client, "/apps/gnomeradio/recording/audiodevice", NULL);
-@@ -299,7 +299,7 @@ static void add_button_clicked_cb(GtkWid
+@@ -299,7 +299,7 @@
ps = malloc(sizeof(preset));
ps->title = g_strdup(_("unnamed"));
@@ -391,7 +394,7 @@ diff -up gnomeradio-1.8/src/prefs.c.gtk
settings.presets = g_list_append(settings.presets, (gpointer) ps);
buffer = g_strdup_printf("%.2f", ps->freq);
-@@ -310,14 +310,14 @@ static void add_button_clicked_cb(GtkWid
+@@ -310,14 +310,14 @@
gtk_tree_selection_unselect_all(selection);
v_scb = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(list_view));
@@ -408,7 +411,7 @@ diff -up gnomeradio-1.8/src/prefs.c.gtk
menuitem = gtk_menu_item_new_with_label(ps->title);
gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, mom_ps);
-@@ -366,7 +366,7 @@ static void del_button_clicked_cb(GtkWid
+@@ -366,7 +366,7 @@
if (!g_list_length(settings.presets)) mom_ps = -1;
preset_combo_set_item(mom_ps);
@@ -417,7 +420,7 @@ diff -up gnomeradio-1.8/src/prefs.c.gtk
g_assert(*row < g_list_length(menuitems));
menuitem = g_list_nth_data(menuitems, *row);
gtk_widget_destroy(menuitem);
-@@ -432,7 +432,7 @@ static void name_cell_edited_cb(GtkCellR
+@@ -432,7 +432,7 @@
mom_ps = *row;
preset_combo_set_item(mom_ps);
@@ -426,7 +429,7 @@ diff -up gnomeradio-1.8/src/prefs.c.gtk
g_assert(mom_ps < g_list_length(menuitems));
menuitem = g_list_nth_data(menuitems, mom_ps);
gtk_widget_destroy(menuitem);
-@@ -546,7 +546,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+@@ -546,7 +546,7 @@
box = gtk_vbox_new(FALSE, 18);
gtk_container_set_border_width(GTK_CONTAINER(box), 12);
@@ -435,7 +438,7 @@ diff -up gnomeradio-1.8/src/prefs.c.gtk
settings_box = gtk_vbox_new(FALSE, 6);
gtk_box_pack_start(GTK_BOX(box), settings_box, TRUE, TRUE, 0);
-@@ -653,17 +653,17 @@ GtkWidget* prefs_window(GtkWidget *app)
+@@ -653,17 +653,17 @@
gtk_tree_selection_set_select_function(selection, (GtkTreeSelectionFunc)list_view_select_cb, NULL, NULL);*/
cellrenderer = gtk_cell_renderer_text_new();
@@ -458,10 +461,11 @@ diff -up gnomeradio-1.8/src/prefs.c.gtk
list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
g_signal_connect(GTK_OBJECT(cellrenderer), "edited", GTK_SIGNAL_FUNC(freq_cell_edited_cb), NULL);
-diff -up gnomeradio-1.8/src/record.c.gtk gnomeradio-1.8/src/record.c
---- gnomeradio-1.8/src/record.c.gtk 2007-02-25 00:33:36.000000000 +0100
-+++ gnomeradio-1.8/src/record.c 2010-08-12 01:06:48.684444252 +0200
-@@ -57,7 +57,7 @@ static gboolean timeout_cb(gpointer data
+Index: b/src/record.c
+===================================================================
+--- a/src/record.c 2012-12-03 10:14:50.018899953 +0000
++++ b/src/record.c 2012-12-03 10:14:53.478899850 +0000
+@@ -57,7 +57,7 @@
g_assert(recording);
@@ -470,9 +474,10 @@ diff -up gnomeradio-1.8/src/record.c.gtk
gtk_widget_show_all(status_dialog);
s = get_file_size(recording->filename);
-diff -up gnomeradio-1.8/src/trayicon.c.gtk gnomeradio-1.8/src/trayicon.c
---- gnomeradio-1.8/src/trayicon.c.gtk 2008-09-13 17:49:07.000000000 +0200
-+++ gnomeradio-1.8/src/trayicon.c 2010-08-12 01:08:27.198692723 +0200
+Index: b/src/trayicon.c
+===================================================================
+--- a/src/trayicon.c 2012-12-03 10:14:50.018899953 +0000
++++ b/src/trayicon.c 2012-12-03 10:14:53.478899850 +0000
@@ -22,6 +22,7 @@
#include
#include "gui.h"
@@ -481,7 +486,7 @@ diff -up gnomeradio-1.8/src/trayicon.c.g
extern GtkAdjustment *adj;
extern GtkTooltips *tooltips;
-@@ -141,7 +142,7 @@ void create_tray_icon(GtkWidget *app)
+@@ -141,7 +142,7 @@
g_signal_connect(G_OBJECT(tray_icon), "popup-menu",
G_CALLBACK(tray_popup_menu), (gpointer)app);
diff -pruN 1.8-2/debian/patches/gnomeradio-gtk_stock.patch 1.8-2ubuntu32/debian/patches/gnomeradio-gtk_stock.patch
--- 1.8-2/debian/patches/gnomeradio-gtk_stock.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-gtk_stock.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,1016 @@
+Description: Drop GtkStock usage.
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/trayicon.c
+===================================================================
+--- gnomeradio-1.8.orig/src/trayicon.c
++++ gnomeradio-1.8/src/trayicon.c
+@@ -65,6 +65,7 @@ void preset_menuitem_activate_cb(GtkMenu
+ }
+
+ void create_tray_menu(GtkWidget *app) {
++ GtkWidget *menuitem;
+ GList *node = settings.presets;
+ int i;
+
+@@ -73,7 +74,7 @@ void create_tray_menu(GtkWidget *app) {
+ for (i = 0; node; i++, node = node->next)
+ {
+ preset *ps = (preset*)node->data;
+- GtkWidget *menuitem = gtk_menu_item_new_with_label(ps->title);
++ menuitem = gtk_menu_item_new_with_label(ps->title);
+
+ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, i);
+ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (i));
+@@ -89,10 +90,10 @@ void create_tray_menu(GtkWidget *app) {
+ g_signal_connect(G_OBJECT(mute_menuitem), "toggled", (GCallback)mute_menuitem_toggled_cb, (gpointer)app);
+ gtk_widget_show(mute_menuitem);
+
+- GtkWidget *record_menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_RECORD, NULL);
+- gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), record_menuitem);
+- g_signal_connect(G_OBJECT(record_menuitem), "activate", (GCallback)record_menuitem_activate_cb, app);
+- gtk_widget_show(record_menuitem);
++ menuitem = gtk_menu_item_new_with_mnemonic (_("_Record"));
++ gtk_menu_shell_append (GTK_MENU_SHELL (tray_menu), menuitem);
++ g_signal_connect (G_OBJECT (menuitem), "activate", (GCallback)record_menuitem_activate_cb, app);
++ gtk_widget_show (menuitem);
+
+ gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), gtk_separator_menu_item_new());
+
+@@ -103,10 +104,10 @@ void create_tray_menu(GtkWidget *app) {
+ g_signal_connect(G_OBJECT(showwindow_menuitem), "activate", (GCallback)showwindow_menuitem_toggled_cb, (gpointer)app);
+ gtk_widget_show(showwindow_menuitem);
+
+- GtkWidget *quit_menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
+- gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), quit_menuitem);
+- g_signal_connect(G_OBJECT(quit_menuitem), "activate", (GCallback)quit_menuitem_activate_cb, NULL);
+- gtk_widget_show(quit_menuitem);
++ menuitem = gtk_menu_item_new_with_mnemonic (_("_Quit"));
++ gtk_menu_shell_append (GTK_MENU_SHELL (tray_menu), menuitem);
++ g_signal_connect (G_OBJECT (menuitem), "activate", (GCallback)quit_menuitem_activate_cb, NULL);
++ gtk_widget_show (menuitem);
+
+ gtk_widget_show_all(tray_menu);
+ }
+@@ -135,10 +136,8 @@ void create_tray_icon(GtkWidget *app)
+ tray_icon = G_OBJECT(gtk_status_icon_new_from_pixbuf(pixbuf));
+ g_object_unref(pixbuf);
+
+- g_signal_connect(G_OBJECT(tray_icon), "activate",
+- G_CALLBACK(tray_activate_cb), (gpointer)app);
+- g_signal_connect(G_OBJECT(tray_icon), "popup-menu",
+- G_CALLBACK(tray_popup_menu), (gpointer)app);
++ g_signal_connect (G_OBJECT(tray_icon), "activate", G_CALLBACK (tray_activate_cb), (gpointer)app);
++ g_signal_connect (G_OBJECT(tray_icon), "popup-menu", G_CALLBACK (tray_popup_menu), (gpointer)app);
+
+ text = g_strdup_printf(_("Gnomeradio - %.2f MHz"), gtk_adjustment_get_value(adj)/STEPS);
+ gtk_status_icon_set_tooltip_text(GTK_STATUS_ICON(tray_icon), text);
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -203,15 +203,14 @@ static gint delete_event_cb(GtkWidget* w
+
+ GtkWidget* record_status_window(Recording *recording)
+ {
+- GtkWidget *btn_label, *btn_pixmap, *button;
+- GtkWidget *vbox, *btn_box, *hbox;
+- GtkWidget *f_lbl, *t_lbl, *s_lbl, *l_lbl;
+- GtkWidget *grid, *r_grid;
+- GtkWidget *title;
++ GtkWidget *vbox;
++ GtkWidget *grid;
+ GtkWidget *image;
+- GtkWidget *level_box;
++ GtkWidget *box;
++ GtkWidget *label;
+ GtkWidget *expander;
+- char *text, *str;
++ GtkWidget *button;
++ gchar *text, *markup;
+
+ status_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title(GTK_WINDOW(status_dialog),_("Gnomeradio recording status"));
+@@ -230,84 +229,86 @@ GtkWidget* record_status_window(Recordin
+ gtk_widget_set_valign(image, GTK_ALIGN_START);
+ gtk_grid_attach(GTK_GRID(grid), image, 0, 0, 1, 3);
+
+- str = g_strdup_printf(_("Recording from station %s"), recording->station);
+- text = g_strdup_printf("%s ", str);
+- g_free(str);
+- title = gtk_label_new(text);
+- g_free(text);
+- gtk_widget_set_halign(title, GTK_ALIGN_START);
+- gtk_label_set_use_markup(GTK_LABEL(title), TRUE);
+- gtk_grid_attach(GTK_GRID(grid), title, 1, 0, 1, 1);
++ label = gtk_label_new (NULL);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ text = g_markup_printf_escaped (_("Recording from station %s"), recording->station);
++ markup = g_strdup_printf ("%s ", text);
++ gtk_label_set_markup (GTK_LABEL (label), markup);
++ g_free (text);
++ g_free (markup);
++ gtk_grid_attach(GTK_GRID(grid), label, 1, 0, 1, 1);
+
+- level_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
++ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ level = gtk_progress_bar_new();
+- gtk_box_pack_start(GTK_BOX(level_box), level, FALSE, TRUE, 0);
+- gtk_grid_attach(GTK_GRID(grid), level_box, 1, 1, 1, 1);
++ gtk_box_pack_start (GTK_BOX (box), level, FALSE, TRUE, 0);
++ gtk_grid_attach (GTK_GRID (grid), box, 1, 1, 1, 1);
+
+ expander = gtk_expander_new(_("Details"));
+ gtk_grid_attach(GTK_GRID(grid), expander, 1, 2, 1, 1);
+
+- r_grid = gtk_grid_new();
+- gtk_grid_set_row_spacing(GTK_GRID(r_grid), 5);
+- gtk_grid_set_column_spacing(GTK_GRID(r_grid), 15);
+- gtk_container_set_border_width(GTK_CONTAINER(r_grid), 5);
+-
+- f_lbl = gtk_label_new(_("Name:"));
+- gtk_widget_set_halign(f_lbl, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(r_grid), f_lbl, 0, 0, 1, 1);
+-
+- t_lbl = gtk_label_new(_("Type:"));
+- gtk_widget_set_halign(t_lbl, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(r_grid), t_lbl, 0, 1, 1, 1);
+-
+- s_lbl = gtk_label_new(_("Size:"));
+- gtk_widget_set_halign(s_lbl, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(r_grid), s_lbl, 0, 2, 1, 1);
+-
+- l_lbl = gtk_label_new(_("Length:"));
+- gtk_widget_set_halign(l_lbl, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(r_grid), l_lbl, 0, 3, 1, 1);
++ gtk_box_pack_start (GTK_BOX(vbox), grid, TRUE, TRUE, 0);
++
++ grid = gtk_grid_new ();
++ gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
++ gtk_grid_set_column_spacing (GTK_GRID (grid), 15);
++ gtk_container_set_border_width (GTK_CONTAINER (grid), 5);
++
++ label = gtk_label_new (_("Name:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
++
++ label = gtk_label_new (_("Type:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
++
++ label = gtk_label_new (_("Size:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
++
++ label = gtk_label_new (_("Length:"));
++ gtk_widget_set_halign(label, GTK_ALIGN_START);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 3, 1, 1);
+
+ file_lbl = gtk_label_new(NULL);
+ gtk_label_set_ellipsize(GTK_LABEL(file_lbl), PANGO_ELLIPSIZE_START);
+ gtk_widget_set_halign(file_lbl, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(r_grid), file_lbl, 1, 0, 1, 1);
++ gtk_grid_attach (GTK_GRID (grid), file_lbl, 1, 0, 1, 1);
+
+ type_lbl = gtk_label_new(NULL);
+ gtk_widget_set_halign(type_lbl, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(r_grid), type_lbl, 1, 1, 1, 1);
++ gtk_grid_attach (GTK_GRID (grid), type_lbl, 1, 1, 1, 1);
+
+ size_lbl = gtk_label_new(NULL);
+ gtk_widget_set_halign(size_lbl, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(r_grid), size_lbl, 1, 2, 1, 1);
++ gtk_grid_attach (GTK_GRID (grid), size_lbl, 1, 2, 1, 1);
+
+ length_lbl = gtk_label_new(NULL);
+ gtk_widget_set_halign(length_lbl, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(r_grid), length_lbl, 1, 3, 1, 1);
++ gtk_grid_attach (GTK_GRID (grid), length_lbl, 1, 3, 1, 1);
+
+- gtk_container_add(GTK_CONTAINER(expander), r_grid);
++ gtk_container_add (GTK_CONTAINER (expander), grid);
+
+- button = gtk_button_new();
+- btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+- btn_label = gtk_label_new(_("Stop Recording"));
+- btn_pixmap = gtk_image_new_from_stock(GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON);
+-
+- gtk_box_pack_start (GTK_BOX(btn_box), btn_pixmap, FALSE, FALSE, 2);
+- gtk_box_pack_start (GTK_BOX(btn_box), btn_label, FALSE, FALSE, 2);
++ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+
+- gtk_container_add(GTK_CONTAINER(button), btn_box);
++ button = gtk_button_new ();
++ label = gtk_label_new (_("Stop Recording"));
++ image = gtk_image_new_from_icon_name ("process-stop", GTK_ICON_SIZE_BUTTON);
+
+- hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+- gtk_box_pack_end (GTK_BOX(hbox), button, TRUE, FALSE, 0);
++ gtk_box_pack_start (GTK_BOX(box), image, FALSE, FALSE, 2);
++ gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 2);
++
++ gtk_container_add(GTK_CONTAINER(button), box);
+
+- gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
++ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
++
++ gtk_box_pack_end (GTK_BOX (box), button, TRUE, FALSE, 0);
++ gtk_box_pack_start (GTK_BOX(vbox), box, FALSE, FALSE, 0);
+
+ gtk_container_add(GTK_CONTAINER(status_dialog), vbox);
+ gtk_widget_grab_focus (button);
+
+- g_signal_connect(G_OBJECT(status_dialog), "delete_event", G_CALLBACK(delete_event_cb), recording);
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(stop_rec_button_clicked_cb), recording);
++ g_signal_connect(G_OBJECT(status_dialog), "delete_event", G_CALLBACK(delete_event_cb), recording);
+ g_signal_connect(G_OBJECT(status_dialog), "key-press-event", G_CALLBACK(key_press_event_cb), recording);
+
+ gtk_window_set_position(GTK_WINDOW(status_dialog), GTK_WIN_POS_CENTER);
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -38,14 +38,19 @@ extern gnomeradio_settings settings;
+
+ extern gboolean main_visible;
+
+-static GtkWidget *device_entry, *mixer_entry;
++static GtkWidget *device_entry;
++static GtkWidget *mixer_entry;
+ static GtkWidget *mute_on_exit_cb;
+-static GtkWidget *save_button, *move_up_button, *move_down_button, *add_button, *remove_button;
+-static GtkWidget *audio_profile_combo;
+-static GtkWidget *install_plugins_button;
+ static GtkWidget *list_view;
+ static GtkListStore *list_store;
+ static GtkTreeSelection *selection;
++static GtkWidget *save_button;
++static GtkWidget *move_up_button;
++static GtkWidget *move_down_button;
++static GtkWidget *add_button;
++static GtkWidget *remove_button;
++static GtkWidget *audio_profile_combo;
++static GtkWidget *install_button;
+
+ gboolean save_settings(void)
+ {
+@@ -303,12 +308,12 @@ static void audio_profile_combo_change_c
+
+ /* indicate whether additional plugins are required to encode in this format */
+ if (rb_gst_check_missing_plugins (profile, NULL, NULL)) {
+- gtk_widget_set_visible (install_plugins_button, TRUE);
++ gtk_widget_set_visible (install_button, TRUE);
+
+- gtk_widget_set_sensitive (install_plugins_button,
++ gtk_widget_set_sensitive (install_button,
+ gst_install_plugins_supported ());
+ } else {
+- gtk_widget_set_visible (install_plugins_button, FALSE);
++ gtk_widget_set_visible (install_button, FALSE);
+ }
+ g_free (media_type);
+ }
+@@ -915,11 +920,11 @@ static void save_to_file_cb(GtkWidget *b
+ GtkFileFilter *file_filter_xml;
+ gchar *filename;
+
+- dialog = gtk_file_chooser_dialog_new("Select file name\xE2\x80\xA6", NULL,
+- GTK_FILE_CHOOSER_ACTION_SAVE,
+- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+- GTK_STOCK_CANCEL,
+- GTK_RESPONSE_CANCEL, NULL);
++ dialog = gtk_file_chooser_dialog_new (_("Select file name\xE2\x80\xA6"), NULL,
++ GTK_FILE_CHOOSER_ACTION_SAVE,
++ _("_Save"), GTK_RESPONSE_ACCEPT,
++ _("_Cancel"), GTK_RESPONSE_CANCEL,
++ NULL);
+
+ file_filter_all = gtk_file_filter_new();
+ gtk_file_filter_set_name(file_filter_all, _("All Files"));
+@@ -1136,11 +1141,11 @@ static void load_from_file_cb(GtkWidget
+ GtkFileFilter *file_filter_xml;
+ gchar *filename;
+
+- dialog = gtk_file_chooser_dialog_new("Select file name\xE2\x80\xA6", NULL,
+- GTK_FILE_CHOOSER_ACTION_OPEN,
+- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+- GTK_STOCK_CANCEL,
+- GTK_RESPONSE_CANCEL, NULL);
++ dialog = gtk_file_chooser_dialog_new (_("Select file name\xE2\x80\xA6"), NULL,
++ GTK_FILE_CHOOSER_ACTION_OPEN,
++ _("_Open"), GTK_RESPONSE_ACCEPT,
++ _("_Cancel"), GTK_RESPONSE_CANCEL,
++ NULL);
+
+ file_filter_all = gtk_file_filter_new();
+ gtk_file_filter_set_name(file_filter_all, _("All Files"));
+@@ -1186,38 +1191,39 @@ gboolean action_mode (gint mode)
+ GtkWidget* prefs_window(GtkWidget *app)
+ {
+ GtkWidget *dialog;
++ GtkWidget *content_area;
+ GtkWidget *box;
+ GtkWidget *grid;
+- GtkWidget *settings_label, *presets_label, *record_label;
+- GtkWidget *s_indent_label, *p_indent_label, *r_indent_label;
+- GtkWidget *destination_label;
+- GtkWidget *destination_button;
+- GtkWidget *audio_profile_label;
+- GtkWidget *device_label, *mixer_label;
+- GtkWidget *button_box;
+- GtkWidget *open_button;
++ GtkWidget *label;
+ GtkWidget *scrolled_window;
+ GtkCellRenderer *cellrenderer;
+ GtkTreeViewColumn *list_column;
++ GtkWidget *button_box;
++ GtkWidget *open_button;
++ GtkWidget *destination_button;
++ GtkWidget *image;
+
+ GstEncodingProfile *profile;
++
+ gint i;
+- char *settings_hdr, *presets_hdr, *record_hdr;
++ gchar *markup;
+ preset* ps;
+ GList *l;
+
+- dialog = gtk_dialog_new_with_buttons(_("Gnomeradio Settings"), GTK_WINDOW(app),
+- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+- GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+- GTK_STOCK_HELP, GTK_RESPONSE_HELP,
+- NULL);
++ dialog = gtk_dialog_new_with_buttons (_("Gnomeradio Settings"), GTK_WINDOW (app),
++ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
++ _("_Close"), GTK_RESPONSE_CLOSE,
++ _("_Help"), GTK_RESPONSE_HELP,
++ NULL);
+
+ gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
+ gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
+
++ content_area = gtk_dialog_get_content_area (GTK_DIALOG(dialog));
++
+ box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
+ gtk_container_set_border_width(GTK_CONTAINER(box), 10);
+- gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), box, TRUE, TRUE, 0);
++ gtk_box_pack_start (GTK_BOX (content_area), box, TRUE, TRUE, 0);
+
+ grid = gtk_grid_new();
+ gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
+@@ -1225,29 +1231,30 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_box_pack_start(GTK_BOX(box), grid, TRUE, TRUE, 0);
+
+ /* The general settings part */
+- settings_hdr = g_strconcat("", _("General Settings"), " ", NULL);
+- settings_label = gtk_label_new(settings_hdr);
+- gtk_widget_set_halign(settings_label, GTK_ALIGN_START);
+- gtk_label_set_use_markup(GTK_LABEL(settings_label), TRUE);
+- g_free(settings_hdr);
+- gtk_grid_attach(GTK_GRID(grid), settings_label, 0, 0, 2, 1);
++ label = gtk_label_new (NULL);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ markup = g_strdup_printf ("%s ", _("General Settings"));
++ gtk_label_set_markup (GTK_LABEL (label), markup);
++ g_free (markup);
++ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 2, 1);
++
++ label = gtk_label_new ("");
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 3);
++
++ label = gtk_label_new (_("Radio Device:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_grid_attach (GTK_GRID (grid), label, 1, 1, 1, 1);
+
+- s_indent_label = gtk_label_new("");
+- gtk_grid_attach(GTK_GRID(grid), s_indent_label, 0, 1, 1, 3);
+-
+- device_label = gtk_label_new(_("Radio Device:"));
+- gtk_widget_set_halign(device_label, GTK_ALIGN_START);
+ device_entry = gtk_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(device_entry), settings.device);
+- gtk_grid_attach(GTK_GRID(grid), device_label, 1, 1, 1, 1);
+ gtk_grid_attach(GTK_GRID(grid), device_entry, 2, 1, 1, 1);
+
+- mixer_label = gtk_label_new(_("Mixer Source:"));
+- gtk_widget_set_halign(mixer_label, GTK_ALIGN_START);
++ label = gtk_label_new (_("Mixer Source:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_grid_attach (GTK_GRID (grid), label, 1, 2, 1, 1);
++
+ mixer_entry = gtk_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(mixer_entry), settings.mixer);
+-
+- gtk_grid_attach(GTK_GRID(grid), mixer_label, 1, 2, 1, 1);
+ gtk_grid_attach(GTK_GRID(grid), mixer_entry, 2, 2, 1, 1);
+
+ mute_on_exit_cb = gtk_check_button_new_with_label(_("Mute on exit"));
+@@ -1266,15 +1273,15 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_widget_set_tooltip_text(mute_on_exit_cb, _("Mute radio device on exit"));
+
+ /* The presets part */
+- presets_hdr = g_strconcat("", _("Presets"), " ", NULL);
+- presets_label = gtk_label_new(presets_hdr);
+- gtk_widget_set_halign(presets_label, GTK_ALIGN_START);
+- gtk_label_set_use_markup(GTK_LABEL(presets_label), TRUE);
+- g_free(presets_hdr);
+- gtk_grid_attach(GTK_GRID(grid), presets_label, 0, 4, 2, 1);
++ label = gtk_label_new (NULL);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ markup = g_strdup_printf ("%s ", _("Presets"));
++ gtk_label_set_markup (GTK_LABEL (label), markup);
++ g_free (markup);
++ gtk_grid_attach(GTK_GRID(grid), label, 0, 4, 2, 1);
+
+- p_indent_label = gtk_label_new("");
+- gtk_grid_attach(GTK_GRID(grid), p_indent_label, 0, 5, 1, 2);
++ label = gtk_label_new ("");
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 5, 1, 2);
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolled_window), 75);
+@@ -1337,7 +1344,8 @@ GtkWidget* prefs_window(GtkWidget *app)
+ button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+ move_up_button = gtk_button_new();
+- gtk_button_set_image(GTK_BUTTON(move_up_button), gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU));
++ image = gtk_image_new_from_icon_name ("go-up", GTK_ICON_SIZE_MENU);
++ gtk_button_set_image (GTK_BUTTON (move_up_button), image);
+ gtk_button_set_relief (GTK_BUTTON (move_up_button), GTK_RELIEF_NONE);
+ gtk_widget_set_sensitive(move_up_button, FALSE);
+ gtk_widget_set_tooltip_text(move_up_button, _("Move preset up"));
+@@ -1345,7 +1353,8 @@ GtkWidget* prefs_window(GtkWidget *app)
+ g_signal_connect(G_OBJECT(move_up_button), "clicked", G_CALLBACK(move_up_button_clicked_cb), NULL);
+
+ move_down_button = gtk_button_new();
+- gtk_button_set_image(GTK_BUTTON(move_down_button), gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU));
++ image = gtk_image_new_from_icon_name ("go-down", GTK_ICON_SIZE_MENU);
++ gtk_button_set_image (GTK_BUTTON (move_down_button), image);
+ gtk_button_set_relief (GTK_BUTTON (move_down_button), GTK_RELIEF_NONE);
+ gtk_widget_set_sensitive(move_down_button, FALSE);
+ gtk_widget_set_tooltip_text(move_down_button, _("Move preset down"));
+@@ -1353,14 +1362,16 @@ GtkWidget* prefs_window(GtkWidget *app)
+ g_signal_connect(G_OBJECT(move_down_button), "clicked", G_CALLBACK(move_down_button_clicked_cb), NULL);
+
+ add_button = gtk_button_new();
+- gtk_button_set_image(GTK_BUTTON(add_button), gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU));
++ image = gtk_image_new_from_icon_name ("list-add", GTK_ICON_SIZE_MENU);
++ gtk_button_set_image (GTK_BUTTON(add_button), image);
+ gtk_button_set_relief (GTK_BUTTON (add_button), GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(add_button, _("Add preset"));
+
+ g_signal_connect(G_OBJECT(add_button), "clicked", G_CALLBACK(add_button_clicked_cb), NULL);
+
+ remove_button = gtk_button_new();
+- gtk_button_set_image(GTK_BUTTON(remove_button), gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU));
++ image = gtk_image_new_from_icon_name ("list-remove", GTK_ICON_SIZE_MENU);
++ gtk_button_set_image (GTK_BUTTON (remove_button), image);
+ gtk_button_set_relief (GTK_BUTTON (remove_button), GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(remove_button, _("Remove preset"));
+ gtk_widget_set_sensitive(remove_button, FALSE);
+@@ -1368,20 +1379,21 @@ GtkWidget* prefs_window(GtkWidget *app)
+ g_signal_connect(G_OBJECT(remove_button), "clicked", G_CALLBACK(remove_button_clicked_cb), NULL);
+
+ save_button = gtk_button_new();
+- gtk_button_set_image(GTK_BUTTON(save_button), gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU));
++ image = gtk_image_new_from_icon_name ("document-save", GTK_ICON_SIZE_MENU);
++ gtk_button_set_image (GTK_BUTTON (save_button), image);
+ gtk_button_set_relief (GTK_BUTTON (save_button), GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(save_button, _("Save to file\xE2\x80\xA6"));
+
+- if (settings.presets == NULL) {
+- gtk_widget_set_sensitive(save_button, FALSE);
+- } else {
+- gtk_widget_set_sensitive(save_button, TRUE);
+- }
++ if (settings.presets == NULL)
++ gtk_widget_set_sensitive (save_button, FALSE);
++ else
++ gtk_widget_set_sensitive (save_button, TRUE);
+
+ g_signal_connect(G_OBJECT(save_button), "clicked", G_CALLBACK(save_to_file_cb), NULL);
+
+ open_button = gtk_button_new();
+- gtk_button_set_image(GTK_BUTTON(open_button), gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU));
++ image = gtk_image_new_from_icon_name ("document-open", GTK_ICON_SIZE_MENU);
++ gtk_button_set_image (GTK_BUTTON(open_button), image);
+ gtk_button_set_relief (GTK_BUTTON (open_button), GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(open_button, _("Load from file\xE2\x80\xA6"));
+ gtk_widget_set_sensitive(open_button, TRUE);
+@@ -1398,49 +1410,48 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_grid_attach(GTK_GRID(grid), button_box, 2, 7, 1, 1);
+
+ /* The record settings part */
+- record_hdr = g_strconcat("", _("Record Settings"), " ", NULL);
+- record_label = gtk_label_new(record_hdr);
+- gtk_widget_set_halign(record_label, GTK_ALIGN_START);
+- gtk_label_set_use_markup(GTK_LABEL(record_label), TRUE);
+- g_free(record_hdr);
+- gtk_grid_attach(GTK_GRID(grid), record_label, 0, 8, 2, 1);
++ label = gtk_label_new (NULL);
++ markup = g_strdup_printf ("%s ", _("Record Settings"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_label_set_markup (GTK_LABEL (label), markup);
++ g_free (markup);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 8, 2, 1);
++
++ label = gtk_label_new ("");
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 9, 1, 2);
++
++ label = gtk_label_new (_("Destination:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(grid), label, 1, 9, 1, 1);
+
+- r_indent_label = gtk_label_new("");
+- gtk_grid_attach(GTK_GRID(grid), r_indent_label, 0, 9, 1, 2);
++ destination_button = gtk_file_chooser_button_new (_("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
++ gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(destination_button), rec_settings.destination);
++ gtk_grid_attach(GTK_GRID(grid), destination_button, 2, 9, 1, 1);
+
+- destination_label = gtk_label_new(_("Destination:"));
+- gtk_widget_set_halign(destination_label, GTK_ALIGN_START);
++ label = gtk_label_new (_("Format:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_grid_attach (GTK_GRID (grid), label, 1, 10, 1, 1);
+
+- destination_button = gtk_file_chooser_button_new(
+- _("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+- gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(destination_button), rec_settings.destination);
+-
+- audio_profile_label = gtk_label_new(_("Format:"));
+- gtk_widget_set_halign(audio_profile_label, GTK_ALIGN_START);
+ audio_profile_combo = audio_profile_choose_new();
+ audio_profile_chooser_set_active(audio_profile_combo, rec_settings.profile);
++ gtk_grid_attach (GTK_GRID (grid), audio_profile_combo, 2, 10, 1, 1);
+
+- install_plugins_button = gtk_button_new_with_label(_("Install additional software required to use this format\xE2\x80\xA6"));
+- gtk_widget_set_no_show_all (install_plugins_button, TRUE);
++ install_button = gtk_button_new_with_label(_("Install additional software required to use this format\xE2\x80\xA6"));
++ gtk_widget_set_no_show_all (install_button, TRUE);
++ gtk_grid_attach (GTK_GRID (grid), install_button, 2, 11, 1, 1);
+
+ profile = rb_gst_get_encoding_profile (rec_settings.profile);
+ if (rb_gst_check_missing_plugins (profile, NULL, NULL)) {
+- gtk_widget_set_visible (install_plugins_button, TRUE);
+- gtk_widget_set_sensitive (install_plugins_button,
++ gtk_widget_set_visible (install_button, TRUE);
++ gtk_widget_set_sensitive (install_button,
+ gst_install_plugins_supported ());
+ } else {
+- gtk_widget_set_visible (install_plugins_button, FALSE);
++ gtk_widget_set_visible (install_button, FALSE);
+ }
+
+- gtk_grid_attach(GTK_GRID(grid), destination_label, 1, 9, 1, 1);
+- gtk_grid_attach(GTK_GRID(grid), destination_button, 2, 9, 1, 1);
+- gtk_grid_attach(GTK_GRID(grid), audio_profile_label, 1, 10, 1, 1);
+- gtk_grid_attach(GTK_GRID(grid), audio_profile_combo, 2, 10, 1, 1);
+- gtk_grid_attach(GTK_GRID(grid), install_plugins_button, 2, 11, 1, 1);
+-
+ g_signal_connect(GTK_FILE_CHOOSER(destination_button), "selection-changed", G_CALLBACK(destination_button_clicked_cb), NULL);
+ g_signal_connect(G_OBJECT(audio_profile_combo), "changed", G_CALLBACK(audio_profile_combo_change_cb), NULL);
+- g_signal_connect(G_OBJECT(install_plugins_button), "clicked", G_CALLBACK(audio_profile_install_plugins_cb), NULL);
++ g_signal_connect(G_OBJECT(install_button), "clicked", G_CALLBACK(audio_profile_install_plugins_cb), NULL);
+
+ gtk_widget_set_tooltip_text(destination_button, _("Select a location where to save recorded file."));
+ gtk_widget_set_tooltip_text(audio_profile_combo, _("Choose the format that should be used for recording."));
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -65,23 +65,31 @@ char *alsa_capture = NULL;
+ int alsa_latency = DEFAULT_LATENCY;
+ int alsa_debug = 0;
+
+-GtkWidget* volume_button, *preset_combo;
+-GtkAdjustment *adj;
+-GtkWidget* app;
+-
+ int mom_ps;
+ gnomeradio_settings settings;
+
+ gboolean main_visible;
+
++GtkWidget *app;
++GtkWidget *preset_combo;
++GtkAdjustment *adj;
++GtkWidget *volume_button;
++
+ static GtkWidget *drawing_area;
+-static GdkPixbuf *digits, *signal_s, *stereo;
++static GdkPixbuf *digits;
++static GdkPixbuf *signal_s;
++static GdkPixbuf *stereo;
+ static GtkWidget *freq_scale;
+-static GtkWidget *scfw_button, *scbw_button, *stfw_button, *stbw_button;
++static GtkWidget *scbw_button;
++static GtkWidget *stbw_button;
++static GtkWidget *stfw_button;
++static GtkWidget *scfw_button;
+ static GtkWidget *rec_button;
+ static GtkWidget *prefs_button;
+
+-static int timeout_id, bp_timeout_id = -1, bp_timeout_steps = 0;
++static int timeout_id;
++static int bp_timeout_id = -1;
++static int bp_timeout_steps = 0;
+ static int volume_value_changed_id;
+ static gint mode;
+
+@@ -165,7 +173,7 @@ static void initial_frequency_scan(GtkWi
+ data.dialog = gtk_dialog_new_with_buttons (_("Scanning"),
+ GTK_WINDOW (app),
+ DIALOG_FLAGS,
+- GTK_STOCK_CANCEL,
++ _("_Cancel"),
+ GTK_RESPONSE_CANCEL,
+ NULL);
+
+@@ -570,7 +578,7 @@ static void adj_value_changed_cb(GtkAdju
+ else
+ buffer = g_strdup_printf(_("Gnomeradio - %.2f MHz"), freq);
+ gtk_window_set_title(GTK_WINDOW(window), buffer);
+- if (tray_icon) gtk_status_icon_set_tooltip_text(GTK_STATUS_ICON(tray_icon), buffer); //gtk_tooltips_set_tip(tooltips, tray_icon, buffer, NULL);
++ if (tray_icon) gtk_status_icon_set_tooltip_text(GTK_STATUS_ICON(tray_icon), buffer);
+ g_free(buffer);
+
+ buffer = g_strdup_printf(_("Frequency: %.2f MHz"), freq);
+@@ -1003,194 +1011,184 @@ void toggle_mainwindow_visibility(GtkWid
+ GtkWidget* gnome_radio_gui(void)
+ {
+ GtkWidget *app;
+- GtkWidget *quit_button;
+- GtkWidget *about_button;
+- GtkWidget *prefs_pixmap, *rec_pixmap, *quit_pixmap, *scfw_pixmap, *scbw_pixmap;
+- GtkWidget *stfw_pixmap, *stbw_pixmap, *about_pixmap;
+- GtkWidget *freq_up_pixmap, *freq_down_pixmap;
+- GdkPixbuf *freq_up_pixbuf, *freq_down_pixbuf;
+- GtkWidget *hbox1, *hbox2, *vbox, *menubox, *freq_vol_box;
+- GtkWidget *vseparator1, *vseparator4;
+- GtkWidget *label;
++ GtkWidget *vbox;
++ GtkWidget *box;
+ GtkWidget *frame;
++ GtkWidget *menubox;
++ GtkWidget *label;
++ GtkWidget *pixmap;
++ GdkPixbuf *pixbuf;
++ GtkWidget *vseparator;
++ GtkWidget *about_button;
++/* GtkWidget *quit_button; */
++ GtkWidget *image;
+ gchar *text;
+
+ app = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+- /* app = gnome_app_new(PACKAGE, _("Gnomeradio")); */
+-
+ gtk_window_set_resizable(GTK_WINDOW(app), FALSE);
+- /*gtk_window_set_policy(GTK_WINDOW(app), FALSE, FALSE, FALSE);*/
+ gtk_window_set_wmclass(GTK_WINDOW(app), "gnomeradio", "Gnomeradio");
+
+- frame = gtk_frame_new(NULL);
+-
+- quit_pixmap = gtk_image_new_from_stock(GTK_STOCK_QUIT, GTK_ICON_SIZE_BUTTON);
+- prefs_pixmap = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_LARGE_TOOLBAR);
+- scfw_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_FORWARD, GTK_ICON_SIZE_LARGE_TOOLBAR);
+- scbw_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_REWIND, GTK_ICON_SIZE_LARGE_TOOLBAR);
+- stfw_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_NEXT, GTK_ICON_SIZE_LARGE_TOOLBAR);
+- stbw_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PREVIOUS, GTK_ICON_SIZE_LARGE_TOOLBAR);
+- about_pixmap = gtk_image_new_from_stock(GTK_STOCK_ABOUT, GTK_ICON_SIZE_LARGE_TOOLBAR);
+- /*mute_pixmap = gtk_image_new_from_stock(GNOME_STOCK_VOLUME, GTK_ICON_SIZE_LARGE_TOOLBAR);*/
+- rec_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_LARGE_TOOLBAR);
+- /*help_pixmap = gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_LARGE_TOOLBAR);*/
+-
+- quit_button = gtk_button_new();
+- prefs_button = gtk_button_new();
+- scfw_button = gtk_button_new();
+- scbw_button = gtk_button_new();
+- stfw_button = gtk_button_new();
+- stbw_button = gtk_button_new();
+- about_button = gtk_button_new();
+- /*volume_button = gtk_toggle_button_new();*/
+- volume_button = gtk_volume_button_new();
+- gtk_button_set_relief(GTK_BUTTON(volume_button), GTK_RELIEF_NORMAL);
+- gtk_widget_set_sensitive(volume_button, FALSE);
+- rec_button = gtk_button_new();
+- /*help_button = gtk_button_new();*/
++ gtk_widget_realize (app);
++ gtk_widget_get_window (app);
++
++ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
++ gtk_container_set_border_width (GTK_CONTAINER(vbox), 3);
+
+- gtk_container_add(GTK_CONTAINER(quit_button), quit_pixmap);
+- gtk_container_add(GTK_CONTAINER(prefs_button), prefs_pixmap);
+- gtk_container_add(GTK_CONTAINER(scfw_button), scfw_pixmap);
+- gtk_container_add(GTK_CONTAINER(scbw_button), scbw_pixmap);
+- gtk_container_add(GTK_CONTAINER(stfw_button), stfw_pixmap);
+- gtk_container_add(GTK_CONTAINER(stbw_button), stbw_pixmap);
+- gtk_container_add(GTK_CONTAINER(about_button), about_pixmap);
+- /*gtk_container_add(GTK_CONTAINER(volume_button), mute_pixmap);*/
+- gtk_container_add(GTK_CONTAINER(rec_button), rec_pixmap);
+- /*gtk_container_add(GTK_CONTAINER(help_button), help_pixmap);*/
+-
+- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+- hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+- hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+- menubox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+- freq_vol_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+-
+- adj = GTK_ADJUSTMENT(gtk_adjustment_new(SUNSHINE*STEPS, FREQ_MIN*STEPS, FREQ_MAX*STEPS+1, 1, STEPS, 1));
+-/* volume = GTK_ADJUSTMENT(gtk_adjustment_new(100, 0, 101, 1, 10, 1)); */
+-
+- preset_combo = gtk_combo_box_text_new();
+- g_signal_connect(G_OBJECT(preset_combo), "changed", G_CALLBACK(preset_combo_change_cb), NULL);
+-
+- gtk_widget_set_size_request(preset_combo, 10, -1);
+- label = gtk_label_new(_("Presets:"));
+-
+- freq_scale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, adj);
+- /*gtk_range_set_update_policy(GTK_RANGE(freq_scale), GTK_UPDATE_DELAYED);*/
+- /*vol_scale = gtk_hscale_new(volume);*/
+-
+- /*vol_up_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)vol_up_xpm);
+- vol_down_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)vol_down_xpm);*/
+- freq_up_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)freq_up_xpm);
+- freq_down_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)freq_down_xpm);
+-
+- /*vol_up_pixmap = gtk_image_new_from_pixbuf(vol_up_pixbuf);
+- vol_down_pixmap = gtk_image_new_from_pixbuf(vol_down_pixbuf);*/
+- freq_up_pixmap = gtk_image_new_from_pixbuf(freq_up_pixbuf);
+- freq_down_pixmap = gtk_image_new_from_pixbuf(freq_down_pixbuf);
++ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+
+- /*gtk_widget_set_usize(freq_scale, 160, 10);*/
+- /*gtk_widget_set_size_request(freq_scale, 160, -1);*/
++ frame = gtk_frame_new (NULL);
++ gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 2);
+
+- gtk_widget_realize(app);
+- gtk_widget_get_window(app);
+ drawing_area = gtk_drawing_area_new();
+-
+- digits = gdk_pixbuf_new_from_xpm_data((const char**)digits_xpm);
+- signal_s = gdk_pixbuf_new_from_xpm_data((const char**)signal_xpm);
+- stereo = gdk_pixbuf_new_from_xpm_data((const char**)stereo_xpm);
+-
+- vseparator1 = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
+- /*vseparator2 = gtk_vseparator_new();*/
+- /*vseparator3 = gtk_vseparator_new();*/
+- vseparator4 = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
+-
+- gtk_scale_set_digits(GTK_SCALE(freq_scale), 0);
+- gtk_scale_set_draw_value(GTK_SCALE(freq_scale), FALSE);
+-/* gtk_scale_set_digits(GTK_SCALE(vol_scale), 0);
+- gtk_scale_set_draw_value(GTK_SCALE(vol_scale), FALSE);
++ gtk_widget_set_size_request(drawing_area, DIGIT_WIDTH*6+10+SIGNAL_WIDTH+STEREO_WIDTH, DIGIT_HEIGTH+10);
+
+- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(volume_button), mixer->get_volume() == 0);*/
++ gtk_container_add (GTK_CONTAINER (frame), drawing_area);
+
+- gtk_widget_set_size_request(drawing_area, DIGIT_WIDTH*6+10+SIGNAL_WIDTH+STEREO_WIDTH, DIGIT_HEIGTH+10);
++ digits = gdk_pixbuf_new_from_xpm_data ((const char**) digits_xpm);
++ signal_s = gdk_pixbuf_new_from_xpm_data ((const char**) signal_xpm);
++ stereo = gdk_pixbuf_new_from_xpm_data ((const char**) stereo_xpm);
++
++ menubox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
++
++ label = gtk_label_new (_("Presets:"));
++
++ preset_combo = gtk_combo_box_text_new ();
++ gtk_widget_set_size_request (preset_combo, 10, -1);
++
++ gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 3);
++ gtk_box_pack_start (GTK_BOX (box), menubox, TRUE, TRUE, 3);
++ gtk_box_pack_start (GTK_BOX (menubox), label, TRUE, TRUE, 0);
++ gtk_box_pack_start (GTK_BOX (menubox), preset_combo, TRUE, TRUE, 0);
++ gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 4);
++
++ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
++
++ pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**) freq_down_xpm);
++ pixmap = gtk_image_new_from_pixbuf (pixbuf);
++
++ gtk_box_pack_start (GTK_BOX(box), pixmap, FALSE, FALSE, 2);
++
++ adj = GTK_ADJUSTMENT (gtk_adjustment_new (SUNSHINE*STEPS, FREQ_MIN*STEPS, FREQ_MAX*STEPS+1, 1, STEPS, 1));
++ freq_scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adj);
++ gtk_scale_set_digits (GTK_SCALE (freq_scale), 0);
++ gtk_scale_set_draw_value (GTK_SCALE (freq_scale), FALSE);
++
++ gtk_box_pack_start (GTK_BOX(box), freq_scale, TRUE, TRUE, 0);
++
++ pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**) freq_up_xpm);
++ pixmap = gtk_image_new_from_pixbuf (pixbuf);
++
++ gtk_box_pack_start (GTK_BOX (box), pixmap, FALSE, FALSE, 2);
++ gtk_box_pack_start (GTK_BOX (vbox), box, TRUE, TRUE, 2);
++
++ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
++
++ scbw_button = gtk_button_new ();
++ image = gtk_image_new_from_icon_name ("media-seek-backward", GTK_ICON_SIZE_LARGE_TOOLBAR);
++ gtk_button_set_image (GTK_BUTTON (scbw_button), image);
++ gtk_button_set_relief (GTK_BUTTON (scbw_button), GTK_RELIEF_NONE);
++
++ gtk_box_pack_start (GTK_BOX (box), scbw_button, FALSE, FALSE, 2);
++
++ stbw_button = gtk_button_new ();
++ image = gtk_image_new_from_icon_name ("media-skip-backward", GTK_ICON_SIZE_LARGE_TOOLBAR);
++ gtk_button_set_image (GTK_BUTTON (stbw_button), image);
++ gtk_button_set_relief (GTK_BUTTON (stbw_button), GTK_RELIEF_NONE);
++
++ gtk_box_pack_start (GTK_BOX (box), stbw_button, FALSE, FALSE, 2);
++
++ stfw_button = gtk_button_new ();
++ image = gtk_image_new_from_icon_name ("media-skip-forward", GTK_ICON_SIZE_LARGE_TOOLBAR);
++ gtk_button_set_image (GTK_BUTTON (stfw_button), image);
++ gtk_button_set_relief (GTK_BUTTON (stfw_button), GTK_RELIEF_NONE);
++
++ gtk_box_pack_start (GTK_BOX (box), stfw_button, FALSE, FALSE, 2);
++
++ scfw_button = gtk_button_new ();
++ image = gtk_image_new_from_icon_name ("media-seek-forward", GTK_ICON_SIZE_LARGE_TOOLBAR);
++ gtk_button_set_image (GTK_BUTTON (scfw_button), image);
++ gtk_button_set_relief (GTK_BUTTON (scfw_button), GTK_RELIEF_NONE);
++
++ gtk_box_pack_start (GTK_BOX (box), scfw_button, FALSE, FALSE, 2);
++
++ vseparator = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
++
++ gtk_box_pack_start (GTK_BOX (box), vseparator, FALSE, FALSE, 2);
++
++ volume_button = gtk_volume_button_new();
++ g_object_set (G_OBJECT (volume_button), "size", GTK_ICON_SIZE_LARGE_TOOLBAR, NULL);
++ g_object_set (G_OBJECT (volume_button), "use-symbolic", FALSE, NULL);
++ gtk_button_set_relief (GTK_BUTTON (volume_button), GTK_RELIEF_NONE);
++ gtk_widget_set_sensitive(volume_button, FALSE);
+
+- gtk_container_add(GTK_CONTAINER(frame), drawing_area);
++ gtk_box_pack_start (GTK_BOX (box), volume_button, FALSE, FALSE, 2);
+
+- gtk_box_pack_start(GTK_BOX(hbox2), scbw_button, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(hbox2), stbw_button, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(hbox2), stfw_button, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(hbox2), scfw_button, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(hbox2), vseparator1, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(hbox2), volume_button, FALSE, FALSE, 2);
+- /*gtk_box_pack_start(GTK_BOX(hbox2), vseparator2, TRUE, TRUE, 3);*/
+- gtk_box_pack_start(GTK_BOX(hbox2), rec_button, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(hbox2), vseparator4, FALSE, FALSE, 2);
+- /*gtk_box_pack_start(GTK_BOX(hbox2), help_button, FALSE, FALSE, 2);*/
+- gtk_box_pack_start(GTK_BOX(hbox2), prefs_button, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(hbox2), about_button, FALSE, FALSE, 2);
+- /*gtk_box_pack_start(GTK_BOX(hbox2), quit_button, FALSE, FALSE, 2);*/
+-
+- gtk_box_pack_start(GTK_BOX(hbox1), frame, FALSE, FALSE, 3);
+- gtk_box_pack_start(GTK_BOX(hbox1), menubox, TRUE, TRUE, 3);
+-
+- gtk_box_pack_start(GTK_BOX(menubox), label, TRUE, TRUE, 0);
+- gtk_box_pack_start(GTK_BOX(menubox), preset_combo, TRUE, TRUE, 0);
+-
+- gtk_box_pack_start(GTK_BOX(freq_vol_box), freq_down_pixmap, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(freq_vol_box), freq_scale, TRUE, TRUE, 0);
+- gtk_box_pack_start(GTK_BOX(freq_vol_box), freq_up_pixmap, FALSE, FALSE, 2);
+- /*gtk_box_pack_start(GTK_BOX(freq_vol_box), vseparator3, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(freq_vol_box), vol_down_pixmap, FALSE, FALSE, 2);
+- gtk_box_pack_start(GTK_BOX(freq_vol_box), vol_scale, TRUE, TRUE, 0);
+- gtk_box_pack_start(GTK_BOX(freq_vol_box), vol_up_pixmap, FALSE, FALSE, 2);*/
+-
+- gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 4);
+- gtk_box_pack_start(GTK_BOX(vbox), freq_vol_box, TRUE, TRUE, 2);
+- gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 4);
+-
+- gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+-
+- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
+- gtk_container_set_border_width(GTK_CONTAINER(frame), 2);
+-
+- /* gnome_app_set_contents(GNOME_APP(app), vbox); */
+-
+- /*status = gnome_appbar_new(FALSE, TRUE, GNOME_PREFERENCES_NEVER);*/
+-
+- /*gnome_app_set_statusbar(GNOME_APP(app), status);*/
+-
+- g_signal_connect(G_OBJECT(app), "delete_event", G_CALLBACK(delete_event_cb), NULL);
+- g_signal_connect(G_OBJECT(quit_button), "clicked", G_CALLBACK(quit_button_clicked_cb), NULL);
+- g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(adj_value_changed_cb), (gpointer) app);
+- volume_value_changed_id = g_signal_connect(G_OBJECT(volume_button), "value-changed", G_CALLBACK(volume_value_changed_cb), NULL);
+- g_signal_connect(G_OBJECT(stfw_button), "pressed", G_CALLBACK(step_button_pressed_cb), (gpointer)TRUE);
+- g_signal_connect(G_OBJECT(stbw_button), "pressed", G_CALLBACK(step_button_pressed_cb), (gpointer)FALSE);
+- g_signal_connect(G_OBJECT(stfw_button), "clicked", G_CALLBACK(step_button_clicked_cb), (gpointer)TRUE);
+- g_signal_connect(G_OBJECT(stbw_button), "clicked", G_CALLBACK(step_button_clicked_cb), (gpointer)FALSE);
+- g_signal_connect(G_OBJECT(stfw_button), "released", G_CALLBACK(step_button_released_cb), NULL);
+- g_signal_connect(G_OBJECT(stbw_button), "released", G_CALLBACK(step_button_released_cb), NULL);
+- g_signal_connect(G_OBJECT(scfw_button), "clicked", G_CALLBACK(scfw_button_clicked_cb), NULL);
+- g_signal_connect(G_OBJECT(scbw_button), "clicked", G_CALLBACK(scbw_button_clicked_cb), NULL);
+- g_signal_connect(G_OBJECT(about_button), "clicked", G_CALLBACK(about_button_clicked_cb), NULL);
+- g_signal_connect(G_OBJECT(rec_button), "clicked", G_CALLBACK(rec_button_clicked_cb), (gpointer) app);
+- g_signal_connect(G_OBJECT(prefs_button), "clicked", G_CALLBACK(prefs_button_clicked_cb), (gpointer) app);
+- g_signal_connect(G_OBJECT(drawing_area), "draw", G_CALLBACK(draw_cb), NULL);
+-
+- gtk_widget_set_tooltip_text(scbw_button, _("Scan Backwards"));
+- gtk_widget_set_tooltip_text(scfw_button, _("Scan Forwards"));
+- gtk_widget_set_tooltip_text(stbw_button, _("0.05 MHz Backwards"));
+- gtk_widget_set_tooltip_text(stfw_button, _("0.05 MHz Forwards"));
+- gtk_widget_set_tooltip_text(about_button, _("About"));
+- gtk_widget_set_tooltip_text(rec_button, _("Record radio as MP3, OGG, FLAC or M4A"));
+- gtk_widget_set_tooltip_text(prefs_button, _("Preferences"));
+- gtk_widget_set_tooltip_text(volume_button, _("Adjust the Volume"));
+- gtk_widget_set_tooltip_text(quit_button, _("Quit"));
+- text = g_strdup_printf(_("Frequency: %.2f MHz"), gtk_adjustment_get_value(adj)/STEPS);
+- gtk_widget_set_tooltip_text(freq_scale, text);
+- g_free(text);
+-/* text = g_strdup_printf(_("Volume: %d%%"), (gint)volume->value);
+- gtk_widget_set_tooltip_text(vol_scale, text);
+- g_free(text);*/
++ rec_button = gtk_button_new ();
++ image = gtk_image_new_from_icon_name ("media-record", GTK_ICON_SIZE_LARGE_TOOLBAR);
++ gtk_button_set_image (GTK_BUTTON (rec_button), image);
++ gtk_button_set_relief (GTK_BUTTON (rec_button), GTK_RELIEF_NONE);
++
++ gtk_box_pack_start (GTK_BOX (box), rec_button, FALSE, FALSE, 2);
++
++ vseparator = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
++
++ gtk_box_pack_start (GTK_BOX (box), vseparator, FALSE, FALSE, 2);
++
++ prefs_button = gtk_button_new ();
++ image = gtk_image_new_from_icon_name ("document-properties", GTK_ICON_SIZE_LARGE_TOOLBAR);
++ gtk_button_set_image (GTK_BUTTON (prefs_button), image);
++ gtk_button_set_relief (GTK_BUTTON (prefs_button), GTK_RELIEF_NONE);
++
++ gtk_box_pack_start (GTK_BOX (box), prefs_button, FALSE, FALSE, 2);
++
++ about_button = gtk_button_new ();
++ image = gtk_image_new_from_icon_name ("help-about", GTK_ICON_SIZE_LARGE_TOOLBAR);
++ gtk_button_set_image (GTK_BUTTON (about_button), image);
++ gtk_button_set_relief (GTK_BUTTON (about_button), GTK_RELIEF_NONE);
++
++ gtk_box_pack_start (GTK_BOX (box), about_button, FALSE, FALSE, 2);
++
++/* quit_button = gtk_button_new ();
++ image = gtk_image_new_from_icon_name ("application-exit", GTK_ICON_SIZE_LARGE_TOOLBAR);
++ gtk_button_set_image (GTK_BUTTON (quit_button), image);
++ gtk_button_set_relief (GTK_BUTTON (quit_button), GTK_RELIEF_NONE);
++
++ gtk_box_pack_start (GTK_BOX (box), quit_button, FALSE, FALSE, 2); */
++
++ gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 4);
++
++ g_signal_connect (G_OBJECT (app), "delete_event", G_CALLBACK (delete_event_cb), NULL);
++ g_signal_connect (G_OBJECT (drawing_area), "draw", G_CALLBACK (draw_cb), NULL);
++ g_signal_connect (G_OBJECT (preset_combo), "changed", G_CALLBACK (preset_combo_change_cb), NULL);
++ g_signal_connect (G_OBJECT (adj), "value-changed", G_CALLBACK (adj_value_changed_cb), (gpointer) app);
++ g_signal_connect (G_OBJECT (scbw_button), "clicked", G_CALLBACK (scbw_button_clicked_cb), NULL);
++ g_signal_connect (G_OBJECT (stbw_button), "pressed", G_CALLBACK (step_button_pressed_cb), (gpointer) FALSE);
++ g_signal_connect (G_OBJECT (stbw_button), "clicked", G_CALLBACK (step_button_clicked_cb), (gpointer) FALSE);
++ g_signal_connect (G_OBJECT (stbw_button), "released", G_CALLBACK (step_button_released_cb), NULL);
++ g_signal_connect (G_OBJECT (stfw_button), "pressed", G_CALLBACK (step_button_pressed_cb), (gpointer) TRUE);
++ g_signal_connect (G_OBJECT (stfw_button), "clicked", G_CALLBACK (step_button_clicked_cb), (gpointer) TRUE);
++ g_signal_connect (G_OBJECT (stfw_button), "released", G_CALLBACK (step_button_released_cb), NULL);
++ g_signal_connect (G_OBJECT (scfw_button), "clicked", G_CALLBACK (scfw_button_clicked_cb), NULL);
++ volume_value_changed_id = g_signal_connect (G_OBJECT (volume_button), "value-changed", G_CALLBACK (volume_value_changed_cb), NULL);
++ g_signal_connect (G_OBJECT (rec_button), "clicked", G_CALLBACK (rec_button_clicked_cb), (gpointer) app);
++ g_signal_connect (G_OBJECT (prefs_button), "clicked", G_CALLBACK (prefs_button_clicked_cb), (gpointer) app);
++ g_signal_connect (G_OBJECT (about_button), "clicked", G_CALLBACK (about_button_clicked_cb), NULL);
++/* g_signal_connect (G_OBJECT (quit_button), "clicked", G_CALLBACK (quit_button_clicked_cb), NULL); */
++
++ gtk_widget_set_tooltip_text (scbw_button, _("Scan Backwards"));
++ gtk_widget_set_tooltip_text (stbw_button, _("0.05 MHz Backwards"));
++ gtk_widget_set_tooltip_text (stfw_button, _("0.05 MHz Forwards"));
++ gtk_widget_set_tooltip_text (scfw_button, _("Scan Forwards"));
++ gtk_widget_set_tooltip_text (volume_button, _("Adjust the Volume"));
++ gtk_widget_set_tooltip_text (rec_button, _("Record radio as MP3, OGG, FLAC or M4A"));
++ gtk_widget_set_tooltip_text (prefs_button, _("Preferences"));
++ gtk_widget_set_tooltip_text (about_button, _("About"));
++/* gtk_widget_set_tooltip_text (quit_button, _("Quit")); */
++
++ text = g_strdup_printf (_("Frequency: %.2f MHz"), gtk_adjustment_get_value (adj)/STEPS);
++ gtk_widget_set_tooltip_text (freq_scale, text);
++ g_free (text);
+
+ gtk_container_add (GTK_CONTAINER (app), vbox);
+ gtk_widget_show_all (vbox);
+@@ -1512,15 +1510,15 @@ static DBusGProxy * connect_to_session (
+ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+
+ if (error) {
+- g_warning ("%s", error->message);
++ g_warning ("Could not connect to system bus: %s", error->message);
+ g_error_free(error);
+ return NULL;
+ }
+ /* Get the current session object */
+ proxy = dbus_g_proxy_new_for_name (connection,
+- "org.gnome.SessionManager",
+- "/org/gnome/SessionManager",
+- "org.gnome.SessionManager");
++ "org.gnome.SessionManager",
++ "/org/gnome/SessionManager",
++ "org.gnome.SessionManager");
+
+ if (!proxy) {
+ g_warning ("Unable to get the SessionManager.");
diff -pruN 1.8-2/debian/patches/gnomeradio-help.patch 1.8-2ubuntu32/debian/patches/gnomeradio-help.patch
--- 1.8-2/debian/patches/gnomeradio-help.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-help.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,25 @@
+## Description: Fixed frecquency value step in manual chapter "Usage/Frequency".
+## Origin: upstream, no
+## Bug-Ubuntu: http://launchpad.net/bugs/980652
+## Bug-Debian:
+## Author: Pojar George
+## Forwarded: no
+Index: b/help/C/gnomeradio.xml
+===================================================================
+--- a/help/C/gnomeradio.xml 2012-12-03 10:14:55.306899796 +0000
++++ b/help/C/gnomeradio.xml 2012-12-03 10:14:55.666899785 +0000
+@@ -171,12 +171,12 @@
+
+
+
+- The 0.5 MHz backwards button (left-arrow without bar) decreases the frequency by 0.5 MHz.
++ The 0.05 MHz backwards button (left-arrow without bar) decreases the frequency by 0.05 MHz.
+
+
+
+
+- The 0.5 MHz forward button (right-arrow without bar) increases the frequency by 0.5 MHz.
++ The 0.05 MHz forward button (right-arrow without bar) increases the frequency by 0.05 MHz.
+
+
+
diff -pruN 1.8-2/debian/patches/gnomeradio-keyboard_shortcuts.patch 1.8-2ubuntu32/debian/patches/gnomeradio-keyboard_shortcuts.patch
--- 1.8-2/debian/patches/gnomeradio-keyboard_shortcuts.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-keyboard_shortcuts.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,108 @@
+## Description: Added a new keyboard shortcut 's' to stop recording.
+## Origin: upstream, no
+## Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1026417
+## Author: Pojar George
+## Forwarded: no
+Index: gnomeradio-1.8/help/C/gnomeradio.xml
+===================================================================
+--- gnomeradio-1.8.orig/help/C/gnomeradio.xml
++++ gnomeradio-1.8/help/C/gnomeradio.xml
+@@ -589,7 +589,15 @@ data is being stored.
+ r
+
+
+- Open the recording dialog.
++ Start recording.
++
++
++
++
++ s
++
++
++ Stop recording.
+
+
+
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -213,7 +213,7 @@ void run_status_window(Recording *record
+ timeout_id = g_timeout_add(500, (GSourceFunc) timeout_cb, recording);
+ }
+
+-static void button_clicked_cb(GtkButton *button, gpointer data)
++void stop_rec_button_clicked_cb(GtkButton *button, gpointer data)
+ {
+ Recording *recording = data;
+ close_status_window();
+@@ -222,7 +222,7 @@ static void button_clicked_cb(GtkButton
+
+ static gint delete_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data)
+ {
+- button_clicked_cb(NULL, data);
++ stop_rec_button_clicked_cb(NULL, data);
+ return TRUE;
+ }
+
+@@ -332,7 +332,8 @@ GtkWidget* record_status_window(Recordin
+ gtk_widget_grab_focus (button);
+
+ g_signal_connect(G_OBJECT(status_dialog), "delete_event", G_CALLBACK(delete_event_cb), recording);
+- g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_clicked_cb), recording);
++ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(stop_rec_button_clicked_cb), recording);
++ g_signal_connect(G_OBJECT(status_dialog), "key-press-event", G_CALLBACK(key_press_event_cb), recording);
+
+ gtk_window_set_modal(GTK_WINDOW(status_dialog), TRUE);
+
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -1154,7 +1154,7 @@ gconf_error_handler(GConfClient *client,
+ g_print("GConf error: %s\n", error->message);
+ }
+
+-static gboolean
++gboolean
+ key_press_event_cb(GtkWidget *app, GdkEventKey *event, gpointer data)
+ {
+ int vol = (int)(gtk_volume_button_get_value(mute_button) + 0.5f);
+@@ -1172,6 +1172,9 @@ key_press_event_cb(GtkWidget *app, GdkEv
+ case GDK_KEY_r:
+ rec_button_clicked_cb(NULL, app);
+ break;
++ case GDK_KEY_s:
++ stop_rec_button_clicked_cb(NULL, data);
++ break;
+ case GDK_KEY_f:
+ scfw_button_clicked_cb(NULL, NULL);
+ break;
+Index: gnomeradio-1.8/src/gui.h
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.h
++++ gnomeradio-1.8/src/gui.h
+@@ -72,6 +72,9 @@ void preset_menuitem_activate_cb(GtkMenu
+
+ void tray_icon_items_set_sensible(gboolean sensible);
+
++gboolean
++key_press_event_cb(GtkWidget *app, GdkEventKey *event, gpointer data);
++
+ void display_help_cb(char *topic);
+
+ void change_preset(gboolean next);
+Index: gnomeradio-1.8/src/record.h
+===================================================================
+--- gnomeradio-1.8.orig/src/record.h
++++ gnomeradio-1.8/src/record.h
+@@ -19,6 +19,8 @@
+
+ void run_status_window(Recording *recording);
+
++void stop_rec_button_clicked_cb(GtkButton *button, gpointer data);
++
+ GtkWidget* record_status_window(Recording *recording);
+
+ #endif
diff -pruN 1.8-2/debian/patches/gnomeradio-lirc.patch 1.8-2ubuntu32/debian/patches/gnomeradio-lirc.patch
--- 1.8-2/debian/patches/gnomeradio-lirc.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-lirc.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,292 @@
+Description: Use current keycode mapping in default lirc keyname.
+ Added a lirc command "toggle visible".
+ Added a new function, so that lirc.c doesn't touch the internals of gui.c anymore.
+ Autodetect supported TV applications.
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c 2013-09-24 18:06:14.320930000 +0000
++++ gnomeradio-1.8/src/gui.c 2013-09-24 18:12:13.000000000 +0000
+@@ -51,6 +51,7 @@
+
+ GtkWidget* mute_button, *preset_combo;
+ GtkAdjustment *adj;
++GtkWidget* app;
+
+ int mom_ps;
+ gnomeradio_settings settings;
+@@ -641,6 +642,16 @@
+ preset_combo_set_item(mom_ps);
+ }
+
++void gnomeradio_switch_to_preset (gint index)
++{
++ if (0 <= index && index < g_list_length(settings.presets)) {
++ preset *ps = g_list_nth_data(settings.presets, index);
++ gtk_adjustment_set_value(adj, ps->freq*STEPS);
++ mom_ps = index;
++ preset_combo_set_item(mom_ps);
++ }
++}
++
+ static void quit_button_clicked_cb(GtkButton *button, gpointer data)
+ {
+ exit_gnome_radio();
+@@ -1140,7 +1151,6 @@
+
+ int main(int argc, char* argv[])
+ {
+- GtkWidget* app;
+ GList *ptr;
+ DBusGProxy *proxy;
+ GError *err = NULL;
+Index: gnomeradio-1.8/src/lirc.c
+===================================================================
+--- gnomeradio-1.8.orig/src/lirc.c 2013-09-24 18:06:14.320930000 +0000
++++ gnomeradio-1.8/src/lirc.c 2013-09-24 18:11:59.000000000 +0000
+@@ -22,25 +22,28 @@
+ #include
+ #include
+ #include
+-
+-#ifdef HAVE_LIRC
+-
+ #include
+
+-#endif
+-
+ #include "lirc.h"
+ #include "gui.h"
+
+-extern GtkWidget* mute_button, *preset_combo;
+-extern GtkAdjustment *adj;
+-
+-extern int mom_ps;
+-extern gnomeradio_settings settings;
++extern GtkWidget* mute_button;
++extern GtkWidget *app;
+
+ static int fd = -1;
+ static struct lirc_config *config = NULL;
+
++static struct TV_LIST
++{
++ const char *name;
++} tv_list[] = {
++ { "tvtime" },
++ { "xawtv" },
++ { "zapping" }
++};
++
++#define TV_COUNT (sizeof(tv_list)/sizeof(struct TV_LIST))
++
+ static void execute_lirc_command (char *cmd)
+ {
+ printf("lirc command: %s\n", cmd);
+@@ -70,12 +73,16 @@
+ }
+ else if (strcasecmp (cmd, "tv") == 0)
+ {
+- gchar **argv;
++ int i;
+ exit_gnome_radio();
+- g_shell_parse_argv ("xawtv", NULL, &argv, NULL);
+- g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
+- g_strfreev (argv);
+- /* gnome_execute_shell(NULL, "xawtv"); */
++ for (i = 0; i < TV_COUNT; i++) {
++ gchar **argv;
++
++ g_shell_parse_argv (tv_list[i].name, NULL, &argv, NULL);
++ if (g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL))
++ break;
++ g_strfreev (argv);
++ }
+ }
+ else if (strcasecmp (cmd, "quit") == 0)
+ {
+@@ -89,17 +96,15 @@
+ {
+ change_preset(FALSE);
+ }
++ else if (strcasecmp (cmd, "toggle visible") == 0)
++ {
++ toggle_mainwindow_visibility(app);
++ }
+ else if (strncasecmp (cmd, "preset ", 7) == 0)
+ {
+- int tmp = 0, ret;
+- ret = sscanf(cmd, "preset %i", &tmp);
+- if (ret && (tmp < g_list_length(settings.presets)))
+- {
+- preset *ps;
+- ps = g_list_nth_data(settings.presets, tmp);
+- gtk_adjustment_set_value(adj, ps->freq*STEPS);
+- mom_ps = tmp;
+- preset_combo_set_item(mom_ps);
++ int tmp = 0;
++ if (sscanf(cmd, "preset %i", &tmp)) {
++ gnomeradio_switch_to_preset(tmp);
+ }
+ }
+ else
+@@ -120,20 +125,28 @@
+ return NULL;
+ }
+
+- if (!strcasecmp("VOL+", event))
+- return (char*)strdup("volume up");
+- else if (!strcasecmp("VOL-", event))
+- return (char*)strdup("volume down");
+- else if (!repeat && !strcasecmp("CH+", event))
++ if (!repeat && !strcasecmp("KEY_KPPLUS", event))
+ return (char*)strdup("tune up");
+- else if (!repeat && !strcasecmp("CH-", event))
++ else if (!repeat && !strcasecmp("KEY_KPMINUS", event))
+ return (char*)strdup("tune down");
+- else if (!repeat && !strcasecmp("MUTE", event))
++ else if (!strcasecmp("KEY_VOLUMEUP", event))
++ return (char*)strdup("volume up");
++ else if (!strcasecmp("KEY_VOLUMEDOWN", event))
++ return (char*)strdup("volume down");
++ else if (!repeat && !strcasecmp("KEY_MUTE", event))
+ return (char*)strdup("mute");
+- else if (!repeat && !strcasecmp("MINIMIZE", event))
++ else if (!repeat && !strcasecmp("KEY_TUNER", event))
++ return (char*)strdup("tv");
++ else if (!repeat && !strcasecmp("KEY_POWER", event))
+ return (char*)strdup("quit");
++ else if (!repeat && !strcasecmp("KEY_CHANNELUP", event))
++ return (char*)strdup("preset up");
++ else if (!repeat && !strcasecmp("KEY_CHANNELDOWN", event))
++ return (char*)strdup("preset down");
++ else if (!repeat && !strcasecmp("KEY_TEXT", event))
++ return (char*)strdup("toggle visible");
+
+- if (sscanf(event, "%d", &key) == 1)
++ if (sscanf(event, "KEY_%d", &key) == 1)
+ {
+ char *ret;
+ if (repeat || (key < 0) || (key > 9))
+@@ -158,12 +171,12 @@
+ if (lirc_readconfig (NULL, &config, NULL) != 0)
+ {
+ perror("lirc_readconfig");
+- config = NULL;
++ config = NULL;
+ /*lirc_deinit ();
+ fd = -1;
+ return 0;*/
+ printf("The lirc configfile (~/.lircrc) could not be opened.\n"
+- "Using default config.\n");
++ "Using default config.\n");
+ }
+
+ fcntl (fd, F_SETFL, O_NONBLOCK);
+Index: gnomeradio-1.8/help/C/gnomeradio.xml
+===================================================================
+--- gnomeradio-1.8.orig/help/C/gnomeradio.xml 2013-09-24 18:06:14.320930000 +0000
++++ gnomeradio-1.8/help/C/gnomeradio.xml 2013-09-24 18:14:07.395126281 +0000
+@@ -726,7 +726,7 @@
+ tune up
+
+
+- Scan forward.
++ Scan forward
+
+
+
+@@ -734,7 +734,7 @@
+ tune down
+
+
+- Scan backwards.
++ Scan backwards
+
+
+
+@@ -742,7 +742,7 @@
+ preset up
+
+
+- Select next preset.
++ Select next preset
+
+
+
+@@ -750,7 +750,7 @@
+ preset down
+
+
+- Select previous preset.
++ Select previous preset
+
+
+
+@@ -758,7 +758,7 @@
+ volume up
+
+
+- Increase the volume.
++ Increase the volume
+
+
+
+@@ -766,7 +766,7 @@
+ volume down
+
+
+- Decrease the volume.
++ Decrease the volume
+
+
+
+@@ -774,7 +774,15 @@
+ mute
+
+
+- Mute/unmute the volume.
++ Mute/unmute the volume
++
++
++
++
++ tv
++
++
++ Select TV mode (supported TV applications: tvtime, xawtv, zapping)
+
+
+
+@@ -782,9 +790,18 @@
+ quit
+
+
+- Terminate &app;.
++ Terminate &app;
++
++
++
++
++ toggle visible
++
++
++ Show/hide &app; window
+
+
++
+
+
+ preset x
+Index: gnomeradio-1.8/src/gui.h
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.h 2013-09-24 18:06:14.320930000 +0000
++++ gnomeradio-1.8/src/gui.h 2013-09-24 18:12:06.000000000 +0000
+@@ -76,6 +76,7 @@
+
+ void change_preset(gboolean next);
+
++void gnomeradio_switch_to_preset (gint index);
+
+ void show_error_message(const char* error, const char* details);
+ void show_warning_message(const char* warning, const char* details);
diff -pruN 1.8-2/debian/patches/gnomeradio-media_types.patch 1.8-2ubuntu32/debian/patches/gnomeradio-media_types.patch
--- 1.8-2/debian/patches/gnomeradio-media_types.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-media_types.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,1845 @@
+Description: Replaced GnomeMediaProfile with GstEncodingProfile.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1154028
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/configure.in
+===================================================================
+--- gnomeradio-1.8.orig/configure.in
++++ gnomeradio-1.8/configure.in
+@@ -26,11 +26,11 @@ PKG_CHECK_MODULES(ALSA, alsa >= 1.0.25)
+ AC_SUBST(ALSA_CFLAGS)
+ AC_SUBST(ALSA_LIBS)
+
+-PKG_CHECK_MODULES(GNOME, dbus-glib-1 gconf-2.0 >= 2.12 gtk+-3.0 libgnome-media-profiles-3.0 >= 3.0)
++PKG_CHECK_MODULES(GNOME, dbus-glib-1 gconf-2.0 >= 2.12 gtk+-3.0)
+ AC_SUBST(GNOME_CFLAGS)
+ AC_SUBST(GNOME_LIBS)
+
+-PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0 gstreamer-plugins-base-1.0)
++PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0 >= 1.0.5 gstreamer-plugins-base-1.0 >= 1.0.5 gstreamer-pbutils-1.0 >= 1.0.5)
+ AC_SUBST(GSTREAMER_CFLAGS)
+ AC_SUBST(GSTREAMER_LIBS)
+
+Index: gnomeradio-1.8/data/gnomeradio.gep
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/data/gnomeradio.gep
+@@ -0,0 +1,62 @@
++[GStreamer Encoding Target]
++name = gnomeradio
++category = muh
++description = Common encoding profiles for Gnomeradio
++
++[profile-mp3]
++name = mp3
++description = MPEG Layer 3 Audio
++format = application/x-id3
++type = container
++
++[streamprofile-mp3-1]
++parent = mp3
++type = audio
++format = audio/mpeg, mpegversion=1, layer=3
++presence = 1
++
++
++[profile-oggvorbis]
++name = oggvorbis
++description = Ogg Vorbis
++format = application/ogg
++type = container
++
++[streamprofile-oggvorbis-1]
++parent = oggvorbis
++type = audio
++format = audio/x-vorbis
++presence = 1
++
++
++[profile-oggopus]
++name = oggopus
++description = Ogg Opus
++format = application/ogg
++type = container
++
++[streamprofile-oggopus-1]
++parent = oggopus
++type = audio
++format = audio/x-opus
++presence = 1
++
++
++[profile-flac]
++name = flac
++description = FLAC
++format = audio/x-flac
++type = audio
++
++
++[profile-m4a]
++name = m4a
++description = MPEG 4 Audio
++format = video/quicktime, variant=iso
++type = container
++
++[streamprofile-m4a-1]
++parent = m4a
++type = audio
++format = audio/mpeg, mpegversion=4, stream-format=raw
++presence = 1
+Index: gnomeradio-1.8/data/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/data/Makefile.am
++++ gnomeradio-1.8/data/Makefile.am
+@@ -5,6 +5,9 @@ applications_in_files = gnomeradio.deskt
+ applications_DATA = $(applications_in_files:.desktop.in=.desktop)
+ @INTLTOOL_DESKTOP_RULE@
+
++profilesdir = $(datadir)/gnomeradio
++profiles_DATA = gnomeradio.gep
++
+ schemadir = @GCONF_SCHEMA_FILE_DIR@
+ schema_in_files = gnomeradio.schemas.in
+ schema_DATA = $(schema_in_files:.schemas.in=.schemas)
+@@ -21,6 +24,7 @@ EXTRA_DIST = $(applications_DATA) \
+ $(applications_in_files) \
+ $(schema_DATA) \
+ $(schema_in_files) \
++ $(profiles_DATA) \
+ example.lircrc
+
+ CLEANFILES = $(schema_DATA) $(applications_DATA)
+Index: gnomeradio-1.8/src/rb_missing_plugins.c
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/rb_missing_plugins.c
+@@ -0,0 +1,253 @@
++/* rb_missing_plugins.c
++
++ Copyright (C) 2007 Tim-Philipp Müller
++ Copyright (C) 2007 Jonathan Matthew
++
++ The Gnome Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Library General Public License as
++ published by the Free Software Foundation; either version 2 of the
++ License, or (at your option) any later version.
++
++ The Gnome Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Library General Public License for more details.
++
++ You should have received a copy of the GNU Library General Public
++ License along with the Gnome Library; see the file COPYING.LIB. If not,
++ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA.
++
++ Based on totem-missing-plugins.c, authored by Tim-Philipp Müller
++ */
++
++#include "config.h"
++
++#include "rb_missing_plugins.h"
++
++#include
++#include
++
++#include /* for gst_registry_update */
++
++#include
++
++#ifdef GDK_WINDOWING_X11
++#include
++#endif
++
++#include
++
++/* list of blacklisted detail strings */
++static GList *blacklisted_plugins = NULL;
++
++/* parent window for installer */
++static gpointer parent_window = NULL;
++
++typedef struct
++{
++ GClosure *closure;
++ gchar **details;
++} RBPluginInstallContext;
++
++static gboolean
++rb_plugin_install_plugin_is_blacklisted (const gchar * detail)
++{
++ GList *res;
++
++ res = g_list_find_custom (blacklisted_plugins,
++ detail,
++ (GCompareFunc) strcmp);
++
++ return (res != NULL);
++}
++
++static void
++rb_plugin_install_blacklist_plugin (const gchar * detail)
++{
++ if (!rb_plugin_install_plugin_is_blacklisted (detail)) {
++ blacklisted_plugins = g_list_prepend (blacklisted_plugins,
++ g_strdup (detail));
++ }
++}
++
++static void
++rb_plugin_install_context_free (RBPluginInstallContext *ctx)
++{
++ fprintf(stderr, "cleaning up plugin install context %p\n", ctx);
++ g_strfreev (ctx->details);
++ g_closure_unref (ctx->closure);
++ g_free (ctx);
++}
++
++static void
++rb_plugin_install_done (RBPluginInstallContext *ctx, gboolean retry)
++{
++ GValue param[2] = { {0,}, {0,} };
++
++ fprintf(stderr, "invoking plugin install context %p callback: retry %d\n", ctx, retry);
++
++ g_value_init (¶m[0], G_TYPE_POINTER);
++ g_value_set_pointer (¶m[0], NULL);
++ g_value_init (¶m[1], G_TYPE_BOOLEAN);
++ g_value_set_boolean (¶m[1], retry);
++
++ g_closure_invoke (ctx->closure, NULL, 2, param, NULL);
++ g_value_unset (¶m[0]);
++ g_value_unset (¶m[1]);
++}
++
++static void
++on_plugin_installation_done (GstInstallPluginsReturn res, gpointer user_data)
++{
++ RBPluginInstallContext *ctx = (RBPluginInstallContext *) user_data;
++ gchar **p;
++ gboolean retry;
++
++ GST_INFO ("res = %d (%s)", res, gst_install_plugins_return_get_name (res));
++
++ switch (res)
++ {
++ /* treat partial success the same as success; in the worst case we'll
++ * just do another round and get NOT_FOUND as result that time */
++ case GST_INSTALL_PLUGINS_PARTIAL_SUCCESS:
++ case GST_INSTALL_PLUGINS_SUCCESS:
++ {
++ /* blacklist installed plugins too, so that we don't get
++ * into endless installer loops in case of inconsistencies */
++ for (p = ctx->details; p != NULL && *p != NULL; ++p) {
++ rb_plugin_install_blacklist_plugin (*p);
++ }
++
++ fprintf(stderr, "Missing plugins installed. Updating plugin registry ...\n");
++
++ /* force GStreamer to re-read its plugin registry */
++ retry = gst_update_registry ();
++
++ rb_plugin_install_done (ctx, retry);
++ break;
++ }
++
++ case GST_INSTALL_PLUGINS_NOT_FOUND:
++ {
++ fprintf(stderr, "No installation candidate for missing plugins found.\n");
++
++ /* NOT_FOUND should only be returned if not a single one of the
++ * requested plugins was found; if we managed to play something
++ * anyway, we should just continue playing what we have and
++ * blacklist the requested plugins for this session; if we
++ * could not play anything we should blacklist them as well,
++ * so the install wizard isn't called again for nothing */
++ for (p = ctx->details; p != NULL && *p != NULL; ++p) {
++ rb_plugin_install_blacklist_plugin (*p);
++ }
++
++ rb_plugin_install_done (ctx, FALSE);
++ break;
++ }
++
++ case GST_INSTALL_PLUGINS_USER_ABORT:
++ {
++ /* blacklist on user abort, so we show an error next time (or
++ * just play what we can) instead of calling the installer */
++ for (p = ctx->details; p != NULL && *p != NULL; ++p) {
++ rb_plugin_install_blacklist_plugin (*p);
++ }
++
++ rb_plugin_install_done (ctx, FALSE);
++ break;
++ }
++
++ case GST_INSTALL_PLUGINS_ERROR:
++ case GST_INSTALL_PLUGINS_CRASHED:
++ default:
++ {
++ fprintf(stderr, "Missing plugin installation failed: %s\n",
++ gst_install_plugins_return_get_name (res));
++
++ rb_plugin_install_done (ctx, FALSE);
++ break;
++ }
++ }
++
++ rb_plugin_install_context_free (ctx);
++}
++
++gboolean
++rb_missing_plugins_install (const char **details, gboolean ignore_blacklist, GClosure *closure)
++{
++ RBPluginInstallContext *ctx;
++ GstInstallPluginsContext *install_ctx;
++ GstInstallPluginsReturn status;
++ int i, num;
++
++ num = g_strv_length ((char **)details);
++ g_return_val_if_fail (num > 0, FALSE);
++
++ ctx = g_new0 (RBPluginInstallContext, 1);
++ ctx->closure = g_closure_ref (closure);
++ ctx->details = g_strdupv ((char **)details);
++
++ num = g_strv_length (ctx->details);
++ for (i = 0; i < num; ++i) {
++ if (ignore_blacklist == FALSE && rb_plugin_install_plugin_is_blacklisted (ctx->details[i])) {
++ fprintf(stderr, "Missing plugin: %s (ignoring)\n", ctx->details[i]);
++ g_free (ctx->details[i]);
++ ctx->details[i] = ctx->details[num-1];
++ ctx->details[num-1] = NULL;
++ --num;
++ --i;
++ } else {
++ fprintf(stderr, "Missing plugin: %s\n", ctx->details[i]);
++ }
++ }
++
++ if (num == 0) {
++ fprintf(stderr, "All missing plugins are blacklisted, doing nothing\n");
++ rb_plugin_install_context_free (ctx);
++ return FALSE;
++ }
++
++ install_ctx = gst_install_plugins_context_new ();
++
++ if (parent_window != NULL && gtk_widget_get_realized (GTK_WIDGET (parent_window))) {
++#ifdef GDK_WINDOWING_X11
++ gulong xid = 0;
++ xid = gdk_x11_window_get_xid (gtk_widget_get_window (GTK_WIDGET (parent_window)));
++ gst_install_plugins_context_set_xid (install_ctx, xid);
++#endif
++ }
++
++ status = gst_install_plugins_async ((const gchar* const*) ctx->details, install_ctx,
++ on_plugin_installation_done,
++ ctx);
++
++ gst_install_plugins_context_free (install_ctx);
++
++ GST_INFO ("gst_install_plugins_async() result = %d", status);
++
++ if (status != GST_INSTALL_PLUGINS_STARTED_OK) {
++ if (status == GST_INSTALL_PLUGINS_HELPER_MISSING) {
++ fprintf(stderr, "Automatic missing codec installation not supported "
++ "(helper script missing)\n");
++ } else {
++ fprintf(stderr, "Failed to start codec installation: %s\n",
++ gst_install_plugins_return_get_name (status));
++ }
++ rb_plugin_install_context_free (ctx);
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++void
++rb_missing_plugins_init (GtkWindow *window)
++{
++ parent_window = window;
++ g_object_add_weak_pointer (G_OBJECT (parent_window), &parent_window);
++
++ gst_pb_utils_init ();
++
++ GST_INFO ("Set up support for automatic missing plugin installation");
++}
+Index: gnomeradio-1.8/src/rb_missing_plugins.h
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/rb_missing_plugins.h
+@@ -0,0 +1,33 @@
++/* rb_missing_plugins.h
++
++ Copyright (C) 2007 Tim-Philipp Müller
++ Copyright (C) 2007 Jonathan Matthew
++
++ The Gnome Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Library General Public License as
++ published by the Free Software Foundation; either version 2 of the
++ License, or (at your option) any later version.
++
++ The Gnome Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Library General Public License for more details.
++
++ You should have received a copy of the GNU Library General Public
++ License along with the Gnome Library; see the file COPYING.LIB. If not,
++ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA.
++
++ Author: Tim-Philipp Müller
++ */
++
++#ifndef RB_MISSING_PLUGINS_H
++#define RB_MISSING_PLUGINS_H
++
++#include
++
++void rb_missing_plugins_init (GtkWindow *parent_window);
++
++gboolean rb_missing_plugins_install (const char **details, gboolean ignore_blacklist, GClosure *closure);
++
++#endif /* RB_MISSING_PLUGINS_H */
+Index: gnomeradio-1.8/src/rb_gst_media_types.c
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/rb_gst_media_types.c
+@@ -0,0 +1,340 @@
++/*
++ * Copyright (C) 2010 Jonathan Matthew
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * The Rhythmbox authors hereby grant permission for non-GPL compatible
++ * GStreamer plugins to be used and distributed together with GStreamer
++ * and Rhythmbox. This permission is above and beyond the permissions granted
++ * by the GPL license by which Rhythmbox is covered. If you modify this code
++ * you may extend this exception to your version of the code, but you are not
++ * obligated to do so. If you do not wish to do so, delete this exception
++ * statement from your version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ */
++
++#include "config.h"
++
++#include
++
++#include
++#include
++
++#include "rb_gst_media_types.h"
++
++#define SOURCE_ENCODING_TARGET_FILE "../data/gnomeradio.gep"
++#define INSTALLED_ENCODING_TARGET_FILE DATADIR"/gnomeradio/gnomeradio.gep"
++static GstEncodingTarget *default_target = NULL;
++
++char *
++rb_gst_caps_to_media_type (const GstCaps *caps)
++{
++ GstStructure *s;
++ const char *media_type;
++
++ /* the aim here is to reduce the caps to a single mimetype-like
++ * string, describing the audio encoding (for audio files) or the
++ * file type (for everything else). raw media types are ignored.
++ *
++ * there are only a couple of special cases.
++ */
++
++ if (gst_caps_get_size (caps) == 0)
++ return NULL;
++
++ s = gst_caps_get_structure (caps, 0);
++ media_type = gst_structure_get_name (s);
++ if (media_type == NULL) {
++ return NULL;
++ } else if (g_str_has_prefix (media_type, "audio/x-raw") ||
++ g_str_has_prefix (media_type, "video/x-raw")) {
++ /* ignore raw types */
++ return NULL;
++ } else if (g_str_equal (media_type, "audio/mpeg")) {
++ /* need to distinguish between mpeg 1 layer 3 and
++ * mpeg 2 or 4 here.
++ */
++ int mpegversion = 0;
++ gst_structure_get_int (s, "mpegversion", &mpegversion);
++ switch (mpegversion) {
++ case 2:
++ case 4:
++ return g_strdup ("audio/x-aac"); /* hmm. */
++
++ case 1:
++ default:
++ return g_strdup ("audio/mpeg");
++ }
++ } else {
++ /* everything else is fine as-is */
++ return g_strdup (media_type);
++ }
++}
++
++GstCaps *
++rb_gst_media_type_to_caps (const char *media_type)
++{
++ /* special cases: */
++ if (strcmp (media_type, "audio/mpeg") == 0) {
++ return gst_caps_from_string ("audio/mpeg, mpegversion=(int)1");
++ } else if (strcmp (media_type, "audio/x-aac") == 0) {
++ return gst_caps_from_string ("audio/mpeg, mpegversion=(int){ 2, 4 }");
++ } else {
++ /* otherwise, the media type is enough */
++ return gst_caps_from_string (media_type);
++ }
++}
++
++const char *
++rb_gst_media_type_to_extension (const char *media_type)
++{
++ if (media_type == NULL) {
++ return NULL;
++ } else if (!strcmp (media_type, "audio/mpeg")) {
++ return "mp3";
++ } else if (!strcmp (media_type, "audio/x-vorbis") || !strcmp (media_type, "application/ogg") || !strcmp (media_type, "audio/ogg")) {
++ return "ogg";
++ } else if (!strcmp (media_type, "audio/x-opus")) {
++ return "opus";
++ } else if (!strcmp (media_type, "audio/x-flac") || !strcmp (media_type, "audio/flac")) {
++ return "flac";
++ } else if (!strcmp (media_type, "audio/x-aac") || !strcmp (media_type, "audio/aac") || !strcmp (media_type, "audio/x-alac")) {
++ return "m4a";
++ } else if (!strcmp (media_type, "audio/x-wavpack")) {
++ return "wv";
++ } else {
++ return NULL;
++ }
++}
++
++const char *
++rb_gst_mime_type_to_media_type (const char *mime_type)
++{
++ if (!strcmp (mime_type, "application/x-id3") || !strcmp (mime_type, "audio/mpeg")) {
++ return "audio/mpeg";
++ } else if (!strcmp (mime_type, "application/ogg") || !strcmp (mime_type, "audio/x-vorbis") || !strcmp (mime_type, "audio/ogg")) {
++ return "audio/x-vorbis";
++ } else if (!strcmp (mime_type, "audio/flac")) {
++ return "audio/x-flac";
++ } else if (!strcmp (mime_type, "audio/aac") || !strcmp (mime_type, "audio/mp4") || !strcmp (mime_type, "audio/m4a")) {
++ return "audio/x-aac";
++ }
++ return mime_type;
++}
++
++const char *
++rb_gst_media_type_to_mime_type (const char *media_type)
++{
++ if (!strcmp (media_type, "audio/x-vorbis")) {
++ return "application/ogg";
++ } else if (!strcmp (media_type, "audio/x-flac")) {
++ return "audio/flac";
++ } else if (!strcmp (media_type, "audio/x-aac")) {
++ return "audio/mp4"; /* probably */
++ } else {
++ return media_type;
++ }
++}
++
++gboolean
++rb_gst_media_type_matches_profile (GstEncodingProfile *profile, const char *media_type)
++{
++ const GstCaps *pcaps;
++ const GList *cl;
++ GstCaps *caps;
++ gboolean matches = FALSE;
++
++ caps = rb_gst_media_type_to_caps (media_type);
++ if (caps == NULL) {
++ return FALSE;
++ }
++
++ pcaps = gst_encoding_profile_get_format (profile);
++ if (gst_caps_can_intersect (caps, pcaps)) {
++ matches = TRUE;
++ }
++
++ if (matches == FALSE && GST_IS_ENCODING_CONTAINER_PROFILE (profile)) {
++ for (cl = gst_encoding_container_profile_get_profiles (GST_ENCODING_CONTAINER_PROFILE (profile)); cl != NULL; cl = cl->next) {
++ GstEncodingProfile *cp = cl->data;
++ pcaps = gst_encoding_profile_get_format (cp);
++ if (gst_caps_can_intersect (caps, pcaps)) {
++ matches = TRUE;
++ break;
++ }
++ }
++ }
++ gst_caps_unref (caps);
++
++ return matches;
++}
++
++char *
++rb_gst_encoding_profile_get_media_type (GstEncodingProfile *profile)
++{
++ if (GST_IS_ENCODING_CONTAINER_PROFILE (profile)) {
++ const GList *cl = gst_encoding_container_profile_get_profiles (GST_ENCODING_CONTAINER_PROFILE (profile));
++ for (; cl != NULL; cl = cl->next) {
++ GstEncodingProfile *p = cl->data;
++ if (GST_IS_ENCODING_AUDIO_PROFILE (p)) {
++ return rb_gst_caps_to_media_type (gst_encoding_profile_get_format (p));
++ }
++
++ }
++
++ /* now what? */
++ return NULL;
++ } else {
++ return rb_gst_caps_to_media_type (gst_encoding_profile_get_format (profile));
++ }
++}
++
++GstEncodingTarget *
++rb_gst_get_default_encoding_target (void)
++{
++ if (default_target == NULL) {
++ char *target_file;
++ GError *error = NULL;
++
++ if (g_file_test (SOURCE_ENCODING_TARGET_FILE,
++ G_FILE_TEST_EXISTS) != FALSE) {
++ target_file = SOURCE_ENCODING_TARGET_FILE;
++ } else {
++ target_file = INSTALLED_ENCODING_TARGET_FILE;
++ }
++
++ default_target = gst_encoding_target_load_from_file (target_file, &error);
++ if (default_target == NULL) {
++ g_warning ("Unable to load encoding profiles from %s: %s", target_file, error ? error->message : "no error");
++ g_clear_error (&error);
++ return NULL;
++ }
++ }
++
++ return default_target;
++}
++
++GstEncodingProfile *
++rb_gst_get_encoding_profile (const char *media_type)
++{
++ const GList *l;
++ GstEncodingTarget *target;
++ target = rb_gst_get_default_encoding_target ();
++
++ for (l = gst_encoding_target_get_profiles (target); l != NULL; l = l->next) {
++ GstEncodingProfile *profile = l->data;
++ if (rb_gst_media_type_matches_profile (profile, media_type)) {
++ gst_encoding_profile_ref (profile);
++ return profile;
++ }
++ }
++
++ return NULL;
++}
++
++gboolean
++rb_gst_media_type_is_lossless (const char *media_type)
++{
++ int i;
++ const char *lossless_types[] = {
++ "audio/x-flac",
++ "audio/x-alac",
++ "audio/x-shorten",
++ "audio/x-wavpack" /* not completely sure */
++ };
++
++ for (i = 0; i < G_N_ELEMENTS (lossless_types); i++) {
++ if (strcmp (media_type, lossless_types[i]) == 0) {
++ return TRUE;
++ }
++ }
++ return FALSE;
++}
++
++gboolean
++rb_gst_check_missing_plugins (GstEncodingProfile *profile,
++ char ***details,
++ char ***descriptions)
++{
++ GstElement *encodebin;
++ GstBus *bus;
++ GstPad *pad;
++ gboolean ret;
++
++ ret = FALSE;
++
++ encodebin = gst_element_factory_make ("encodebin", NULL);
++ if (encodebin == NULL) {
++ g_warning ("Unable to create encodebin");
++ return TRUE;
++ }
++
++ bus = gst_bus_new ();
++ gst_element_set_bus (encodebin, bus);
++ gst_bus_set_flushing (bus, FALSE); /* necessary? */
++
++ g_object_set (encodebin, "profile", profile, NULL);
++ pad = gst_element_get_static_pad (encodebin, "audio_0");
++ if (pad == NULL) {
++ GstMessage *message;
++ GList *messages = NULL;
++ GList *m;
++ int i;
++
++ message = gst_bus_pop (bus);
++ while (message != NULL) {
++ if (gst_is_missing_plugin_message (message)) {
++ messages = g_list_append (messages, message);
++ } else {
++ gst_message_unref (message);
++ }
++ message = gst_bus_pop (bus);
++ }
++
++ if (messages != NULL) {
++ if (details != NULL) {
++ *details = g_new0(char *, g_list_length (messages)+1);
++ }
++ if (descriptions != NULL) {
++ *descriptions = g_new0(char *, g_list_length (messages)+1);
++ }
++ i = 0;
++ for (m = messages; m != NULL; m = m->next) {
++ char *str;
++ if (details != NULL) {
++ str = gst_missing_plugin_message_get_installer_detail (m->data);
++ (*details)[i] = str;
++ }
++ if (descriptions != NULL) {
++ str = gst_missing_plugin_message_get_description (m->data);
++ (*descriptions)[i] = str;
++ }
++ i++;
++ }
++
++ ret = TRUE;
++ g_list_foreach (messages, (GFunc)gst_message_unref, NULL);
++ g_list_free (messages);
++ }
++
++ } else {
++ gst_element_release_request_pad (encodebin, pad);
++ gst_object_unref (pad);
++ }
++
++ gst_object_unref (encodebin);
++ gst_object_unref (bus);
++ return ret;
++}
+Index: gnomeradio-1.8/src/rb_gst_media_types.h
+===================================================================
+--- /dev/null
++++ gnomeradio-1.8/src/rb_gst_media_types.h
+@@ -0,0 +1,76 @@
++/*
++ * Copyright (C) 2010 Jonathan Matthew
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * The Rhythmbox authors hereby grant permission for non-GPL compatible
++ * GStreamer plugins to be used and distributed together with GStreamer
++ * and Rhythmbox. This permission is above and beyond the permissions granted
++ * by the GPL license by which Rhythmbox is covered. If you modify this code
++ * you may extend this exception to your version of the code, but you are not
++ * obligated to do so. If you do not wish to do so, delete this exception
++ * statement from your version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ */
++
++#ifndef __MEDIA_TYPES_H
++#define __MEDIA_TYPES_H
++
++#include
++#include
++#include
++
++G_BEGIN_DECLS
++
++/* some common media types */
++#define MEDIA_TYPE_MP3 "audio/mpeg"
++#define MEDIA_TYPE_OGG_VORBIS "audio/x-vorbis"
++#define MEDIA_TYPE_FLAC "audio/x-flac"
++#define MEDIA_TYPE_AAC "audio/x-aac"
++
++/* media type categories */
++typedef enum {
++ MEDIA_TYPE_NONE = 0,
++ MEDIA_TYPE_CONTAINER,
++ MEDIA_TYPE_AUDIO,
++ MEDIA_TYPE_VIDEO,
++ MEDIA_TYPE_OTHER
++} RBGstMediaType;
++
++char * rb_gst_caps_to_media_type (const GstCaps *caps);
++GstCaps * rb_gst_media_type_to_caps (const char *media_type);
++
++const char * rb_gst_media_type_to_extension (const char *media_type);
++
++const char * rb_gst_mime_type_to_media_type (const char *mime_type);
++
++const char * rb_gst_media_type_to_mime_type (const char *media_type);
++
++GstEncodingTarget *rb_gst_get_default_encoding_target (void);
++
++GstEncodingProfile *rb_gst_get_encoding_profile (const char *media_type);
++
++gboolean rb_gst_media_type_matches_profile (GstEncodingProfile *profile, const char *media_type);
++
++char * rb_gst_encoding_profile_get_media_type (GstEncodingProfile *profile);
++
++gboolean rb_gst_media_type_is_lossless (const char *media_type);
++gboolean rb_gst_check_missing_plugins (GstEncodingProfile *profile,
++ char ***details,
++ char ***descriptions);
++
++G_END_DECLS
++
++#endif /* __MEDIA_TYPES_H */
+Index: gnomeradio-1.8/data/gnomeradio.schemas.in
+===================================================================
+--- gnomeradio-1.8.orig/data/gnomeradio.schemas.in
++++ gnomeradio-1.8/data/gnomeradio.schemas.in
+@@ -113,10 +113,10 @@
+ /apps/gnomeradio/recording/profile
+ gnomeradio
+ string
+- cdlossy
++ audio/x-vorbis
+
+- GnomeMedia Profile
+- Choose the GnomeMedia Profile that should be used for recording
++ Media format
++ Choose the format that should be used for recording
+
+
+
+Index: gnomeradio-1.8/src/Makefile.am
+===================================================================
+--- gnomeradio-1.8.orig/src/Makefile.am
++++ gnomeradio-1.8/src/Makefile.am
+@@ -18,6 +18,8 @@ gnomeradio_SOURCES = \
+ mixer.h \
+ prefs.h \
+ radio.h \
++ rb_gst_media_types.h \
++ rb_missing_plugins.h \
+ rec_tech.h \
+ record.h \
+ trayicon.h \
+@@ -33,6 +35,8 @@ gnomeradio_SOURCES = \
+ mixer-oss.c \
+ prefs.c \
+ radio.c \
++ rb_gst_media_types.c \
++ rb_missing_plugins.c \
+ rec_tech.c \
+ record.c \
+ trayicon.c \
+Index: gnomeradio-1.8/src/rec_tech.c
+===================================================================
+--- gnomeradio-1.8.orig/src/rec_tech.c
++++ gnomeradio-1.8/src/rec_tech.c
+@@ -18,17 +18,19 @@
+ #include "rec_tech.h"
+ #include
+ #include
+-#include
++#include
++#include
+ #include
+ #include
+ #include
+ #include
+ #include
+-
+-#define DECAY_STEP .15
++#include "rb_gst_media_types.h"
++#include "rb_missing_plugins.h"
+
+ GtkWidget *level;
+-static gdouble last_input_peak;
++
++static guint bus_watch_id;
+
+ static void
+ show_error_dialog (GtkWindow *win, const gchar *dbg, const gchar * format, ...)
+@@ -57,88 +59,67 @@ show_error_dialog (GtkWindow *win, const
+ g_free (s);
+ }
+
+-static void
+-show_missing_known_element_error (GtkWindow *win, gchar *description,
+- gchar *element, gchar *plugin, gchar *module)
+-{
+- show_error_dialog (win, NULL,
+- _("Could not create the GStreamer %s element.\n"
+- "Please install the '%s' plugin from the '%s' module.\n"
+- "Verify that the installation is correct by running\n"
+- " gst-inspect-1.0 %s\n"
+- "and then restart gnomeradio."),
+- description, plugin, module, element);
+-}
+-
+-static void
+-show_profile_error (GtkWindow *win, gchar *debug, gchar *description,
+- const char *profile)
+-{
+- gchar *first;
+-
+- first = g_strdup_printf (description, profile);
+- show_error_dialog (win, debug, "%s%s", first,
+- _("Please verify its settings.\n"
+- "You may be missing the necessary plugins."));
+- g_free (first);
+-}
+-
+-static void pipeline_error_cb(GstBus *bus, GstMessage *message, gpointer user_data)
+-{
+- GError *error = NULL;
+- GstElement *pipeline = user_data;
+- g_assert(pipeline);
+-
+- /* Make sure the pipeline is not running any more */
+- gst_element_set_state (pipeline, GST_STATE_NULL);
+-
+- gst_message_parse_error(message, &error, NULL);
+- g_warning(_("GStreamer runtime error: %s\n"), error->message);
+- g_error_free(error);
+-}
+-
+ static gboolean
+-level_message_cb (GstBus *bus, GstMessage *message, gpointer user_data)
++bus_watch_cb (GstBus *bus, GstMessage *message, gpointer data)
+ {
+- if (message->type == GST_MESSAGE_ELEMENT) {
+- const GstStructure *s = gst_message_get_structure (message);
+- const gchar *name = gst_structure_get_name (s);
+-
+- if (g_strcmp0 (name, "level") == 0) {
+- gint channels;
+- gdouble peak_dB;
+- gdouble peak;
+- const GValue *array_val;
+- const GValue *value;
+-
+- GValueArray *rms_arr, *peak_arr;
+- gint i;
+-
+- array_val = gst_structure_get_value (s, "rms");
+- rms_arr = (GValueArray *) g_value_get_boxed (array_val);
+-
+- array_val = gst_structure_get_value (s, "peak");
+- peak_arr = (GValueArray *) g_value_get_boxed (array_val);
+-
+- channels = rms_arr->n_values;
++ GError *error = NULL;
++ gchar *debug = NULL;
+
+- for (i = 0; i < channels; ++i) {
+- value = peak_arr->values + i;
+- peak_dB = g_value_get_double (value);
++ switch (GST_MESSAGE_TYPE (message))
++ {
++ case GST_MESSAGE_ERROR:
++ gst_message_parse_error (message, &error, &debug);
++ g_print ("ERROR: %s\nDEBUG MESSAGE: %s\n", error->message, debug);
++ g_error_free (error);
++ g_free (debug);
++ break;
++ case GST_MESSAGE_WARNING:
++ gst_message_parse_warning (message, &error, &debug);
++ g_print ("WARNING: %s\nDEBUG MESSAGE: %s\n", error->message, debug);
++ g_error_free (error);
++ g_free (debug);
++ break;
++ case GST_MESSAGE_EOS:
++ break;
++ case GST_MESSAGE_ELEMENT:
++ {
++ const GstStructure *structure;
++ const gchar *name;
++
++ structure = gst_message_get_structure (message);
++ name = gst_structure_get_name (structure);
++
++ if (g_strcmp0 (name, "level") == 0) {
++ gint channels;
++ gdouble peak_dB;
++ gdouble peak;
++ const GValue *array_val;
++ const GValue *value;
++
++ GValueArray *rms_arr, *peak_arr;
++ gint i;
++
++ array_val = gst_structure_get_value (structure, "rms");
++ rms_arr = (GValueArray *) g_value_get_boxed (array_val);
++
++ array_val = gst_structure_get_value (structure, "peak");
++ peak_arr = (GValueArray *) g_value_get_boxed (array_val);
++
++ channels = rms_arr->n_values;
++
++ for (i = 0; i < channels; ++i) {
++ value = peak_arr->values + i;
++ peak_dB = g_value_get_double (value);
+
+- peak = pow (10, peak_dB / 20);
+- }
++ peak = pow (10, peak_dB / 20);
+
+- if (last_input_peak >= DECAY_STEP) {
+- if (peak < last_input_peak - DECAY_STEP) {
+- peak = last_input_peak - DECAY_STEP;
++ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (level), peak);
+ }
+ }
+-
+- last_input_peak = peak;
+-
+- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (level), peak);
++ break;
+ }
++ default:
++ break;
+ }
+
+ return TRUE;
+@@ -147,112 +128,81 @@ level_message_cb (GstBus *bus, GstMessag
+ Recording*
+ recording_start(const char* filename)
+ {
+- GMAudioProfile *profile;
+- const gchar *profile_pipeline_desc;
+- GstElement *pipeline, *source, *encoder, *filesink, *level;
+- pipeline = source = encoder = filesink = level = NULL;
+- GError *err = NULL;
+- gchar *pipeline_desc;
+- const char *name;
+-
+- source = gst_element_factory_make ("autoaudiosrc", "autoaudiosource");
+- if (source == NULL) {
+- show_missing_known_element_error (NULL,
+- _("GConf audio recording"), "autoaudiosrc",
+- "gconfelements", "gst-plugins-good");
+- return FALSE;
+- }
+-
+- if (!gst_element_set_state (source, GST_STATE_READY)) {
+- show_error_dialog (NULL, NULL,
+- _("Your audio capture settings are invalid. "
+- "Please correct them with the \"Sound Settings\" "
+- "under the System Settings menu."));
+- return FALSE;
+- }
+-
+- filesink = gst_element_factory_make ("filesink", "sink");
+- if (filesink == NULL)
+- {
+- show_missing_known_element_error (NULL,
+- _("file output"), "filesink", "coreelements", "gstreamer");
++ GstElement *pipeline;
++ GstElement *source;
++ GstElement *level;
++ GstElement *encodebin;
++ GstElement *filesink;
++ GstBus *bus;
++ GstStateChangeReturn ret;
++ GstEncodingProfile *profile;
++ GFile *file;
++ const gchar *extension;
++ gchar *path;
++
++ pipeline = gst_pipeline_new("pipeline");
++ g_return_val_if_fail (pipeline != NULL, NULL);
++
++ if (bus_watch_id != 0) {
++ g_source_remove (bus_watch_id);
++ bus_watch_id = 0;
++ }
++
++ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
++ bus_watch_id = gst_bus_add_watch (bus, bus_watch_cb, pipeline);
++ g_object_unref (bus);
++
++ source = gst_element_factory_make ("autoaudiosrc", NULL);
++ g_return_val_if_fail (source != NULL, NULL);
++
++ ret = gst_element_set_state (source, GST_STATE_READY);
++ if (ret == GST_STATE_CHANGE_FAILURE) {
++ gst_element_set_state (source, GST_STATE_NULL);
+ gst_object_unref (source);
+ return NULL;
+ }
+
+- pipeline = gst_pipeline_new("gnomeradio-record-pipeline");
++ level = gst_element_factory_make ("level", NULL);
++ g_return_val_if_fail (level != NULL, NULL);
++ g_object_set(G_OBJECT(level), "message", TRUE, NULL);
+
+- gst_bin_add (GST_BIN (pipeline), source);
++ filesink = gst_element_factory_make ("filesink", NULL);
++ g_return_val_if_fail (filesink != NULL, NULL);
+
+- level = gst_element_factory_make ("level", "level");
+- if (level == NULL)
+- {
+- show_missing_known_element_error (NULL,
+- _("level"), "level", "level", "gstreamer");
+- gst_object_unref (source);
+- return NULL;
+- }
+- gst_element_set_name (level, "level");
++ profile = rb_gst_get_encoding_profile(rec_settings.profile);
++ encodebin = gst_element_factory_make ("encodebin", NULL);
++ g_return_val_if_fail (encodebin != NULL, NULL);
+
+- profile = gm_audio_profile_lookup(rec_settings.profile);
+- g_assert(profile);
+- if (profile == NULL)
+- return NULL;
+- profile_pipeline_desc = gm_audio_profile_get_pipeline (profile);
+- name = gm_audio_profile_get_name (profile);
++ g_object_set (G_OBJECT (encodebin),
++ "profile", profile,
++ "queue-time-max", 120 * GST_SECOND,
++ NULL);
+
+- GST_DEBUG ("encoder profile pipeline: '%s'", GST_STR_NULL (profile_pipeline_desc));
++ gst_bin_add_many (GST_BIN (pipeline), source, level, encodebin, filesink, NULL);
+
+- pipeline_desc = g_strdup_printf ("audioconvert ! %s", profile_pipeline_desc);
+- GST_DEBUG ("making encoder bin from description '%s'", pipeline_desc);
+- encoder = gst_parse_bin_from_description (pipeline_desc, TRUE, &err);
+- g_free (pipeline_desc);
+- pipeline_desc = NULL;
+-
+- if (err) {
+- show_profile_error (NULL, err->message,
+- _("Could not parse the '%s' audio profile. "), name);
+- g_printerr ("Failed to create GStreamer encoder plugins [%s]: %s\n", profile_pipeline_desc, err->message);
+- g_error_free (err);
++ if (!gst_element_link_many (source, level, encodebin, filesink, NULL)) {
+ gst_object_unref (pipeline);
+- gst_object_unref (filesink);
+- g_free (pipeline);
+ return NULL;
+ }
+
+- gst_bin_add (GST_BIN (pipeline), level);
+- gst_bin_add (GST_BIN (pipeline), encoder);
+- gst_bin_add (GST_BIN (pipeline), filesink);
+-
+- if (!(gst_element_link_many (source, level, encoder, NULL))) {
+- show_profile_error (NULL, NULL,
+- _("Could not capture using the '%s' audio profile. "), name);
+- gst_object_unref (pipeline);
+- g_free (pipeline);
+- return NULL;
+- }
++ extension = rb_gst_media_type_to_extension(rec_settings.profile);
++ path = g_strdup_printf("%s.%s", filename, extension);
+
+- if (!gst_element_link (encoder, filesink)) {
+- show_profile_error (NULL, NULL,
+- _("Could not write to a file using the '%s' audio profile. "), name);
++ g_object_set (G_OBJECT(filesink), "location", path, NULL);
++
++ file = g_file_new_for_path (path);
++ g_free (path);
++
++ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ if (ret == GST_STATE_CHANGE_FAILURE) {
++ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+- g_free (pipeline);
+ return NULL;
+ }
+-
+- GstBus *bus = gst_element_get_bus(pipeline);
+- gst_bus_add_signal_watch(bus);
+-
+- g_signal_connect(G_OBJECT(bus), "message::error", G_CALLBACK(pipeline_error_cb), pipeline);
+- g_signal_connect (G_OBJECT(bus), "message::element", G_CALLBACK (level_message_cb), pipeline);
+-
+- char* path = g_strdup_printf("%s.%s", filename, gm_audio_profile_get_extension(profile));
+- g_object_set(G_OBJECT(filesink), "location", path, NULL);
+-
+- gst_element_set_state(pipeline, GST_STATE_PLAYING);
+
+- Recording *recording = g_malloc0(sizeof(Recording));
+- recording->filename = path;
++ Recording *recording;
++ recording = g_malloc0 (sizeof (Recording));
++ recording->file = file;
+ recording->pipeline = pipeline;
+
+ return recording;
+@@ -261,26 +211,33 @@ recording_start(const char* filename)
+ void
+ recording_stop(Recording *recording)
+ {
+- g_assert(recording);
+-
+ GstState state;
+- gst_element_get_state(recording->pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
+- if (state != GST_STATE_PLAYING) {
+- GST_DEBUG ("pipeline in wrong state: %s", gst_element_state_get_name (state));
+- } else {
+- GstMessage *msg;
+- GST_DEBUG ("Stopping recording source");
+- gst_element_send_event (recording->pipeline, gst_event_new_eos ());
+- /* wait for EOS message on the pipeline bus */
+- msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (recording->pipeline), GST_SECOND, GST_MESSAGE_EOS | GST_MESSAGE_ERROR);
+- gst_message_unref (msg);
+
+- gst_element_set_state(recording->pipeline, GST_STATE_NULL);
++ if (recording) {
++
++ gst_element_get_state (recording->pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
++
++ if (state == GST_STATE_PLAYING) {
++ GstMessage *msg;
++ gst_element_send_event (recording->pipeline, gst_event_new_eos ());
++ /* wait one second for EOS message on the pipeline bus */
++ msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (recording->pipeline),
++ GST_SECOND,
++ GST_MESSAGE_EOS | GST_MESSAGE_ERROR);
++ gst_message_unref (msg);
++ gst_element_set_state (recording->pipeline, GST_STATE_NULL);
++ }
++
++ if (bus_watch_id != 0) {
++ g_source_remove (bus_watch_id);
++ bus_watch_id = 0;
++ }
++
++ gst_object_unref (recording->pipeline);
++ g_object_unref (recording->file);
++ g_free (recording->station);
++ g_free (recording);
+ }
+- gst_object_unref(GST_OBJECT(recording->pipeline));
+- g_free(recording->filename);
+- g_free(recording->station);
+- g_free(recording);
+ }
+
+ /*
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -22,7 +22,7 @@
+
+ #include
+ #include
+-#include
++#include
+ #include
+ #include
+ #include
+@@ -36,6 +36,8 @@
+ #include "lirc.h"
+ #include "prefs.h"
+ #include "record.h"
++#include "rb_gst_media_types.h"
++#include "rb_missing_plugins.h"
+
+ #include "../data/pixmaps/digits.xpm"
+ #include "../data/pixmaps/signal.xpm"
+@@ -784,27 +786,69 @@ void recording_set_sensible(gboolean sen
+ static int start_recording(const gchar *destination, const char* station, const char* time)
+ {
+ Recording* recording;
+- char *filename;
+-
++ GFile *file;
++ GFileInfo *info;
++ gchar *caption, *detail;
++
++ file = g_file_new_for_path (rec_settings.destination);
++ info = g_file_query_info (file,
++ G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE,
++ G_FILE_QUERY_INFO_NONE,
++ NULL,
++ NULL);
++
++ if (info != NULL) {
++ if (!g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE)) {
++ caption = g_strdup_printf (_("Could not write file to \"%s\" location!"), rec_settings.destination);
++ detail = g_strdup_printf (_("Check your settings and make sure that you have write access to it."));
++ show_error_message (caption, detail);
++
++ g_free (caption);
++ g_free (detail);
++
++ g_object_unref(info);
++ g_object_unref(file);
++
++ return -1;
++ }
++ g_object_unref(info);
++ }
++ g_object_unref(file);
++
++ if (rb_gst_check_missing_plugins (rb_gst_get_encoding_profile (rec_settings.profile), NULL, NULL)) {
++ gchar *extension, *format;
++
++ extension = g_utf8_strup (rb_gst_media_type_to_extension (rec_settings.profile), -1);
++ format = g_strdup_printf ("%s", extension);
++ caption = g_strdup_printf (_("Could not write file in \"%s\" format!"), format);
++ detail = g_strdup_printf (_("You need to install additional software required to use this format."));
++ show_error_message (caption, detail);
++
++ g_free (extension);
++ g_free (format);
++ g_free (caption);
++ g_free (detail);
++
++ return -1;
++ }
++
+ /* You can translate the filename for a recording:
+- * args for this format are: path, station title, time
+- */
+- filename = g_strdup_printf(_("%s/%s_%s"),
+- destination,
+- station,
+- time);
+- recording = recording_start(filename);
+- g_free(filename);
++ * args for this format are: path, station title, time
++ */
++ char *filename = g_strdup_printf (_("%s/%s_%s"), destination, station, time);
++ recording = recording_start (filename);
++ g_free (filename);
++
+ if (!recording)
+ return -1;
+-
+- tray_icon_items_set_sensible(FALSE);
+- recording_set_sensible(FALSE);
+-
+- recording->station = g_strdup(station);
+- record_status_window(recording);
+-
+- run_status_window(recording);
++
++ tray_icon_items_set_sensible (FALSE);
++ recording_set_sensible (FALSE);
++
++ recording->station = g_strdup (station);
++ record_status_window (recording);
++
++ run_status_window (recording);
+
+ return 1;
+ }
+@@ -1131,8 +1175,8 @@ GtkWidget* gnome_radio_gui(void)
+ gtk_widget_set_tooltip_text(stbw_button, _("0.05 MHz Backwards"));
+ gtk_widget_set_tooltip_text(stfw_button, _("0.05 MHz Forwards"));
+ gtk_widget_set_tooltip_text(about_button, _("About"));
+- gtk_widget_set_tooltip_text(rec_button, _("Record radio as OGG, Flac, Wave or MP3"));
+- gtk_widget_set_tooltip_text(prefs_button, _("Edit your Preferences"));
++ gtk_widget_set_tooltip_text(rec_button, _("Record radio as MP3, OGG, FLAC or M4A"));
++ gtk_widget_set_tooltip_text(prefs_button, _("Preferences"));
+ gtk_widget_set_tooltip_text(volume_button, _("Adjust the Volume"));
+ gtk_widget_set_tooltip_text(quit_button, _("Quit"));
+ text = g_strdup_printf(_("Frequency: %.2f MHz"), gtk_adjustment_get_value(adj)/STEPS);
+@@ -1355,6 +1399,8 @@ int main(int argc, char* argv[])
+
+ /* Initizialize GStreamer */
+ gst_init(&argc, &argv);
++
++ rb_missing_plugins_init (GTK_WINDOW (app));
+
+ /* Initizialize Gconf */
+ if (!gconf_init(argc, argv, &err)) {
+@@ -1367,7 +1413,6 @@ int main(int argc, char* argv[])
+ } else {
+ gconf_client_set_global_default_error_handler((GConfClientErrorHandlerFunc)gconf_error_handler);
+ gconf_client_set_error_handling(gconf_client_get_default(), GCONF_CLIENT_HANDLE_ALL);
+- gnome_media_profiles_init(gconf_client_get_default());
+ }
+
+ load_settings();
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -16,7 +16,9 @@
+
+ #include
+ #include
+-#include
++#include
++#include
++#include
+ #include
+ #include
+ #include
+@@ -25,6 +27,8 @@
+ #include "trayicon.h"
+ #include "gui.h"
+ #include "rec_tech.h"
++#include "rb_gst_media_types.h"
++#include "rb_missing_plugins.h"
+
+ extern GtkWidget *preset_combo;
+ extern GtkAdjustment *adj;
+@@ -37,6 +41,8 @@ extern gboolean main_visible;
+ static GtkWidget *device_entry, *mixer_entry;
+ static GtkWidget *mute_on_exit_cb;
+ static GtkWidget *save_button, *move_up_button, *move_down_button, *add_button, *remove_button;
++static GtkWidget *audio_profile_combo;
++static GtkWidget *install_plugins_button;
+ static GtkWidget *list_view;
+ static GtkListStore *list_store;
+ static GtkTreeSelection *selection;
+@@ -158,7 +164,7 @@ gboolean load_settings(void)
+ rec_settings.destination = g_strdup(g_get_home_dir());
+ rec_settings.profile = gconf_client_get_string(client, "/apps/gnomeradio/recording/profile", NULL);
+ if (!rec_settings.profile)
+- rec_settings.profile = g_strdup("cdlossy");
++ rec_settings.profile = g_strdup("audio/x-vorbis");
+
+ /* Load the presets */
+ count = gconf_client_get_int(client, "/apps/gnomeradio/presets/presets", NULL);
+@@ -274,15 +280,135 @@ static gboolean mixer_entry_activate_cb(
+ return FALSE;
+ }*/
+
+-static gboolean profile_combo_change_cb(GtkComboBox *combo, gpointer userdata)
++static void audio_profile_combo_change_cb(GtkWidget *widget, gpointer user_data)
+ {
+- GMAudioProfile* profile = gm_audio_profile_choose_get_active(GTK_WIDGET(combo));
++ GtkTreeModel *model;
++ GtkTreeIter iter;
++ char *media_type = NULL;
++ GstEncodingProfile *profile;
+
+- g_assert(rec_settings.profile);
+- g_free(rec_settings.profile);
+- rec_settings.profile = g_strdup(gm_audio_profile_get_id(profile));
++ model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
++ /* get selected media type */
++ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter) == FALSE)
++ return;
++ gtk_tree_model_get (GTK_TREE_MODEL (model),
++ &iter,
++ 0, &media_type,
++ 2, &profile,
++ -1);
++
++ rec_settings.profile = g_strdup(media_type);
++
++ /* indicate whether additional plugins are required to encode in this format */
++ if (rb_gst_check_missing_plugins (profile, NULL, NULL)) {
++ gtk_widget_set_visible (install_plugins_button, TRUE);
+
+- return FALSE;
++ gtk_widget_set_sensitive (install_plugins_button,
++ gst_install_plugins_supported ());
++ } else {
++ gtk_widget_set_visible (install_plugins_button, FALSE);
++ }
++ g_free (media_type);
++}
++
++static void
++audio_profile_chooser_set_active(GtkWidget *widget, const char *profile)
++{
++ GtkTreeIter iter;
++ GtkTreeModel *model;
++ gboolean done;
++
++ done = FALSE;
++ model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
++ if (gtk_tree_model_get_iter_first(model, &iter)) {
++ do {
++ char *media_type;
++
++ gtk_tree_model_get(model, &iter, 0, &media_type, -1);
++ if (g_strcmp0(media_type, profile) == 0) {
++ gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widget), &iter);
++ done = TRUE;
++ }
++ g_free (media_type);
++ } while (done == FALSE && gtk_tree_model_iter_next(model, &iter));
++ }
++
++ if (done == FALSE) {
++ gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widget), NULL);
++ }
++}
++
++static GtkWidget *audio_profile_choose_new(void)
++{
++ GstEncodingTarget *target;
++ const GList *p;
++ GtkWidget *combo;
++ GtkCellRenderer *renderer;
++ GtkTreeModel *model;
++
++ model = GTK_TREE_MODEL(gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER));
++
++ target = rb_gst_get_default_encoding_target();
++ for (p = gst_encoding_target_get_profiles(target); p != NULL; p = p->next) {
++ GstEncodingProfile *profile = GST_ENCODING_PROFILE (p->data);
++ char *media_type;
++
++ media_type = rb_gst_encoding_profile_get_media_type(profile);
++ if (media_type == NULL) {
++ continue;
++ }
++ gtk_tree_store_insert_with_values(GTK_TREE_STORE(model),
++ NULL, NULL, -1,
++ 0, media_type,
++ 1, gst_encoding_profile_get_description(profile),
++ 2, profile, -1);
++ g_free(media_type);
++ }
++
++ combo = gtk_combo_box_new_with_model(model);
++ renderer = gtk_cell_renderer_text_new();
++ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
++ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer, "text", 1, NULL);
++
++ return GTK_WIDGET(combo);
++}
++
++static void
++audio_plugin_install_done_cb (gpointer inst, gboolean retry, gpointer user_data)
++{
++ audio_profile_combo_change_cb (audio_profile_combo, user_data);
++}
++
++static void
++audio_profile_install_plugins_cb (GtkWidget *widget, gpointer user_data)
++{
++ GstEncodingProfile *profile;
++ char **details;
++ GClosure *closure;
++
++ /* get profile */
++ profile = rb_gst_get_encoding_profile (rec_settings.profile);
++ if (profile == NULL) {
++ g_free (rec_settings.profile);
++ return;
++ }
++ g_free (rec_settings.profile);
++
++ /* get plugin details */
++ if (rb_gst_check_missing_plugins (profile, &details, NULL) == FALSE) {
++ return;
++ }
++
++ /* attempt installation */
++ closure = g_cclosure_new ((GCallback) audio_plugin_install_done_cb,
++ g_object_ref (audio_profile_combo),
++ (GClosureNotify) g_object_unref);
++ g_closure_set_marshal (closure, g_cclosure_marshal_VOID__BOOLEAN);
++
++ rb_missing_plugins_install ((const char **)details, TRUE, closure);
++
++ g_closure_sink (closure);
++ g_strfreev (details);
+ }
+
+ static void add_button_clicked_cb(GtkWidget *widget, gpointer data)
+@@ -1066,14 +1192,15 @@ GtkWidget* prefs_window(GtkWidget *app)
+ GtkWidget *s_indent_label, *p_indent_label, *r_indent_label;
+ GtkWidget *destination_label;
+ GtkWidget *destination_button;
+- GtkWidget *profile_combo;
+- GtkWidget *profile_eb;
++ GtkWidget *audio_profile_label;
+ GtkWidget *device_label, *mixer_label;
+ GtkWidget *button_box;
+ GtkWidget *open_button;
+ GtkWidget *scrolled_window;
+ GtkCellRenderer *cellrenderer;
+ GtkTreeViewColumn *list_column;
++
++ GstEncodingProfile *profile;
+ gint i;
+ char *settings_hdr, *presets_hdr, *record_hdr;
+ preset* ps;
+@@ -1285,22 +1412,35 @@ GtkWidget* prefs_window(GtkWidget *app)
+ _("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+ gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(destination_button), rec_settings.destination);
+
+- profile_eb = gtk_event_box_new();
+- gtk_widget_set_hexpand(profile_eb, TRUE);
+- gtk_widget_set_halign(profile_eb, GTK_ALIGN_FILL);
+- profile_combo = gm_audio_profile_choose_new();
+- gtk_container_add(GTK_CONTAINER(profile_eb), profile_combo);
+- gm_audio_profile_choose_set_active(profile_combo, rec_settings.profile);
++ audio_profile_label = gtk_label_new(_("Format:"));
++ gtk_widget_set_halign(audio_profile_label, GTK_ALIGN_START);
++ audio_profile_combo = audio_profile_choose_new();
++ audio_profile_chooser_set_active(audio_profile_combo, rec_settings.profile);
++
++ install_plugins_button = gtk_button_new_with_label(_("Install additional software required to use this format\xE2\x80\xA6"));
++ gtk_widget_set_no_show_all (install_plugins_button, TRUE);
++
++ profile = rb_gst_get_encoding_profile (rec_settings.profile);
++ if (rb_gst_check_missing_plugins (profile, NULL, NULL)) {
++ gtk_widget_set_visible (install_plugins_button, TRUE);
++ gtk_widget_set_sensitive (install_plugins_button,
++ gst_install_plugins_supported ());
++ } else {
++ gtk_widget_set_visible (install_plugins_button, FALSE);
++ }
+
+ gtk_grid_attach(GTK_GRID(grid), destination_label, 1, 9, 1, 1);
+ gtk_grid_attach(GTK_GRID(grid), destination_button, 2, 9, 1, 1);
+- gtk_grid_attach(GTK_GRID(grid), profile_eb, 1, 10, 2, 1);
++ gtk_grid_attach(GTK_GRID(grid), audio_profile_label, 1, 10, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), audio_profile_combo, 2, 10, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), install_plugins_button, 2, 11, 1, 1);
+
+ g_signal_connect(GTK_FILE_CHOOSER(destination_button), "selection-changed", G_CALLBACK(destination_button_clicked_cb), NULL);
+- g_signal_connect(G_OBJECT(profile_combo), "changed", G_CALLBACK(profile_combo_change_cb), NULL);
++ g_signal_connect(G_OBJECT(audio_profile_combo), "changed", G_CALLBACK(audio_profile_combo_change_cb), NULL);
++ g_signal_connect(G_OBJECT(install_plugins_button), "clicked", G_CALLBACK(audio_profile_install_plugins_cb), NULL);
+
+- gtk_widget_set_tooltip_text(destination_button, _("Choose a destination directory for recording file."));
+- gtk_widget_set_tooltip_text(profile_eb, _("Choose the Media Profile that should be used to record."));
++ gtk_widget_set_tooltip_text(destination_button, _("Select a location where to save recorded file."));
++ gtk_widget_set_tooltip_text(audio_profile_combo, _("Choose the format that should be used for recording."));
+
+ gtk_widget_show_all(dialog);
+
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -30,17 +30,20 @@
+ #include "rec_tech.h"
+ #include "prefs.h"
+
+-static int timeout_id = -1;
+-static GtkWidget *file_lbl, *type_lbl, *size_lbl, *length_lbl;
++extern GtkWidget *level;
++
+ static GtkWidget *status_dialog;
++static GtkWidget *file_lbl;
++static GtkWidget *type_lbl;
++static GtkWidget *size_lbl;
++static GtkWidget *length_lbl;
+
+-extern GtkWidget *level;
++static int timeout_id = -1;
+
+ void close_status_window(void)
+ {
+- if (timeout_id >= 0)
+- {
+- g_source_remove(timeout_id);
++ if (timeout_id >= 0) {
++ g_source_remove (timeout_id);
+ timeout_id = -1;
+ }
+
+@@ -114,94 +117,67 @@ static char *seconds_to_full_string (gui
+ return time;
+ }
+
+-static gboolean timeout_cb(gpointer data)
++static gboolean timeout_cb (gpointer data)
+ {
+ Recording *recording = data;
+- GError *error = NULL;
+- GFile *file;
+- GFileInfo *info;
+
+- gchar *description, *name, *mime, *type, *size = NULL;
+- gchar *utf8_name = NULL;
+- const gchar *content_type;
+- guint64 s;
++ g_assert (recording);
+
+- g_assert(recording);
+-
+- if (!gtk_widget_get_visible(status_dialog))
+- gtk_widget_show_all(status_dialog);
+-
+- /* name */
+- name = g_path_get_basename(recording->filename);
+- utf8_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL);
+- gtk_label_set_text(GTK_LABEL(file_lbl), utf8_name);
+- g_free (name);
+- g_free (utf8_name);
+-
+- /* type */
+- file = g_file_new_for_path(recording->filename);
+- info = g_file_query_info(file,
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+- G_FILE_QUERY_INFO_NONE,
+- NULL,
+- &error);
+-
+- if (error == NULL) {
+- content_type = g_file_info_get_content_type(info);
+- description = g_content_type_get_description(content_type);
+- mime = g_content_type_get_mime_type(content_type);
++ if (!gtk_widget_get_visible (status_dialog))
++ gtk_widget_show_all (status_dialog);
++
++ GFileInfo *info;
++
++ info = g_file_query_info (recording->file,
++ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME ","
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
++ G_FILE_ATTRIBUTE_STANDARD_SIZE,
++ G_FILE_QUERY_INFO_NONE,
++ NULL,
++ NULL);
++
++ if (info != NULL) {
++ const gchar *display_name, *content_type;
++ gchar *description, *mime, *type, *size;
++ gint64 file_size;
++
++ display_name = g_file_info_get_display_name (info);
++
++ gtk_label_set_text (GTK_LABEL (file_lbl), display_name);
++
++ content_type = g_file_info_get_content_type (info);
++ description = g_content_type_get_description (content_type);
++ mime = g_content_type_get_mime_type (content_type);
+ type = g_strdup_printf ("%s (%s)", description, mime);
+- gtk_label_set_text(GTK_LABEL(type_lbl), type);
+
+- g_object_unref(info);
+- g_free(description);
+- g_free(mime);
+- g_free(type);
+- } else {
+- fprintf(stderr, "%s\n", error->message);
+- g_error_free(error);
++ gtk_label_set_text (GTK_LABEL (type_lbl), type);
+
+- return FALSE;
+- }
++ g_free (description);
++ g_free (mime);
++ g_free (type);
+
+- /* size */
+- info = g_file_query_info(file,
+- G_FILE_ATTRIBUTE_STANDARD_SIZE,
+- G_FILE_QUERY_INFO_NONE,
+- NULL,
+- &error);
+- if (error == NULL) {
+- s = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_STANDARD_SIZE);
+- size = g_format_size_full(s, G_FORMAT_SIZE_LONG_FORMAT);
+- gtk_label_set_text(GTK_LABEL(size_lbl), size);
++ file_size = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_STANDARD_SIZE);
+
+- g_object_unref(info);
+- g_free(size);
+- } else {
+- fprintf(stderr, "%s\n", error->message);
+- g_error_free(error);
++ size = g_format_size_full (file_size, G_FORMAT_SIZE_LONG_FORMAT);
++ gtk_label_set_text (GTK_LABEL (size_lbl), size);
+
+- close_status_window();
+- recording_stop(recording);
++ g_free (size);
+
+- return FALSE;
+- }
+- g_object_unref(file);
++ g_object_unref (info);
++
++ gint64 position;
+
+- /* length */
+- GstElement *pipeline;
+- gint64 val = -1;
+- gint secs;
+-
+- pipeline = recording->pipeline;
+-
+- if (gst_element_query_position (pipeline, GST_FORMAT_TIME, &val) && val != -1) {
+- gchar* length;
+- secs = val / GST_SECOND;
+-
+- length = seconds_to_full_string(secs);
+- gtk_label_set_text(GTK_LABEL(length_lbl), length);
+- g_free(length);
++ if (gst_element_query_position (recording->pipeline, GST_FORMAT_TIME, &position)) {
++ gchar* length;
++ gint secs;
++
++ secs = position / GST_SECOND;
++ length = seconds_to_full_string (secs);
++
++ gtk_label_set_text (GTK_LABEL (length_lbl), length);
++
++ g_free (length);
++ }
+ }
+
+ return TRUE;
+Index: gnomeradio-1.8/src/rec_tech.h
+===================================================================
+--- gnomeradio-1.8.orig/src/rec_tech.h
++++ gnomeradio-1.8/src/rec_tech.h
+@@ -16,6 +16,7 @@
+
+ #ifndef _REC_TECH_H
+ #define _REC_TECH_H
++#include
+ #include
+
+ typedef struct Recording_Settings recording_settings;
+@@ -36,7 +37,7 @@ recording_settings rec_settings;
+
+ typedef struct {
+ GstElement* pipeline;
+- char* filename;
++ GFile* file;
+ char* station;
+ } Recording;
+
diff -pruN 1.8-2/debian/patches/gnomeradio-ngettext.patch 1.8-2ubuntu32/debian/patches/gnomeradio-ngettext.patch
--- 1.8-2/debian/patches/gnomeradio-ngettext.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-ngettext.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,163 @@
+Description: Adds ngettext support for messages strings.
+Origin: upstream, https://bugzilla.gnome.org/attachment.cgi?id=211463&action=diff
+Bug-Ubuntu: http://launchpad.net/bugs/980633
+Author: Daniel Mustieles
+Forwarded: not-needed
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -106,7 +106,14 @@ static gboolean initial_frequency_scan_c
+ }
+
+ if (radio_check_station(freq)) {
+- char *text = g_strdup_printf(_("%d stations found"), g_list_length(fsd->stations) + 1);
++ guint num;
++ char *text;
++
++ num = g_list_length (fsd->stations) + 1;
++ text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE,
++ "%d station found",
++ "%d stations found", num), num);
++
+ gfloat *f = g_malloc(sizeof(gfloat));
+ gtk_label_set_text(GTK_LABEL(fsd->label), text);
+ g_free(text);
+@@ -128,69 +135,95 @@ static gboolean initial_frequency_scan_c
+ static void initial_frequency_scan(GtkWidget *app)
+ {
+ FreqScanData data;
+- GtkWidget *title;
+- char *title_hdr;
++ GtkWidget *content_area;
++ GtkWidget *box;
++ GtkWidget *label;
++ gchar *markup;
+
+ data.stations = NULL;
+
+- data.dialog = gtk_dialog_new_with_buttons(_("Scanning"),
+- GTK_WINDOW(app), DIALOG_FLAGS, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
+- /* gtk_dialog_set_has_separator(GTK_DIALOG(data.dialog), FALSE); */
+- gtk_window_set_resizable(GTK_WINDOW(data.dialog), FALSE);
+-
+- title_hdr = g_strconcat("", _("Scanning for available stations:"), " ", NULL);
+- title = gtk_label_new(title_hdr);
+- gtk_misc_set_alignment(GTK_MISC(title), 0, 0.5);
+- gtk_label_set_use_markup(GTK_LABEL(title), TRUE);
+- g_free(title_hdr);
+- gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(data.dialog))), title, FALSE, FALSE, 6);
+-
+- data.progress = gtk_progress_bar_new();
+- gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(data.dialog))), data.progress, TRUE, FALSE, 6);
+-
+- data.label = gtk_label_new(_("No stations found"));
+- gtk_misc_set_alignment(GTK_MISC(data.label), 0, 0.5);
+- gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(data.dialog))), data.label, TRUE, FALSE, 6);
++ data.dialog = gtk_dialog_new_with_buttons (_("Scanning"),
++ GTK_WINDOW (app),
++ DIALOG_FLAGS,
++ GTK_STOCK_CANCEL,
++ GTK_RESPONSE_CANCEL,
++ NULL);
++
++ gtk_window_set_resizable (GTK_WINDOW (data.dialog), FALSE);
++
++ content_area = gtk_dialog_get_content_area (GTK_DIALOG (data.dialog));
++
++ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
++ gtk_container_set_border_width (GTK_CONTAINER (box), 8);
+
+- gtk_widget_show_all(data.dialog);
++ label = gtk_label_new (NULL);
++ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
++ markup = g_strdup_printf ("%s ", _("Scanning for available stations"));
++ gtk_label_set_markup (GTK_LABEL (label), markup);
++ g_free (markup);
++ gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
++
++ data.progress = gtk_progress_bar_new ();
++ gtk_box_pack_start (GTK_BOX (box), data.progress, FALSE, FALSE, 0);
++
++ data.label = gtk_label_new (_("No stations found"));
++ gtk_misc_set_alignment (GTK_MISC (data.label), 0, 0.5);
++ gtk_box_pack_start (GTK_BOX (box), data.label, FALSE, FALSE, 0);
++
++ gtk_container_add (GTK_CONTAINER (content_area), box);
++ gtk_widget_show_all (data.dialog);
+
+ radio_mute();
+- timeout_id = g_timeout_add(1000/SCAN_SPEED, (GSourceFunc)initial_frequency_scan_cb, (gpointer)&data);
+- gtk_dialog_run(GTK_DIALOG(data.dialog));
++ timeout_id = g_timeout_add (1000/SCAN_SPEED, (GSourceFunc)initial_frequency_scan_cb, (gpointer)&data);
++ gtk_dialog_run (GTK_DIALOG (data.dialog));
+
+ radio_unmute();
+ if (timeout_id) {
+- g_source_remove(timeout_id);
++ g_source_remove (timeout_id);
+ timeout_id = 0;
+- gtk_widget_destroy(data.dialog);
++ gtk_widget_destroy (data.dialog);
+ } else {
+- if (g_list_length(data.stations) > 0) {
++ if (g_list_length (data.stations) > 0) {
++ GtkWidget *dialog;
++ GList *l;
++ guint num;
++ int response;
++ char *text;
++
+ gfloat f = *((gfloat*)data.stations->data);
+ gtk_adjustment_set_value(adj, f*STEPS);
+ radio_set_freq(f);
+
+- GtkWidget *dialog;
+- GList *ptr;
+- char *text;
+-
+- text = g_strdup_printf(_("%d stations found. \nDo you want to add them as presets?\n"),
+- g_list_length(data.stations));
+-
+- dialog = gtk_message_dialog_new(GTK_WINDOW(app), DIALOG_FLAGS, GTK_MESSAGE_QUESTION,
+- GTK_BUTTONS_YES_NO, "%s", text);
+- g_free(text);
+-
+- int response = gtk_dialog_run(GTK_DIALOG(dialog));
+- gtk_widget_destroy(dialog);
++ num = g_list_length (data.stations);
++ text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE,
++ "%d station found.",
++ "%d stations found.", num), num);
++
++ dialog = gtk_message_dialog_new (GTK_WINDOW (app),
++ DIALOG_FLAGS,
++ GTK_MESSAGE_QUESTION,
++ GTK_BUTTONS_YES_NO,
++ "%s", text);
++
++ if (num == 1)
++ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
++ _("Do you want to add it as preset?"));
++ else
++ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
++ _("Do you want to add them as presets?"));
++ g_free (text);
++
++ response = gtk_dialog_run (GTK_DIALOG (dialog));
++ gtk_widget_destroy (dialog);
+
+- for (ptr = data.stations; ptr; ptr = ptr->next) {
++ for (l = data.stations; l; l = l->next) {
+ if (response == GTK_RESPONSE_YES) {
+ preset *ps = g_malloc0(sizeof(preset));
+ ps->title = g_strdup(_("unnamed"));
+- ps->freq = *((gfloat*)ptr->data);
++ ps->freq = *((gfloat*)l->data);
+ settings.presets = g_list_append(settings.presets, ps);
+ }
+- g_free(ptr->data);
++ g_free(l->data);
+ }
+ }
+ }
diff -pruN 1.8-2/debian/patches/gnomeradio-non_modal.patch 1.8-2ubuntu32/debian/patches/gnomeradio-non_modal.patch
--- 1.8-2/debian/patches/gnomeradio-non_modal.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-non_modal.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,93 @@
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -61,6 +61,9 @@ gboolean main_visible;
+ static GtkWidget *drawing_area;
+ static GdkPixbuf *digits, *signal_s, *stereo;
+ static GtkWidget *freq_scale;
++static GtkWidget *scfw_button, *scbw_button, *stfw_button, *stbw_button;
++static GtkWidget *rec_button;
++static GtkWidget *prefs_button;
+
+ static int timeout_id, bp_timeout_id = -1, bp_timeout_steps = 0;
+
+@@ -719,6 +722,25 @@ void tray_icon_items_set_sensible(gboole
+ gtk_widget_set_sensitive(menuitem, sensible);
+ }
+
++void recording_set_sensible(gboolean sensible)
++{
++ /* Disable the presets */
++ gtk_widget_set_sensitive(preset_combo, sensible);
++
++ /* Disable the scan button */
++ gtk_widget_set_sensitive(freq_scale, sensible);
++ gtk_widget_set_sensitive(scfw_button, sensible);
++ gtk_widget_set_sensitive(scbw_button, sensible);
++ gtk_widget_set_sensitive(stfw_button, sensible);
++ gtk_widget_set_sensitive(stbw_button, sensible);
++
++ /* Disable the record button */
++ gtk_widget_set_sensitive(rec_button, sensible);
++
++ /* Disable the preferences button */
++ gtk_widget_set_sensitive(prefs_button, sensible);
++}
++
+ static int start_recording(const gchar *destination, const char* station, const char* time)
+ {
+ Recording* recording;
+@@ -747,6 +769,7 @@ static int start_recording(const gchar *
+ return -1;
+
+ tray_icon_items_set_sensible(FALSE);
++ recording_set_sensible(FALSE);
+
+ recording->station = g_strdup(station);
+ record_status_window(recording);
+@@ -931,8 +954,8 @@ void toggle_mainwindow_visibility(GtkWid
+ GtkWidget* gnome_radio_gui(void)
+ {
+ GtkWidget *app;
+- GtkWidget *prefs_button, *quit_button, *scfw_button, *scbw_button;
+- GtkWidget *stfw_button, *stbw_button, *about_button, *rec_button;
++ GtkWidget *quit_button;
++ GtkWidget *about_button;
+ GtkWidget *prefs_pixmap, *rec_pixmap, *quit_pixmap, *scfw_pixmap, *scbw_pixmap;
+ GtkWidget *stfw_pixmap, *stbw_pixmap, *about_pixmap;
+ GtkWidget *freq_up_pixmap, *freq_down_pixmap;
+Index: gnomeradio-1.8/src/gui.h
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.h
++++ gnomeradio-1.8/src/gui.h
+@@ -75,6 +75,8 @@ void tray_icon_items_set_sensible(gboole
+ gboolean
+ key_press_event_cb(GtkWidget *app, GdkEventKey *event, gpointer data);
+
++void recording_set_sensible(gboolean sensible);
++
+ void display_help_cb(char *topic);
+
+ void change_preset(gboolean next);
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -50,6 +50,7 @@ void close_status_window(void)
+ status_dialog = NULL;
+
+ tray_icon_items_set_sensible(TRUE);
++ recording_set_sensible(TRUE);
+ }
+
+ static char *seconds_to_full_string (guint seconds)
+@@ -335,7 +336,7 @@ GtkWidget* record_status_window(Recordin
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(stop_rec_button_clicked_cb), recording);
+ g_signal_connect(G_OBJECT(status_dialog), "key-press-event", G_CALLBACK(key_press_event_cb), recording);
+
+- gtk_window_set_modal(GTK_WINDOW(status_dialog), TRUE);
++ gtk_window_set_position(GTK_WINDOW(status_dialog), GTK_WIN_POS_CENTER);
+
+ return status_dialog;
+ }
diff -pruN 1.8-2/debian/patches/gnomeradio-popover.patch 1.8-2ubuntu32/debian/patches/gnomeradio-popover.patch
--- 1.8-2/debian/patches/gnomeradio-popover.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-popover.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,70 @@
+Description: Fix volume button popup with a known limitation of popovers (at least in their current implementation).
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1438261
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -93,6 +93,7 @@ static int timeout_id;
+ static int bp_timeout_id = -1;
+ static int bp_timeout_steps = 0;
+ static int volume_value_changed_id;
++static int redraw_status_window_id;
+ static gint mode;
+
+ static gboolean do_scan;
+@@ -566,6 +567,19 @@ static gboolean draw_cb(GtkWidget *widge
+ return TRUE;
+ }
+
++static void scale_button_map(GtkWidget *widget, gpointer data)
++{
++ if (redraw_status_window_id) {
++ g_source_remove(redraw_status_window_id);
++ redraw_status_window_id = 0;
++ }
++}
++
++static void scale_button_unmap(GtkWidget *widget, gpointer data)
++{
++ redraw_status_window_id = g_timeout_add_seconds(3, (GSourceFunc) redraw_status_window, NULL);
++}
++
+ void exit_gnome_radio(void)
+ {
+ if (settings.mute_on_exit)
+@@ -1035,6 +1049,7 @@ GtkWidget* gnome_radio_gui (void)
+ GtkWidget *vseparator;
+ GtkWidget *about_button;
+ /* GtkWidget *quit_button; */
++ GtkWidget *popup;
+ GtkWidget *image;
+ gchar *text;
+
+@@ -1172,6 +1187,8 @@ GtkWidget* gnome_radio_gui (void)
+
+ gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 4);
+
++ popup = gtk_scale_button_get_popup (GTK_SCALE_BUTTON (volume_button));
++
+ g_signal_connect (app, "delete_event", G_CALLBACK (delete_event_cb), NULL);
+ g_signal_connect (drawing_area, "draw", G_CALLBACK (draw_cb), NULL);
+ g_signal_connect (preset_combo, "changed", G_CALLBACK (preset_combo_change_cb), NULL);
+@@ -1189,6 +1206,8 @@ GtkWidget* gnome_radio_gui (void)
+ g_signal_connect (prefs_button, "clicked", G_CALLBACK (prefs_button_clicked_cb), (gpointer) app);
+ g_signal_connect (about_button, "clicked", G_CALLBACK (about_button_clicked_cb), NULL);
+ /* g_signal_connect (quit_button, "clicked", G_CALLBACK (quit_button_clicked_cb), NULL); */
++ g_signal_connect (popup, "map", G_CALLBACK (scale_button_map), NULL);
++ g_signal_connect (popup, "unmap", G_CALLBACK (scale_button_unmap), NULL);
+
+ gtk_widget_set_tooltip_text (scbw_button, _("Scan Backwards"));
+ gtk_widget_set_tooltip_text (stbw_button, _("0.05 MHz Backwards"));
+@@ -1432,7 +1451,7 @@ startup_cb (GApplication *application, g
+
+ g_signal_connect (app, "key-press-event", G_CALLBACK (key_press_event_cb), NULL);
+
+- g_timeout_add_seconds (3, (GSourceFunc)redraw_status_window, NULL);
++ redraw_status_window_id = g_timeout_add_seconds (3, (GSourceFunc) redraw_status_window, NULL);
+ }
+
+ static void
diff -pruN 1.8-2/debian/patches/gnomeradio-preferences.patch 1.8-2ubuntu32/debian/patches/gnomeradio-preferences.patch
--- 1.8-2/debian/patches/gnomeradio-preferences.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-preferences.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,713 @@
+Description: Avoid memory leak (unref the gconf client when we're done).
+ Added option to disable audio loopback mode in Preferences settings.
+ Moved in separate GOptionGroup all command line parameters which refers to audio loopback mode.
+ Make sentence capitalization in text and increased preferences dialog.
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -31,6 +31,8 @@
+ #include "rb_missing_plugins.h"
+
+ extern int autodetect;
++extern int can_capture;
++extern int alsa_loopback;
+
+ extern GtkWidget *preset_combo;
+ extern GtkAdjustment *adj;
+@@ -42,7 +44,9 @@ extern gboolean main_visible;
+
+ static GtkWidget *device_entry;
+ static GtkWidget *mixer_entry;
+-static GtkWidget *mute_on_exit_cb;
++static GtkWidget *audio_box;
++static GtkWidget *audio_switch;
++static GtkWidget *mute_on_exit;
+ static GtkWidget *list_view;
+ static GtkListStore *list_store;
+ static GtkTreeSelection *selection;
+@@ -78,6 +82,7 @@ gboolean save_settings(void)
+ gconf_client_set_bool(client, "/apps/gnomeradio/muted", settings.muted, NULL);
+ gconf_client_set_float(client, "/apps/gnomeradio/unmute-volume", settings.unmute_volume, NULL);
+ gconf_client_set_bool(client, "/apps/gnomeradio/mute-on-exit", settings.mute_on_exit, NULL);
++ gconf_client_set_bool(client, "/apps/gnomeradio/audio-loopback", settings.audio_loopback , NULL);
+ /*gconf_client_set_float(client, "/apps/gnomeradio/volume", volume->value, NULL);*/
+ gconf_client_set_float(client, "/apps/gnomeradio/last-freq", gtk_adjustment_get_value(adj)/STEPS, NULL);
+
+@@ -109,6 +114,8 @@ gboolean save_settings(void)
+ }
+ gconf_client_set_int(client, "/apps/gnomeradio/presets/last", mom_ps, NULL);
+ /*g_print("Storing Settings in GConf database\n");*/
++
++ g_object_unref (client);
+
+ return TRUE;
+ }
+@@ -131,10 +138,10 @@ gboolean load_settings(void)
+ return FALSE;
+
+ /* Load general settings */
+- settings.device = gconf_client_get_string(client, "/apps/gnomeradio/device" , NULL);
++ settings.device = gconf_client_get_string(client, "/apps/gnomeradio/device", NULL);
+ if (!settings.device)
+ settings.device = g_strdup("auto");
+- settings.driver = gconf_client_get_string(client, "/apps/gnomeradio/driver" , NULL);
++ settings.driver = gconf_client_get_string(client, "/apps/gnomeradio/driver", NULL);
+ if (!settings.driver)
+ settings.driver = g_strdup("any");
+ settings.mixer = gconf_client_get_string(client, "/apps/gnomeradio/mixer", NULL);
+@@ -143,6 +150,7 @@ gboolean load_settings(void)
+ settings.muted = gconf_client_get_bool(client, "/apps/gnomeradio/muted", NULL);
+ settings.unmute_volume = gconf_client_get_float(client, "/apps/gnomeradio/unmute-volume", NULL);
+ settings.mute_on_exit = gconf_client_get_bool(client, "/apps/gnomeradio/mute-on-exit", NULL);
++ settings.audio_loopback = gconf_client_get_bool(client, "/apps/gnomeradio/audio-loopback", NULL);
+ /*volume->value = gconf_client_get_float(client, "/apps/gnomeradio/volume", NULL);*/
+ freq = gconf_client_get_float(client, "/apps/gnomeradio/last-freq", NULL);
+ if ((freq < FREQ_MIN) || (freq > FREQ_MAX))
+@@ -201,13 +209,37 @@ gboolean load_settings(void)
+ if (mom_ps >= count)
+ mom_ps = -1;
+
++ g_object_unref (client);
++
+ return TRUE;
+ }
+
+ static void mute_on_exit_toggled_cb(GtkWidget* widget, gpointer data)
+ {
+- settings.mute_on_exit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mute_on_exit_cb));
+-}
++ settings.mute_on_exit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mute_on_exit));
++}
++
++void audio_box_set_visible (gboolean visible)
++{
++ gtk_widget_hide (audio_box);
++ gtk_widget_set_no_show_all (audio_box, !visible);
++ if (visible)
++ gtk_widget_show_all (audio_box);
++}
++
++static void audio_switch_activate_cb (GtkWidget* widget, gpointer data)
++{
++ settings.audio_loopback = gtk_switch_get_active (GTK_SWITCH (audio_switch));
++
++ start_radio(TRUE, data);
++
++ if (settings.audio_loopback)
++ alsa_loopback = 1;
++ else
++ alsa_loopback = 0;
++
++ audio_box_set_visible (can_capture);
++}
+
+ static gboolean device_entry_activate_cb(GtkWidget *widget, gpointer data)
+ {
+@@ -224,6 +256,8 @@ static gboolean device_entry_activate_cb
+ settings.device = g_strdup(text);
+
+ start_radio(TRUE, data);
++
++ audio_box_set_visible (can_capture);
+
+ return FALSE;
+ }
+@@ -1244,73 +1278,112 @@ GtkWidget* prefs_window(GtkWidget *app)
+
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG(dialog));
+
+- box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
++ box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
+ gtk_container_set_border_width(GTK_CONTAINER(box), 10);
+ gtk_box_pack_start (GTK_BOX (content_area), box, TRUE, TRUE, 0);
+
+ grid = gtk_grid_new();
+- gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
+- gtk_grid_set_column_spacing(GTK_GRID(grid), 20);
+- gtk_box_pack_start(GTK_BOX(box), grid, TRUE, TRUE, 0);
++ gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
++ gtk_grid_set_column_spacing (GTK_GRID (grid), 30);
++ gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
++ gtk_box_pack_start (GTK_BOX (box), grid, TRUE, TRUE, 0);
+
+ /* The general settings part */
+ label = gtk_label_new (NULL);
+- gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ markup = g_strdup_printf ("%s ", _("General Settings"));
+ gtk_label_set_markup (GTK_LABEL (label), markup);
+ g_free (markup);
+- gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 2, 1);
+-
+- label = gtk_label_new ("");
+- gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 3);
++ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+
+- label = gtk_label_new (_("Radio Device:"));
+- gtk_widget_set_halign (label, GTK_ALIGN_START);
+- gtk_grid_attach (GTK_GRID (grid), label, 1, 1, 1, 1);
++ label = gtk_label_new (_("Radio device:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_widget_set_margin_start (label, 10);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
+
+ device_entry = gtk_entry_new();
++
+ if (autodetect)
+ gtk_entry_set_placeholder_text(GTK_ENTRY(device_entry), "auto");
+ else
+ gtk_entry_set_text(GTK_ENTRY(device_entry), settings.device);
+- gtk_grid_attach(GTK_GRID(grid), device_entry, 2, 1, 1, 1);
+
+- label = gtk_label_new (_("Mixer Source:"));
+- gtk_widget_set_halign (label, GTK_ALIGN_START);
+- gtk_grid_attach (GTK_GRID (grid), label, 1, 2, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), device_entry, 1, 1, 1, 1);
++
++ label = gtk_label_new (_("Mixer source:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_widget_set_margin_start (label, 10);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
+
+ mixer_entry = gtk_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(mixer_entry), settings.mixer);
+- gtk_grid_attach(GTK_GRID(grid), mixer_entry, 2, 2, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), mixer_entry, 1, 2, 1, 1);
++
++ audio_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
++ gtk_widget_set_no_show_all (audio_box, TRUE);
++
++ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
++
++ label = gtk_label_new (_("Audio loopback mode"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_widget_set_margin_start (label, 10);
++
++ audio_switch = gtk_switch_new ();
++
++ gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
++ gtk_box_pack_end (GTK_BOX (box), audio_switch, FALSE, FALSE, 0);
++
++ label = gtk_label_new (NULL);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_widget_set_valign (label, GTK_ALIGN_START);
++ gtk_widget_set_margin_start (label, 10);
++ markup = g_strconcat ("", _("Note: "), " ",
++ _("The audio loopback mode is required when radio card is not connected\n"
++ "to the sound card via a cable. In this case, Gnomeradio needs to map the audio\n"
++ "from the internal digital capture out to sound card."),
++ " ", NULL);
++ gtk_label_set_markup (GTK_LABEL (label), markup);
++ g_free (markup);
++
++ gtk_box_pack_start (GTK_BOX (audio_box), box, FALSE, FALSE, 0);
++ gtk_box_pack_end (GTK_BOX (audio_box), label, FALSE, FALSE, 0);
++ gtk_grid_attach(GTK_GRID(grid), audio_box, 0, 3, 2, 1);
++
++ /* Enabled audio loopback from switch|commandline */
++ if (settings.audio_loopback || alsa_loopback)
++ gtk_switch_set_active (GTK_SWITCH (audio_switch), TRUE);
++ else
++ gtk_switch_set_active (GTK_SWITCH (audio_switch), FALSE);
+
+- mute_on_exit_cb = gtk_check_button_new_with_label(_("Mute on exit"));
+- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mute_on_exit_cb), settings.mute_on_exit);
++ audio_box_set_visible (can_capture);
+
+- gtk_grid_attach(GTK_GRID(grid), mute_on_exit_cb, 1, 3, 1, 1);
++ mute_on_exit = gtk_check_button_new_with_label(_("Mute on exit"));
++ gtk_widget_set_margin_start (mute_on_exit, 10);
++ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mute_on_exit), settings.mute_on_exit);
++ gtk_grid_attach(GTK_GRID(grid), mute_on_exit, 0, 4, 2, 1);
+
+ g_signal_connect(G_OBJECT(device_entry), "hide", G_CALLBACK(device_entry_activate_cb), app);
+ g_signal_connect(G_OBJECT(device_entry), "activate", G_CALLBACK(device_entry_activate_cb), NULL);
+ g_signal_connect(G_OBJECT(device_entry), "changed", G_CALLBACK(device_entry_auto_activate_cb), NULL);
+ g_signal_connect(G_OBJECT(mixer_entry), "hide", G_CALLBACK(mixer_entry_activate_cb), app);
+ g_signal_connect(G_OBJECT(mixer_entry), "activate", G_CALLBACK(mixer_entry_activate_cb), NULL);
+- g_signal_connect(G_OBJECT(mute_on_exit_cb), "toggled", G_CALLBACK(mute_on_exit_toggled_cb), NULL);
++ g_signal_connect(G_OBJECT(audio_switch), "notify::active", G_CALLBACK(audio_switch_activate_cb), NULL);
++ g_signal_connect(G_OBJECT(mute_on_exit), "toggled", G_CALLBACK(mute_on_exit_toggled_cb), NULL);
+
+ gtk_widget_set_tooltip_text(device_entry, _("The radio device to use (e.g. /dev/radio0)"));
+ gtk_widget_set_tooltip_text(mixer_entry, _("The mixer device and channel to use (e.g. hw:0/Line)"));
+- gtk_widget_set_tooltip_text(mute_on_exit_cb, _("Mute radio device on exit"));
++ gtk_widget_set_tooltip_text(mute_on_exit, _("Mute radio device on exit"));
+
+ /* The presets part */
+ label = gtk_label_new (NULL);
+- gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ markup = g_strdup_printf ("%s ", _("Presets"));
+ gtk_label_set_markup (GTK_LABEL (label), markup);
+ g_free (markup);
+- gtk_grid_attach(GTK_GRID(grid), label, 0, 4, 2, 1);
+-
+- label = gtk_label_new ("");
+- gtk_grid_attach (GTK_GRID (grid), label, 0, 5, 1, 2);
++ gtk_grid_attach(GTK_GRID(grid), label, 0, 5, 1, 1);
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
++ gtk_widget_set_margin_start (scrolled_window, 10);
+ gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolled_window), 75);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+@@ -1366,7 +1439,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ i++;
+ }
+
+- gtk_grid_attach(GTK_GRID(grid), scrolled_window, 1, 5, 2, 2);
++ gtk_grid_attach(GTK_GRID(grid), scrolled_window, 0, 6, 2, 1);
+
+ button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+@@ -1434,44 +1507,43 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_box_pack_end(GTK_BOX(button_box), save_button, FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(button_box), open_button, FALSE, FALSE, 0);
+
+- gtk_grid_attach(GTK_GRID(grid), button_box, 2, 7, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), button_box, 1, 7, 1, 1);
+
+ /* The record settings part */
+ label = gtk_label_new (NULL);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ markup = g_strdup_printf ("%s ", _("Record Settings"));
+- gtk_widget_set_halign (label, GTK_ALIGN_START);
+ gtk_label_set_markup (GTK_LABEL (label), markup);
+ g_free (markup);
+- gtk_grid_attach (GTK_GRID (grid), label, 0, 8, 2, 1);
+-
+- label = gtk_label_new ("");
+- gtk_grid_attach (GTK_GRID (grid), label, 0, 9, 1, 2);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 8, 1, 1);
+
+ label = gtk_label_new (_("Destination:"));
+- gtk_widget_set_halign (label, GTK_ALIGN_START);
+- gtk_grid_attach(GTK_GRID(grid), label, 1, 9, 1, 1);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_widget_set_margin_start (label, 10);
++ gtk_grid_attach(GTK_GRID(grid), label, 0, 9, 1, 1);
+
+ destination_button = gtk_file_chooser_button_new (_("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+ gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(destination_button), rec_settings.destination);
+- gtk_grid_attach(GTK_GRID(grid), destination_button, 2, 9, 1, 1);
++ gtk_grid_attach(GTK_GRID(grid), destination_button, 1, 9, 1, 1);
+
+- label = gtk_label_new (_("Format:"));
+- gtk_widget_set_halign (label, GTK_ALIGN_START);
+- gtk_grid_attach (GTK_GRID (grid), label, 1, 10, 1, 1);
++ label = gtk_label_new (_("File format:"));
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_widget_set_margin_start (label, 10);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 10, 1, 1);
+
+ audio_profile_combo = audio_profile_choose_new();
+ audio_profile_chooser_set_active(audio_profile_combo, rec_settings.profile);
+- gtk_grid_attach (GTK_GRID (grid), audio_profile_combo, 2, 10, 1, 1);
++ gtk_grid_attach (GTK_GRID (grid), audio_profile_combo, 1, 10, 1, 1);
+
+ install_button = gtk_button_new_with_label(_("Install additional software required to use this format\xE2\x80\xA6"));
+ gtk_widget_set_no_show_all (install_button, TRUE);
+- gtk_grid_attach (GTK_GRID (grid), install_button, 2, 11, 1, 1);
++ gtk_grid_attach (GTK_GRID (grid), install_button, 1, 11, 1, 1);
+
+ profile = rb_gst_get_encoding_profile (rec_settings.profile);
+ if (rb_gst_check_missing_plugins (profile, NULL, NULL)) {
+ gtk_widget_set_visible (install_button, TRUE);
+ gtk_widget_set_sensitive (install_button,
+- gst_install_plugins_supported ());
++ gst_install_plugins_supported ());
+ } else {
+ gtk_widget_set_visible (install_button, FALSE);
+ }
+Index: gnomeradio-1.8/data/gnomeradio.schemas.in
+===================================================================
+--- gnomeradio-1.8.orig/data/gnomeradio.schemas.in
++++ gnomeradio-1.8/data/gnomeradio.schemas.in
+@@ -85,6 +85,18 @@
+
+
+
++ /schemas/apps/gnomeradio/audio-loopback
++ /apps/gnomeradio/audio-loopback
++ gnomeradio
++ bool
++ TRUE
++
++ Audio Loopback mode
++ Start an audio streaming between the radio device and the audio output device
++
++
++
++
+ /schemas/apps/gnomeradio/presets/presets
+ /apps/gnomeradio/presets/presets
+ gnomeradio
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -60,8 +60,9 @@
+ #define DEFAULT_LATENCY 500
+
+ int autodetect;
++int can_capture;
+
+-int alsa_loopback = 1;
++int alsa_loopback = 0;
+ char *alsa_playback = NULL;
+ char *alsa_capture = NULL;
+ int alsa_latency = DEFAULT_LATENCY;
+@@ -99,20 +100,31 @@ static DBusGProxy * connect_to_sess
+
+ static gboolean is_first_start(void)
+ {
+- GConfClient *client = gconf_client_get_default();
++ GConfClient *client;
++ gboolean first_start;
++
++ client = gconf_client_get_default();
+ if (!client)
+ return TRUE;
+
+- return !gconf_client_get_bool(client, "/apps/gnomeradio/first_time_flag", NULL);
++ first_start = gconf_client_get_bool(client, "/apps/gnomeradio/first_time_flag", NULL);
++
++ g_object_unref (client);
++
++ return !first_start;
+ }
+
+ static void set_first_time_flag(void)
+ {
+- GConfClient *client = gconf_client_get_default();
++ GConfClient *client;
++
++ client = gconf_client_get_default();
+ if (!client)
+ return;
+
+ gconf_client_set_bool(client, "/apps/gnomeradio/first_time_flag", TRUE, NULL);
++
++ g_object_unref (client);
+ }
+
+ typedef struct {
+@@ -379,8 +391,14 @@ static void prefs_button_clicked_cb(GtkB
+ void start_radio(gboolean restart, GtkWidget *app)
+ {
+ DriverType driver = DRIVER_ANY;
+- if (restart)
++
++ if (restart) {
+ radio_stop();
++ if (settings.audio_loopback)
++ alsa_loopback = 1;
++ else
++ alsa_loopback = 0;
++ }
+
+ if (settings.driver) {
+ if (0 == strcmp(settings.driver, "v4l1"))
+@@ -390,12 +408,19 @@ void start_radio(gboolean restart, GtkWi
+ }
+
+ autodetect = 0;
+- if (0 == strcmp(settings.device, "auto"))
++ if ((0 == strcmp(settings.device, "auto")) || (0 == strcmp(settings.device, "")))
+ autodetect = 1;
+
++ if (settings.audio_loopback)
++ alsa_loopback = 1;
++
+ if (!radio_init(settings.device, driver)) {
+ char *caption, *detail;
+
++ can_capture = 0;
++ if (restart)
++ audio_box_set_visible (can_capture);
++
+ if (autodetect) {
+ caption = g_strdup_printf (_("Could not detect radio device!"));
+ detail = g_strdup_printf (_("To listen to the FM radio, you will need an FM tuner connected to or installed "
+@@ -1283,7 +1308,6 @@ key_press_event_cb(GtkWidget *app, GdkEv
+ enum
+ {
+ ARG_ALSA_LOOPBACK,
+- ARG_NO_ALSA_LOOPBACK,
+ ARG_ALSA_CAPTURE,
+ ARG_ALSA_PLAYBACK,
+ ARG_ALSA_LATENCY,
+@@ -1297,16 +1321,13 @@ parse_one_option (gint opt, const gchar
+ case ARG_ALSA_LOOPBACK:
+ alsa_loopback = 1;
+ break;
+- case ARG_NO_ALSA_LOOPBACK:
+- alsa_loopback = 0;
+- break;
+ case ARG_ALSA_CAPTURE:
+ if (!strncmp(arg, "hw:", 3) && isdigit(arg[3]) && arg[4] == ',' && isdigit(arg[5])) {
+ alsa_capture = g_strdup (arg);
+ break;
+ } else {
+ g_set_error(err, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+- _("invalid argument name '%s', must be e.g. 'hw:1,0'"), arg);
++ _("Invalid argument name '%s'. Example usage: --alsa-capture=hw:1,0"), arg);
+ return FALSE;
+ }
+ case ARG_ALSA_PLAYBACK:
+@@ -1315,7 +1336,7 @@ parse_one_option (gint opt, const gchar
+ break;
+ } else {
+ g_set_error(err, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+- _("invalid argument name '%s', must be e.g. 'hw:0,0'"), arg);
++ _("Invalid argument name '%s'. Example usage: --alsa-playback=hw:0,0"), arg);
+ return FALSE;
+ }
+ case ARG_ALSA_LATENCY:
+@@ -1344,7 +1365,6 @@ option_alsa_cb (const gchar * opt,
+ } options[] = {
+ {
+ "--alsa-loopback", ARG_ALSA_LOOPBACK}, {
+- "--no-alsa-loopback", ARG_NO_ALSA_LOOPBACK}, {
+ "--alsa-capture", ARG_ALSA_CAPTURE}, {
+ "--alsa-playback", ARG_ALSA_PLAYBACK}, {
+ "--alsa-latency", ARG_ALSA_LATENCY}, {
+@@ -1363,6 +1383,27 @@ option_alsa_cb (const gchar * opt,
+ return parse_one_option (val, arg, err);
+ }
+
++static GOptionGroup *
++alsa_get_option_group (void)
++{
++ GOptionGroup *group;
++
++ static const GOptionEntry alsa_args[] = {
++ { "alsa-loopback", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Enable audio loopback mode"), NULL },
++ { "alsa-capture", '\0', 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set an capture device for audio loopback mode"), N_("DEVICE") },
++ { "alsa-playback", '\0', 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set an playback device for audio loopback mode"), N_("DEVICE") },
++ { "alsa-latency", '\0', 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set a latency for audio loopback mode in ms"), N_("TIME") },
++ { "alsa-debug", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Show the debug output for audio loopback mode"), NULL },
++ { NULL }
++ };
++
++ group = g_option_group_new ("alsa", _("Alsa Options"),
++ _("Show Alsa Options"), NULL, NULL);
++ g_option_group_add_entries (group, alsa_args);
++
++ return group;
++}
++
+ G_GNUC_NORETURN static gboolean
+ option_version_cb (const gchar * opt,
+ const gchar * arg, gpointer data, GError ** err)
+@@ -1379,13 +1420,7 @@ int main(int argc, char* argv[])
+ gboolean do_scan = FALSE;
+ GOptionContext *ctx;
+ const GOptionEntry entries[] = {
+- { "alsa-loopback", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Enable loopback digital audio from radio device (default: enable)"), NULL },
+- { "no-alsa-loopback", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Disable loopback digital audio from radio device"), NULL },
+- { "alsa-capture", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set capture device for loopback digital audio (default: auto)"), N_("DEVICE") },
+- { "alsa-playback", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set playback device for loopback digital audio (default: default)"), N_("DEVICE") },
+- { "alsa-latency", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Set latency for loopback digital audio in ms (default: 500)"), N_("TIME") },
+- { "alsa-debug", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) option_alsa_cb, N_("Enable debug output for loopback digital audio"), NULL },
+- { "scan", '\0', 0, G_OPTION_ARG_NONE, &do_scan, N_("Scan for stations"), NULL },
++ { "scan", '\0', 0, G_OPTION_ARG_NONE, &do_scan, N_("Scan for available stations"), NULL },
+ { "version", 0, G_OPTION_FLAG_NO_ARG | G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, option_version_cb, NULL, NULL },
+ { NULL }
+ };
+@@ -1399,11 +1434,13 @@ int main(int argc, char* argv[])
+
+ ctx = g_option_context_new("- Listen to FM radio");
+ g_option_context_add_main_entries(ctx, entries, GETTEXT_PACKAGE);
++ g_option_context_add_group(ctx, alsa_get_option_group());
+ g_option_context_add_group(ctx, gtk_get_option_group (TRUE));
+ g_option_context_add_group(ctx, gst_init_get_option_group());
+ if (g_option_context_parse(ctx, &argc, &argv, &err) == FALSE) {
+ g_print(_("%s\nRun '%s --help' to see a full list of available command line options.\n"),
+ err->message, argv[0]);
++ g_option_context_free(ctx);
+ g_error_free(err);
+ exit(1);
+ }
+Index: gnomeradio-1.8/src/radio.c
+===================================================================
+--- gnomeradio-1.8.orig/src/radio.c
++++ gnomeradio-1.8/src/radio.c
+@@ -30,6 +30,7 @@
+ #include "get_media_devices.h"
+
+ extern int autodetect;
++extern int can_capture;
+
+ extern int alsa_loopback;
+ extern char *alsa_playback;
+@@ -45,21 +46,14 @@ static RadioDev *dev;
+ int radio_init(char *device, DriverType driver)
+ {
+ int rv = -1;
++ void *md;
++ const char *p;
+
+- if (autodetect) {
+- void *md;
+- const char *p = NULL;
++ md = discover_media_devices();
+
++ if (autodetect) {
++ p = NULL;
+ *device = 0;
+- md = discover_media_devices();
+- if (!md) {
+- fprintf (stderr, "open: Failed to open \"auto\" device");
+- if (*device)
+- fprintf (stderr, " at %s\n", device);
+- else
+- fprintf (stderr, "\n");
+- goto failure;
+- }
+
+ while (1) {
+ p = get_associated_device(md, p, MEDIA_V4L_RADIO, NULL, NONE);
+@@ -67,8 +61,6 @@ int radio_init(char *device, DriverType
+ break;
+ asprintf(&device, "/dev/%s", p);
+ }
+-
+- free_media_devices(md);
+ }
+
+ switch (driver) {
+@@ -84,9 +76,10 @@ try_v4l1:
+ dev = v4l1_radio_dev_new();
+ rv = dev->init (dev, device);
+ if (rv == 0) {
+- fprintf(stderr, "v4l1: Initialization failed\n");
++ fprintf(stderr, "v4l1: Initialization failed\n");
+ dev->finalize (dev);
+ dev = NULL;
++ can_capture = 0;
+ if (alsa_loopback)
+ alsa_loopback = 0;
+ if (driver != DRIVER_ANY)
+@@ -99,9 +92,10 @@ try_v4l2:
+ dev = v4l2_radio_dev_new();
+ rv = dev->init (dev, device);
+ if (rv == 0) {
+- fprintf(stderr, "v4l2: Initialization failed\n");
++ fprintf(stderr, "v4l2: Initialization failed\n");
+ dev->finalize (dev);
+ dev = NULL;
++ can_capture = 0;
+ if (alsa_loopback)
+ alsa_loopback = 0;
+ if (driver != DRIVER_ANY)
+@@ -111,41 +105,35 @@ try_v4l2:
+ }
+
+ success:
+- if (autodetect)
+- fprintf(stderr, "open: Using radio device: %s\n", device);
+-
+- if (alsa_loopback) {
+- if (alsa_capture == NULL) {
+- void *md = discover_media_devices();
+- const char *p = strrchr(device, '/');
+- if (p)
+- p++;
+- else
+- p = device;
+-
+- p = get_associated_device(md, NULL, MEDIA_SND_CAP, p, MEDIA_V4L_RADIO);
+- if (p)
+- alsa_capture = strdup(p);
+- else
+- alsa_loopback = 0;
++ p = NULL;
++ p = strrchr(device, '/');
++ if (p)
++ p++;
++ else
++ p = device;
+
+- free_media_devices(md);
+- }
++ p = get_associated_device(md, NULL, MEDIA_SND_CAP, p, MEDIA_V4L_RADIO);
++ if (p) {
++ can_capture = 1;
++ if (alsa_loopback && alsa_capture == NULL)
++ alsa_capture = strdup(p);
++ } else {
++ can_capture = 0;
++ if (alsa_loopback)
++ alsa_loopback = 0;
++ }
+
+- if (alsa_loopback) {
+- if (alsa_playback == NULL)
+- alsa_playback = "default";
++ if (alsa_loopback && alsa_playback == NULL)
++ alsa_playback = strdup("default");
+
+- fprintf(stderr, "alsa: Using audio loopback device from %s (%s) to %s\n",
+- alsa_capture, device, alsa_playback);
+- }
+- }
+
+ radio_unmute();
+
+ failure:
++ free_media_devices(md);
+ if (autodetect)
+ free (device);
++
+ return rv;
+ }
+
+@@ -163,6 +151,16 @@ void radio_stop(void)
+
+ if (dev)
+ dev->finalize (dev);
++ if (alsa_loopback) {
++ if (alsa_capture) {
++ free (alsa_capture);
++ alsa_capture = NULL;
++ }
++ if (alsa_playback) {
++ free (alsa_playback);
++ alsa_playback = NULL;
++ }
++ }
+ }
+
+ double radio_get_freq(void)
+Index: gnomeradio-1.8/src/prefs.h
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.h
++++ gnomeradio-1.8/src/prefs.h
+@@ -20,8 +20,11 @@
+ #include
+
+ gboolean save_settings(void);
++
+ gboolean load_settings(void);
+
++void audio_box_set_visible (gboolean visible);
++
+ enum
+ {
+ RADIO_DEVICE,
+Index: gnomeradio-1.8/src/gui.h
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.h
++++ gnomeradio-1.8/src/gui.h
+@@ -34,6 +34,7 @@ struct Gnomeradio_Settings
+ gboolean muted;
+ gfloat unmute_volume;
+ gboolean mute_on_exit;
++ gboolean audio_loopback;
+ gchar *driver;
+
+ GList *presets;
diff -pruN 1.8-2/debian/patches/gnomeradio-presets.patch 1.8-2ubuntu32/debian/patches/gnomeradio-presets.patch
--- 1.8-2/debian/patches/gnomeradio-presets.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-presets.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,829 @@
+## Description: Added option for sorting preset stations with up or down arrow buttons.
+## Origin: upstream, no
+## Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1082274
+## Author: Pojar George
+## Forwarded: no
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c 2013-12-04 05:54:29.284004000 +0000
++++ gnomeradio-1.8/src/prefs.c 2013-12-04 05:56:36.010841202 +0000
+@@ -17,6 +17,8 @@
+ #include
+ #include
+ #include
++#include
++#include
+ #include
+ #include "config.h"
+ #include "prefs.h"
+@@ -35,7 +37,7 @@
+ static GtkWidget *device_entry;
+ static GtkWidget *mixer_combo;
+ static GtkWidget *mute_on_exit_cb;
+-static GtkWidget *delete_button;
++static GtkWidget *save_button, *move_up_button, *move_down_button, *remove_button;
+ static GtkWidget *list_view;
+ static GtkListStore *list_store;
+ static GtkTreeSelection *selection;
+@@ -79,7 +81,7 @@
+ /* Store the presets */
+ count = g_list_length(settings.presets);
+ gconf_client_set_int(client, "/apps/gnomeradio/presets/presets", count, NULL);
+- for (i=0;ifreq);
+
+ gtk_list_store_append(list_store, &iter);
+- gtk_list_store_set(list_store, &iter, 0, ps->title, 1, buffer, -1);
++ gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, ps->title, 1, buffer, -1);
+
+ g_free(buffer);
+ gtk_tree_selection_unselect_all(selection);
+@@ -318,7 +319,6 @@
+ mom_ps = g_list_length(settings.presets) - 1;
+ preset_combo_set_item(mom_ps);
+
+- menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+ menuitem = gtk_menu_item_new_with_label(ps->title);
+
+ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, mom_ps);
+@@ -331,10 +331,11 @@
+ g_free(buffer);
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(list_view), path, NULL, FALSE);
+ gtk_tree_path_free(path);
+-}
+
++ gtk_widget_set_sensitive(save_button, TRUE);
++}
+
+-static void delete_button_clicked_cb(GtkWidget *widget, gpointer data)
++static void remove_button_clicked_cb(GtkWidget *widget, gpointer data)
+ {
+ GtkTreePath *path = NULL;
+ GtkTreeViewColumn *focus_column = NULL;
+@@ -346,7 +347,8 @@
+
+ gtk_tree_view_get_cursor(GTK_TREE_VIEW(list_view), &path, &focus_column);
+
+- if (!path) return;
++ if (path == NULL)
++ return;
+
+ row = gtk_tree_path_get_indices(path);
+ g_assert(row);
+@@ -375,7 +377,141 @@
+
+ gtk_tree_path_prev(path);
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(list_view), path, NULL, FALSE);
+- gtk_tree_path_free(path);
++ gtk_tree_path_free(path);
++
++ if (!g_list_length(settings.presets)) {
++ gtk_widget_set_sensitive(save_button, FALSE);
++ } else {
++ gtk_widget_set_sensitive(save_button, TRUE);
++ }
++}
++
++static void move_up_button_clicked_cb(GtkWidget * widget, gpointer data)
++{
++ GtkTreeIter iter, iter2;
++ GtkTreePath *path, *path2;
++ gint pos;
++ preset *ps;
++ int *row;
++ GList* menuitems;
++ GtkWidget *menuitem;
++
++ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
++ gtk_tree_selection_get_selected(selection, NULL, &iter);
++ path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
++
++ path2 = path;
++ gtk_tree_path_prev(path2);
++
++ if (gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter2, path2)) {
++ // we have a previous entry...
++ gtk_list_store_swap(GTK_LIST_STORE(GTK_TREE_MODEL(list_store)), &iter, &iter2);
++ }
++
++ row = gtk_tree_path_get_indices(path);
++ g_assert(row);
++ g_assert(*row < g_list_length(settings.presets));
++
++ ps = g_list_nth_data(settings.presets, *row);
++ g_assert(ps);
++ pos = g_list_index(settings.presets, (gpointer)ps);
++ pos++;
++
++ settings.presets = g_list_remove(settings.presets, (gpointer)ps);
++ settings.presets = g_list_insert(settings.presets, (gpointer)ps, pos);
++
++ if (main_visible) {
++ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(preset_combo), *row + 1);
++ gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(preset_combo), *row + 2, ps->title);
++ mom_ps = *row;
++ preset_combo_set_item(mom_ps);
++
++ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
++ g_assert(mom_ps < g_list_length(menuitems));
++ menuitem = g_list_nth_data(menuitems, mom_ps);
++ gtk_widget_destroy(menuitem);
++ menuitem = gtk_menu_item_new_with_label(ps->title);
++
++ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, *row + 1);
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (mom_ps));
++ gtk_widget_show(menuitem);
++ }
++
++ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(list_view), path, NULL, FALSE, 0, 0);
++ gtk_tree_path_free(path);
++
++ if (pos - 1 <= 0) {
++ gtk_widget_set_sensitive(move_up_button, FALSE);
++ } else {
++ gtk_widget_set_sensitive(move_up_button, TRUE);
++ }
++ gtk_widget_set_sensitive(move_down_button, TRUE);
++}
++
++static void move_down_button_clicked_cb(GtkWidget * widget, gpointer data)
++{
++ GtkTreeIter iter, iter2;
++ GtkTreePath *path, *path2;
++ gint pos, count;
++ preset *ps;
++ int *row;
++ GList* menuitems;
++ GtkWidget *menuitem;
++
++ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
++ gtk_tree_selection_get_selected(selection, NULL, &iter);
++ path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
++
++ path2 = path;
++ gtk_tree_path_next(path2);
++
++ if (gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter2, path2)) {
++ // we have a next entry...
++ gtk_list_store_swap(GTK_LIST_STORE(GTK_TREE_MODEL(list_store)), &iter, &iter2);
++ }
++
++ row = gtk_tree_path_get_indices(path);
++ g_assert(row);
++ g_assert(*row < g_list_length(settings.presets));
++
++ ps = g_list_nth_data(settings.presets, *row);
++ g_assert(ps);
++
++ count = g_list_length(settings.presets);
++ pos = g_list_index(settings.presets, (gpointer)ps);
++ pos--;
++ if (pos == count)
++ pos = 0;
++
++ settings.presets = g_list_remove(settings.presets, (gpointer)ps);
++ settings.presets = g_list_insert(settings.presets, (gpointer)ps, pos);
++
++ if (main_visible) {
++ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(preset_combo), *row + 1);
++ gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(preset_combo), *row, ps->title);
++ mom_ps = *row;
++ preset_combo_set_item(mom_ps);
++
++ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
++ g_assert(mom_ps < g_list_length(menuitems));
++ menuitem = g_list_nth_data(menuitems, mom_ps);
++ gtk_widget_destroy(menuitem);
++ menuitem = gtk_menu_item_new_with_label(ps->title);
++
++ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, *row - 1);
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (mom_ps));
++ gtk_widget_show(menuitem);
++ }
++
++ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(list_view), path, NULL, FALSE, 0, 0);
++ gtk_tree_path_free(path);
++
++ if (pos + 2 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL)) {
++ gtk_widget_set_sensitive(move_down_button, FALSE);
++ } else {
++ gtk_widget_set_sensitive(move_down_button, TRUE);
++ }
++ gtk_widget_set_sensitive(move_up_button, TRUE);
+ }
+
+ static void destination_button_clicked_cb(GtkWidget *button, gpointer data)
+@@ -390,13 +526,44 @@
+ static gboolean list_view_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+ {
+ if (event->keyval == GDK_KEY_Delete)
+- delete_button_clicked_cb(widget, user_data);
++ remove_button_clicked_cb(widget, user_data);
+ if (event->keyval == GDK_KEY_Insert)
+ add_button_clicked_cb(widget, user_data);
+
+ return FALSE;
+ }
+
++static gboolean button_release_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
++{
++ GtkTreePath *path;
++ gint pos;
++ GdkEventButton *event_button;
++ gchar *buffer;
++
++ event_button = (GdkEventButton *) event;
++
++ gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(list_view), event_button->x, event_button->y, &path, NULL, NULL, NULL);
++ if (path != NULL) {
++ buffer = gtk_tree_path_to_string(path);
++ pos = (gint) g_strtod(buffer, NULL);
++ g_free(buffer);
++ gtk_tree_path_free(path);
++
++ if (pos == 0) {
++ gtk_widget_set_sensitive(move_up_button, FALSE);
++ } else {
++ gtk_widget_set_sensitive(move_up_button, TRUE);
++ }
++
++ if (pos + 1 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL)) {
++ gtk_widget_set_sensitive(move_down_button, FALSE);
++ } else {
++ gtk_widget_set_sensitive(move_down_button, TRUE);
++ }
++ }
++ return FALSE;
++}
++
+ static void name_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *path_str, gchar *new_val, gpointer user_data)
+ {
+ GtkTreePath *path = NULL;
+@@ -479,18 +646,42 @@
+ static void list_view_cursor_changed_cb(GtkWidget *widget, gpointer data)
+ {
+ int *row;
++ preset *ps;
++ gint pos;
+ GtkTreePath *path = NULL;
+ GtkTreeViewColumn *focus_column = NULL;
+
++ if (settings.presets == NULL)
++ return;
++
+ gtk_tree_view_get_cursor(GTK_TREE_VIEW(list_view), &path, &focus_column);
+
+- if (!path) return;
++ if (path == NULL)
++ return;
+
+ row = gtk_tree_path_get_indices(path);
+ g_assert(row);
+
+ mom_ps = *row;
+ preset_combo_set_item(mom_ps);
++
++ ps = g_list_nth_data(settings.presets, *row);
++ g_assert(ps);
++
++ pos = g_list_index(settings.presets, (gpointer)ps);
++
++ if (pos == 0) {
++ gtk_widget_set_sensitive(move_up_button, FALSE);
++ } else {
++ gtk_widget_set_sensitive(move_up_button, TRUE);
++ }
++
++ if (pos + 1 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL)) {
++ gtk_widget_set_sensitive(move_down_button, FALSE);
++ } else {
++ gtk_widget_set_sensitive(move_down_button, TRUE);
++ }
++ gtk_tree_path_free(path);
+ return;
+ }
+
+@@ -500,7 +691,8 @@
+
+ sel = gtk_tree_selection_get_selected(selection, NULL, NULL);
+
+- gtk_widget_set_sensitive(delete_button, sel);
++ gtk_widget_set_sensitive(remove_button, sel);
++ gtk_widget_set_sensitive(save_button, sel);
+ }
+
+ static void free_string_list(GList *list)
+@@ -510,20 +702,338 @@
+ g_list_free(list);
+ }
+
++static void free_preset_list(gpointer data, gpointer user_data)
++{
++ preset *ps;
++
++ ps = (preset *) data;
++ g_free(ps->title);
++ g_free(ps);
++}
++
++/* Go through each row and add its data to the xmlDocPtr */
++static gboolean save_to_file_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, xmlNodePtr root, gpointer user_data)
++{
++ gchar *title, *freq, *position;
++ xmlNodePtr current;
++
++ /* get the data stored in the model... */
++ gtk_tree_model_get(model, iter, 0, &title, 1, &freq, -1);
++ /* ...and get the path of the current row */
++ position = gtk_tree_path_to_string(path);
++ /* create a new child of the root node... */
++ /* (note that I'm using a (guchar*) cast; this is because it's the same thing as
++ * an (xmlChar*) cast, but easier to type) */
++ current = xmlNewChild(root, NULL, (guchar*)"station", NULL);
++ /* ...and set some properties */
++ xmlSetProp(current, (guchar*)"name", (guchar*)title);
++ xmlSetProp(current, (guchar*)"freq", (guchar*)freq);
++ xmlSetProp(current, (guchar*)"position", (guchar*)position);
++ /* free our data we retrieved from the model */
++ g_free(title);
++ g_free(freq);
++ g_free(position);
++
++ /* return FALSE to keep iterating */
++ return FALSE;
++}
++
++/* Function handle saving an xml file; calls save_to_file_foreach */
++static void save_to_file(gchar *filename)
++{
++ GtkTreeModel *model;
++ xmlDocPtr doc;
++ xmlNodePtr root;
++
++ /* create a new doc node */
++ doc = xmlNewDoc((guchar*)"1.0");
++ /* create a new root element. */
++ root = xmlNewDocNode(doc, NULL, (guchar*)"gnomeradio", NULL);
++ /* set it as the root element */
++ xmlDocSetRootElement(doc, root);
++ /* get the tree view's model... */
++ model = gtk_tree_view_get_model(GTK_TREE_VIEW(list_view));
++ /* ...and go through it with a foreach */
++ gtk_tree_model_foreach(model, (GtkTreeModelForeachFunc)save_to_file_foreach, (gpointer)root);
++ /* make sure the XML document will be indented */
++ xmlIndentTreeOutput = 1;
++ /* save the actual file */
++ xmlSaveFormatFileEnc(filename, doc, "utf-8", 1);
++ /* free the doc node */
++ xmlFreeDoc(doc);
++}
++
++/* Callback for the "Save to file" button; calls save_to_file */
++static void save_to_file_cb(GtkWidget *button, gpointer data)
++{
++ GtkWidget *dialog;
++ GtkFileFilter *file_filter_all;
++ GtkFileFilter *file_filter_xml;
++ gchar *filename;
++
++ dialog = gtk_file_chooser_dialog_new("Select file name\xE2\x80\xA6", NULL,
++ GTK_FILE_CHOOSER_ACTION_SAVE,
++ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
++ GTK_STOCK_CANCEL,
++ GTK_RESPONSE_CANCEL, NULL);
++
++ file_filter_all = gtk_file_filter_new();
++ gtk_file_filter_set_name(file_filter_all, _("All Files"));
++ gtk_file_filter_add_pattern(file_filter_all, "*");
++ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filter_all);
++
++ file_filter_xml = gtk_file_filter_new();
++ gtk_file_filter_set_name(file_filter_xml, _("XML Files (*.xml)"));
++ gtk_file_filter_add_pattern(file_filter_xml, "*.xml");
++ gtk_file_filter_add_pattern(file_filter_xml, "*.XML");
++ gtk_file_filter_add_mime_type(file_filter_xml, "text/xml");
++ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filter_xml);
++
++ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
++ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), file_filter_xml);
++ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "gnomeradio.xml");
++
++ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
++ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
++ /* Check if .xml extension is added, if not add */
++ if (!g_str_has_suffix(filename, ".xml")) {
++ char *tmp_file;
++ /* create copy of filename to release it and create a new one, using old name */
++ tmp_file = g_strdup(filename);
++ g_free(filename);
++ filename = g_strdup_printf("%s.xml", tmp_file);
++ g_free(tmp_file);
++ }
++ save_to_file(filename);
++ g_free(filename);
++ }
++ gtk_widget_destroy(dialog);
++}
++
++/* Gets the parent of a path string.
++* passing "0:1:2" would return "0:1",
++* passing "0:1" would return "0",
++* passing "0" would return NULL */
++gchar *gtk_tree_path_string_get_parent(gchar *path)
++{
++ gchar *colon;
++
++ g_return_val_if_fail(path != NULL, NULL);
++
++ colon = g_strrstr(path, ":");
++ if (colon == NULL)
++ return NULL;
++
++ return g_strndup(path, colon - path);
++}
++
++/* Make sure that path exists within model */
++static void gtk_tree_model_generate_path(GtkTreeModel *model, gchar *path)
++{
++ GtkTreeIter iter, parent;
++ gchar *temp;
++
++ while (TRUE) {
++ /* if this returns TRUE, then this path exists and we're fine */
++ if (gtk_tree_model_get_iter_from_string(model, &iter, path))
++ break;
++
++ temp = path;
++ path = gtk_tree_path_string_get_parent(path);
++ /* if there's no parent, then it's toplevel */
++ if (path == NULL) {
++ if (GTK_IS_TREE_STORE(model))
++ gtk_tree_store_append(GTK_TREE_STORE(model), &parent, NULL);
++ else
++ gtk_list_store_append(GTK_LIST_STORE(model), &parent);
++ gtk_tree_model_generate_path(model, temp);
++ break;
++ }
++ if (GTK_IS_TREE_STORE(model)) {
++ gtk_tree_model_generate_path(model, path);
++ gtk_tree_model_get_iter_from_string(model, &parent, path);
++ gtk_tree_store_append(GTK_TREE_STORE(model), &iter, &parent);
++ }
++ }
++}
++
++/* Function to load from an xml file */
++static void load_from_file(gchar *filename)
++{
++ xmlDocPtr doc;
++ xmlNodePtr current;
++ xmlChar *title, *freq, *position;
++ GtkTreeModel *model;
++ GtkTreePath *path = NULL;
++ GtkTreeIter iter;
++ GtkAdjustment* v_scb;
++ GList* menuitems;
++ GtkWidget *menuitem;
++
++ /* load the file */
++ doc = xmlParseFile(filename);
++ /* get the root item */
++ if (doc == NULL)
++ return;
++
++ current = xmlDocGetRootElement(doc);
++ if (current == NULL) {
++ xmlFreeDoc(doc);
++ return;
++ }
++
++ if (xmlStrcmp(current->name, (guchar*)"gnomeradio")) {
++ xmlFreeDoc(doc);
++ return;
++ }
++
++ /* remove previous presets */
++ if (settings.presets != NULL) {
++ if (main_visible) {
++ gint i, count;
++
++ count = g_list_length (settings.presets);
++ for (i = 0; i < count; i++)
++ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(preset_combo), 1);
++
++ menuitems = gtk_container_get_children (GTK_CONTAINER (tray_menu));
++
++ count = g_list_length (menuitems);
++ for (i = 0; i < count - 6; i++) {
++ menuitem = g_list_nth_data (menuitems, i);
++ gtk_widget_destroy (menuitem);
++ }
++ }
++
++ gtk_list_store_clear(GTK_LIST_STORE(list_store));
++
++ g_list_free_full (settings.presets, free_presets_list);
++ settings.presets = NULL;
++ }
++
++ /* get the tree view's model */
++ model = gtk_tree_view_get_model(GTK_TREE_VIEW(list_view));
++
++ /* iterate through the root's children items */
++ current = current->xmlChildrenNode;
++ while (current) {
++ if(!xmlIsBlankNode(current)) {
++ /* check for the proper element name */
++ if (!xmlStrcmp(current->name, (guchar*)"station")) {
++ /* get the saved properties */
++ title = xmlGetProp(current, (guchar*)"name");
++ freq = xmlGetProp(current, (guchar*)"freq");
++ position = xmlGetProp(current, (guchar*)"position");
++
++ if( title && freq && position ) {
++ preset *ps = g_malloc0(sizeof(preset));
++ ps->title = g_strdup((gchar*)title);
++ ps->freq = atof((gchar*)freq);
++
++ settings.presets = g_list_append(settings.presets, ps);
++
++ /* make sure that the path exists */
++ gtk_tree_model_generate_path(model, (gchar*)position);
++ /* get an iter to the path */
++ gtk_tree_model_get_iter_from_string(model, &iter, (gchar*)position);
++ /* set the data */
++ gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, title, 1, freq, -1);
++
++ gtk_tree_selection_unselect_all(selection);
++
++ v_scb = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(list_view));
++ gtk_adjustment_set_value(v_scb, gtk_adjustment_get_upper(v_scb));
++
++ if (main_visible) {
++ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(preset_combo), ps->title);
++ mom_ps = g_list_length(settings.presets) - 1;
++ preset_combo_set_item(mom_ps);
++
++ menuitem = gtk_menu_item_new_with_label(ps->title);
++
++ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, mom_ps);
++ g_signal_connect(G_OBJECT(menuitem), "activate",
++ (GCallback)preset_menuitem_activate_cb,
++ GINT_TO_POINTER (mom_ps));
++ gtk_widget_show(menuitem);
++ }
++ }
++ /* free the data */
++ xmlFree(title);
++ xmlFree(freq);
++ xmlFree(position);
++ }
++ current = current->next;
++ }
++ }
++ /* free the doc node */
++ xmlFreeDoc(doc);
++
++ if (settings.presets == NULL)
++ return;
++
++ path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
++
++ gtk_tree_view_set_cursor(GTK_TREE_VIEW (list_view), path, NULL, FALSE );
++ gtk_tree_path_free(path);
++
++ gtk_widget_grab_focus(list_view);
++
++ list_view_cursor_changed_cb(list_view, NULL);
++ gtk_widget_set_sensitive(save_button, TRUE);
++ gtk_widget_set_sensitive(remove_button, TRUE);
++}
++
++/* Callback for the "Load from file" button; calls load_from_file */
++static void load_from_file_cb(GtkWidget *button, gpointer data)
++{
++ GtkWidget *dialog;
++ GtkFileFilter *file_filter_all;
++ GtkFileFilter *file_filter_xml;
++ gchar *filename;
++
++ dialog = gtk_file_chooser_dialog_new("Select file name\xE2\x80\xA6", NULL,
++ GTK_FILE_CHOOSER_ACTION_OPEN,
++ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
++ GTK_STOCK_CANCEL,
++ GTK_RESPONSE_CANCEL, NULL);
++
++ file_filter_all = gtk_file_filter_new();
++ gtk_file_filter_set_name(file_filter_all, _("All Files"));
++ gtk_file_filter_add_pattern(file_filter_all, "*");
++ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filter_all);
++
++ file_filter_xml = gtk_file_filter_new();
++ gtk_file_filter_set_name(file_filter_xml, _("XML Files"));
++ gtk_file_filter_add_pattern(file_filter_xml, "*.xml");
++ gtk_file_filter_add_pattern(file_filter_xml, "*.XML");
++ gtk_file_filter_add_mime_type(file_filter_xml, "text/xml");
++ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filter_xml);
++
++ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), file_filter_xml);
++
++ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
++ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
++ load_from_file(filename);
++ g_free(filename);
++ }
++ gtk_widget_destroy(dialog);
++}
++
+ GtkWidget* prefs_window(GtkWidget *app)
+ {
+ GtkWidget *dialog;
+ GtkWidget *box;
++ GtkWidget *grid;
+ GtkWidget *settings_label, *presets_label, *record_label;
+ GtkWidget *s_indent_label, *p_indent_label, *r_indent_label;
+ GtkWidget *destination_label;
+ GtkWidget *destination_button;
+ GtkWidget *profile_combo;
+ GtkWidget *mixer_eb, *profile_eb;
+- GtkWidget *grid;
+ GtkWidget *device_label, *mixer_label;
+ GtkWidget *button_box;
+- GtkWidget *add_button, *add_pixmap, *delete_pixmap;
++ GtkWidget *open_button, *add_button;
+ GtkWidget *scrolled_window;
+ GtkCellRenderer *cellrenderer;
+ GtkTreeViewColumn *list_column;
+@@ -613,16 +1123,22 @@
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolled_window), 75);
++ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
++ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
++
+ list_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+ list_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
+ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(list_view), TRUE);
+- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
+- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list_view), FALSE);
+-
++
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+ gtk_container_add(GTK_CONTAINER(scrolled_window), list_view);
++
++ g_signal_connect(G_OBJECT(list_view), "button-release-event", G_CALLBACK(button_release_cb), NULL);
++ g_signal_connect(G_OBJECT(list_view), "key-press-event", G_CALLBACK(list_view_key_press_event_cb), NULL);
++ g_signal_connect(G_OBJECT(list_view), "cursor-changed", G_CALLBACK(list_view_cursor_changed_cb), NULL);
++
+ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(list_view_selection_changed_cb), list_view);
+
+ /*gtk_tree_selection_select_path(selection, gtk_tree_path_new_from_string("0"));
+@@ -632,8 +1148,10 @@
+ g_object_set(G_OBJECT(cellrenderer), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
+ g_object_set(G_OBJECT(GTK_CELL_RENDERER_TEXT(cellrenderer)), "editable", TRUE, NULL);
+ list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 0, NULL);
+- gtk_tree_view_column_set_min_width(list_column, 150);
++ gtk_tree_view_column_set_reorderable(list_column, TRUE);
++ gtk_tree_view_column_set_expand(list_column, TRUE);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
++
+ g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(name_cell_edited_cb), NULL);
+
+ cellrenderer = gtk_cell_renderer_text_new();
+@@ -641,46 +1159,86 @@
+ g_object_set(G_OBJECT(cellrenderer), "xalign", 1.0, NULL);
+ g_object_set(G_OBJECT(GTK_CELL_RENDERER_TEXT(cellrenderer)), "editable", TRUE, NULL);
+ list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 1, NULL);
++ gtk_tree_view_column_set_reorderable(list_column, TRUE);
++ gtk_tree_view_column_set_expand(list_column, FALSE);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
+- g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(freq_cell_edited_cb), NULL);
+-
+- button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+
+- add_button = gtk_button_new();
+- add_pixmap = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_SMALL_TOOLBAR);
+- gtk_button_set_relief (GTK_BUTTON (add_button), GTK_RELIEF_NONE);
+- delete_button = gtk_button_new();
+- delete_pixmap = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_SMALL_TOOLBAR);
+- gtk_button_set_relief (GTK_BUTTON (delete_button), GTK_RELIEF_NONE);
+- gtk_widget_set_sensitive(delete_button, FALSE);
+-
+- gtk_box_pack_end(GTK_BOX(button_box), delete_button, FALSE, FALSE, 0);
+- gtk_box_pack_end(GTK_BOX(button_box), add_button, FALSE, FALSE, 0);
+-
+- gtk_container_add(GTK_CONTAINER(add_button), add_pixmap);
+- gtk_container_add(GTK_CONTAINER(delete_button), delete_pixmap);
+-
+- gtk_grid_attach(GTK_GRID(grid), scrolled_window, 1, 5, 2, 2);
+- gtk_grid_attach(GTK_GRID(grid), button_box, 1, 7, 2, 1);
++ g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(freq_cell_edited_cb), NULL);
+
+- for (i=0;ifreq);
+ gtk_list_store_append(list_store, &iter);
+- gtk_list_store_set(list_store, &iter, 0, ps->title, 1, buffer, -1);
++ gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, ps->title, 1, buffer, -1);
+ g_free(buffer);
+ }
+
+- g_signal_connect(G_OBJECT(add_button), "clicked", G_CALLBACK(add_button_clicked_cb), NULL);
+- g_signal_connect(G_OBJECT(delete_button), "clicked", G_CALLBACK(delete_button_clicked_cb), NULL);
+- g_signal_connect(G_OBJECT(list_view), "key-press-event", G_CALLBACK(list_view_key_press_event_cb), NULL);
+- g_signal_connect(G_OBJECT(list_view), "cursor-changed", G_CALLBACK(list_view_cursor_changed_cb), NULL);
++ gtk_grid_attach(GTK_GRID(grid), scrolled_window, 1, 5, 2, 2);
++
++ button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
++ move_up_button = gtk_button_new();
++ gtk_button_set_image(GTK_BUTTON(move_up_button), gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU));
++ gtk_button_set_relief (GTK_BUTTON (move_up_button), GTK_RELIEF_NONE);
++ gtk_widget_set_sensitive(move_up_button, FALSE);
++ gtk_widget_set_tooltip_text(move_up_button, _("Move preset up"));
++
++ g_signal_connect(G_OBJECT(move_up_button), "clicked", G_CALLBACK(move_up_button_clicked_cb), NULL);
++
++ move_down_button = gtk_button_new();
++ gtk_button_set_image(GTK_BUTTON(move_down_button), gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU));
++ gtk_button_set_relief (GTK_BUTTON (move_down_button), GTK_RELIEF_NONE);
++ gtk_widget_set_sensitive(move_down_button, FALSE);
++ gtk_widget_set_tooltip_text(move_down_button, _("Move preset down"));
++
++ g_signal_connect(G_OBJECT(move_down_button), "clicked", G_CALLBACK(move_down_button_clicked_cb), NULL);
++
++ add_button = gtk_button_new();
++ gtk_button_set_image(GTK_BUTTON(add_button), gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU));
++ gtk_button_set_relief (GTK_BUTTON (add_button), GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(add_button, _("Add preset"));
+- gtk_widget_set_tooltip_text(delete_button, _("Remove preset"));
+
++ g_signal_connect(G_OBJECT(add_button), "clicked", G_CALLBACK(add_button_clicked_cb), NULL);
++
++ remove_button = gtk_button_new();
++ gtk_button_set_image(GTK_BUTTON(remove_button), gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU));
++ gtk_button_set_relief (GTK_BUTTON (remove_button), GTK_RELIEF_NONE);
++ gtk_widget_set_tooltip_text(remove_button, _("Remove preset"));
++ gtk_widget_set_sensitive(remove_button, FALSE);
++
++ g_signal_connect(G_OBJECT(remove_button), "clicked", G_CALLBACK(remove_button_clicked_cb), NULL);
++
++ save_button = gtk_button_new();
++ gtk_button_set_image(GTK_BUTTON(save_button), gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU));
++ gtk_button_set_relief (GTK_BUTTON (save_button), GTK_RELIEF_NONE);
++ gtk_widget_set_tooltip_text(save_button, _("Save to file\xE2\x80\xA6"));
++
++ if (settings.presets == NULL) {
++ gtk_widget_set_sensitive(save_button, FALSE);
++ } else {
++ gtk_widget_set_sensitive(save_button, TRUE);
++ }
++
++ g_signal_connect(G_OBJECT(save_button), "clicked", G_CALLBACK(save_to_file_cb), NULL);
++
++ open_button = gtk_button_new();
++ gtk_button_set_image(GTK_BUTTON(open_button), gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU));
++ gtk_button_set_relief (GTK_BUTTON (open_button), GTK_RELIEF_NONE);
++ gtk_widget_set_tooltip_text(open_button, _("Load from file\xE2\x80\xA6"));
++ gtk_widget_set_sensitive(open_button, TRUE);
++
++ g_signal_connect(G_OBJECT(open_button), "clicked", G_CALLBACK(load_from_file_cb), NULL);
++
++ gtk_box_pack_end(GTK_BOX(button_box), move_down_button, FALSE, FALSE, 0);
++ gtk_box_pack_end(GTK_BOX(button_box), move_up_button, FALSE, FALSE, 0);
++ gtk_box_pack_end(GTK_BOX(button_box), remove_button, FALSE, FALSE, 0);
++ gtk_box_pack_end(GTK_BOX(button_box), add_button, FALSE, FALSE, 0);
++ gtk_box_pack_end(GTK_BOX(button_box), save_button, FALSE, FALSE, 0);
++ gtk_box_pack_end(GTK_BOX(button_box), open_button, FALSE, FALSE, 0);
++
++ gtk_grid_attach(GTK_GRID(grid), button_box, 1, 7, 2, 1);
+
+ /* The record settings part */
+ record_hdr = g_strconcat("", _("Record Settings"), " ", NULL);
diff -pruN 1.8-2/debian/patches/gnomeradio-record_information.patch 1.8-2ubuntu32/debian/patches/gnomeradio-record_information.patch
--- 1.8-2/debian/patches/gnomeradio-record_information.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-record_information.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,671 @@
+Description: Redesigned 'Gnomeradio recording status' window to show more recording information.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1019981
+Author: Pojar George
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -32,9 +32,11 @@
+ #include "prefs.h"
+
+ static int timeout_id = -1;
+-static GtkWidget *file_lbl, *size_lbl;
++static GtkWidget *file_lbl, *type_lbl, *size_lbl, *length_lbl;
+ static GtkWidget *status_dialog;
+
++extern GtkWidget *level;
++
+ void close_status_window(void)
+ {
+ if (timeout_id >= 0)
+@@ -50,31 +52,158 @@ void close_status_window(void)
+ tray_icon_items_set_sensible(TRUE);
+ }
+
++static char *seconds_to_full_string (guint seconds)
++{
++ long days, hours, minutes;
++ char *time = NULL;
++ const char *minutefmt;
++ const char *hourfmt;
++ const char *secondfmt;
++
++ days = seconds / (60 * 60 * 24);
++ hours = (seconds / (60 * 60));
++ minutes = (seconds / 60) - ((days * 24 * 60) + (hours * 60));
++ seconds = seconds % 60;
++
++ minutefmt = ngettext ("%ld minute", "%ld minutes", minutes);
++ hourfmt = ngettext ("%ld hour", "%ld hours", hours);
++ secondfmt = ngettext ("%ld second", "%ld seconds", seconds);
++
++ if (hours > 0) {
++ if (minutes > 0)
++ if (seconds > 0) {
++ char *fmt;
++ /* Translators: the format is "X hours X minutes X seconds" */
++ fmt = g_strdup_printf (_("%s %s %s"), hourfmt, minutefmt, secondfmt);
++ time = g_strdup_printf (fmt, hours, minutes, seconds);
++ g_free (fmt);
++ } else {
++ char *fmt;
++ /* Translators: the format is "X hours X minutes" */
++ fmt = g_strdup_printf (_("%s %s"), hourfmt, minutefmt);
++ time = g_strdup_printf (fmt, hours, minutes);
++ g_free (fmt);
++ }
++ else
++ if (seconds > 0) {
++ char *fmt;
++ /* Translators: the format is "X minutes X seconds" */
++ fmt = g_strdup_printf (_("%s %s"), minutefmt, secondfmt);
++ time = g_strdup_printf (fmt, minutes, seconds);
++ g_free (fmt);
++ } else {
++ time = g_strdup_printf (minutefmt, minutes);
++ }
++ } else {
++ if (minutes > 0) {
++ if (seconds > 0) {
++ char *fmt;
++ /* Translators: the format is "X minutes X seconds" */
++ fmt = g_strdup_printf (_("%s %s"), minutefmt, secondfmt);
++ time = g_strdup_printf (fmt, minutes, seconds);
++ g_free (fmt);
++ } else {
++ time = g_strdup_printf (minutefmt, minutes);
++ }
++
++ } else {
++ time = g_strdup_printf (secondfmt, seconds);
++ }
++ }
++
++ return time;
++}
++
+ static gboolean timeout_cb(gpointer data)
+ {
+ Recording *recording = data;
+- gint s;
+- gchar *size=NULL;
++ GError *error = NULL;
++ GFile *file;
++ GFileInfo *info;
++
++ gchar *description, *name, *mime, *type, *size = NULL;
++ gchar *utf8_name = NULL;
++ const gchar *content_type;
++ guint64 s;
+
+ g_assert(recording);
+
+ if (!gtk_widget_get_visible(status_dialog))
+ gtk_widget_show_all(status_dialog);
+
+- s = get_file_size(recording->filename);
+- if (s > 0) {
+- if (s < 1024) size = g_strdup_printf(_("%i byte"), s);
+-
+- if ((s >= 1024) && (s < 1024*1024)) size = g_strdup_printf(_("%i kB"), s>>10);
+- if (s >= 1024*1024) size = g_strdup_printf(_("%.2f MB"), (float)s/1024/1024);
++ /* name */
++ name = g_path_get_basename(recording->filename);
++ utf8_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL);
++ gtk_label_set_text(GTK_LABEL(file_lbl), utf8_name);
++ g_free (name);
++ g_free (utf8_name);
++
++ /* type */
++ file = g_file_new_for_path(recording->filename);
++ info = g_file_query_info(file,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_QUERY_INFO_NONE,
++ NULL,
++ &error);
++
++ if (error == NULL) {
++ content_type = g_file_info_get_content_type(info);
++ description = g_content_type_get_description(content_type);
++ mime = g_content_type_get_mime_type(content_type);
++ type = g_strdup_printf ("%s (%s)", description, mime);
++ gtk_label_set_text(GTK_LABEL(type_lbl), type);
++
++ g_object_unref(info);
++ g_free(description);
++ g_free(mime);
++ g_free(type);
++ } else {
++ fprintf(stderr, "%s\n", error->message);
++ g_error_free(error);
++
++ return FALSE;
++ }
++
++ /* size */
++ info = g_file_query_info(file,
++ G_FILE_ATTRIBUTE_STANDARD_SIZE,
++ G_FILE_QUERY_INFO_NONE,
++ NULL,
++ &error);
++ if (error == NULL) {
++ s = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_STANDARD_SIZE);
++ size = g_format_size_full(s, G_FORMAT_SIZE_LONG_FORMAT);
++ gtk_label_set_text(GTK_LABEL(size_lbl), size);
++
++ g_object_unref(info);
++ g_free(size);
+ } else {
+- if (s) size = g_strdup(_("Error"));
+- else size = g_strdup(_("0 byte"));
+- }
+-
+- gtk_label_set_text(GTK_LABEL(file_lbl), recording->filename);
+- gtk_label_set_text(GTK_LABEL(size_lbl), size);
+- g_free(size);
++ fprintf(stderr, "%s\n", error->message);
++ g_error_free(error);
++
++ close_status_window();
++ recording_stop(recording);
++
++ return FALSE;
++ }
++ g_object_unref(file);
++
++ /* length */
++ GstElement *pipeline;
++ GstFormat fmt = GST_FORMAT_TIME;
++ gint64 val = -1;
++ gint secs;
++
++ pipeline = recording->pipeline;
++
++ if (gst_element_query_position (pipeline, &fmt, &val) && val != -1) {
++ gchar* length;
++ secs = val / GST_SECOND;
++
++ length = seconds_to_full_string(secs);
++ gtk_label_set_text(GTK_LABEL(length_lbl), length);
++ g_free(length);
++ }
+
+ return TRUE;
+ }
+@@ -101,60 +230,87 @@ GtkWidget* record_status_window(Recordin
+ {
+ GtkWidget *btn_label, *btn_pixmap, *button;
+ GtkWidget *vbox, *btn_box, *hbox;
+- GtkWidget *grid;
+- GtkWidget *title, *f_lbl, *s_lbl;
++ GtkWidget *f_lbl, *t_lbl, *s_lbl, *l_lbl;
++ GtkWidget *grid, *r_grid;
++ GtkWidget *title;
++ GtkWidget *image;
++ GtkWidget *level_box;
++ GtkWidget *expander;
+ char *text, *str;
+
+ status_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title(GTK_WINDOW(status_dialog),_("Gnomeradio recording status"));
+- /*gtk_window_set_resizable(GTK_WINDOW(status_dialog), FALSE);*/
+- gtk_window_set_default_size(GTK_WINDOW(status_dialog), 400, -1);
++ gtk_window_set_resizable(GTK_WINDOW(status_dialog), FALSE);
+
+- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+- gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
++ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
++ gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
++
++ grid = gtk_grid_new();
++ gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
++ gtk_grid_set_column_spacing(GTK_GRID(grid), 15);
++ gtk_container_set_border_width(GTK_CONTAINER(grid), 5);
++
++ image = gtk_image_new_from_icon_name("gnomeradio", GTK_ICON_SIZE_DIALOG);
++ gtk_image_set_pixel_size(GTK_IMAGE(image), 42);
++ gtk_widget_set_valign(image, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(grid), image, 0, 0, 1, 3);
+
+- grid = gtk_grid_new();
+- gtk_grid_set_row_spacing(GTK_GRID(grid), 10);
+- gtk_grid_set_column_spacing(GTK_GRID(grid), 12);
+- gtk_container_set_border_width(GTK_CONTAINER(grid), 6);
+-
+ str = g_strdup_printf(_("Recording from station %s"), recording->station);
+- text = g_strdup_printf("%s ", str);
++ text = g_strdup_printf("%s ", str);
+ g_free(str);
+ title = gtk_label_new(text);
+ g_free(text);
++ gtk_widget_set_halign(title, GTK_ALIGN_START);
+ gtk_label_set_use_markup(GTK_LABEL(title), TRUE);
+-
+- text = g_strdup_printf(" %s ", _("Destination:"));
+- f_lbl = gtk_label_new(text);
+- g_free(text);
+- gtk_label_set_use_markup(GTK_LABEL(f_lbl), TRUE);
++ gtk_grid_attach(GTK_GRID(grid), title, 1, 0, 1, 1);
+
+- text = g_strdup_printf(" %s ", _("Filesize:"));
+- s_lbl = gtk_label_new(text);
+- g_free(text);
+- gtk_label_set_use_markup(GTK_LABEL(s_lbl), TRUE);
+-
+- file_lbl = gtk_label_new("");
+- gtk_label_set_ellipsize(GTK_LABEL(file_lbl), PANGO_ELLIPSIZE_START);
+- gtk_widget_set_hexpand(file_lbl, TRUE);
+- gtk_widget_set_halign(file_lbl, GTK_ALIGN_FILL);
+- size_lbl = gtk_label_new("");
+- gtk_widget_set_hexpand(size_lbl, TRUE);
+- gtk_widget_set_halign(size_lbl, GTK_ALIGN_FILL);
+-
+- gtk_widget_set_halign(title, GTK_ALIGN_START);
++ level_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
++ level = gtk_progress_bar_new();
++ gtk_box_pack_start(GTK_BOX(level_box), level, FALSE, TRUE, 0);
++ gtk_grid_attach(GTK_GRID(grid), level_box, 1, 1, 1, 1);
++
++ expander = gtk_expander_new(_("Details"));
++ gtk_grid_attach(GTK_GRID(grid), expander, 1, 2, 1, 1);
++
++ r_grid = gtk_grid_new();
++ gtk_grid_set_row_spacing(GTK_GRID(r_grid), 5);
++ gtk_grid_set_column_spacing(GTK_GRID(r_grid), 15);
++ gtk_container_set_border_width(GTK_CONTAINER(r_grid), 5);
++
++ f_lbl = gtk_label_new(_("Name:"));
+ gtk_widget_set_halign(f_lbl, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(r_grid), f_lbl, 0, 0, 1, 1);
++
++ t_lbl = gtk_label_new(_("Type:"));
++ gtk_widget_set_halign(t_lbl, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(r_grid), t_lbl, 0, 1, 1, 1);
++
++ s_lbl = gtk_label_new(_("Size:"));
+ gtk_widget_set_halign(s_lbl, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(r_grid), s_lbl, 0, 2, 1, 1);
++
++ l_lbl = gtk_label_new(_("Length:"));
++ gtk_widget_set_halign(l_lbl, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(r_grid), l_lbl, 0, 3, 1, 1);
++
++ file_lbl = gtk_label_new(NULL);
++ gtk_label_set_ellipsize(GTK_LABEL(file_lbl), PANGO_ELLIPSIZE_START);
+ gtk_widget_set_halign(file_lbl, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(r_grid), file_lbl, 1, 0, 1, 1);
++
++ type_lbl = gtk_label_new(NULL);
++ gtk_widget_set_halign(type_lbl, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(r_grid), type_lbl, 1, 1, 1, 1);
++
++ size_lbl = gtk_label_new(NULL);
+ gtk_widget_set_halign(size_lbl, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(r_grid), size_lbl, 1, 2, 1, 1);
+
+- gtk_grid_attach(GTK_GRID(grid), title, 0, 0, 2, 1);
+- gtk_grid_attach(GTK_GRID(grid), f_lbl, 0, 1, 1, 1);
+- gtk_grid_attach(GTK_GRID(grid), s_lbl, 0, 2, 1, 1);
++ length_lbl = gtk_label_new(NULL);
++ gtk_widget_set_halign(length_lbl, GTK_ALIGN_START);
++ gtk_grid_attach(GTK_GRID(r_grid), length_lbl, 1, 3, 1, 1);
+
+- gtk_grid_attach(GTK_GRID(grid), file_lbl, 1, 1, 1, 1);
+- gtk_grid_attach(GTK_GRID(grid), size_lbl, 1, 2, 1, 1);
++ gtk_container_add(GTK_CONTAINER(expander), r_grid);
+
+ button = gtk_button_new();
+ btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+@@ -169,10 +325,11 @@ GtkWidget* record_status_window(Recordin
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_end (GTK_BOX(hbox), button, TRUE, FALSE, 0);
+
+- gtk_box_pack_start (GTK_BOX(vbox), grid, TRUE, TRUE, 0);
++ gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+ gtk_container_add(GTK_CONTAINER(status_dialog), vbox);
++ gtk_widget_grab_focus (button);
+
+ g_signal_connect(G_OBJECT(status_dialog), "delete_event", G_CALLBACK(delete_event_cb), recording);
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_clicked_cb), recording);
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -61,7 +61,6 @@ gboolean main_visible;
+ static GtkWidget *drawing_area;
+ static GdkPixbuf *digits, *signal_s, *stereo;
+ static GtkWidget *freq_scale;
+-static GtkWidget *rec_pixmap;
+
+ static int timeout_id, bp_timeout_id = -1, bp_timeout_steps = 0;
+
+@@ -760,12 +759,14 @@ static int start_recording(const gchar *
+ void rec_button_clicked_cb(GtkButton *button, gpointer app)
+ {
+ char *station;
+- char time_str[100];
+- time_t t;
++ gchar *time;
++ GDateTime *date;
+
+- t = time(NULL);
++ date = g_date_time_new_now_local ();
++ g_assert (date);
+ /* consult man strftime to translate this. This is a filename, so don't use "/" or ":", please */
+- strftime(time_str, 100, _("%B-%d-%Y_%H-%M-%S"), localtime(&t));
++ time = g_date_time_format (date, _("%Y%m%d-%H%M%S"));
++ g_date_time_unref (date);
+
+ if (mom_ps < 0) {
+ station = g_strdup_printf(_("%.2f MHz"), rint(gtk_adjustment_get_value(adj))/STEPS);
+@@ -784,8 +785,9 @@ void rec_button_clicked_cb(GtkButton *bu
+ gtk_dialog_run (GTK_DIALOG (errdialog));
+ gtk_widget_destroy (errdialog);
+ } else */
+- start_recording(rec_settings.destination, station, time_str);
++ start_recording(rec_settings.destination, station, time);
+ g_free(station);
++ g_free(time);
+ }
+
+ void toggle_volume(void)
+@@ -931,7 +933,7 @@ GtkWidget* gnome_radio_gui(void)
+ GtkWidget *app;
+ GtkWidget *prefs_button, *quit_button, *scfw_button, *scbw_button;
+ GtkWidget *stfw_button, *stbw_button, *about_button, *rec_button;
+- GtkWidget *prefs_pixmap, *quit_pixmap, *scfw_pixmap, *scbw_pixmap;
++ GtkWidget *prefs_pixmap, *rec_pixmap, *quit_pixmap, *scfw_pixmap, *scbw_pixmap;
+ GtkWidget *stfw_pixmap, *stbw_pixmap, *about_pixmap;
+ GtkWidget *freq_up_pixmap, *freq_down_pixmap;
+ GdkPixbuf *freq_up_pixbuf, *freq_down_pixbuf;
+@@ -1106,7 +1108,7 @@ GtkWidget* gnome_radio_gui(void)
+ gtk_widget_set_tooltip_text(stbw_button, _("0.05 MHz Backwards"));
+ gtk_widget_set_tooltip_text(stfw_button, _("0.05 MHz Forwards"));
+ gtk_widget_set_tooltip_text(about_button, _("About"));
+- gtk_widget_set_tooltip_text(rec_button, _("Record radio as Wave, OGG or MP3"));
++ gtk_widget_set_tooltip_text(rec_button, _("Record radio as OGG, Flac, Wave or MP3"));
+ gtk_widget_set_tooltip_text(prefs_button, _("Edit your Preferences"));
+ gtk_widget_set_tooltip_text(mute_button, _("Adjust the Volume"));
+ gtk_widget_set_tooltip_text(quit_button, _("Quit"));
+Index: gnomeradio-1.8/src/rec_tech.c
+===================================================================
+--- gnomeradio-1.8.orig/src/rec_tech.c
++++ gnomeradio-1.8/src/rec_tech.c
+@@ -23,8 +23,64 @@
+ #include
+ #include
+ #include
++#include
+
+-static void error_cb(GstBus *bus, GstMessage *message, gpointer user_data)
++GtkWidget *level;
++
++static void
++show_error_dialog (GtkWindow *win, const gchar *dbg, const gchar * format, ...)
++{
++ GtkWidget *dialog;
++ va_list args;
++ gchar *s;
++
++ va_start (args, format);
++ s = g_strdup_vprintf (format, args);
++ va_end (args);
++
++ dialog = gtk_message_dialog_new (win,
++ GTK_DIALOG_DESTROY_WITH_PARENT,
++ GTK_MESSAGE_ERROR,
++ GTK_BUTTONS_CLOSE,
++ "%s",
++ s);
++
++ if (dbg != NULL) {
++ g_printerr ("ERROR: %s\nDEBUG MESSAGE: %s\n", s, dbg);
++ }
++
++ gtk_dialog_run (GTK_DIALOG (dialog));
++ gtk_widget_destroy (dialog);
++ g_free (s);
++}
++
++static void
++show_missing_known_element_error (GtkWindow *win, gchar *description,
++ gchar *element, gchar *plugin, gchar *module)
++{
++ show_error_dialog (win, NULL,
++ _("Could not create the GStreamer %s element.\n"
++ "Please install the '%s' plugin from the '%s' module.\n"
++ "Verify that the installation is correct by running\n"
++ " gst-inspect-0.10 %s\n"
++ "and then restart gnomeradio."),
++ description, plugin, module, element);
++}
++
++static void
++show_profile_error (GtkWindow *win, gchar *debug, gchar *description,
++ const char *profile)
++{
++ gchar *first;
++
++ first = g_strdup_printf (description, profile);
++ show_error_dialog (win, debug, "%s%s", first,
++ _("Please verify its settings.\n"
++ "You may be missing the necessary plugins."));
++ g_free (first);
++}
++
++static void pipeline_error_cb(GstBus *bus, GstMessage *message, gpointer user_data)
+ {
+ GError *error = NULL;
+ GstElement *pipeline = user_data;
+@@ -38,57 +94,140 @@ static void error_cb(GstBus *bus, GstMes
+ g_error_free(error);
+ }
+
++static gboolean
++level_message_handler_cb (GstBus *bus, GstMessage *message, gpointer user_data)
++{
++ if (message->type == GST_MESSAGE_ELEMENT) {
++ const GstStructure *s = gst_message_get_structure (message);
++ const gchar *name = gst_structure_get_name (s);
++
++ if (g_str_equal (name, "level")) {
++ gint channels;
++ gdouble peak_dB;
++ gdouble norm_peak;
++ const GValue *list;
++ const GValue *value;
++
++ gint i;
++ list = gst_structure_get_value (s, "rms");
++ channels = gst_value_list_get_size (list);
++
++ for (i = 0; i < channels; ++i) {
++ list = gst_structure_get_value (s, "peak");
++ value = gst_value_list_get_value (list, i);
++ peak_dB = g_value_get_double (value);
++ norm_peak = exp (peak_dB / 20);
++ if (norm_peak > 1.0)
++ norm_peak = 1.0;
++ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(level), norm_peak);
++ }
++ }
++ }
++ return TRUE;
++}
++
+ Recording*
+ recording_start(const char* filename)
+ {
+ GMAudioProfile *profile;
+- GstElement *pipeline, *source, *encoder, *filesink;
+- pipeline = source = encoder = filesink = NULL;
+-
+- profile = gm_audio_profile_lookup(rec_settings.profile);
+- g_assert(profile);
+-
++ const gchar *profile_pipeline_desc;
++ GstElement *pipeline, *source, *encoder, *filesink, *level;
++ pipeline = source = encoder = filesink = level = NULL;
++ GError *err = NULL;
++ gchar *pipeline_desc;
++ const char *name;
++
++ source = gst_element_factory_make ("gconfaudiosrc", "gconfaudiosource");
++ if (source == NULL) {
++ show_missing_known_element_error (NULL,
++ _("GConf audio recording"), "gconfaudiosrc",
++ "gconfelements", "gst-plugins-good");
++ return FALSE;
++ }
++
++ if (!gst_element_set_state (source, GST_STATE_READY)) {
++ show_error_dialog (NULL, NULL,
++ _("Your audio capture settings are invalid. "
++ "Please correct them with the \"Sound Settings\" "
++ "under the System Settings menu."));
++ return FALSE;
++ }
++
++ filesink = gst_element_factory_make ("filesink", "sink");
++ if (filesink == NULL)
++ {
++ show_missing_known_element_error (NULL,
++ _("file output"), "filesink", "coreelements", "gstreamer");
++ gst_object_unref (source);
++ return NULL;
++ }
++
+ pipeline = gst_pipeline_new("gnomeradio-record-pipeline");
+- if (!pipeline) {
+- g_warning(_("Could not create GStreamer pipeline. Check your Gstreamer installation!\n"));
+- goto error;
+- }
+-
+- source = gst_element_factory_make("autoaudiosrc", "audio_source");
+- if (!source) {
+- g_warning(_("Could not open Gstreamer AUDIO Source. Verify your Gstreamer AUDIO subsystem installation!\n"));
+- goto error;
++
++ gst_bin_add (GST_BIN (pipeline), source);
++
++ level = gst_element_factory_make ("level", "level");
++ if (level == NULL)
++ {
++ show_missing_known_element_error (NULL,
++ _("level"), "level", "level", "gstreamer");
++ gst_object_unref (source);
++ return NULL;
+ }
+-
+- GstBus *bus = gst_element_get_bus(pipeline);
+- gst_bus_add_signal_watch(bus);
+- g_signal_connect(G_OBJECT(bus), "message::error", G_CALLBACK(error_cb), pipeline);
++ gst_element_set_name (level, "level");
++
++ profile = gm_audio_profile_lookup(rec_settings.profile);
++ g_assert(profile);
++ if (profile == NULL)
++ return NULL;
++ profile_pipeline_desc = gm_audio_profile_get_pipeline (profile);
++ name = gm_audio_profile_get_name (profile);
++
++ GST_DEBUG ("encoder profile pipeline: '%s'", GST_STR_NULL (profile_pipeline_desc));
+
+- char* pipeline_str = g_strdup_printf("audioconvert ! %s", gm_audio_profile_get_pipeline(profile));
+- encoder = gst_parse_bin_from_description(pipeline_str, TRUE, NULL);
+- g_free(pipeline_str);
+- if (!encoder) {
+- char *caption = g_strdup_printf(_("Could not create encoder \"%s\"."), gm_audio_profile_get_name (profile));
+- g_warning(_("%s Verify your Gstreamer plugins installation!\n"), caption);
+- g_free(caption);
+- goto error;
++ pipeline_desc = g_strdup_printf ("audioconvert ! %s", profile_pipeline_desc);
++ GST_DEBUG ("making encoder bin from description '%s'", pipeline_desc);
++ encoder = gst_parse_bin_from_description (pipeline_desc, TRUE, &err);
++ g_free (pipeline_desc);
++ pipeline_desc = NULL;
++
++ if (err) {
++ show_profile_error (NULL, err->message,
++ _("Could not parse the '%s' audio profile. "), name);
++ g_printerr ("Failed to create GStreamer encoder plugins [%s]: %s\n", profile_pipeline_desc, err->message);
++ g_error_free (err);
++ gst_object_unref (pipeline);
++ gst_object_unref (filesink);
++ g_free (pipeline);
++ return NULL;
+ }
+-
+- /* Write to disk */
+- filesink = gst_element_factory_make("filesink", "file-sink");
+- if (!filesink) {
+- g_warning(_("Could not create Gstreamer filesink. Check your Gstreamer installation!"));
+- goto error;
++
++ gst_bin_add (GST_BIN (pipeline), level);
++ gst_bin_add (GST_BIN (pipeline), encoder);
++ gst_bin_add (GST_BIN (pipeline), filesink);
++
++ if (!(gst_element_link_many (source, level, encoder, NULL))) {
++ show_profile_error (NULL, NULL,
++ _("Could not capture using the '%s' audio profile. "), name);
++ gst_object_unref (pipeline);
++ g_free (pipeline);
++ return NULL;
+ }
+-
+- /* Add the elements to the pipeline */
+- gst_bin_add_many(GST_BIN(pipeline), source, encoder, filesink, NULL);
+-
+- /* Link it all together */
+- if (!gst_element_link_many(source, encoder, filesink, NULL)) {
+- g_warning("Could not link elements. This is bad!\n");
+- goto error;
++
++ if (!gst_element_link (encoder, filesink)) {
++ show_profile_error (NULL, NULL,
++ _("Could not write to a file using the '%s' audio profile. "), name);
++ gst_object_unref (pipeline);
++ g_free (pipeline);
++ return NULL;
+ }
++
++ GstBus *bus = gst_element_get_bus(pipeline);
++ gst_bus_add_signal_watch(bus);
++
++ g_signal_connect(G_OBJECT(bus), "message::error", G_CALLBACK(pipeline_error_cb), pipeline);
++ g_signal_connect (G_OBJECT(bus), "message::element", G_CALLBACK (level_message_handler_cb), pipeline);
++
+ char* path = g_strdup_printf("%s.%s", filename, gm_audio_profile_get_extension(profile));
+ g_object_set(G_OBJECT(filesink), "location", path, NULL);
+
+@@ -99,18 +238,6 @@ recording_start(const char* filename)
+ recording->pipeline = pipeline;
+
+ return recording;
+-
+-error:
+- if (pipeline)
+- gst_object_unref(GST_OBJECT(pipeline));
+- if (source)
+- gst_object_unref(GST_OBJECT(source));
+- if (encoder)
+- gst_object_unref(GST_OBJECT(encoder));
+- if (filesink)
+- gst_object_unref(GST_OBJECT(filesink));
+-
+- return NULL;
+ }
+
+ void
+@@ -121,7 +248,7 @@ recording_stop(Recording *recording)
+ GstState state;
+ gst_element_get_state(recording->pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
+ if (state != GST_STATE_PLAYING) {
+- g_print("Ups!\n");
++ GST_DEBUG ("pipeline in wrong state: %s", gst_element_state_get_name (state));
+ } else {
+ gst_element_set_state(recording->pipeline, GST_STATE_NULL);
+ }
diff -pruN 1.8-2/debian/patches/gnomeradio-record.patch 1.8-2ubuntu32/debian/patches/gnomeradio-record.patch
--- 1.8-2/debian/patches/gnomeradio-record.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-record.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,57 @@
+## Description: Changed audio source from osssrc to autoaudiosrc that automatically detects an appropriate audio source to use.
+## Origin: upstream, no
+## Bug-Ubuntu: http://launchpad.net/bugs/1004761
+## Author: Pojar George
+## Forwarded: no
+Index: b/src/rec_tech.c
+===================================================================
+--- a/src/rec_tech.c 2012-12-03 10:14:54.942899807 +0000
++++ b/src/rec_tech.c 2012-12-03 10:14:56.370899764 +0000
+@@ -42,8 +42,8 @@
+ recording_start(const char* filename)
+ {
+ GMAudioProfile *profile;
+- GstElement *pipeline, *oss_src, *encoder, *filesink;
+- pipeline = oss_src = encoder = filesink = NULL;
++ GstElement *pipeline, *source, *encoder, *filesink;
++ pipeline = source = encoder = filesink = NULL;
+
+ profile = gm_audio_profile_lookup(rec_settings.profile);
+ g_assert(profile);
+@@ -54,9 +54,9 @@
+ goto error;
+ }
+
+- oss_src = gst_element_factory_make("osssrc", "oss-source");
+- if (!oss_src) {
+- g_warning(_("Could not open Gstreamer OSS Source. Verify your Gstreamer OSS subsystem installation!\n"));
++ source = gst_element_factory_make("autoaudiosrc", "audio_source");
++ if (!source) {
++ g_warning(_("Could not open Gstreamer AUDIO Source. Verify your Gstreamer AUDIO subsystem installation!\n"));
+ goto error;
+ }
+
+@@ -82,10 +82,10 @@
+ }
+
+ /* Add the elements to the pipeline */
+- gst_bin_add_many(GST_BIN(pipeline), oss_src, encoder, filesink, NULL);
++ gst_bin_add_many(GST_BIN(pipeline), source, encoder, filesink, NULL);
+
+ /* Link it all together */
+- if (!gst_element_link_many(oss_src, encoder, filesink, NULL)) {
++ if (!gst_element_link_many(source, encoder, filesink, NULL)) {
+ g_warning("Could not link elements. This is bad!\n");
+ goto error;
+ }
+@@ -103,8 +103,8 @@
+ error:
+ if (pipeline)
+ gst_object_unref(GST_OBJECT(pipeline));
+- if (oss_src)
+- gst_object_unref(GST_OBJECT(oss_src));
++ if (source)
++ gst_object_unref(GST_OBJECT(source));
+ if (encoder)
+ gst_object_unref(GST_OBJECT(encoder));
+ if (filesink)
diff -pruN 1.8-2/debian/patches/gnomeradio-save_the_world.patch 1.8-2ubuntu32/debian/patches/gnomeradio-save_the_world.patch
--- 1.8-2/debian/patches/gnomeradio-save_the_world.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-save_the_world.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,15 @@
+Description: Use g_timeout_add_seconds instead g_timeout_add.
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -1474,7 +1474,7 @@ int main(int argc, char* argv[])
+ * Necessary, because the mono/stereo reception
+ * needs some time to be correctly detected
+ */
+- g_timeout_add(3000, (GSourceFunc)redraw_status_window, NULL);
++ g_timeout_add_seconds(3, (GSourceFunc)redraw_status_window, NULL);
+
+ /* Checks if the volume has been changed by an
+ * external app
diff -pruN 1.8-2/debian/patches/gnomeradio-scan.patch 1.8-2ubuntu32/debian/patches/gnomeradio-scan.patch
--- 1.8-2/debian/patches/gnomeradio-scan.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-scan.patch 2015-04-13 18:43:38.000000000 +0000
@@ -0,0 +1,222 @@
+Description: Avoid scan dialog from locking up during long running process.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1441336
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -127,11 +127,18 @@ static void set_first_time_flag(void)
+ g_clear_object (&gsettings);
+ }
+
++static gint compare_freq(preset *a, preset *b)
++{
++ return (a->freq > b->freq) - (a->freq < b->freq);
++}
++
+ typedef struct {
+ GtkWidget *dialog;
++ GtkWidget *label;
+ GtkWidget *progress;
++ GHashTable *table;
+ GList *stations;
+- GtkWidget *label;
++ int timeout_id;
+ } FreqScanData;
+
+ static gboolean initial_frequency_scan_cb(gpointer data)
+@@ -143,27 +150,50 @@ static gboolean initial_frequency_scan_c
+
+ if (freq > FREQ_MAX) {
+ gtk_widget_destroy(fsd->dialog);
+- timeout_id = 0;
++ fsd->timeout_id = 0;
++ if (fsd->table != NULL) {
++ g_hash_table_destroy(fsd->table);
++ fsd->table = NULL;
++ }
+ return FALSE;
+ }
+
++ g_print(_("Checking %6.2f MHz:"), freq);
++ g_print(" - %-30s\r", _("No signal"));
++
+ if (radio_check_station(freq)) {
+- guint num;
+- char *text;
++ gboolean found = FALSE;
++ gchar *buf;
++
++ g_print(" + %-30s\r", _("Signal detected"));
++ g_print("\r");
++ g_print("Found a station at %6.2f MHz", freq);
++
++ buf = g_strdup_printf("%.2f", freq);
++ if (g_hash_table_lookup_extended(fsd->table, buf, NULL, NULL)) {
++ g_hash_table_remove(fsd->table, buf);
++ found = TRUE;
++ g_print(" (skipped)\n");
++ }
++ g_free(buf);
+
+- num = g_list_length (fsd->stations) + 1;
+- text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE,
+- "%d station found",
+- "%d stations found", num), num);
+-
+- gfloat *f = g_malloc(sizeof(gfloat));
+- gtk_label_set_text(GTK_LABEL(fsd->label), text);
+- g_free(text);
+-
+- g_print("Found a station at %.2f MHz\n", freq);
+-
+- *f = freq;
+- fsd->stations = g_list_append(fsd->stations, f);
++ if (!found) {
++ static int n = 1;
++ gfloat *f;
++ gchar *markup;
++
++ f = g_malloc0(sizeof(gfloat));
++ *f = freq;
++ fsd->stations = g_list_prepend(fsd->stations, f);
++ g_print("\n");
++
++ markup = g_strdup_printf(g_dngettext(GETTEXT_PACKAGE,
++ "%d station found",
++ "%d stations found", n), n);
++ gtk_label_set_text(GTK_LABEL(fsd->label), markup);
++ g_free(markup);
++ n += 1;
++ }
+ }
+
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(fsd->progress), MAX(0, (freq - FREQ_MIN)/(FREQ_MAX - FREQ_MIN)));
+@@ -180,8 +210,19 @@ static void initial_frequency_scan(GtkWi
+ GtkWidget *content_area;
+ GtkWidget *box;
+ GtkWidget *label;
++ GList *node;
+ gchar *markup;
+
++ data.table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
++ for (node = settings.presets; node; node = node->next) {
++ preset *ps = (preset *) node->data;
++ gchar *buf;
++
++ buf = g_strdup_printf("%.2f", ps->freq);
++ g_hash_table_insert(data.table, g_strdup(buf), NULL);
++ g_free(buf);
++ }
++
+ data.stations = NULL;
+
+ data.dialog = gtk_dialog_new_with_buttons (_("Scanning"),
+@@ -216,60 +257,68 @@ static void initial_frequency_scan(GtkWi
+ gtk_widget_show_all (data.dialog);
+
+ radio_mute();
+- timeout_id = g_timeout_add (1000/SCAN_SPEED, (GSourceFunc)initial_frequency_scan_cb, (gpointer)&data);
++ data.timeout_id = g_idle_add((GSourceFunc) initial_frequency_scan_cb, (gpointer) &data);
++
++ g_print(_("Scanning range: %.2f - %.2f MHz (%.2f MHz steps)\n"), FREQ_MIN, FREQ_MAX, 1.0 / STEPS);
++
+ gtk_dialog_run (GTK_DIALOG (data.dialog));
+
+ radio_unmute();
+- if (timeout_id) {
+- g_source_remove (timeout_id);
+- timeout_id = 0;
+- gtk_widget_destroy (data.dialog);
++ if (data.timeout_id) {
++ g_source_remove (data.timeout_id);
++ data.timeout_id = 0;
++ if (data.table != NULL) {
++ g_hash_table_destroy(data.table);
++ data.table = NULL;
++ }
++ gtk_widget_destroy(data.dialog);
++ g_print("\n");
+ } else {
+ if (data.stations != NULL) {
+ GtkWidget *dialog;
+- GList *l;
+- guint num;
+- int response;
+- char *text;
+-
+- gfloat f = *((gfloat*)data.stations->data);
+- gtk_adjustment_set_value(adj, f*STEPS);
+- radio_set_freq(f);
++ gfloat freq;
++ int n, response;
++
++ data.stations = g_list_reverse(data.stations);
++
++ freq = *((gfloat *) data.stations->data);
++ gtk_adjustment_set_value(adj, freq * STEPS);
++ radio_set_freq(freq);
+
+- num = g_list_length (data.stations);
+- text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE,
+- "%d station found.",
+- "%d stations found.", num), num);
++ n = g_list_length(data.stations);
++ markup = g_strdup_printf(g_dngettext (GETTEXT_PACKAGE,
++ "%d station found.",
++ "%d stations found.", n), n);
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW (app),
+ DIALOG_FLAGS,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_YES_NO,
+- "%s", text);
++ "%s", markup);
+
+- if (num == 1)
++ if (n == 1)
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("Do you want to add it as preset?"));
+ else
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("Do you want to add them as presets?"));
+- g_free (text);
++ g_free(markup);
+
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+- for (l = data.stations; l; l = l->next) {
+- if (response == GTK_RESPONSE_YES) {
++ if (response == GTK_RESPONSE_YES) {
++ for (node = data.stations; node; node = node->next) {
+ preset *ps = g_malloc0(sizeof(preset));
+ ps->title = g_strdup(_("unnamed"));
+- ps->freq = *((gfloat*) l->data);
++ ps->freq = *((gfloat *) node->data);
+ settings.presets = g_list_prepend(settings.presets, ps);
++
++ g_free(node->data);
+ }
+
+- g_free (l->data);
++ settings.presets = g_list_sort(settings.presets, (GCompareFunc) compare_freq);
+ }
+-
+- settings.presets = g_list_reverse (settings.presets);
+ }
+ }
+ }
+Index: gnomeradio-1.8/src/gui.h
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.h
++++ gnomeradio-1.8/src/gui.h
+@@ -17,7 +17,7 @@
+ #ifndef _GUI_H
+ #define _GUI_H
+
+-#define FREQ_MAX 108
++#define FREQ_MAX 108.0
+ #define FREQ_MIN 87.5
+ #define STEPS 20
+ #define SUNSHINE 106.15
diff -pruN 1.8-2/debian/patches/gnomeradio-set_pulse_role.patch 1.8-2ubuntu32/debian/patches/gnomeradio-set_pulse_role.patch
--- 1.8-2/debian/patches/gnomeradio-set_pulse_role.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-set_pulse_role.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,17 @@
+## Description: Set the pulse media role.
+## Origin: upstream, no
+## Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1079573
+## Author: Pojar George
+## Forwarded: no
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -1248,6 +1248,7 @@ int main(int argc, char* argv[])
+
+ gtk_init(&argc, &argv);
+ gtk_window_set_default_icon_name("gnomeradio");
++ g_setenv("PULSE_PROP_media.role", "production", TRUE);
+ /* Main app */
+ main_visible = FALSE;
+ app = gnome_radio_gui();
diff -pruN 1.8-2/debian/patches/gnomeradio-tray_menu.patch 1.8-2ubuntu32/debian/patches/gnomeradio-tray_menu.patch
--- 1.8-2/debian/patches/gnomeradio-tray_menu.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-tray_menu.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,925 @@
+Description: Fixed menu item not update conform new order when we use move up[down] swap. (LP: #1232931)
+ Fixed conditional jump or move depends on uninitialized value.
+ Added function to switch to preset in settings preset list when changed them from tray menu.
+ Cleaned up the files relating to the tray icon. Neither gui.c, prefs.c nor record.c touch the internals of trayicon.c anymore.
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnomeradio/+bug/1232931
+Author: POJAR GEORGE
+Index: gnomeradio-1.8/src/trayicon.c
+===================================================================
+--- gnomeradio-1.8.orig/src/trayicon.c
++++ gnomeradio-1.8/src/trayicon.c
+@@ -25,12 +25,121 @@
+ #include "trayicon.h"
+ #include "mixer.h"
+
+-extern GtkAdjustment *adj;
+-
+-extern int mom_ps;
+ extern gnomeradio_settings settings;
+
++static GtkWidget *mute_menuitem;
+ static GtkWidget *showwindow_menuitem;
++static GtkWidget *tray_menu;
++static GObject *tray_icon;
++
++int mute_menuitem_toggled_cb_id;
++
++void tray_icon_set_title(gchar *title)
++{
++ if (tray_icon)
++ gtk_status_icon_set_tooltip_text(GTK_STATUS_ICON(tray_icon), title);
++}
++
++void tray_menu_items_set_sensible(gboolean sensible)
++{
++ GList* menuitems;
++ GtkWidget *menuitem;
++ int i, cnt = g_list_length(settings.presets);
++
++
++ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
++
++ g_assert(cnt + 6 == g_list_length(menuitems));
++
++ /* Disable the presets */
++ for (i = 0; i < cnt; i++) {
++ menuitem = g_list_nth_data(menuitems, i);
++ gtk_widget_set_sensitive(menuitem, sensible);
++ }
++
++ /* Disable the mute button (separator => +1) */
++ menuitem = g_list_nth_data(menuitems, cnt + 1);
++ gtk_widget_set_sensitive(menuitem, sensible);
++
++ /* Disable the record button */
++ menuitem = g_list_nth_data(menuitems, cnt + 2);
++ gtk_widget_set_sensitive(menuitem, sensible);
++
++ /* Disable the quit button */
++ menuitem = g_list_nth_data(menuitems, cnt + 5);
++ gtk_widget_set_sensitive(menuitem, sensible);
++}
++
++void tray_menu_enable_mute_button (gboolean enable)
++{
++ if (tray_menu) {
++ g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), enable);
++ g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
++ }
++}
++
++void tray_menu_add_preset (preset* ps, gint index)
++{
++ GtkWidget *menuitem;
++
++ menuitem = gtk_menu_item_new_with_label(ps->title);
++
++ gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, index);
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index));
++ gtk_widget_show(menuitem);
++}
++
++void tray_menu_remove_preset (gint index)
++{
++ GList* menuitems;
++ GtkWidget *menuitem;
++
++ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
++ g_assert(index < g_list_length(menuitems));
++ menuitem = g_list_nth_data(menuitems, index);
++ gtk_widget_destroy(menuitem);
++}
++
++void tray_menu_move_up_preset (preset* ps, gint index)
++{
++ GList* menuitems;
++ GtkWidget *menuitem;
++
++ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
++ g_assert(index < g_list_length(menuitems));
++ menuitem = g_list_nth_data(menuitems, index);
++
++ gtk_menu_reorder_child (GTK_MENU(tray_menu), menuitem, GPOINTER_TO_INT (index + 1));
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index + 1));
++
++ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
++ menuitem = g_list_nth_data(menuitems, index);
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index));
++}
++
++void tray_menu_move_down_preset (preset* ps, gint index)
++{
++ GList* menuitems;
++ GtkWidget *menuitem;
++
++ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
++ g_assert(index < g_list_length(menuitems));
++ menuitem = g_list_nth_data(menuitems, index);
++
++ gtk_menu_reorder_child (GTK_MENU(tray_menu), menuitem, GPOINTER_TO_INT (index - 1));
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index - 1));
++
++ menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
++ menuitem = g_list_nth_data(menuitems, index);
++ g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (index));
++}
++
++void tray_menu_update_preset (preset* ps, gint index)
++{
++ tray_menu_remove_preset (index);
++ tray_menu_add_preset (ps, index);
++}
+
+ static void mute_menuitem_toggled_cb(GtkCheckMenuItem *checkmenuitem, gpointer user_data)
+ {
+@@ -55,13 +164,7 @@ static void quit_menuitem_activate_cb(Gt
+
+ void preset_menuitem_activate_cb(GtkMenuItem *menuitem, gpointer user_data)
+ {
+- preset* ps;
+- mom_ps = GPOINTER_TO_INT (user_data);
+-
+- g_assert(mom_ps >= 0 && mom_ps < g_list_length(settings.presets));
+-
+- ps = (preset*)g_list_nth_data(settings.presets, mom_ps);
+- gtk_adjustment_set_value(adj, ps->freq * STEPS);
++ gnomeradio_switch_to_preset(GPOINTER_TO_INT (user_data));
+ }
+
+ void create_tray_menu(GtkWidget *app) {
+@@ -71,8 +174,7 @@ void create_tray_menu(GtkWidget *app) {
+
+ tray_menu = gtk_menu_new();
+
+- for (i = 0; node; i++, node = node->next)
+- {
++ for (i = 0; node; i++, node = node->next) {
+ preset *ps = (preset*)node->data;
+ menuitem = gtk_menu_item_new_with_label(ps->title);
+
+@@ -86,8 +188,7 @@ void create_tray_menu(GtkWidget *app) {
+ mute_menuitem = gtk_check_menu_item_new_with_label(_("Muted"));
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->get_volume() == 0);
+ gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), mute_menuitem);
+- mute_menuitem_toggled_cb_id =
+- g_signal_connect(G_OBJECT(mute_menuitem), "toggled", (GCallback)mute_menuitem_toggled_cb, (gpointer)app);
++ mute_menuitem_toggled_cb_id = g_signal_connect(G_OBJECT(mute_menuitem), "toggled", (GCallback)mute_menuitem_toggled_cb, (gpointer)app);
+ gtk_widget_show(mute_menuitem);
+
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Record"));
+@@ -128,7 +229,6 @@ void create_tray_icon(GtkWidget *app)
+ {
+ GdkPixbuf *pixbuf;
+ GtkIconTheme *icontheme;
+- char *text;
+
+ icontheme = gtk_icon_theme_get_default();
+ pixbuf = gtk_icon_theme_load_icon(icontheme, "gnomeradio", 22, 0, NULL);
+@@ -138,8 +238,4 @@ void create_tray_icon(GtkWidget *app)
+
+ g_signal_connect (G_OBJECT(tray_icon), "activate", G_CALLBACK (tray_activate_cb), (gpointer)app);
+ g_signal_connect (G_OBJECT(tray_icon), "popup-menu", G_CALLBACK (tray_popup_menu), (gpointer)app);
+-
+- text = g_strdup_printf(_("Gnomeradio - %.2f MHz"), gtk_adjustment_get_value(adj)/STEPS);
+- gtk_status_icon_set_tooltip_text(GTK_STATUS_ICON(tray_icon), text);
+- g_free(text);
+ }
+Index: gnomeradio-1.8/src/prefs.c
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.c
++++ gnomeradio-1.8/src/prefs.c
+@@ -47,7 +47,7 @@ static GtkWidget *mixer_entry;
+ static GtkWidget *audio_box;
+ static GtkWidget *audio_switch;
+ static GtkWidget *mute_on_exit;
+-static GtkWidget *list_view;
++static GtkWidget *tree_view;
+ static GtkListStore *list_store;
+ static GtkTreeSelection *selection;
+ static GtkWidget *save_button;
+@@ -482,7 +482,6 @@ static void add_button_clicked_cb(GtkWid
+ GtkTreeIter iter = {0};
+ GtkAdjustment* v_scb;
+ GtkTreePath *path = NULL;
+- GtkWidget *menuitem;
+
+ ps = malloc(sizeof(preset));
+ ps->title = g_strdup(_("unnamed"));
+@@ -496,7 +495,7 @@ static void add_button_clicked_cb(GtkWid
+ g_free(buffer);
+ gtk_tree_selection_unselect_all(selection);
+
+- v_scb = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(list_view));
++ v_scb = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(tree_view));
+ gtk_adjustment_set_value(v_scb, gtk_adjustment_get_upper(v_scb));
+
+ if (main_visible) {
+@@ -504,17 +503,13 @@ static void add_button_clicked_cb(GtkWid
+ mom_ps = g_list_length(settings.presets) - 1;
+ preset_combo_set_item(mom_ps);
+
+- menuitem = gtk_menu_item_new_with_label(ps->title);
+-
+- gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, mom_ps);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (mom_ps));
+- gtk_widget_show(menuitem);
++ tray_menu_add_preset (ps, mom_ps);
+ }
+
+ buffer = g_strdup_printf("%d", g_list_length(settings.presets) - 1);
+ path = gtk_tree_path_new_from_string(buffer);
+ g_free(buffer);
+- gtk_tree_view_set_cursor(GTK_TREE_VIEW(list_view), path, NULL, FALSE);
++ gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view), path, NULL, FALSE);
+ gtk_tree_path_free(path);
+
+ gtk_widget_set_sensitive(save_button, TRUE);
+@@ -527,10 +522,8 @@ static void remove_button_clicked_cb(Gtk
+ GtkTreeIter iter;
+ preset *ps;
+ int *row;
+- GList* menuitems;
+- GtkWidget *menuitem;
+
+- gtk_tree_view_get_cursor(GTK_TREE_VIEW(list_view), &path, &focus_column);
++ gtk_tree_view_get_cursor(GTK_TREE_VIEW(tree_view), &path, &focus_column);
+
+ if (path == NULL)
+ return;
+@@ -554,21 +547,17 @@ static void remove_button_clicked_cb(Gtk
+ if (settings.presets == NULL) mom_ps = -1;
+ preset_combo_set_item(mom_ps);
+
+- menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+- g_assert(*row < g_list_length(menuitems));
+- menuitem = g_list_nth_data(menuitems, *row);
+- gtk_widget_destroy(menuitem);
++ tray_menu_remove_preset (*row);
+ }
+
+ gtk_tree_path_prev(path);
+- gtk_tree_view_set_cursor(GTK_TREE_VIEW(list_view), path, NULL, FALSE);
++ gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view), path, NULL, FALSE);
+ gtk_tree_path_free(path);
+
+- if (settings.presets == NULL) {
++ if (settings.presets == NULL)
+ gtk_widget_set_sensitive(save_button, FALSE);
+- } else {
++ else
+ gtk_widget_set_sensitive(save_button, TRUE);
+- }
+ }
+
+ static void move_up_button_clicked_cb(GtkWidget * widget, gpointer data)
+@@ -578,10 +567,8 @@ static void move_up_button_clicked_cb(Gt
+ gint pos;
+ preset *ps;
+ int *row;
+- GList* menuitems;
+- GtkWidget *menuitem;
+
+- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
++ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
+ gtk_tree_selection_get_selected(selection, NULL, &iter);
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
+
+@@ -611,25 +598,17 @@ static void move_up_button_clicked_cb(Gt
+ mom_ps = *row;
+ preset_combo_set_item(mom_ps);
+
+- menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+- g_assert(mom_ps < g_list_length(menuitems));
+- menuitem = g_list_nth_data(menuitems, mom_ps);
+- gtk_widget_destroy(menuitem);
+- menuitem = gtk_menu_item_new_with_label(ps->title);
+-
+- gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, *row + 1);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (mom_ps));
+- gtk_widget_show(menuitem);
++ tray_menu_move_up_preset (ps, mom_ps);
+ }
+
+- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(list_view), path, NULL, FALSE, 0, 0);
++ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree_view), path, NULL, FALSE, 0, 0);
+ gtk_tree_path_free(path);
+
+- if (pos - 1 <= 0) {
++ if (pos - 1 <= 0)
+ gtk_widget_set_sensitive(move_up_button, FALSE);
+- } else {
++ else
+ gtk_widget_set_sensitive(move_up_button, TRUE);
+- }
++
+ gtk_widget_set_sensitive(move_down_button, TRUE);
+ }
+
+@@ -640,10 +619,8 @@ static void move_down_button_clicked_cb(
+ gint pos, count;
+ preset *ps;
+ int *row;
+- GList* menuitems;
+- GtkWidget *menuitem;
+
+- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
++ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
+ gtk_tree_selection_get_selected(selection, NULL, &iter);
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
+
+@@ -677,38 +654,29 @@ static void move_down_button_clicked_cb(
+ mom_ps = *row;
+ preset_combo_set_item(mom_ps);
+
+- menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+- g_assert(mom_ps < g_list_length(menuitems));
+- menuitem = g_list_nth_data(menuitems, mom_ps);
+- gtk_widget_destroy(menuitem);
+- menuitem = gtk_menu_item_new_with_label(ps->title);
+-
+- gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, *row - 1);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (mom_ps));
+- gtk_widget_show(menuitem);
++ tray_menu_move_down_preset (ps, mom_ps);
+ }
+
+- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(list_view), path, NULL, FALSE, 0, 0);
++ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree_view), path, NULL, FALSE, 0, 0);
+ gtk_tree_path_free(path);
+
+- if (pos + 2 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL)) {
++ if (pos + 2 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL))
+ gtk_widget_set_sensitive(move_down_button, FALSE);
+- } else {
++ else
+ gtk_widget_set_sensitive(move_down_button, TRUE);
+- }
++
+ gtk_widget_set_sensitive(move_up_button, TRUE);
+ }
+
+ static void destination_button_clicked_cb(GtkWidget *button, gpointer data)
+ {
+ if (rec_settings.destination)
+- {
+ g_free(rec_settings.destination);
+- }
++
+ rec_settings.destination = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(button));
+ }
+
+-static gboolean list_view_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
++static gboolean tree_view_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+ {
+ if (event->keyval == GDK_KEY_Delete)
+ remove_button_clicked_cb(widget, user_data);
+@@ -727,24 +695,22 @@ static gboolean button_release_cb(GtkWid
+
+ event_button = (GdkEventButton *) event;
+
+- gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(list_view), event_button->x, event_button->y, &path, NULL, NULL, NULL);
++ gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree_view), event_button->x, event_button->y, &path, NULL, NULL, NULL);
+ if (path != NULL) {
+ buffer = gtk_tree_path_to_string(path);
+ pos = (gint) g_strtod(buffer, NULL);
+ g_free(buffer);
+ gtk_tree_path_free(path);
+
+- if (pos == 0) {
++ if (pos == 0)
+ gtk_widget_set_sensitive(move_up_button, FALSE);
+- } else {
++ else
+ gtk_widget_set_sensitive(move_up_button, TRUE);
+- }
+
+- if (pos + 1 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL)) {
++ if (pos + 1 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL))
+ gtk_widget_set_sensitive(move_down_button, FALSE);
+- } else {
++ else
+ gtk_widget_set_sensitive(move_down_button, TRUE);
+- }
+ }
+ return FALSE;
+ }
+@@ -755,8 +721,6 @@ static void name_cell_edited_cb(GtkCellR
+ GtkTreeIter iter;
+ preset *ps;
+ int *row;
+- GList* menuitems;
+- GtkWidget *menuitem;
+
+ path = gtk_tree_path_new_from_string(path_str);
+
+@@ -775,15 +739,7 @@ static void name_cell_edited_cb(GtkCellR
+ mom_ps = *row;
+ preset_combo_set_item(mom_ps);
+
+- menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+- g_assert(mom_ps < g_list_length(menuitems));
+- menuitem = g_list_nth_data(menuitems, mom_ps);
+- gtk_widget_destroy(menuitem);
+- menuitem = gtk_menu_item_new_with_label(ps->title);
+-
+- gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, *row);
+- g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, GINT_TO_POINTER (mom_ps));
+- gtk_widget_show(menuitem);
++ tray_menu_update_preset (ps, mom_ps);
+ }
+
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path);
+@@ -828,7 +784,7 @@ static void freq_cell_edited_cb(GtkCellR
+ gtk_tree_path_free(path);
+ }
+
+-static void list_view_cursor_changed_cb(GtkWidget *widget, gpointer data)
++static void tree_view_cursor_changed_cb(GtkWidget *widget, gpointer data)
+ {
+ int *row;
+ preset *ps;
+@@ -839,7 +795,7 @@ static void list_view_cursor_changed_cb(
+ if (settings.presets == NULL)
+ return;
+
+- gtk_tree_view_get_cursor(GTK_TREE_VIEW(list_view), &path, &focus_column);
++ gtk_tree_view_get_cursor(GTK_TREE_VIEW(tree_view), &path, &focus_column);
+
+ if (path == NULL)
+ return;
+@@ -855,22 +811,21 @@ static void list_view_cursor_changed_cb(
+
+ pos = g_list_index(settings.presets, (gpointer)ps);
+
+- if (pos == 0) {
++ if (pos == 0)
+ gtk_widget_set_sensitive(move_up_button, FALSE);
+- } else {
++ else
+ gtk_widget_set_sensitive(move_up_button, TRUE);
+- }
+
+- if (pos + 1 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL)) {
++ if (pos + 1 == gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL))
+ gtk_widget_set_sensitive(move_down_button, FALSE);
+- } else {
++ else
+ gtk_widget_set_sensitive(move_down_button, TRUE);
+- }
++
+ gtk_tree_path_free(path);
+ return;
+ }
+
+-static void list_view_selection_changed_cb(GtkWidget *widget, gpointer data)
++static void tree_view_selection_changed_cb(GtkWidget *widget, gpointer data)
+ {
+ gboolean sel;
+
+@@ -880,10 +835,25 @@ static void list_view_selection_changed_
+ gtk_widget_set_sensitive(save_button, sel);
+ }
+
+-static void list_view_scroll_to_active_preset_cb(GtkWidget *widget, gpointer data)
++void tree_view_switch_to_preset (gint active)
+ {
+ GtkTreePath *path = NULL;
+ GtkTreeIter iter;
++
++ if (!gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list_store), &iter, NULL, active))
++ return;
++
++ path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
++
++ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW (tree_view), path, NULL, FALSE, 0, 0);
++ gtk_tree_view_set_cursor(GTK_TREE_VIEW (tree_view), path, NULL, FALSE );
++ gtk_tree_path_free(path);
++
++ gtk_widget_grab_focus(tree_view);
++}
++
++static void tree_view_scroll_to_active_preset_cb(GtkWidget *widget, gpointer data)
++{
+ gint active;
+
+ if (settings.presets == NULL) {
+@@ -898,16 +868,7 @@ static void list_view_scroll_to_active_p
+ return;
+ }
+
+- if (!gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list_store), &iter, NULL, active))
+- return;
+-
+- path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
+-
+- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW (list_view), path, NULL, FALSE, 0, 0);
+- gtk_tree_view_set_cursor(GTK_TREE_VIEW (list_view), path, NULL, FALSE );
+- gtk_tree_path_free(path);
+-
+- gtk_widget_grab_focus(list_view);
++ tree_view_switch_to_preset (active);
+ }
+
+ static void free_presets_list (gpointer data)
+@@ -958,7 +919,7 @@ static void save_to_file(gchar *filename
+ /* set it as the root element */
+ xmlDocSetRootElement(doc, root);
+ /* get the tree view's model... */
+- model = gtk_tree_view_get_model(GTK_TREE_VIEW(list_view));
++ model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
+ /* ...and go through it with a foreach */
+ gtk_tree_model_foreach(model, (GtkTreeModelForeachFunc)save_to_file_foreach, (gpointer)root);
+ /* make sure the XML document will be indented */
+@@ -1073,8 +1034,6 @@ static void load_from_file(gchar *filena
+ GtkTreePath *path = NULL;
+ GtkTreeIter iter;
+ GtkAdjustment* v_scb;
+- GList* menuitems;
+- GtkWidget *menuitem;
+
+ /* load the file */
+ doc = xmlParseFile(filename);
+@@ -1099,15 +1058,9 @@ static void load_from_file(gchar *filena
+ gint i, count;
+
+ count = g_list_length (settings.presets);
+- for (i = 0; i < count; i++)
++ for (i = 0; i < count; i++) {
+ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(preset_combo), 1);
+-
+- menuitems = gtk_container_get_children (GTK_CONTAINER (tray_menu));
+-
+- count = g_list_length (menuitems);
+- for (i = 0; i < count - 6; i++) {
+- menuitem = g_list_nth_data (menuitems, i);
+- gtk_widget_destroy (menuitem);
++ tray_menu_remove_preset(0);
+ }
+ }
+
+@@ -1118,7 +1071,7 @@ static void load_from_file(gchar *filena
+ }
+
+ /* get the tree view's model */
+- model = gtk_tree_view_get_model(GTK_TREE_VIEW(list_view));
++ model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
+
+ /* iterate through the root's children items */
+ current = current->xmlChildrenNode;
+@@ -1147,7 +1100,7 @@ static void load_from_file(gchar *filena
+
+ gtk_tree_selection_unselect_all(selection);
+
+- v_scb = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(list_view));
++ v_scb = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(tree_view));
+ gtk_adjustment_set_value(v_scb, gtk_adjustment_get_upper(v_scb));
+
+ if (main_visible) {
+@@ -1155,13 +1108,7 @@ static void load_from_file(gchar *filena
+ mom_ps = g_list_length(settings.presets) - 1;
+ preset_combo_set_item(mom_ps);
+
+- menuitem = gtk_menu_item_new_with_label(ps->title);
+-
+- gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, mom_ps);
+- g_signal_connect(G_OBJECT(menuitem), "activate",
+- (GCallback)preset_menuitem_activate_cb,
+- GINT_TO_POINTER (mom_ps));
+- gtk_widget_show(menuitem);
++ tray_menu_add_preset (ps, mom_ps);
+ }
+ }
+ /* free the data */
+@@ -1180,12 +1127,12 @@ static void load_from_file(gchar *filena
+
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &iter);
+
+- gtk_tree_view_set_cursor(GTK_TREE_VIEW (list_view), path, NULL, FALSE );
++ gtk_tree_view_set_cursor(GTK_TREE_VIEW (tree_view), path, NULL, FALSE );
+ gtk_tree_path_free(path);
+
+- gtk_widget_grab_focus(list_view);
++ gtk_widget_grab_focus(tree_view);
+
+- list_view_cursor_changed_cb(list_view, NULL);
++ tree_view_cursor_changed_cb(tree_view, NULL);
+ gtk_widget_set_sensitive(save_button, TRUE);
+ gtk_widget_set_sensitive(remove_button, TRUE);
+ }
+@@ -1236,7 +1183,7 @@ gboolean action_mode (gint mode)
+ gtk_widget_grab_focus (mixer_entry);
+ break;
+ case PRESETS:
+- list_view_scroll_to_active_preset_cb(list_view, NULL);
++ tree_view_scroll_to_active_preset_cb(tree_view, NULL);
+ break;
+ default:
+ break;
+@@ -1389,22 +1336,22 @@ GtkWidget* prefs_window(GtkWidget *app)
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+ list_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+- list_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
+- gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(list_view), TRUE);
+- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list_view), FALSE);
++ tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
++ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(tree_view), TRUE);
++ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE);
+
+- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
++ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+- gtk_container_add(GTK_CONTAINER(scrolled_window), list_view);
++ gtk_container_add(GTK_CONTAINER(scrolled_window), tree_view);
+
+- g_signal_connect(G_OBJECT(list_view), "button-release-event", G_CALLBACK(button_release_cb), NULL);
+- g_signal_connect(G_OBJECT(list_view), "key-press-event", G_CALLBACK(list_view_key_press_event_cb), NULL);
+- g_signal_connect(G_OBJECT(list_view), "cursor-changed", G_CALLBACK(list_view_cursor_changed_cb), NULL);
++ g_signal_connect(G_OBJECT(tree_view), "button-release-event", G_CALLBACK(button_release_cb), NULL);
++ g_signal_connect(G_OBJECT(tree_view), "key-press-event", G_CALLBACK(tree_view_key_press_event_cb), NULL);
++ g_signal_connect(G_OBJECT(tree_view), "cursor-changed", G_CALLBACK(tree_view_cursor_changed_cb), NULL);
+
+- g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(list_view_selection_changed_cb), list_view);
++ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(tree_view_selection_changed_cb), tree_view);
+
+ /*gtk_tree_selection_select_path(selection, gtk_tree_path_new_from_string("0"));
+- gtk_tree_selection_set_select_function(selection, (GtkTreeSelectionFunc)list_view_select_cb, NULL, NULL);*/
++ gtk_tree_selection_set_select_function(selection, (GtkTreeSelectionFunc)tree_view_select_cb, NULL, NULL);*/
+
+ cellrenderer = gtk_cell_renderer_text_new();
+ g_object_set(G_OBJECT(cellrenderer), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
+@@ -1412,7 +1359,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 0, NULL);
+ gtk_tree_view_column_set_reorderable(list_column, TRUE);
+ gtk_tree_view_column_set_expand(list_column, TRUE);
+- gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
++ gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), list_column);
+
+ g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(name_cell_edited_cb), NULL);
+
+@@ -1423,7 +1370,7 @@ GtkWidget* prefs_window(GtkWidget *app)
+ list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 1, NULL);
+ gtk_tree_view_column_set_reorderable(list_column, TRUE);
+ gtk_tree_view_column_set_expand(list_column, FALSE);
+- gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
++ gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), list_column);
+
+ g_signal_connect(G_OBJECT(cellrenderer), "edited", G_CALLBACK(freq_cell_edited_cb), NULL);
+
+Index: gnomeradio-1.8/src/prefs.h
+===================================================================
+--- gnomeradio-1.8.orig/src/prefs.h
++++ gnomeradio-1.8/src/prefs.h
+@@ -34,6 +34,8 @@ enum
+
+ gboolean action_mode (gint mode);
+
++void tree_view_switch_to_preset (gint active);
++
+ GtkWidget* prefs_window(GtkWidget *app);
+
+ #endif
+Index: gnomeradio-1.8/src/trayicon.h
+===================================================================
+--- gnomeradio-1.8.orig/src/trayicon.h
++++ gnomeradio-1.8/src/trayicon.h
+@@ -16,14 +16,23 @@
+
+ #ifndef _TRAYICON_H
+ #define _TRAYICON_H
++#include "gui.h"
+
+-GtkWidget *tray_menu;
+-GObject *tray_icon;
+-GtkWidget *mute_menuitem;
++void tray_icon_set_title(gchar *title);
+
+-int mute_menuitem_toggled_cb_id;
++void tray_menu_items_set_sensible(gboolean sensible);
+
+-void tray_icon_items_set_sensible(gboolean sensible);
++void tray_menu_enable_mute_button (gboolean enable);
++
++void tray_menu_add_preset (preset* ps, gint index);
++
++void tray_menu_remove_preset (gint index);
++
++void tray_menu_move_up_preset (preset* ps, gint index);
++
++void tray_menu_move_down_preset (preset* ps, gint index);
++
++void tray_menu_update_preset (preset* ps, gint index);
+
+ void create_tray_icon(GtkWidget *app);
+
+Index: gnomeradio-1.8/src/record.c
+===================================================================
+--- gnomeradio-1.8.orig/src/record.c
++++ gnomeradio-1.8/src/record.c
+@@ -29,6 +29,7 @@
+ #include "gui.h"
+ #include "rec_tech.h"
+ #include "prefs.h"
++#include "trayicon.h"
+
+ extern GtkWidget *level;
+
+@@ -51,7 +52,7 @@ void close_status_window(void)
+ gtk_widget_destroy(GTK_WIDGET(status_dialog));
+ status_dialog = NULL;
+
+- tray_icon_items_set_sensible(TRUE);
++ tray_menu_items_set_sensible(TRUE);
+ recording_set_sensible(TRUE);
+ }
+
+Index: gnomeradio-1.8/src/gui.h
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.h
++++ gnomeradio-1.8/src/gui.h
+@@ -70,8 +70,6 @@ void preset_combo_set_item(gint i);
+
+ void preset_menuitem_activate_cb(GtkMenuItem *menuitem, gpointer user_data);
+
+-void tray_icon_items_set_sensible(gboolean sensible);
+-
+ gboolean
+ key_press_event_cb(GtkWidget *app, GdkEventKey *event, gpointer data);
+
+Index: gnomeradio-1.8/src/gui.c
+===================================================================
+--- gnomeradio-1.8.orig/src/gui.c
++++ gnomeradio-1.8/src/gui.c
+@@ -72,6 +72,7 @@ int mom_ps;
+ gnomeradio_settings settings;
+
+ gboolean main_visible;
++gboolean dialog_visible;
+
+ GtkWidget *app;
+ GtkWidget *preset_combo;
+@@ -289,11 +290,7 @@ set_volume (gdouble volume)
+ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), volume / 100);
+ g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
+
+- if (tray_menu) {
+- g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->is_muted());
+- g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- }
++ tray_menu_enable_mute_button (mixer->is_muted());
+
+ if (radio_is_muted())
+ radio_unmute();
+@@ -348,11 +345,7 @@ toggle_volume (void)
+ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), volume / 100);
+ g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
+
+- if (tray_menu) {
+- g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->is_muted());
+- g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- }
++ tray_menu_enable_mute_button (mixer->is_muted());
+ }
+
+ static void prefs_button_clicked_cb(GtkButton *button, gpointer app)
+@@ -360,6 +353,10 @@ static void prefs_button_clicked_cb(GtkB
+ GtkWidget* dialog;
+ gint choise;
+
++ if (dialog_visible)
++ return;
++
++ dialog_visible = TRUE;
+ dialog = prefs_window(app);
+
+ /* Michael Jochum proposed to not use gnome_dialog_set_parent()
+@@ -386,6 +383,8 @@ static void prefs_button_clicked_cb(GtkB
+ gtk_widget_destroy(dialog);
+ }
+ }
++
++ dialog_visible = FALSE;
+ }
+
+ void start_radio(gboolean restart, GtkWidget *app)
+@@ -453,11 +452,7 @@ void start_mixer(gboolean restart, GtkWi
+ gtk_scale_button_set_value (GTK_SCALE_BUTTON (volume_button), settings.unmute_volume);
+ g_signal_handler_unblock (G_OBJECT(volume_button), volume_value_changed_id);
+
+- if (tray_menu) {
+- g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer->is_muted());
+- g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
+- }
++ tray_menu_enable_mute_button (mixer->is_muted());
+
+ gtk_widget_set_sensitive(volume_button, TRUE);
+ } else {
+@@ -617,7 +612,7 @@ static void adj_value_changed_cb(GtkAdju
+ else
+ buffer = g_strdup_printf(_("Gnomeradio - %.2f MHz"), freq);
+ gtk_window_set_title(GTK_WINDOW(window), buffer);
+- if (tray_icon) gtk_status_icon_set_tooltip_text(GTK_STATUS_ICON(tray_icon), buffer);
++ tray_icon_set_title(buffer);
+ g_free(buffer);
+
+ buffer = g_strdup_printf(_("Frequency: %.2f MHz"), freq);
+@@ -736,8 +731,11 @@ void scbw_button_clicked_cb(GtkButton *b
+
+ void preset_combo_set_item(gint i)
+ {
+- if (i < -1) return;
+- if (preset_combo == NULL) return;
++ if (i < -1)
++ return;
++ if (preset_combo == NULL)
++ return;
++
+ gtk_combo_box_set_active(GTK_COMBO_BOX(preset_combo), i + 1);
+ }
+
+@@ -746,10 +744,14 @@ static void preset_combo_change_cb(GtkWi
+ preset* ps;
+ mom_ps = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) - 1;
+
+- if (mom_ps < 0) return;
++ if (mom_ps < 0)
++ return;
+
+ ps = (preset*)g_list_nth_data(settings.presets, mom_ps);
+ gtk_adjustment_set_value(adj, ps->freq * STEPS);
++
++ if (dialog_visible)
++ tree_view_switch_to_preset (mom_ps);
+ }
+
+ void change_preset(gboolean next)
+@@ -767,6 +769,9 @@ void change_preset(gboolean next)
+ ps = g_list_nth_data(settings.presets, mom_ps);
+ gtk_adjustment_set_value(adj, ps->freq*STEPS);
+ preset_combo_set_item(mom_ps);
++
++ if (dialog_visible)
++ tree_view_switch_to_preset (mom_ps);
+ }
+
+ void gnomeradio_switch_to_preset (gint index)
+@@ -776,6 +781,9 @@ void gnomeradio_switch_to_preset (gint i
+ gtk_adjustment_set_value(adj, ps->freq*STEPS);
+ mom_ps = index;
+ preset_combo_set_item(mom_ps);
++
++ if (dialog_visible)
++ tree_view_switch_to_preset (mom_ps);
+ }
+ }
+
+@@ -784,36 +792,6 @@ static void quit_button_clicked_cb(GtkBu
+ exit_gnome_radio();
+ }
+
+-void tray_icon_items_set_sensible(gboolean sensible)
+-{
+- GList* menuitems;
+- GtkWidget *menuitem;
+- int i, cnt = g_list_length(settings.presets);
+-
+-
+- menuitems = gtk_container_get_children(GTK_CONTAINER(tray_menu));
+-
+- g_assert(cnt + 6 == g_list_length(menuitems));
+-
+- /* Disable the presets */
+- for (i = 0; i < cnt; i++) {
+- menuitem = g_list_nth_data(menuitems, i);
+- gtk_widget_set_sensitive(menuitem, sensible);
+- }
+-
+- /* Disable the mute button (separator => +1) */
+- menuitem = g_list_nth_data(menuitems, cnt + 1);
+- gtk_widget_set_sensitive(menuitem, sensible);
+-
+- /* Disable the record button */
+- menuitem = g_list_nth_data(menuitems, cnt + 2);
+- gtk_widget_set_sensitive(menuitem, sensible);
+-
+- /* Disable the quit button */
+- menuitem = g_list_nth_data(menuitems, cnt + 5);
+- gtk_widget_set_sensitive(menuitem, sensible);
+-}
+-
+ void recording_set_sensible(gboolean sensible)
+ {
+ /* Disable the presets */
+@@ -892,7 +870,7 @@ static int start_recording(const gchar *
+ if (!recording)
+ return -1;
+
+- tray_icon_items_set_sensible (FALSE);
++ tray_menu_items_set_sensible (FALSE);
+ recording_set_sensible (FALSE);
+
+ recording->station = g_strdup (station);
diff -pruN 1.8-2/debian/patches/gnomeradio-v4l2.patch 1.8-2ubuntu32/debian/patches/gnomeradio-v4l2.patch
--- 1.8-2/debian/patches/gnomeradio-v4l2.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-v4l2.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,59 @@
+## Description: Changed defaults autodetection driver for using v4l2
+## Origin: upstream, http://pkgs.fedoraproject.org/gitweb/?p=gnomeradio.git;a=blob_plain;f=gnomeradio-v4l2.patch;hb=3a4a46b5247f04184e25e25e84d3b10a7e9dfc5a
+## Bug-Ubuntu: http://launchpad.net/bugs/958030
+## Bug-Debian:
+## Author: Dominik Mierzejewski
+## Forwarded: not-needed
+Index: b/src/prefs.c
+===================================================================
+--- a/src/prefs.c 2012-12-03 10:14:54.530899819 +0000
++++ b/src/prefs.c 2012-12-03 10:14:55.122899801 +0000
+@@ -114,7 +114,7 @@
+ /* Load general settings */
+ settings.device = gconf_client_get_string(client, "/apps/gnomeradio/device" , NULL);
+ if (!settings.device)
+- settings.device = g_strdup("/dev/radio");
++ settings.device = g_strdup("/dev/radio0");
+ settings.driver = gconf_client_get_string(client, "/apps/gnomeradio/driver" , NULL);
+ if (!settings.driver)
+ settings.driver = g_strdup("any");
+@@ -623,7 +623,7 @@
+ g_signal_connect(G_OBJECT(mixer_combo), "changed", G_CALLBACK(mixer_combo_change_cb), app);
+ g_signal_connect(G_OBJECT(mute_on_exit_cb), "toggled", G_CALLBACK(mute_on_exit_toggled_cb), NULL);
+
+- gtk_widget_set_tooltip_text(device_entry, _("Specify the radio-device (in most cases /dev/radio)"));
++ gtk_widget_set_tooltip_text(device_entry, _("Specify the radio-device (in most cases /dev/radio0)"));
+ gtk_widget_set_tooltip_text(mixer_eb,
+ _("Choose the mixer source (line, line1, etc.) that is able to control the volume of your radio"));
+ gtk_widget_set_tooltip_text(mute_on_exit_cb, _("If unchecked, gnomeradio won't mute after exiting"));
+Index: b/src/radio.c
+===================================================================
+--- a/src/radio.c 2012-12-03 10:14:49.366899972 +0000
++++ b/src/radio.c 2012-12-03 10:14:55.122899801 +0000
+@@ -41,11 +41,11 @@
+ }
+
+ switch (driver) {
++ case DRIVER_ANY:
+ case DRIVER_V4L2:
++ default:
+ goto try_v4l2;
+- case DRIVER_ANY:
+ case DRIVER_V4L1:
+- default:
+ goto try_v4l1;
+ }
+
+Index: b/data/gnomeradio.schemas.in
+===================================================================
+--- a/data/gnomeradio.schemas.in 2012-12-03 10:14:49.366899972 +0000
++++ b/data/gnomeradio.schemas.in 2012-12-03 10:14:55.122899801 +0000
+@@ -29,7 +29,7 @@
+ /apps/gnomeradio/device
+ gnomeradio
+ string
+- /dev/radio
++ /dev/radio0
+
+ Radio device
+ Specify the radio-device (in most cases /dev/radio)
diff -pruN 1.8-2/debian/patches/gnomeradio-volume_button.patch 1.8-2ubuntu32/debian/patches/gnomeradio-volume_button.patch
--- 1.8-2/debian/patches/gnomeradio-volume_button.patch 1970-01-01 00:00:00.000000000 +0000
+++ 1.8-2ubuntu32/debian/patches/gnomeradio-volume_button.patch 2015-04-13 18:42:54.000000000 +0000
@@ -0,0 +1,870 @@
+Description: Replace BaconVolumeButton with GtkVolumeButton, see: https://bugzilla.gnome.org/show_bug.cgi?id=565783
+Origin: upstream, http://bugzilla-attachments.gnome.org/attachment.cgi?id=125384
+Bug-Ubuntu: http://launchpad.net/bugs/957867
+Author: Thomas Meire
+Forwarded: not-needed
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -11,7 +11,6 @@
+ bin_PROGRAMS = gnomeradio
+
+ gnomeradio_SOURCES = \
+- bacon-volume.h \
+ gui.h \
+ lirc.h \
+ prefs.h \
+@@ -22,7 +21,6 @@
+ trayicon.h \
+ v4l1.h \
+ v4l2.h \
+- bacon-volume.c \
+ gui.c \
+ lirc.c \
+ prefs.c \
+--- a/src/bacon-volume.c
++++ /dev/null
+@@ -1,615 +0,0 @@
+-/* Volume Button / popup widget
+- * (c) copyright 2005 Ronald S. Bultje
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Library General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU Library General Public
+- * License along with this library; if not, write to the
+- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+- * Boston, MA 02111-1307, USA.
+- */
+-
+-#ifdef HAVE_CONFIG_H
+-#include "config.h"
+-#endif
+-
+-#define _GNU_SOURCE
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include "bacon-volume.h"
+-
+-#define SCALE_SIZE 100
+-#define CLICK_TIMEOUT 250
+-
+-enum {
+- SIGNAL_VALUE_CHANGED,
+- NUM_SIGNALS
+-};
+-
+-static void bacon_volume_button_class_init (BaconVolumeButtonClass * klass);
+-static void bacon_volume_button_init (BaconVolumeButton * button);
+-static void bacon_volume_button_dispose (GObject * object);
+-
+-static gboolean bacon_volume_button_scroll (GtkWidget * widget,
+- GdkEventScroll * event);
+-static gboolean bacon_volume_button_press (GtkWidget * widget,
+- GdkEventButton * event);
+-static gboolean cb_dock_press (GtkWidget * widget,
+- GdkEventButton * event,
+- gpointer data);
+-
+-static gboolean cb_button_press (GtkWidget * widget,
+- GdkEventButton * event,
+- gpointer data);
+-static gboolean cb_button_release (GtkWidget * widget,
+- GdkEventButton * event,
+- gpointer data);
+-static void bacon_volume_scale_value_changed(GtkRange * range);
+-
+-/* see below for scale definitions */
+-static GtkWidget *bacon_volume_scale_new (BaconVolumeButton * button,
+- float min, float max,
+- float step);
+-
+-static GtkButtonClass *parent_class = NULL;
+-static guint signals[NUM_SIGNALS] = { 0 };
+-
+-GType
+-bacon_volume_button_get_type (void)
+-{
+- static GType bacon_volume_button_type = 0;
+-
+- if (!bacon_volume_button_type) {
+- static const GTypeInfo bacon_volume_button_info = {
+- sizeof (BaconVolumeButtonClass),
+- NULL,
+- NULL,
+- (GClassInitFunc) bacon_volume_button_class_init,
+- NULL,
+- NULL,
+- sizeof (BaconVolumeButton),
+- 0,
+- (GInstanceInitFunc) bacon_volume_button_init,
+- NULL
+- };
+-
+- bacon_volume_button_type =
+- g_type_register_static (GTK_TYPE_BUTTON,
+- "BaconVolumeButton",
+- &bacon_volume_button_info, 0);
+- }
+-
+- return bacon_volume_button_type;
+-}
+-
+-static void
+-bacon_volume_button_class_init (BaconVolumeButtonClass *klass)
+-{
+- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+- GtkWidgetClass *gtkwidget_class = GTK_WIDGET_CLASS (klass);
+-
+- parent_class = g_type_class_ref (GTK_TYPE_BUTTON);
+-
+- /* events */
+- gobject_class->dispose = bacon_volume_button_dispose;
+- gtkwidget_class->button_press_event = bacon_volume_button_press;
+- gtkwidget_class->scroll_event = bacon_volume_button_scroll;
+-
+- /* signals */
+- signals[SIGNAL_VALUE_CHANGED] = g_signal_new ("value-changed",
+- G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+- G_STRUCT_OFFSET (BaconVolumeButtonClass, value_changed),
+- NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+-}
+-
+-static void
+-bacon_volume_button_init (BaconVolumeButton *button)
+-{
+- button->timeout = FALSE;
+- button->click_id = 0;
+- button->dock = button->scale = NULL;
+-#ifndef HAVE_GTK_ONLY
+- button->theme = gtk_icon_theme_get_default ();
+-#endif
+-}
+-
+-static void
+-bacon_volume_button_dispose (GObject *object)
+-{
+- BaconVolumeButton *button = BACON_VOLUME_BUTTON (object);
+-
+- if (button->dock) {
+- gtk_widget_destroy (button->dock);
+- button->dock = NULL;
+- }
+-
+- if (button->theme) {
+- g_object_unref (G_OBJECT (button->theme));
+- button->theme = NULL;
+- }
+-
+- if (button->click_id != 0) {
+- g_source_remove (button->click_id);
+- button->click_id = 0;
+- }
+-
+- G_OBJECT_CLASS (parent_class)->dispose (object);
+-}
+-
+-/*
+- * public API.
+- */
+-
+-GtkWidget *
+-bacon_volume_button_new (GtkIconSize size,
+- float min, float max,
+- float step)
+-{
+- BaconVolumeButton *button;
+- GtkWidget *frame, *box;
+-
+- button = g_object_new (BACON_TYPE_VOLUME_BUTTON, NULL);
+- button->size = size;
+- gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+-
+-#ifndef HAVE_GTK_ONLY
+- /* image */
+- button->image = gtk_image_new ();
+- gtk_container_add (GTK_CONTAINER (button), button->image);
+- gtk_widget_show_all (button->image);
+-#endif
+-
+- /* window */
+- button->dock = gtk_window_new (GTK_WINDOW_POPUP);
+- g_signal_connect (button->dock, "button-press-event",
+- G_CALLBACK (cb_dock_press), button);
+- gtk_window_set_decorated (GTK_WINDOW (button->dock), FALSE);
+-
+- /* frame */
+- frame = gtk_frame_new (NULL);
+- gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
+- gtk_container_add (GTK_CONTAINER (button->dock), frame);
+- box = gtk_vbox_new (FALSE, 0);
+- gtk_container_add (GTK_CONTAINER (frame), box);
+-
+- /* + */
+- button->plus = gtk_button_new_with_label (_("+"));
+- gtk_button_set_relief (GTK_BUTTON (button->plus), GTK_RELIEF_NONE);
+- g_signal_connect (button->plus, "button-press-event",
+- G_CALLBACK (cb_button_press), button);
+- g_signal_connect (button->plus, "button-release-event",
+- G_CALLBACK (cb_button_release), button);
+- gtk_box_pack_start (GTK_BOX (box), button->plus, TRUE, FALSE, 0);
+-
+- /* scale */
+- button->scale = bacon_volume_scale_new (button, min, max, step);
+- gtk_widget_set_size_request (button->scale, -1, SCALE_SIZE);
+- gtk_scale_set_draw_value (GTK_SCALE (button->scale), FALSE);
+- gtk_range_set_inverted (GTK_RANGE (button->scale), TRUE);
+- gtk_box_pack_start (GTK_BOX (box), button->scale, TRUE, FALSE, 0);
+-
+- /* - */
+- button->min = gtk_button_new_with_label (_("-"));
+- gtk_button_set_relief (GTK_BUTTON (button->min), GTK_RELIEF_NONE);
+- g_signal_connect (button->min, "button-press-event",
+- G_CALLBACK (cb_button_press), button);
+- g_signal_connect (button->min, "button-release-event",
+- G_CALLBACK (cb_button_release), button);
+- gtk_box_pack_start (GTK_BOX (box), button->min, TRUE, FALSE, 0);
+-
+- /* call callback once so original icon is drawn */
+- bacon_volume_scale_value_changed (GTK_RANGE (button->scale));
+-
+- return GTK_WIDGET (button);
+-}
+-
+-float
+-bacon_volume_button_get_value (BaconVolumeButton * button)
+-{
+- g_return_val_if_fail (button != NULL, 0);
+-
+- return gtk_range_get_value (GTK_RANGE (button->scale));
+-}
+-
+-void
+-bacon_volume_button_set_value (BaconVolumeButton * button,
+- float value)
+-{
+- g_return_if_fail (button != NULL);
+-
+- gtk_range_set_value (GTK_RANGE (button->scale), value);
+-}
+-
+-/*
+- * button callbacks.
+- */
+-
+-static gboolean
+-bacon_volume_button_scroll (GtkWidget * widget,
+- GdkEventScroll * event)
+-{
+- BaconVolumeButton *button = BACON_VOLUME_BUTTON (widget);
+- GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
+- float d;
+- gdouble i;
+-
+- if (event->type != GDK_SCROLL)
+- return FALSE;
+-
+- d = bacon_volume_button_get_value (button);
+- i = gtk_adjustment_get_step_increment(adj);
+- if (event->direction == GDK_SCROLL_UP) {
+- gdouble u = gtk_adjustment_get_upper(adj);
+- d += i;
+- if (d > u)
+- d = u;
+- } else {
+- gdouble l = gtk_adjustment_get_lower(adj);
+- d -= i;
+- if (d < l)
+- d = l;
+- }
+- bacon_volume_button_set_value (button, d);
+-
+- return TRUE;
+-}
+-
+-static gboolean
+-bacon_volume_button_press (GtkWidget * widget,
+- GdkEventButton * event)
+-{
+- BaconVolumeButton *button = BACON_VOLUME_BUTTON (widget);
+- GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
+- gint x, y, m, dx, dy, sx, sy, ystartoff, mouse_y;
+- float v;
+- GdkEventButton *e;
+- GtkAllocation widget_all, dock_all, scale_all;
+-
+- /* position roughly */
+- gdk_window_get_origin (gtk_widget_get_window(widget), &x, &y);
+- gtk_widget_get_allocation(widget, &widget_all);
+- x += widget_all.x;
+- y += widget_all.y;
+- gtk_window_move (GTK_WINDOW (button->dock), x, y - (SCALE_SIZE / 2));
+- gtk_widget_show_all (button->dock);
+- gdk_window_get_origin (gtk_widget_get_window(button->dock), &dx, &dy);
+- gtk_widget_get_allocation (button->dock, &dock_all);
+- dy += dock_all.y;
+- gdk_window_get_origin (gtk_widget_get_window(button->scale), &sx, &sy);
+- gtk_widget_get_allocation (button->scale, &scale_all);
+- sy += scale_all.y;
+- ystartoff = sy - dy;
+- mouse_y = event->y;
+- button->timeout = TRUE;
+-
+- /* position (needs widget to be shown already) */
+- v = bacon_volume_button_get_value (button) / (gtk_adjustment_get_upper(adj) - gtk_adjustment_get_lower(adj));
+- x += (widget_all.width - dock_all.width) / 2;
+- y -= ystartoff;
+- y -= gtk_range_get_min_slider_size(GTK_RANGE (button->scale)) / 2;
+- m = scale_all.height -
+- gtk_range_get_min_slider_size(GTK_RANGE (button->scale));
+- y -= m * (1.0 - v);
+- y += mouse_y;
+- gtk_window_move (GTK_WINDOW (button->dock), x, y);
+- gdk_window_get_origin (gtk_widget_get_window(button->scale), &sx, &sy);
+-
+- GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);
+-
+- /* grab focus */
+- gtk_widget_grab_focus (button->dock);
+- gtk_grab_add (button->dock);
+- gdk_pointer_grab (gtk_widget_get_window(button->dock), TRUE,
+- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+- GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME);
+- gdk_keyboard_grab (gtk_widget_get_window(button->dock), TRUE, GDK_CURRENT_TIME);
+-
+- /* forward event to the slider */
+- e = (GdkEventButton *) gdk_event_copy ((GdkEvent *) event);
+- e->window = gtk_widget_get_window(button->scale);
+-
+- /* position: the X position isn't relevant, halfway will work just fine.
+- * The vertical position should be *exactly* in the middle of the slider
+- * of the scale; if we don't do that correctly, it'll move from its current
+- * position, which means a position change on-click, which is bad. */
+- e->x = scale_all.width / 2;
+- m = scale_all.height -
+- gtk_range_get_min_slider_size(GTK_RANGE (button->scale));
+- e->y = ((1.0 - v) * m) + gtk_range_get_min_slider_size(GTK_RANGE (button->scale)) / 2;
+- gtk_widget_event (button->scale, (GdkEvent *) e);
+- e->window = event->window;
+- gdk_event_free ((GdkEvent *) e);
+-
+- button->pop_time = event->time;
+-
+- return TRUE;
+-}
+-
+-/*
+- * +/- button callbacks.
+- */
+-
+-static gboolean
+-cb_button_timeout (gpointer data)
+-{
+- BaconVolumeButton *button = BACON_VOLUME_BUTTON (data);
+- GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
+- float val;
+- gboolean res = TRUE;
+-
+- if (button->click_id == 0)
+- return FALSE;
+-
+- val = bacon_volume_button_get_value (button);
+- val += button->direction;
+- if (val <= gtk_adjustment_get_lower(adj)) {
+- res = FALSE;
+- val = gtk_adjustment_get_lower(adj);
+- } else if (val > gtk_adjustment_get_upper(adj)) {
+- res = FALSE;
+- val = gtk_adjustment_get_upper(adj);
+- }
+- bacon_volume_button_set_value (button, val);
+-
+- if (!res) {
+- g_source_remove (button->click_id);
+- button->click_id = 0;
+- }
+-
+- return res;
+-}
+-
+-static gboolean
+-cb_button_press (GtkWidget * widget,
+- GdkEventButton * event,
+- gpointer data)
+-{
+- BaconVolumeButton *button = BACON_VOLUME_BUTTON (data);
+- GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
+-
+- if (button->click_id != 0)
+- g_source_remove (button->click_id);
+- button->direction = (widget == button->plus) ?
+- fabs (gtk_adjustment_get_page_increment(adj)) : - fabs (gtk_adjustment_get_page_increment(adj));
+- button->click_id = g_timeout_add (CLICK_TIMEOUT,
+- (GSourceFunc) cb_button_timeout, button);
+- cb_button_timeout (button);
+-
+- return TRUE;
+-}
+-
+-static gboolean
+-cb_button_release (GtkWidget * widget,
+- GdkEventButton * event,
+- gpointer data)
+-{
+- BaconVolumeButton *button = BACON_VOLUME_BUTTON (data);
+-
+- if (button->click_id != 0) {
+- g_source_remove (button->click_id);
+- button->click_id = 0;
+- }
+-
+- return TRUE;
+-}
+-
+-/*
+- * Scale callbacks.
+- */
+-
+-static void
+-bacon_volume_release_grab (BaconVolumeButton *button,
+- GdkEventButton * event)
+-{
+- GdkEventButton *e;
+-
+- /* ungrab focus */
+- gdk_keyboard_ungrab (GDK_CURRENT_TIME);
+- gdk_pointer_ungrab (GDK_CURRENT_TIME);
+- gtk_grab_remove (button->dock);
+-
+- /* hide again */
+- gtk_widget_hide (button->dock);
+- button->timeout = FALSE;
+-
+- e = (GdkEventButton *) gdk_event_copy ((GdkEvent *) event);
+- e->window = gtk_widget_get_window (GTK_WIDGET (button));
+- e->type = GDK_BUTTON_RELEASE;
+- gtk_widget_event (GTK_WIDGET (button), (GdkEvent *) e);
+- e->window = event->window;
+- gdk_event_free ((GdkEvent *) e);
+-}
+-
+-static gboolean
+-cb_dock_press (GtkWidget * widget,
+- GdkEventButton * event,
+- gpointer data)
+-{
+- //GtkWidget *ewidget = gtk_get_event_widget ((GdkEvent *) event);
+- BaconVolumeButton *button = BACON_VOLUME_BUTTON (data);
+-
+- if (/*ewidget == button->dock &&*/ event->type == GDK_BUTTON_PRESS) {
+- bacon_volume_release_grab (button, event);
+- return TRUE;
+- }
+-
+- return FALSE;
+-}
+-
+-/*
+- * Scale stuff.
+- */
+-
+-#define BACON_TYPE_VOLUME_SCALE \
+- (bacon_volume_scale_get_type ())
+-#define BACON_VOLUME_SCALE(obj) \
+- (G_TYPE_CHECK_INSTANCE_CAST ((obj), BACON_TYPE_VOLUME_SCALE, \
+- BaconVolumeScale))
+-
+-typedef struct _BaconVolumeScale {
+- GtkVScale parent;
+- BaconVolumeButton *button;
+-} BaconVolumeScale;
+-
+-static GType bacon_volume_scale_get_type (void);
+-
+-static void bacon_volume_scale_class_init (GtkVScaleClass * klass);
+-
+-static gboolean bacon_volume_scale_press (GtkWidget * widget,
+- GdkEventButton * event);
+-static gboolean bacon_volume_scale_release (GtkWidget * widget,
+- GdkEventButton * event);
+-
+-static GtkVScaleClass *scale_parent_class = NULL;
+-
+-static GType
+-bacon_volume_scale_get_type (void)
+-{
+- static GType bacon_volume_scale_type = 0;
+-
+- if (!bacon_volume_scale_type) {
+- static const GTypeInfo bacon_volume_scale_info = {
+- sizeof (GtkVScaleClass),
+- NULL,
+- NULL,
+- (GClassInitFunc) bacon_volume_scale_class_init,
+- NULL,
+- NULL,
+- sizeof (BaconVolumeScale),
+- 0,
+- NULL,
+- NULL
+- };
+-
+- bacon_volume_scale_type =
+- g_type_register_static (GTK_TYPE_VSCALE,
+- "BaconVolumeScale",
+- &bacon_volume_scale_info, 0);
+- }
+-
+- return bacon_volume_scale_type;
+-}
+-
+-static void
+-bacon_volume_scale_class_init (GtkVScaleClass * klass)
+-{
+- GtkWidgetClass *gtkwidget_class = GTK_WIDGET_CLASS (klass);
+- GtkRangeClass *gtkrange_class = GTK_RANGE_CLASS (klass);
+-
+- scale_parent_class = g_type_class_ref (GTK_TYPE_VSCALE);
+-
+- gtkwidget_class->button_press_event = bacon_volume_scale_press;
+- gtkwidget_class->button_release_event = bacon_volume_scale_release;
+- gtkrange_class->value_changed = bacon_volume_scale_value_changed;
+-}
+-
+-static GtkWidget *
+-bacon_volume_scale_new (BaconVolumeButton * button,
+- float min, float max,
+- float step)
+-{
+- BaconVolumeScale *scale = g_object_new (BACON_TYPE_VOLUME_SCALE, NULL);
+- GObject *adj;
+-
+- adj = gtk_adjustment_new (min, min, max, step, 10 * step, 0);
+- gtk_range_set_adjustment (GTK_RANGE (scale), GTK_ADJUSTMENT (adj));
+- scale->button = button;
+-
+- return GTK_WIDGET (scale);
+-}
+-
+-static gboolean
+-bacon_volume_scale_press (GtkWidget * widget,
+- GdkEventButton * event)
+-{
+- BaconVolumeScale *scale = BACON_VOLUME_SCALE (widget);
+- BaconVolumeButton *button = scale->button;
+-
+- /* the scale will grab input; if we have input grabbed, all goes
+- * horribly wrong, so let's not do that. */
+- gtk_grab_remove (button->dock);
+-
+- return GTK_WIDGET_CLASS (scale_parent_class)->button_press_event (widget, event);
+-}
+-
+-static gboolean
+-bacon_volume_scale_release (GtkWidget * widget,
+- GdkEventButton * event)
+-{
+- BaconVolumeScale *scale = BACON_VOLUME_SCALE (widget);
+- BaconVolumeButton *button = scale->button;
+- gboolean res;
+-
+- if (button->timeout) {
+- /* if we did a quick click, leave the window open; else, hide it */
+- if (event->time > button->pop_time + CLICK_TIMEOUT) {
+- bacon_volume_release_grab (button, event);
+- GTK_WIDGET_CLASS (scale_parent_class)->button_release_event (widget, event);
+- return TRUE;
+- }
+- button->timeout = FALSE;
+- }
+-
+- res = GTK_WIDGET_CLASS (scale_parent_class)->button_release_event (widget, event);
+-
+- /* the scale will release input; right after that, we *have to* grab
+- * it back so we can catch out-of-scale clicks and hide the popup,
+- * so I basically want a g_signal_connect_after_always(), but I can't
+- * find that, so we do this complex 'first-call-parent-then-do-actual-
+- * action' thingy... */
+- gtk_grab_add (button->dock);
+-
+- return res;
+-}
+-
+-static void
+-bacon_volume_scale_value_changed (GtkRange * range)
+-{
+- BaconVolumeScale *scale = BACON_VOLUME_SCALE (range);
+- BaconVolumeButton *button = scale->button;
+- GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
+- float step = (gtk_adjustment_get_upper(adj) - gtk_adjustment_get_lower(adj)) / 4;
+- float val = gtk_range_get_value (range);
+- gint w, h;
+-#ifdef HAVE_GTK_ONLY
+- char *s;
+-
+- /* update label */
+- s = g_strdup_printf ("%d", lrintf (val));
+- gtk_button_set_label (GTK_BUTTON (button), s);
+- g_free (s);
+-#else
+- const char *s;
+- GdkPixbuf *buf;
+-
+- if (val == gtk_adjustment_get_lower(adj))
+- s = "stock_volume-mute";
+- else if (val > gtk_adjustment_get_lower(adj) && val <= gtk_adjustment_get_lower(adj) + step)
+- s = "stock_volume-0";
+- else if (val > gtk_adjustment_get_lower(adj) + step && val <= gtk_adjustment_get_lower(adj) + step * 2)
+- s = "stock_volume-min";
+- else if (val > gtk_adjustment_get_lower(adj) + step * 2 && val <= gtk_adjustment_get_lower(adj) + step * 3)
+- s = "stock_volume-med";
+- else
+- s = "stock_volume-max";
+-
+- /* update image */
+- gtk_icon_size_lookup (button->size, &w, &h);
+- buf = gtk_icon_theme_load_icon (button->theme, s, w, 0, NULL);
+- gtk_image_set_from_pixbuf (GTK_IMAGE (button->image), buf);
+-#endif
+-
+- /* signal */
+- g_signal_emit (button, signals[SIGNAL_VALUE_CHANGED], 0);
+-}
+--- a/src/bacon-volume.h
++++ /dev/null
+@@ -1,66 +0,0 @@
+-/* Volume Button / popup widget
+- * (c) copyright 2005 Ronald S. Bultje
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Library General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU Library General Public
+- * License along with this library; if not, write to the
+- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+- * Boston, MA 02111-1307, USA.
+- */
+-
+-#ifndef __BACON_VOLUME_BUTTON_H__
+-#define __BACON_VOLUME_BUTTON_H__
+-
+-#include
+-
+-G_BEGIN_DECLS
+-
+-#define BACON_TYPE_VOLUME_BUTTON \
+- (bacon_volume_button_get_type ())
+-#define BACON_VOLUME_BUTTON(obj) \
+- (G_TYPE_CHECK_INSTANCE_CAST ((obj), BACON_TYPE_VOLUME_BUTTON, \
+- BaconVolumeButton))
+-
+-typedef struct _BaconVolumeButton {
+- GtkButton parent;
+-
+- /* popup */
+- GtkWidget *dock, *scale, *image, *plus, *min;
+- GtkIconSize size;
+- gint click_id;
+- float direction;
+- gboolean timeout;
+- guint32 pop_time;
+- GtkIconTheme *theme;
+-} BaconVolumeButton;
+-
+-typedef struct _BaconVolumeButtonClass {
+- GtkButtonClass parent_class;
+-
+- /* signals */
+- void (* value_changed) (BaconVolumeButton * button);
+-
+- gpointer __bla[4];
+-} BaconVolumeButtonClass;
+-
+-GType bacon_volume_button_get_type (void);
+-
+-GtkWidget * bacon_volume_button_new (GtkIconSize size,
+- float min, float max,
+- float step);
+-float bacon_volume_button_get_value (BaconVolumeButton * button);
+-void bacon_volume_button_set_value (BaconVolumeButton * button,
+- float value);
+-
+-G_END_DECLS
+-
+-#endif /* __BACON_VOLUME_BUTTON_H__ */
+--- a/src/gui.c
++++ b/src/gui.c
+@@ -27,7 +27,6 @@
+ #include