summaryrefslogtreecommitdiffstats
path: root/pulsecaster
diff options
context:
space:
mode:
authorJürgen Geuter <tante@the-gay-bar.com>2010-02-15 23:11:26 +0100
committerJürgen Geuter <tante@the-gay-bar.com>2010-02-15 23:11:26 +0100
commit45760059f2a6fb0d172d87b5f2d909392b5ed757 (patch)
treeac35cd024429814bece1944537e7ec01db1f4a29 /pulsecaster
parent5f0587c0939bcb0dbe466d82672391f984e3e6cc (diff)
downloadpulsecaster-45760059f2a6fb0d172d87b5f2d909392b5ed757.tar.gz
pulsecaster-45760059f2a6fb0d172d87b5f2d909392b5ed757.tar.xz
pulsecaster-45760059f2a6fb0d172d87b5f2d909392b5ed757.zip
Fixed directory layout
/src/ is PyDev/Eclipse's default but it it not a good idea: If your "real module" is called "pulsecaster" just name it like that.
Diffstat (limited to 'pulsecaster')
-rw-r--r--pulsecaster/__init__.py23
-rw-r--r--pulsecaster/config.py50
-rw-r--r--pulsecaster/data/icons/16x16/pulsecaster-16.pngbin0 -> 889 bytes
-rw-r--r--pulsecaster/data/icons/24x24/pulsecaster-24.pngbin0 -> 1570 bytes
-rw-r--r--pulsecaster/data/icons/32x32/pulsecaster-32.pngbin0 -> 2395 bytes
-rw-r--r--pulsecaster/data/icons/48x48/pulsecaster-48.pngbin0 -> 4220 bytes
-rw-r--r--pulsecaster/data/icons/64x64/pulsecaster-64.pngbin0 -> 6367 bytes
-rw-r--r--pulsecaster/data/icons/scalable/pulsecaster-logo.svg845
-rw-r--r--pulsecaster/data/icons/scalable/pulsecaster.svg1043
-rw-r--r--pulsecaster/data/pulsecaster.glade451
-rw-r--r--pulsecaster/gconfig.py44
-rw-r--r--pulsecaster/listener.py18
-rw-r--r--pulsecaster/pulseaudio/PulseClient.py66
-rw-r--r--pulsecaster/pulseaudio/PulseObj.py623
-rw-r--r--pulsecaster/pulseaudio/PulseSink.py213
-rw-r--r--pulsecaster/pulseaudio/PulseSource.py189
-rw-r--r--pulsecaster/pulseaudio/PulseVolume.py114
-rw-r--r--pulsecaster/pulseaudio/__init__.py29
-rw-r--r--pulsecaster/pulseaudio/lib_pulseaudio.py733
-rw-r--r--pulsecaster/ui.py236
20 files changed, 4677 insertions, 0 deletions
diff --git a/pulsecaster/__init__.py b/pulsecaster/__init__.py
new file mode 100644
index 0000000..4204c27
--- /dev/null
+++ b/pulsecaster/__init__.py
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2009 Paul W. Frields
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Paul W. Frields <stickster@gmail.com>
+
+
+from config import *
+from ui import *
diff --git a/pulsecaster/config.py b/pulsecaster/config.py
new file mode 100644
index 0000000..9c66fce
--- /dev/null
+++ b/pulsecaster/config.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+# -*- coding: iso-8859-15 -*-
+#
+# Copyright (C) 2009 Paul W. Frields
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Paul W. Frields <stickster@gmail.com>
+
+
+NAME = u'PulseCaster'
+VERSION = u'0.1.3'
+AUTHOR = u'Paul W. Frields'
+AUTHOR_EMAIL = u'stickster@gmail.com'
+DESCRIPTION = u'PulseAudio based podcast recorder'
+LICENSE = u'GPLv3+'
+COPYRIGHT = u'Copyright © 2009 ' + AUTHOR
+KEYWORDS = u'pulseaudio podcast recorder mixer gstreamer pygtk'
+URL = u'http://pulsecaster.fedorahosted.org' # FIXME: Project needs a
+ # home!
+CONTRIBUTORS = [u'Harry Karvonen <harry.karvonen@gmail.com>']
+
+LICENSE_TEXT = u'''Licensed under the GNU General Public License Version 3
+
+PulseCaster 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 3
+of the License, or (at your option) any later version.
+
+PulseCaster 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.'''
diff --git a/pulsecaster/data/icons/16x16/pulsecaster-16.png b/pulsecaster/data/icons/16x16/pulsecaster-16.png
new file mode 100644
index 0000000..c6840c9
--- /dev/null
+++ b/pulsecaster/data/icons/16x16/pulsecaster-16.png
Binary files differ
diff --git a/pulsecaster/data/icons/24x24/pulsecaster-24.png b/pulsecaster/data/icons/24x24/pulsecaster-24.png
new file mode 100644
index 0000000..4cc7a58
--- /dev/null
+++ b/pulsecaster/data/icons/24x24/pulsecaster-24.png
Binary files differ
diff --git a/pulsecaster/data/icons/32x32/pulsecaster-32.png b/pulsecaster/data/icons/32x32/pulsecaster-32.png
new file mode 100644
index 0000000..9a15d49
--- /dev/null
+++ b/pulsecaster/data/icons/32x32/pulsecaster-32.png
Binary files differ
diff --git a/pulsecaster/data/icons/48x48/pulsecaster-48.png b/pulsecaster/data/icons/48x48/pulsecaster-48.png
new file mode 100644
index 0000000..fdc2f3d
--- /dev/null
+++ b/pulsecaster/data/icons/48x48/pulsecaster-48.png
Binary files differ
diff --git a/pulsecaster/data/icons/64x64/pulsecaster-64.png b/pulsecaster/data/icons/64x64/pulsecaster-64.png
new file mode 100644
index 0000000..4a4425a
--- /dev/null
+++ b/pulsecaster/data/icons/64x64/pulsecaster-64.png
Binary files differ
diff --git a/pulsecaster/data/icons/scalable/pulsecaster-logo.svg b/pulsecaster/data/icons/scalable/pulsecaster-logo.svg
new file mode 100644
index 0000000..8e51935
--- /dev/null
+++ b/pulsecaster/data/icons/scalable/pulsecaster-logo.svg
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="82.392563"
+ height="28.269129"
+ id="svg2161"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ sodipodi:docname="pulsecaster-logo.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.0">
+ <defs
+ id="defs2163">
+ <radialGradient
+ r="12.59534"
+ fy="36.907261"
+ fx="23.82066"
+ cy="36.907261"
+ cx="23.82066"
+ gradientTransform="matrix(1,0,0,0.508772,0,18.12988)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3012-3"
+ xlink:href="#linearGradient4499-8"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4499-8"
+ inkscape:collect="always">
+ <stop
+ id="stop4501-0"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ id="stop4503-9"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.508772,0,18.12988)"
+ r="12.59534"
+ fy="36.907261"
+ fx="23.82066"
+ cy="36.907261"
+ cx="23.82066"
+ id="radialGradient4505-7"
+ xlink:href="#linearGradient4499-8"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="5.5441942"
+ x2="32.864544"
+ y1="13.794194"
+ x1="32.864544"
+ gradientTransform="translate(-0.25,13.5)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4473-9"
+ xlink:href="#linearGradient4475-9"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4475-9">
+ <stop
+ style="stop-color:black;stop-opacity:1"
+ offset="0"
+ id="stop4477-3" />
+ <stop
+ style="stop-color:black;stop-opacity:0"
+ offset="1"
+ id="stop4479-2" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-0.25,12.5)"
+ y2="5.5441942"
+ x2="32.864544"
+ y1="13.794194"
+ x1="32.864544"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4460-4"
+ xlink:href="#linearGradient4465-3"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4465-3"
+ inkscape:collect="always">
+ <stop
+ id="stop4467-7"
+ offset="0"
+ style="stop-color:#2e3436;stop-opacity:1" />
+ <stop
+ id="stop4469-1"
+ offset="1"
+ style="stop-color:#2e3436;stop-opacity:0" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)"
+ r="13.08399"
+ fy="40.578671"
+ fx="18.753521"
+ cy="40.578671"
+ cx="18.753521"
+ id="radialGradient3691-2"
+ xlink:href="#linearGradient3711-2"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3711-2">
+ <stop
+ style="stop-color:#babdb6;stop-opacity:1"
+ offset="0"
+ id="stop3713-0" />
+ <stop
+ style="stop-color:#888a85;stop-opacity:1"
+ offset="1"
+ id="stop3715-2" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.508772,0,18.12988)"
+ r="12.59534"
+ fy="36.907261"
+ fx="23.82066"
+ cy="36.907261"
+ cx="23.82066"
+ id="radialGradient2971-1"
+ xlink:href="#linearGradient2965-7"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2965-7"
+ inkscape:collect="always">
+ <stop
+ id="stop2967-5"
+ offset="0"
+ style="stop-color:#888a85;stop-opacity:1;" />
+ <stop
+ id="stop2969-1"
+ offset="1"
+ style="stop-color:#888a85;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)"
+ gradientUnits="userSpaceOnUse"
+ y2="32.355263"
+ x2="29.74268"
+ y1="37.835339"
+ x1="23.997437"
+ id="linearGradient3785-7"
+ xlink:href="#linearGradient3779-4"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3779-4"
+ inkscape:collect="always">
+ <stop
+ id="stop3781-1"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ id="stop3783-7"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="28.590008"
+ x2="27.272261"
+ y1="41.836731"
+ x1="23.8125"
+ id="linearGradient3709-1"
+ xlink:href="#linearGradient3703-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3703-1"
+ inkscape:collect="always">
+ <stop
+ id="stop3705-1"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop3707-7"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,-1)"
+ gradientUnits="userSpaceOnUse"
+ y2="30.421146"
+ x2="23.640165"
+ y1="36.722809"
+ x1="25.606806"
+ id="linearGradient3732-0"
+ xlink:href="#linearGradient3726-4"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3726-4">
+ <stop
+ id="stop3728-0"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1" />
+ <stop
+ id="stop3730-8"
+ offset="1"
+ style="stop-color:#888a85;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,-1)"
+ gradientUnits="userSpaceOnUse"
+ y2="19.231655"
+ x2="13.567612"
+ y1="18.432873"
+ x1="13.567612"
+ id="linearGradient3801-5"
+ xlink:href="#linearGradient3795-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3795-1">
+ <stop
+ id="stop3797-6"
+ offset="0"
+ style="stop-color:white;stop-opacity:1" />
+ <stop
+ id="stop3799-6"
+ offset="1"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(20,-1)"
+ y2="19.231655"
+ x2="13.567612"
+ y1="18.432873"
+ x1="13.567612"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3805-2"
+ xlink:href="#linearGradient3795-1"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(1,0,0,0.940947,0,1.564893)"
+ gradientUnits="userSpaceOnUse"
+ y2="25.229111"
+ x2="21.649811"
+ y1="19.452076"
+ x1="23.374121"
+ id="linearGradient2987-1"
+ xlink:href="#linearGradient2981-9"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2981-9">
+ <stop
+ id="stop2983-6"
+ offset="0"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ <stop
+ id="stop2985-4"
+ offset="1"
+ style="stop-color:white;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(14,0)"
+ y2="20.381033"
+ x2="16.65625"
+ y1="16.14632"
+ x1="16.65625"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2953-8"
+ xlink:href="#linearGradient2943-0"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2943-0">
+ <stop
+ id="stop2945-8"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1" />
+ <stop
+ id="stop2947-1"
+ offset="1"
+ style="stop-color:#2e3436;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="20.381033"
+ x2="16.65625"
+ y1="16.14632"
+ x1="16.65625"
+ id="linearGradient2949-0"
+ xlink:href="#linearGradient2943-0"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="13.351768"
+ x2="30.230837"
+ y1="13.351768"
+ x1="18.737373"
+ id="linearGradient2902-2"
+ xlink:href="#linearGradient2904-2"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2904-2">
+ <stop
+ style="stop-color:#babdb6;stop-opacity:1"
+ offset="0"
+ id="stop2906-9" />
+ <stop
+ id="stop2910-7"
+ offset="0.21551724"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ style="stop-color:#c3c4c2;stop-opacity:1;"
+ offset="0.70243758"
+ id="stop2912-5" />
+ <stop
+ style="stop-color:#888a85;stop-opacity:1"
+ offset="1"
+ id="stop2908-6" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="5.125"
+ x2="17.625"
+ y1="20.814491"
+ x1="17.625"
+ id="linearGradient4487-4"
+ xlink:href="#linearGradient4481-6"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4481-6">
+ <stop
+ id="stop4483-3"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1;" />
+ <stop
+ id="stop4485-7"
+ offset="1"
+ style="stop-color:#babdb6;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,-1)"
+ gradientUnits="userSpaceOnUse"
+ y2="28.617105"
+ x2="24.6875"
+ y1="36.75"
+ x1="24.6875"
+ id="linearGradient3740-9"
+ xlink:href="#linearGradient3734-7"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3734-7">
+ <stop
+ id="stop3736-4"
+ offset="0"
+ style="stop-color:#babdb6;stop-opacity:1" />
+ <stop
+ id="stop3738-9"
+ offset="1"
+ style="stop-color:white;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ y2="10.76408"
+ x2="23.176371"
+ y1="10.76408"
+ x1="19.583334"
+ gradientTransform="matrix(1,0,0,0.809211,0,2.763158)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2890-1"
+ xlink:href="#linearGradient2867-7"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2867-7"
+ inkscape:collect="always">
+ <stop
+ id="stop2869-0"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop2871-6"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ y2="15.94703"
+ x2="23.246162"
+ y1="24.761473"
+ x1="23.246162"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2892-0"
+ xlink:href="#linearGradient3815-8"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3815-8"
+ inkscape:collect="always">
+ <stop
+ id="stop3817-5"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ id="stop3819-3"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ y2="10.75"
+ x2="24.508121"
+ y1="6.3608937"
+ x1="21.961548"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2894-9"
+ xlink:href="#linearGradient2877-4"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2877-4"
+ inkscape:collect="always">
+ <stop
+ id="stop2879-1"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop2881-5"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)"
+ r="6.46875"
+ fy="10.432782"
+ fx="22.553526"
+ cy="10.432782"
+ cx="22.553526"
+ id="radialGradient2926-4"
+ xlink:href="#linearGradient2920-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2920-1"
+ inkscape:collect="always">
+ <stop
+ id="stop2922-5"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop2924-5"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,3)"
+ y2="10.081399"
+ x2="30"
+ y1="10.081399"
+ x1="17.999674"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3567-4"
+ xlink:href="#linearGradient3228-9"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3228-9">
+ <stop
+ id="stop3230-8"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0.42857143;"
+ offset="0.06770357"
+ id="stop3573-3" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0.29894069"
+ id="stop3569-8" />
+ <stop
+ id="stop3571-5"
+ offset="0.77437174"
+ style="stop-color:black;stop-opacity:0.49803922;" />
+ <stop
+ id="stop3232-2"
+ offset="1"
+ style="stop-color:black;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)"
+ gradientUnits="userSpaceOnUse"
+ y2="25.991137"
+ x2="28.357954"
+ y1="3.4711361"
+ x1="20.483149"
+ id="linearGradient3585-2"
+ xlink:href="#linearGradient3579-2"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3579-2"
+ inkscape:collect="always">
+ <stop
+ id="stop3581-7"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop3583-0"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="6.727323"
+ inkscape:cx="28.86207"
+ inkscape:cy="20.847678"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="872"
+ inkscape:window-height="624"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata2166">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <cc:license
+ rdf:resource="http://www.gnu.org/copyleft/gpl.html" />
+ <dc:title></dc:title>
+ <dc:date>2006-08-28</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Pierre Ossman &lt;ossman@cendio.se&gt; for Cendio AB</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title />
+ </cc:Agent>
+ </dc:rights>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Rafael Jannone (basic idea)</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/SourceCode" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Mic"
+ transform="translate(-1.8065748,-0.0439041)">
+ <g
+ style="display:inline"
+ id="g306"
+ transform="matrix(0.49976071,0,0,0.49976071,3.2433793,5.5836561)">
+ <g
+ style="display:inline"
+ inkscape:label="vectors"
+ id="layer2">
+ <path
+ transform="matrix(0.727673,0,0,1.235135,7.166344,-12.0556)"
+ d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z"
+ sodipodi:ry="6.4081554"
+ sodipodi:rx="12.59534"
+ sodipodi:cy="36.907261"
+ sodipodi:cx="23.82066"
+ id="path3010"
+ style="opacity:0.1;fill:url(#radialGradient3012-3);fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.233813,0,0,1.235135,-4.890235,-6.055598)"
+ d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z"
+ sodipodi:ry="6.4081554"
+ sodipodi:rx="12.59534"
+ sodipodi:cy="36.907261"
+ sodipodi:cx="23.82066"
+ id="path4489"
+ style="opacity:0.7;fill:url(#radialGradient4505-7);fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="opacity:0.2;fill:none;stroke:url(#linearGradient4473-9);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 32.800044,40.588388 C 24.781634,29.5 47,35.875 46.25,32 45.476667,28.004445 36.399824,30.554499 36.875,26.25 37.336541,22.069018 46.75,23.75 44.625,15"
+ id="path4471"
+ sodipodi:nodetypes="czzc" />
+ <path
+ style="fill:none;stroke:url(#linearGradient4460-4);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 32.800044,39.588388 C 24.781634,28.5 47,34.875 46.25,31 45.476667,27.004445 36.399824,29.554499 36.875,25.25 37.336541,21.069018 46.75,22.75 44.625,14"
+ id="path4172"
+ sodipodi:nodetypes="czzc" />
+ <path
+ transform="matrix(1.032128,0,0,1.014402,-0.08596444,1.56074)"
+ d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z"
+ sodipodi:ry="6.4081554"
+ sodipodi:rx="12.59534"
+ sodipodi:cy="36.907261"
+ sodipodi:cx="23.82066"
+ id="path3683"
+ style="fill:url(#radialGradient3691-2);fill-opacity:1;stroke:#555753;stroke-width:0.97730058;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.43667,0,0,0.429141,14.09824,21.41158)"
+ d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z"
+ sodipodi:ry="6.4081554"
+ sodipodi:rx="12.59534"
+ sodipodi:cy="36.907261"
+ sodipodi:cx="23.82066"
+ id="path2955"
+ style="fill:url(#radialGradient2971-1);fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccssccc"
+ id="path3766"
+ d="m 27.35249,32.125 c -1.738654,0.735383 -2.545819,2.052948 -3.67816,3.167277 -0.486309,0.3076 -0.5997,0.709446 -0.51965,1.276685 0.08005,0.567243 0.489446,1.055334 1.042146,1.218184 0.552698,0.162848 0.999547,0.130039 1.377887,-0.302139 C 26.676195,35.285524 28.744563,33.983863 31,32.85591 29.870496,32.536987 28.651039,32.264053 27.35249,32.125 z"
+ style="opacity:0.7;fill:url(#linearGradient3785-7);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
+ <path
+ transform="matrix(1.032128,0,0,1.014402,-0.08596444,1.56074)"
+ d="m 23.8125,31.5 c -3.339495,0 -6.371551,0.683256 -8.46875,1.75 -2.097199,1.066744 -3.125,2.416366 -3.125,3.65625 0,1.239884 1.027801,2.589506 3.125,3.65625 2.097199,1.066744 5.129255,1.750001 8.46875,1.75 3.339495,0 6.371551,-0.683256 8.46875,-1.75 2.097199,-1.066744 3.125,-2.416366 3.125,-3.65625 0,-1.239884 -1.027801,-2.589506 -3.125,-3.65625 C 30.184051,32.183256 27.151995,31.5 23.8125,31.5 z"
+ id="path3697"
+ style="opacity:0.4;fill:none;stroke:url(#linearGradient3709-1);stroke-width:0.97730058;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ inkscape:original="M 23.8125 30.5 C 16.859872 30.5 11.21875 33.368948 11.21875 36.90625 C 11.21875 40.443552 16.859872 43.312502 23.8125 43.3125 C 30.765128 43.3125 36.406249 40.443552 36.40625 36.90625 C 36.40625 33.368948 30.765128 30.5 23.8125 30.5 z "
+ inkscape:radius="-0.99470079"
+ sodipodi:type="inkscape:offset" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3589"
+ d="m 24.5,27.5 0,9"
+ style="fill:none;stroke:url(#linearGradient3732-0);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="csc"
+ id="path2781"
+ d="m 34.500008,18.999997 c -8e-6,4.285711 -4.46,7.500001 -10.000002,7.500001 -5.540002,0 -10.000006,-3.21429 -10.000003,-7.500001"
+ style="fill:none;stroke:#888a85;stroke-width:3.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <rect
+ y="16.499998"
+ x="12.5"
+ height="2.9999995"
+ width="4"
+ id="rect2783"
+ style="fill:url(#linearGradient3801-5);fill-opacity:1;stroke:#888a85;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+ <rect
+ y="16.499998"
+ x="32.5"
+ height="2.9999995"
+ width="4"
+ id="rect3803"
+ style="fill:url(#linearGradient3805-2);fill-opacity:1;stroke:#888a85;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+ <path
+ sodipodi:nodetypes="csc"
+ id="rect1882"
+ d="m 34.500008,18.999991 c 0,4.28571 -4.46,7.500001 -10.000002,7.500001 -5.540002,0 -10.000006,-3.214291 -10.000003,-7.500001"
+ style="fill:none;stroke:url(#linearGradient2987-1);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <rect
+ ry="0.9722718"
+ rx="0.9722718"
+ y="15"
+ x="30"
+ height="6"
+ width="3.0000005"
+ id="rect2951"
+ style="fill:url(#linearGradient2953-8);fill-opacity:1;stroke:none;display:inline" />
+ <path
+ transform="matrix(1.5,0,0,1.5,12.25,-11.25)"
+ d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="19"
+ sodipodi:cx="14"
+ id="path3825"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <rect
+ ry="0.9722718"
+ rx="0.9722718"
+ y="15"
+ x="16"
+ height="6"
+ width="3.0000005"
+ id="rect2787"
+ style="fill:url(#linearGradient2949-0);fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ ry="7.0108709"
+ rx="7.0000019"
+ y="1.5000002"
+ x="17.499996"
+ height="24.000008"
+ width="14.000004"
+ id="rect1880"
+ style="fill:url(#linearGradient2902-2);fill-opacity:1;stroke:url(#linearGradient4487-4);stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3587"
+ d="m 24.5,26.5 0,10"
+ style="fill:none;stroke:url(#linearGradient3740-9);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+ <path
+ transform="matrix(1.5,0,0,1.5,-7.75,-11.25)"
+ d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="19"
+ sodipodi:cx="14"
+ id="path3823"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <g
+ id="g3270"
+ inkscape:label="Shadow"
+ transform="translate(-9.25,46.68088)" />
+ <g
+ transform="translate(-9.25,61.74691)"
+ inkscape:label="Shadow"
+ id="g2611" />
+ <g
+ transform="translate(-9.25,61.74691)"
+ style="display:inline"
+ inkscape:label="Lavoro"
+ id="g2613" />
+ <g
+ id="g2885">
+ <rect
+ style="fill:url(#linearGradient2890-1);fill-opacity:1;stroke:none;display:inline"
+ id="rect1975"
+ width="4"
+ height="15.374996"
+ x="20"
+ y="6"
+ rx="2"
+ ry="2.1991496" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-0.54470092"
+ inkscape:original="M 24.5 2.5 C 20.621999 2.5 17.5 5.615977 17.5 9.5 L 17.5 19.5 C 17.5 23.384022 20.621999 26.5 24.5 26.5 C 28.378001 26.5 31.5 23.384022 31.5 19.5 L 31.5 9.5 C 31.5 5.6159775 28.378001 2.5 24.5 2.5 z "
+ style="opacity:0.2;fill:url(#linearGradient2892-0);fill-opacity:1;stroke:none;display:inline"
+ id="path3811"
+ d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,10 c 0,3.592133 2.882528,6.46875 6.46875,6.46875 3.586222,0 6.46875,-2.876617 6.46875,-6.46875 l 0,-10 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z"
+ transform="translate(0,-1)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient2894-9);fill-opacity:1;stroke:none"
+ id="path2875"
+ sodipodi:cx="23.65625"
+ sodipodi:cy="7.6875"
+ sodipodi:rx="3.34375"
+ sodipodi:ry="3.0625"
+ d="M 27,7.6875 C 27,9.378872 25.502952,10.75 23.65625,10.75 21.809548,10.75 20.3125,9.378872 20.3125,7.6875 20.3125,5.996128 21.809548,4.625 23.65625,4.625 25.502952,4.625 27,5.996128 27,7.6875 z"
+ transform="matrix(1,0,0,1.081633,-0.375,-1.252551)" />
+ </g>
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path2916"
+ d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,5 12.9375,0 0,-5 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z"
+ style="opacity:0.9;fill:url(#radialGradient2926-4);fill-opacity:1;stroke:none;display:inline"
+ transform="translate(0,-1)" />
+ </g>
+ <g
+ style="display:inline"
+ inkscape:label="buchi"
+ id="layer3">
+ <path
+ sodipodi:nodetypes="csssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssc"
+ id="path2902"
+ d="M 22.5,3 C 22.224,3 22,3.224 22,3.5 22,3.776 22.224,4 22.5,4 22.776,4 23,3.776 23,3.5 23,3.224 22.776,3 22.5,3 z m 2,0 C 24.224,3 24,3.224 24,3.5 24,3.776 24.224,4 24.5,4 24.776,4 25,3.776 25,3.5 25,3.224 24.776,3 24.5,3 z m 2,0 C 26.224,3 26,3.224 26,3.5 26,3.776 26.224,4 26.5,4 26.776,4 27,3.776 27,3.5 27,3.224 26.776,3 26.5,3 z m -5,1 C 21.224,4 21,4.224 21,4.5 21,4.776 21.224,5 21.5,5 21.776,5 22,4.776 22,4.5 22,4.224 21.776,4 21.5,4 z m 2,0 C 23.224,4 22.999999,4.2240007 23,4.5 23,4.7759993 23.223999,5 23.5,5 23.776,5 24,4.7759993 24,4.5 24,4.2240007 23.776,4 23.5,4 z m 2,0 C 25.224,4 24.999999,4.2240007 25,4.5 25,4.7759993 25.223999,5 25.5,5 25.776,5 26,4.7759993 26,4.5 26,4.2240007 25.776,4 25.5,4 z m 2,0 C 27.224,4 27,4.224 27,4.5 27,4.776 27.224,5 27.5,5 27.776,5 28,4.776 28,4.5 28,4.224 27.776,4 27.5,4 z m -7,1 C 20.224,5 19.999999,5.2240008 20,5.5 20,5.7759993 20.223999,6 20.5,6 20.776,6 21,5.7759994 21,5.5 21,5.2240007 20.776,5 20.5,5 z m 2,0 C 22.224,5 21.999999,5.2240008 22,5.5 22,5.7759993 22.223999,6 22.5,6 22.776,6 23,5.7759994 23,5.5 23,5.2240007 22.776,5 22.5,5 z m 2,0 C 24.224,5 23.999999,5.2240008 24,5.5 24,5.7759993 24.223999,6 24.5,6 24.776,6 25,5.7759994 25,5.5 25,5.2240007 24.776,5 24.5,5 z m 2,0 C 26.224,5 25.999999,5.2240008 26,5.5 26,5.7759993 26.223999,6 26.5,6 26.776,6 27,5.7759994 27,5.5 27,5.2240007 26.776,5 26.5,5 z m 2,0 C 28.224,5 28,5.224 28,5.5 28,5.776 28.224,6 28.5,6 28.776,6 29,5.776 29,5.5 29,5.224 28.776,5 28.5,5 z m -9,1 C 19.224,6 18.999999,6.2240008 19,6.5 19,6.7759993 19.223999,7 19.5,7 19.776,7 20,6.7759994 20,6.5 20,6.2240007 19.776,6 19.5,6 z m 2,0 C 21.224,6 20.999999,6.2240008 21,6.5 21,6.7759993 21.223999,7 21.5,7 21.776,7 22,6.7759994 22,6.5 22,6.2240007 21.776,6 21.5,6 z m 2,0 C 23.224,6 22.999999,6.2240008 23,6.5 23,6.7759993 23.223999,7 23.5,7 23.776,7 24,6.7759994 24,6.5 24,6.2240007 23.776,6 23.5,6 z m 2,0 C 25.224,6 24.999999,6.2240008 25,6.5 25,6.7759993 25.223999,7 25.5,7 25.776,7 26,6.7759994 26,6.5 26,6.2240007 25.776,6 25.5,6 z m 2,0 C 27.224,6 26.999999,6.2240008 27,6.5 27,6.7759993 27.223999,7 27.5,7 27.776,7 28,6.7759994 28,6.5 28,6.2240007 27.776,6 27.5,6 z m 2,0 C 29.224,6 29,6.224 29,6.5 29,6.776 29.224,7 29.5,7 29.776,7 30,6.776 30,6.5 30,6.224 29.776,6 29.5,6 z m -9,1 C 20.224,7 19.999999,7.2240008 20,7.5 20,7.7759993 20.223999,8.0000002 20.5,8 20.776,8 21,7.7759994 21,7.5 21,7.2240007 20.776,7 20.5,7 z m 2,0 C 22.224,7 21.999999,7.2240008 22,7.5 22,7.7759993 22.223999,8.0000002 22.5,8 22.776,8 23,7.7759994 23,7.5 23,7.2240007 22.776,7 22.5,7 z m 2,0 C 24.224,7 23.999999,7.2240008 24,7.5 24,7.7759993 24.223999,8.0000002 24.5,8 24.776,8 25,7.7759994 25,7.5 25,7.2240007 24.776,7 24.5,7 z m 2,0 C 26.224,7 25.999999,7.2240008 26,7.5 26,7.7759993 26.223999,8.0000002 26.5,8 26.776,8 27,7.7759994 27,7.5 27,7.2240007 26.776,7 26.5,7 z m 2,0 C 28.224,7 27.999999,7.2240008 28,7.5 28,7.7759993 28.223999,8.0000002 28.5,8 28.776,8 29,7.7759994 29,7.5 29,7.2240007 28.776,7 28.5,7 z m 2,0 C 30.224,7 30,7.224 30,7.5 30,7.776 30.224,8 30.5,8 30.776,8 31,7.776 31,7.5 31,7.224 30.776,7 30.5,7 z m -11,1 C 19.224,8 18.999999,8.2240008 19,8.5 19,8.7759993 19.223999,9 19.5,9 19.776,9 20,8.7759994 20,8.5 20,8.2240007 19.776,8 19.5,8 z m 2,0 C 21.224,8 20.999999,8.2240008 21,8.5 21,8.7759993 21.223999,9 21.5,9 21.776,9 22,8.7759994 22,8.5 22,8.2240007 21.776,8 21.5,8 z m 2,0 C 23.224,8 22.999999,8.2240008 23,8.5 23,8.7759993 23.223999,9 23.5,9 23.776,9 24,8.7759994 24,8.5 24,8.2240007 23.776,8 23.5,8 z m 2,0 C 25.224,8 24.999999,8.2240008 25,8.5 25,8.7759993 25.223999,9 25.5,9 25.776,9 26,8.7759994 26,8.5 26,8.2240007 25.776,8 25.5,8 z m 2,0 C 27.224,8 26.999999,8.2240008 27,8.5 27,8.7759993 27.223999,9 27.5,9 27.776,9 28,8.7759994 28,8.5 28,8.2240007 27.776,8 27.5,8 z m 2,0 C 29.224,8 28.999999,8.2240008 29,8.5 29,8.7759993 29.223999,9 29.5,9 29.776,9 30,8.7759994 30,8.5 30,8.2240007 29.776,8 29.5,8 z m -11,1 C 18.224,9 17.999999,9.224001 18,9.5 18,9.775999 18.223999,10 18.5,10 18.776,10 19,9.775999 19,9.5 19,9.224001 18.776,9 18.5,9 z m 2,0 C 20.224,9 19.999999,9.224001 20,9.5 20,9.775999 20.223999,10 20.5,10 20.776,10 21,9.775999 21,9.5 21,9.224001 20.776,9 20.5,9 z m 2,0 C 22.224,9 21.999999,9.224001 22,9.5 22,9.775999 22.223999,10 22.5,10 22.776,10 23,9.775999 23,9.5 23,9.224001 22.776,9 22.5,9 z m 2,0 C 24.224,9 23.999999,9.224001 24,9.5 24,9.775999 24.223999,10 24.5,10 24.776,10 25,9.775999 25,9.5 25,9.224001 24.776,9 24.5,9 z m 2,0 C 26.224,9 25.999999,9.224001 26,9.5 26,9.775999 26.223999,10 26.5,10 26.776,10 27,9.775999 27,9.5 27,9.224001 26.776,9 26.5,9 z m 2,0 C 28.224,9 27.999999,9.224001 28,9.5 28,9.775999 28.223999,10 28.5,10 28.776,10 29,9.775999 29,9.5 29,9.224001 28.776,9 28.5,9 z m 2,0 C 30.224,9 30,9.224 30,9.5 30,9.776 30.224,10 30.5,10 30.776,10 31,9.776 31,9.5 31,9.224 30.776,9 30.5,9 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,11 20,10.775999 20,10.5 20,10.224001 19.776,10 19.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,11 22,10.775999 22,10.5 22,10.224001 21.776,10 21.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,11 24,10.775999 24,10.5 24,10.224001 23.776,10 23.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,11 26,10.775999 26,10.5 26,10.224001 25.776,10 25.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,11 28,10.775999 28,10.5 28,10.224001 27.776,10 27.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,11 30,10.775999 30,10.5 30,10.224001 29.776,10 29.5,10 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,12 19,11.775999 19,11.5 19,11.224001 18.776,11 18.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,12 21,11.775999 21,11.5 21,11.224001 20.776,11 20.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,12 23,11.775999 23,11.5 23,11.224001 22.776,11 22.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,12 25,11.775999 25,11.5 25,11.224001 24.776,11 24.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,12 27,11.775999 27,11.5 27,11.224001 26.776,11 26.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,12 29,11.775999 29,11.5 29,11.224001 28.776,11 28.5,11 z m 2,0 C 30.224,11 30,11.224 30,11.5 30,11.776 30.224,12 30.5,12 30.776,12 31,11.776 31,11.5 31,11.224 30.776,11 30.5,11 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,13 20,12.775999 20,12.5 20,12.224001 19.776,12 19.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,13 22,12.775999 22,12.5 22,12.224001 21.776,12 21.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,13 24,12.775999 24,12.5 24,12.224001 23.776,12 23.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,13 26,12.775999 26,12.5 26,12.224001 25.776,12 25.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,13 28,12.775999 28,12.5 28,12.224001 27.776,12 27.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,13 30,12.775999 30,12.5 30,12.224001 29.776,12 29.5,12 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,14 19,13.775999 19,13.5 19,13.224001 18.776,13 18.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,14 21,13.775999 21,13.5 21,13.224001 20.776,13 20.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,14 23,13.775999 23,13.5 23,13.224001 22.776,13 22.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,14 25,13.775999 25,13.5 25,13.224001 24.776,13 24.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,14 27,13.775999 27,13.5 27,13.224001 26.776,13 26.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,14 29,13.775999 29,13.5 29,13.224001 28.776,13 28.5,13 z m 2,0 C 30.224,13 30,13.224 30,13.5 30,13.776 30.224,14 30.5,14 30.776,14 31,13.776 31,13.5 31,13.224 30.776,13 30.5,13 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,15 20,14.775999 20,14.5 20,14.224001 19.776,14 19.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,15 22,14.775999 22,14.5 22,14.224001 21.776,14 21.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,15 24,14.775999 24,14.5 24,14.224001 23.776,14 23.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,15 26,14.775999 26,14.5 26,14.224001 25.776,14 25.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,15 28,14.775999 28,14.5 28,14.224001 27.776,14 27.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,15 30,14.775999 30,14.5 30,14.224001 29.776,14 29.5,14 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,16 19,15.775999 19,15.5 19,15.224001 18.776,15 18.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,16 21,15.775999 21,15.5 21,15.224001 20.776,15 20.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,16 23,15.775999 23,15.5 23,15.224001 22.776,15 22.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,16 25,15.775999 25,15.5 25,15.224001 24.776,15 24.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,16 27,15.775999 27,15.5 27,15.224001 26.776,15 26.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,16 29,15.775999 29,15.5 29,15.224001 28.776,15 28.5,15 z m 2,0 C 30.224,15 30,15.224 30,15.5 30,15.776 30.224,16 30.5,16 30.776,16 31,15.776 31,15.5 31,15.224 30.776,15 30.5,15 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,17 20,16.776 20,16.5 20,16.224001 19.776,16 19.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,17 22,16.776 22,16.5 22,16.224001 21.776,16 21.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,17 24,16.776 24,16.5 24,16.224001 23.776,16 23.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,17 26,16.776 26,16.5 26,16.224001 25.776,16 25.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,17 28,16.776 28,16.5 28,16.224001 27.776,16 27.5,16 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,17 30,16.775999 30,16.5 30,16.224001 29.776,16 29.5,16 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,18 19,17.776 19,17.5 19,17.224001 18.776,17 18.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,18 21,17.776 21,17.5 21,17.224001 20.776,17 20.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,18 23,17.776 23,17.5 23,17.224001 22.776,17 22.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,18 25,17.776 25,17.5 25,17.224001 24.776,17 24.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,18 27,17.776 27,17.5 27,17.224001 26.776,17 26.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,18 29,17.776 29,17.5 29,17.224001 28.776,17 28.5,17 z m 2,0 C 30.224,17 30,17.224 30,17.5 30,17.776 30.224,18 30.5,18 30.776,18 31,17.776 31,17.5 31,17.224 30.776,17 30.5,17 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,19 20,18.776 20,18.5 20,18.224001 19.776,18 19.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,19 22,18.776 22,18.5 22,18.224001 21.776,18 21.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,19 24,18.776 24,18.5 24,18.224001 23.776,18 23.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,19 26,18.776 26,18.5 26,18.224001 25.776,18 25.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,19 28,18.776 28,18.5 28,18.224001 27.776,18 27.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,19 30,18.776 30,18.5 30,18.224001 29.776,18 29.5,18 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 18.776,20 19,19.776 19,19.5 19,19.224001 18.776,19 18.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 20.776,20 21,19.776 21,19.5 21,19.224001 20.776,19 20.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,20 23,19.776 23,19.5 23,19.224001 22.776,19 22.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,20 25,19.776 25,19.5 25,19.224001 24.776,19 24.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,20 27,19.776 27,19.5 27,19.224001 26.776,19 26.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 28.776,20 29,19.776 29,19.5 29,19.224001 28.776,19 28.5,19 z m 2,0 C 30.224,19 30,19.224 30,19.5 30,19.776 30.224,20 30.5,20 30.776,20 31,19.776 31,19.5 31,19.224 30.776,19 30.5,19 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 19.776,21 20,20.776 20,20.5 20,20.224001 19.776,20 19.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 21.776,21 22,20.776 22,20.5 22,20.224001 21.776,20 21.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,21 24,20.776 24,20.5 24,20.224001 23.776,20 23.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,21 26,20.776 26,20.5 26,20.224001 25.776,20 25.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 27.776,21 28,20.776 28,20.5 28,20.224001 27.776,20 27.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 29.776,21 30,20.776 30,20.5 30,20.224001 29.776,20 29.5,20 z m -9,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 20.776,22 21,21.776 21,21.5 21,21.224001 20.776,21 20.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,22 23,21.776 23,21.5 23,21.224001 22.776,21 22.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,22 25,21.776 25,21.5 25,21.224001 24.776,21 24.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,22 27,21.776 27,21.5 27,21.224001 26.776,21 26.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 28.776,22 29,21.776 29,21.5 29,21.224001 28.776,21 28.5,21 z m -7,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 21.776,23 22,22.776 22,22.5 22,22.224001 21.776,22 21.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,23 24,22.776 24,22.5 24,22.224001 23.776,22 23.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,23 26,22.776 26,22.5 26,22.224001 25.776,22 25.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 27.776,23 28,22.776 28,22.5 28,22.224001 27.776,22 27.5,22 z m -5,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,24 23,23.776 23,23.5 23,23.224001 22.776,23 22.5,23 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,24 25,23.776 25,23.5 25,23.224001 24.776,23 24.5,23 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,24 27,23.776 27,23.5 27,23.224001 26.776,23 26.5,23 z m -3,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,25 24,24.776 24,24.5 24,24.224001 23.776,24 23.5,24 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,25 26,24.776 26,24.5 26,24.224001 25.776,24 25.5,24 z"
+ style="opacity:0.5;fill:url(#linearGradient3567-4);fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ ry="6.0500031"
+ rx="6.0000024"
+ y="2.5000026"
+ x="18.500008"
+ height="22.000008"
+ width="12.000005"
+ id="rect3575"
+ style="fill:none;stroke:url(#linearGradient3585-2);stroke-width:1.0000006;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ transform="translate(-11.455575,-6.2799821)"
+ style="display:inline">
+ <g
+ id="g781"
+ transform="matrix(0.88131313,0,0,0.88131313,2.9517844,0.78404468)">
+ <path
+ style="fill:#729fcf;fill-opacity:1;stroke:none"
+ d="m 22.365786,11.528391 c -4.16858,1.106752 -7.242777,4.906525 -7.242774,9.421848 0,4.51531 3.074196,8.318988 7.242774,9.42574 -3.007226,-1.349598 -5.168955,-5.062913 -5.168955,-9.42574 -1e-6,-4.362815 2.161728,-8.07225 5.168955,-9.421848 z m 5.009131,0 c 3.007227,1.349598 5.168955,5.059021 5.168955,9.421848 0,4.362827 -2.161729,8.076142 -5.168955,9.42574 4.16858,-1.106752 7.242777,-4.91043 7.242774,-9.42574 0,-4.515311 -3.074193,-8.315096 -7.242774,-9.421848 z"
+ id="path2419" />
+ <path
+ id="path2421"
+ d="M 20.959247,6.236078 C 14.449633,7.9643721 9.6489964,13.898061 9.6490002,20.949142 c 0,7.05107 4.8006348,12.990862 11.3102468,14.719148 -4.696056,-2.107524 -8.071791,-7.906196 -8.071791,-14.719148 -2e-6,-6.812926 3.375734,-12.6055448 8.071791,-14.713064 z m 7.82221,0 c 4.696057,2.1075192 8.07179,7.900118 8.07179,14.713064 0,6.812952 -3.375735,12.611624 -8.07179,14.719148 6.509614,-1.728286 11.31025,-7.668078 11.310246,-14.719148 0,-7.051061 -4.80063,-12.9847699 -11.310246,-14.713064 z"
+ style="fill:#729fcf;fill-opacity:1;stroke:none" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="39.743385"
+ y="34.479111"
+ id="text2991"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2993"
+ x="39.743385"
+ y="34.479111"
+ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Engebrechtre;-inkscape-font-specification:Engebrechtre">PulseCaster</tspan></text>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="center"
+ style="display:none"
+ transform="translate(-1.8065748,-0.0439041)">
+ <path
+ transform="matrix(0.2091112,0,0,0.2091112,15.430463,-165.87494)"
+ d="m 22,863.61249 c 0,12.70255 -10.297451,23 -23,23 -12.702549,0 -23,-10.29745 -23,-23 0,-12.70255 10.297451,-23 23,-23 12.702549,0 23,10.29745 23,23 z"
+ sodipodi:ry="23"
+ sodipodi:rx="23"
+ sodipodi:cy="863.61249"
+ sodipodi:cx="-1"
+ id="path2417"
+ style="fill:#729fcf;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+</svg>
diff --git a/pulsecaster/data/icons/scalable/pulsecaster.svg b/pulsecaster/data/icons/scalable/pulsecaster.svg
new file mode 100644
index 0000000..b15a05c
--- /dev/null
+++ b/pulsecaster/data/icons/scalable/pulsecaster.svg
@@ -0,0 +1,1043 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="30.442703"
+ height="29.432213"
+ id="svg2161"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ sodipodi:docname="pulseaudio.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.0">
+ <defs
+ id="defs2163">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective69" />
+ <linearGradient
+ id="linearGradient3093">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3095" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3097" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2503">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2505" />
+ <stop
+ style="stop-color:#141413;stop-opacity:1;"
+ offset="1"
+ id="stop2507" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2495">
+ <stop
+ style="stop-color:#0a0a09;stop-opacity:1;"
+ offset="0"
+ id="stop2497" />
+ <stop
+ style="stop-color:#282927;stop-opacity:1;"
+ offset="1"
+ id="stop2499" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2535">
+ <stop
+ id="stop2537"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0.36078432;" />
+ <stop
+ id="stop2539"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3072">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3074" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3076" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3228">
+ <stop
+ id="stop3230"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0.42857143;"
+ offset="0.06770357"
+ id="stop3573" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0.29894069"
+ id="stop3569" />
+ <stop
+ id="stop3571"
+ offset="0.77437174"
+ style="stop-color:black;stop-opacity:0.49803922;" />
+ <stop
+ id="stop3232"
+ offset="1"
+ style="stop-color:black;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3726">
+ <stop
+ id="stop3728"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1" />
+ <stop
+ id="stop3730"
+ offset="1"
+ style="stop-color:#888a85;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3734">
+ <stop
+ id="stop3736"
+ offset="0"
+ style="stop-color:#babdb6;stop-opacity:1" />
+ <stop
+ id="stop3738"
+ offset="1"
+ style="stop-color:white;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3795">
+ <stop
+ id="stop3797"
+ offset="0"
+ style="stop-color:white;stop-opacity:1" />
+ <stop
+ id="stop3799"
+ offset="1"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4481">
+ <stop
+ id="stop4483"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1;" />
+ <stop
+ id="stop4485"
+ offset="1"
+ style="stop-color:#babdb6;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2943">
+ <stop
+ id="stop2945"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1" />
+ <stop
+ id="stop2947"
+ offset="1"
+ style="stop-color:#2e3436;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2981">
+ <stop
+ id="stop2983"
+ offset="0"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ <stop
+ id="stop2985"
+ offset="1"
+ style="stop-color:white;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2904">
+ <stop
+ style="stop-color:#babdb6;stop-opacity:1"
+ offset="0"
+ id="stop2906" />
+ <stop
+ id="stop2910"
+ offset="0.21551724"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ style="stop-color:#c3c4c2;stop-opacity:1;"
+ offset="0.70243758"
+ id="stop2912" />
+ <stop
+ style="stop-color:#888a85;stop-opacity:1"
+ offset="1"
+ id="stop2908" />
+ </linearGradient>
+ <inkscape:perspective
+ id="perspective215"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective350"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective374"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <radialGradient
+ r="12.59534"
+ fy="36.907261"
+ fx="23.82066"
+ cy="36.907261"
+ cx="23.82066"
+ gradientTransform="matrix(1,0,0,0.508772,0,18.12988)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3012-3"
+ xlink:href="#linearGradient4499-8"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4499-8"
+ inkscape:collect="always">
+ <stop
+ id="stop4501-0"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ id="stop4503-9"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.508772,0,18.12988)"
+ r="12.59534"
+ fy="36.907261"
+ fx="23.82066"
+ cy="36.907261"
+ cx="23.82066"
+ id="radialGradient4505-7"
+ xlink:href="#linearGradient4499-8"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="5.5441942"
+ x2="32.864544"
+ y1="13.794194"
+ x1="32.864544"
+ gradientTransform="translate(-0.25,13.5)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4473-9"
+ xlink:href="#linearGradient4475-9"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4475-9">
+ <stop
+ style="stop-color:black;stop-opacity:1"
+ offset="0"
+ id="stop4477-3" />
+ <stop
+ style="stop-color:black;stop-opacity:0"
+ offset="1"
+ id="stop4479-2" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-0.25,12.5)"
+ y2="5.5441942"
+ x2="32.864544"
+ y1="13.794194"
+ x1="32.864544"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4460-4"
+ xlink:href="#linearGradient4465-3"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4465-3"
+ inkscape:collect="always">
+ <stop
+ id="stop4467-7"
+ offset="0"
+ style="stop-color:#2e3436;stop-opacity:1" />
+ <stop
+ id="stop4469-1"
+ offset="1"
+ style="stop-color:#2e3436;stop-opacity:0" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)"
+ r="13.08399"
+ fy="40.578671"
+ fx="18.753521"
+ cy="40.578671"
+ cx="18.753521"
+ id="radialGradient3691-2"
+ xlink:href="#linearGradient3711-2"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3711-2">
+ <stop
+ style="stop-color:#babdb6;stop-opacity:1"
+ offset="0"
+ id="stop3713-0" />
+ <stop
+ style="stop-color:#888a85;stop-opacity:1"
+ offset="1"
+ id="stop3715-2" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.508772,0,18.12988)"
+ r="12.59534"
+ fy="36.907261"
+ fx="23.82066"
+ cy="36.907261"
+ cx="23.82066"
+ id="radialGradient2971-1"
+ xlink:href="#linearGradient2965-7"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2965-7"
+ inkscape:collect="always">
+ <stop
+ id="stop2967-5"
+ offset="0"
+ style="stop-color:#888a85;stop-opacity:1;" />
+ <stop
+ id="stop2969-1"
+ offset="1"
+ style="stop-color:#888a85;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)"
+ gradientUnits="userSpaceOnUse"
+ y2="32.355263"
+ x2="29.74268"
+ y1="37.835339"
+ x1="23.997437"
+ id="linearGradient3785-7"
+ xlink:href="#linearGradient3779-4"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3779-4"
+ inkscape:collect="always">
+ <stop
+ id="stop3781-1"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ id="stop3783-7"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="28.590008"
+ x2="27.272261"
+ y1="41.836731"
+ x1="23.8125"
+ id="linearGradient3709-1"
+ xlink:href="#linearGradient3703-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3703-1"
+ inkscape:collect="always">
+ <stop
+ id="stop3705-1"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop3707-7"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,-1)"
+ gradientUnits="userSpaceOnUse"
+ y2="30.421146"
+ x2="23.640165"
+ y1="36.722809"
+ x1="25.606806"
+ id="linearGradient3732-0"
+ xlink:href="#linearGradient3726-4"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3726-4">
+ <stop
+ id="stop3728-0"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1" />
+ <stop
+ id="stop3730-8"
+ offset="1"
+ style="stop-color:#888a85;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,-1)"
+ gradientUnits="userSpaceOnUse"
+ y2="19.231655"
+ x2="13.567612"
+ y1="18.432873"
+ x1="13.567612"
+ id="linearGradient3801-5"
+ xlink:href="#linearGradient3795-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3795-1">
+ <stop
+ id="stop3797-6"
+ offset="0"
+ style="stop-color:white;stop-opacity:1" />
+ <stop
+ id="stop3799-6"
+ offset="1"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(20,-1)"
+ y2="19.231655"
+ x2="13.567612"
+ y1="18.432873"
+ x1="13.567612"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3805-2"
+ xlink:href="#linearGradient3795-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient422">
+ <stop
+ id="stop424"
+ offset="0"
+ style="stop-color:white;stop-opacity:1" />
+ <stop
+ id="stop426"
+ offset="1"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(1,0,0,0.940947,0,1.564893)"
+ gradientUnits="userSpaceOnUse"
+ y2="25.229111"
+ x2="21.649811"
+ y1="19.452076"
+ x1="23.374121"
+ id="linearGradient2987-1"
+ xlink:href="#linearGradient2981-9"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2981-9">
+ <stop
+ id="stop2983-6"
+ offset="0"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ <stop
+ id="stop2985-4"
+ offset="1"
+ style="stop-color:white;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(14,0)"
+ y2="20.381033"
+ x2="16.65625"
+ y1="16.14632"
+ x1="16.65625"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2953-8"
+ xlink:href="#linearGradient2943-0"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2943-0">
+ <stop
+ id="stop2945-8"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1" />
+ <stop
+ id="stop2947-1"
+ offset="1"
+ style="stop-color:#2e3436;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="20.381033"
+ x2="16.65625"
+ y1="16.14632"
+ x1="16.65625"
+ id="linearGradient2949-0"
+ xlink:href="#linearGradient2943-0"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient437">
+ <stop
+ id="stop439"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1" />
+ <stop
+ id="stop441"
+ offset="1"
+ style="stop-color:#2e3436;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="13.351768"
+ x2="30.230837"
+ y1="13.351768"
+ x1="18.737373"
+ id="linearGradient2902-2"
+ xlink:href="#linearGradient2904-2"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2904-2">
+ <stop
+ style="stop-color:#babdb6;stop-opacity:1"
+ offset="0"
+ id="stop2906-9" />
+ <stop
+ id="stop2910-7"
+ offset="0.21551724"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ style="stop-color:#c3c4c2;stop-opacity:1;"
+ offset="0.70243758"
+ id="stop2912-5" />
+ <stop
+ style="stop-color:#888a85;stop-opacity:1"
+ offset="1"
+ id="stop2908-6" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="5.125"
+ x2="17.625"
+ y1="20.814491"
+ x1="17.625"
+ id="linearGradient4487-4"
+ xlink:href="#linearGradient4481-6"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4481-6">
+ <stop
+ id="stop4483-3"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:1;" />
+ <stop
+ id="stop4485-7"
+ offset="1"
+ style="stop-color:#babdb6;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,-1)"
+ gradientUnits="userSpaceOnUse"
+ y2="28.617105"
+ x2="24.6875"
+ y1="36.75"
+ x1="24.6875"
+ id="linearGradient3740-9"
+ xlink:href="#linearGradient3734-7"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3734-7">
+ <stop
+ id="stop3736-4"
+ offset="0"
+ style="stop-color:#babdb6;stop-opacity:1" />
+ <stop
+ id="stop3738-9"
+ offset="1"
+ style="stop-color:white;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ y2="10.76408"
+ x2="23.176371"
+ y1="10.76408"
+ x1="19.583334"
+ gradientTransform="matrix(1,0,0,0.809211,0,2.763158)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2890-1"
+ xlink:href="#linearGradient2867-7"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2867-7"
+ inkscape:collect="always">
+ <stop
+ id="stop2869-0"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop2871-6"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ y2="15.94703"
+ x2="23.246162"
+ y1="24.761473"
+ x1="23.246162"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2892-0"
+ xlink:href="#linearGradient3815-8"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3815-8"
+ inkscape:collect="always">
+ <stop
+ id="stop3817-5"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ id="stop3819-3"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ y2="10.75"
+ x2="24.508121"
+ y1="6.3608937"
+ x1="21.961548"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2894-9"
+ xlink:href="#linearGradient2877-4"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2877-4"
+ inkscape:collect="always">
+ <stop
+ id="stop2879-1"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop2881-5"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)"
+ r="6.46875"
+ fy="10.432782"
+ fx="22.553526"
+ cy="10.432782"
+ cx="22.553526"
+ id="radialGradient2926-4"
+ xlink:href="#linearGradient2920-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient2920-1"
+ inkscape:collect="always">
+ <stop
+ id="stop2922-5"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop2924-5"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,3)"
+ y2="10.081399"
+ x2="30"
+ y1="10.081399"
+ x1="17.999674"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3567-4"
+ xlink:href="#linearGradient3228-9"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3228-9">
+ <stop
+ id="stop3230-8"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0.42857143;"
+ offset="0.06770357"
+ id="stop3573-3" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0.29894069"
+ id="stop3569-8" />
+ <stop
+ id="stop3571-5"
+ offset="0.77437174"
+ style="stop-color:black;stop-opacity:0.49803922;" />
+ <stop
+ id="stop3232-2"
+ offset="1"
+ style="stop-color:black;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)"
+ gradientUnits="userSpaceOnUse"
+ y2="25.991137"
+ x2="28.357954"
+ y1="3.4711361"
+ x1="20.483149"
+ id="linearGradient3585-2"
+ xlink:href="#linearGradient3579-2"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3579-2"
+ inkscape:collect="always">
+ <stop
+ id="stop3581-7"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop3583-0"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.454646"
+ inkscape:cx="15.221352"
+ inkscape:cy="14.716106"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="872"
+ inkscape:window-height="624"
+ inkscape:window-x="0"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata2166">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <cc:license
+ rdf:resource="http://www.gnu.org/copyleft/gpl.html" />
+ <dc:title>PulseAudio logotype</dc:title>
+ <dc:date>2006-08-28</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Pierre Ossman &lt;ossman@cendio.se&gt; for Cendio AB</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title />
+ </cc:Agent>
+ </dc:rights>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Rafael Jannone (basic idea)</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/SourceCode" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Mic">
+ <g
+ style="display:inline"
+ id="g306"
+ transform="matrix(0.49976071,0,0,0.49976071,3.2433793,5.5836561)">
+ <g
+ style="display:inline"
+ inkscape:label="vectors"
+ id="layer2">
+ <path
+ transform="matrix(0.727673,0,0,1.235135,7.166344,-12.0556)"
+ d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z"
+ sodipodi:ry="6.4081554"
+ sodipodi:rx="12.59534"
+ sodipodi:cy="36.907261"
+ sodipodi:cx="23.82066"
+ id="path3010"
+ style="opacity:0.1;fill:url(#radialGradient3012-3);fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.233813,0,0,1.235135,-4.890235,-6.055598)"
+ d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z"
+ sodipodi:ry="6.4081554"
+ sodipodi:rx="12.59534"
+ sodipodi:cy="36.907261"
+ sodipodi:cx="23.82066"
+ id="path4489"
+ style="opacity:0.7;fill:url(#radialGradient4505-7);fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="opacity:0.2;fill:none;stroke:url(#linearGradient4473-9);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 32.800044,40.588388 C 24.781634,29.5 47,35.875 46.25,32 45.476667,28.004445 36.399824,30.554499 36.875,26.25 37.336541,22.069018 46.75,23.75 44.625,15"
+ id="path4471"
+ sodipodi:nodetypes="czzc" />
+ <path
+ style="fill:none;stroke:url(#linearGradient4460-4);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 32.800044,39.588388 C 24.781634,28.5 47,34.875 46.25,31 45.476667,27.004445 36.399824,29.554499 36.875,25.25 37.336541,21.069018 46.75,22.75 44.625,14"
+ id="path4172"
+ sodipodi:nodetypes="czzc" />
+ <path
+ transform="matrix(1.032128,0,0,1.014402,-0.08596444,1.56074)"
+ d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z"
+ sodipodi:ry="6.4081554"
+ sodipodi:rx="12.59534"
+ sodipodi:cy="36.907261"
+ sodipodi:cx="23.82066"
+ id="path3683"
+ style="fill:url(#radialGradient3691-2);fill-opacity:1;stroke:#555753;stroke-width:0.97730058;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.43667,0,0,0.429141,14.09824,21.41158)"
+ d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z"
+ sodipodi:ry="6.4081554"
+ sodipodi:rx="12.59534"
+ sodipodi:cy="36.907261"
+ sodipodi:cx="23.82066"
+ id="path2955"
+ style="fill:url(#radialGradient2971-1);fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccssccc"
+ id="path3766"
+ d="m 27.35249,32.125 c -1.738654,0.735383 -2.545819,2.052948 -3.67816,3.167277 -0.486309,0.3076 -0.5997,0.709446 -0.51965,1.276685 0.08005,0.567243 0.489446,1.055334 1.042146,1.218184 0.552698,0.162848 0.999547,0.130039 1.377887,-0.302139 C 26.676195,35.285524 28.744563,33.983863 31,32.85591 29.870496,32.536987 28.651039,32.264053 27.35249,32.125 z"
+ style="opacity:0.7;fill:url(#linearGradient3785-7);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
+ <path
+ transform="matrix(1.032128,0,0,1.014402,-0.08596444,1.56074)"
+ d="m 23.8125,31.5 c -3.339495,0 -6.371551,0.683256 -8.46875,1.75 -2.097199,1.066744 -3.125,2.416366 -3.125,3.65625 0,1.239884 1.027801,2.589506 3.125,3.65625 2.097199,1.066744 5.129255,1.750001 8.46875,1.75 3.339495,0 6.371551,-0.683256 8.46875,-1.75 2.097199,-1.066744 3.125,-2.416366 3.125,-3.65625 0,-1.239884 -1.027801,-2.589506 -3.125,-3.65625 C 30.184051,32.183256 27.151995,31.5 23.8125,31.5 z"
+ id="path3697"
+ style="opacity:0.4;fill:none;stroke:url(#linearGradient3709-1);stroke-width:0.97730058;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ inkscape:original="M 23.8125 30.5 C 16.859872 30.5 11.21875 33.368948 11.21875 36.90625 C 11.21875 40.443552 16.859872 43.312502 23.8125 43.3125 C 30.765128 43.3125 36.406249 40.443552 36.40625 36.90625 C 36.40625 33.368948 30.765128 30.5 23.8125 30.5 z "
+ inkscape:radius="-0.99470079"
+ sodipodi:type="inkscape:offset" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3589"
+ d="m 24.5,27.5 0,9"
+ style="fill:none;stroke:url(#linearGradient3732-0);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="csc"
+ id="path2781"
+ d="m 34.500008,18.999997 c -8e-6,4.285711 -4.46,7.500001 -10.000002,7.500001 -5.540002,0 -10.000006,-3.21429 -10.000003,-7.500001"
+ style="fill:none;stroke:#888a85;stroke-width:3.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <rect
+ y="16.499998"
+ x="12.5"
+ height="2.9999995"
+ width="4"
+ id="rect2783"
+ style="fill:url(#linearGradient3801-5);fill-opacity:1;stroke:#888a85;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+ <rect
+ y="16.499998"
+ x="32.5"
+ height="2.9999995"
+ width="4"
+ id="rect3803"
+ style="fill:url(#linearGradient3805-2);fill-opacity:1;stroke:#888a85;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+ <path
+ sodipodi:nodetypes="csc"
+ id="rect1882"
+ d="m 34.500008,18.999991 c 0,4.28571 -4.46,7.500001 -10.000002,7.500001 -5.540002,0 -10.000006,-3.214291 -10.000003,-7.500001"
+ style="fill:none;stroke:url(#linearGradient2987-1);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <rect
+ ry="0.9722718"
+ rx="0.9722718"
+ y="15"
+ x="30"
+ height="6"
+ width="3.0000005"
+ id="rect2951"
+ style="fill:url(#linearGradient2953-8);fill-opacity:1;stroke:none;display:inline" />
+ <path
+ transform="matrix(1.5,0,0,1.5,12.25,-11.25)"
+ d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="19"
+ sodipodi:cx="14"
+ id="path3825"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <rect
+ ry="0.9722718"
+ rx="0.9722718"
+ y="15"
+ x="16"
+ height="6"
+ width="3.0000005"
+ id="rect2787"
+ style="fill:url(#linearGradient2949-0);fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ ry="7.0108709"
+ rx="7.0000019"
+ y="1.5000002"
+ x="17.499996"
+ height="24.000008"
+ width="14.000004"
+ id="rect1880"
+ style="fill:url(#linearGradient2902-2);fill-opacity:1;stroke:url(#linearGradient4487-4);stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3587"
+ d="m 24.5,26.5 0,10"
+ style="fill:none;stroke:url(#linearGradient3740-9);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+ <path
+ transform="matrix(1.5,0,0,1.5,-7.75,-11.25)"
+ d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="19"
+ sodipodi:cx="14"
+ id="path3823"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <g
+ id="g3270"
+ inkscape:label="Shadow"
+ transform="translate(-9.25,46.68088)" />
+ <g
+ transform="translate(-9.25,61.74691)"
+ inkscape:label="Shadow"
+ id="g2611" />
+ <g
+ transform="translate(-9.25,61.74691)"
+ style="display:inline"
+ inkscape:label="Lavoro"
+ id="g2613" />
+ <g
+ id="g2885">
+ <rect
+ style="fill:url(#linearGradient2890-1);fill-opacity:1;stroke:none;display:inline"
+ id="rect1975"
+ width="4"
+ height="15.374996"
+ x="20"
+ y="6"
+ rx="2"
+ ry="2.1991496" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-0.54470092"
+ inkscape:original="M 24.5 2.5 C 20.621999 2.5 17.5 5.615977 17.5 9.5 L 17.5 19.5 C 17.5 23.384022 20.621999 26.5 24.5 26.5 C 28.378001 26.5 31.5 23.384022 31.5 19.5 L 31.5 9.5 C 31.5 5.6159775 28.378001 2.5 24.5 2.5 z "
+ style="opacity:0.2;fill:url(#linearGradient2892-0);fill-opacity:1;stroke:none;display:inline"
+ id="path3811"
+ d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,10 c 0,3.592133 2.882528,6.46875 6.46875,6.46875 3.586222,0 6.46875,-2.876617 6.46875,-6.46875 l 0,-10 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z"
+ transform="translate(0,-1)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient2894-9);fill-opacity:1;stroke:none"
+ id="path2875"
+ sodipodi:cx="23.65625"
+ sodipodi:cy="7.6875"
+ sodipodi:rx="3.34375"
+ sodipodi:ry="3.0625"
+ d="M 27,7.6875 C 27,9.378872 25.502952,10.75 23.65625,10.75 21.809548,10.75 20.3125,9.378872 20.3125,7.6875 20.3125,5.996128 21.809548,4.625 23.65625,4.625 25.502952,4.625 27,5.996128 27,7.6875 z"
+ transform="matrix(1,0,0,1.081633,-0.375,-1.252551)" />
+ </g>
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path2916"
+ d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,5 12.9375,0 0,-5 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z"
+ style="opacity:0.9;fill:url(#radialGradient2926-4);fill-opacity:1;stroke:none;display:inline"
+ transform="translate(0,-1)" />
+ </g>
+ <g
+ style="display:inline"
+ inkscape:label="buchi"
+ id="layer3">
+ <path
+ sodipodi:nodetypes="csssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssc"
+ id="path2902"
+ d="M 22.5,3 C 22.224,3 22,3.224 22,3.5 22,3.776 22.224,4 22.5,4 22.776,4 23,3.776 23,3.5 23,3.224 22.776,3 22.5,3 z m 2,0 C 24.224,3 24,3.224 24,3.5 24,3.776 24.224,4 24.5,4 24.776,4 25,3.776 25,3.5 25,3.224 24.776,3 24.5,3 z m 2,0 C 26.224,3 26,3.224 26,3.5 26,3.776 26.224,4 26.5,4 26.776,4 27,3.776 27,3.5 27,3.224 26.776,3 26.5,3 z m -5,1 C 21.224,4 21,4.224 21,4.5 21,4.776 21.224,5 21.5,5 21.776,5 22,4.776 22,4.5 22,4.224 21.776,4 21.5,4 z m 2,0 C 23.224,4 22.999999,4.2240007 23,4.5 23,4.7759993 23.223999,5 23.5,5 23.776,5 24,4.7759993 24,4.5 24,4.2240007 23.776,4 23.5,4 z m 2,0 C 25.224,4 24.999999,4.2240007 25,4.5 25,4.7759993 25.223999,5 25.5,5 25.776,5 26,4.7759993 26,4.5 26,4.2240007 25.776,4 25.5,4 z m 2,0 C 27.224,4 27,4.224 27,4.5 27,4.776 27.224,5 27.5,5 27.776,5 28,4.776 28,4.5 28,4.224 27.776,4 27.5,4 z m -7,1 C 20.224,5 19.999999,5.2240008 20,5.5 20,5.7759993 20.223999,6 20.5,6 20.776,6 21,5.7759994 21,5.5 21,5.2240007 20.776,5 20.5,5 z m 2,0 C 22.224,5 21.999999,5.2240008 22,5.5 22,5.7759993 22.223999,6 22.5,6 22.776,6 23,5.7759994 23,5.5 23,5.2240007 22.776,5 22.5,5 z m 2,0 C 24.224,5 23.999999,5.2240008 24,5.5 24,5.7759993 24.223999,6 24.5,6 24.776,6 25,5.7759994 25,5.5 25,5.2240007 24.776,5 24.5,5 z m 2,0 C 26.224,5 25.999999,5.2240008 26,5.5 26,5.7759993 26.223999,6 26.5,6 26.776,6 27,5.7759994 27,5.5 27,5.2240007 26.776,5 26.5,5 z m 2,0 C 28.224,5 28,5.224 28,5.5 28,5.776 28.224,6 28.5,6 28.776,6 29,5.776 29,5.5 29,5.224 28.776,5 28.5,5 z m -9,1 C 19.224,6 18.999999,6.2240008 19,6.5 19,6.7759993 19.223999,7 19.5,7 19.776,7 20,6.7759994 20,6.5 20,6.2240007 19.776,6 19.5,6 z m 2,0 C 21.224,6 20.999999,6.2240008 21,6.5 21,6.7759993 21.223999,7 21.5,7 21.776,7 22,6.7759994 22,6.5 22,6.2240007 21.776,6 21.5,6 z m 2,0 C 23.224,6 22.999999,6.2240008 23,6.5 23,6.7759993 23.223999,7 23.5,7 23.776,7 24,6.7759994 24,6.5 24,6.2240007 23.776,6 23.5,6 z m 2,0 C 25.224,6 24.999999,6.2240008 25,6.5 25,6.7759993 25.223999,7 25.5,7 25.776,7 26,6.7759994 26,6.5 26,6.2240007 25.776,6 25.5,6 z m 2,0 C 27.224,6 26.999999,6.2240008 27,6.5 27,6.7759993 27.223999,7 27.5,7 27.776,7 28,6.7759994 28,6.5 28,6.2240007 27.776,6 27.5,6 z m 2,0 C 29.224,6 29,6.224 29,6.5 29,6.776 29.224,7 29.5,7 29.776,7 30,6.776 30,6.5 30,6.224 29.776,6 29.5,6 z m -9,1 C 20.224,7 19.999999,7.2240008 20,7.5 20,7.7759993 20.223999,8.0000002 20.5,8 20.776,8 21,7.7759994 21,7.5 21,7.2240007 20.776,7 20.5,7 z m 2,0 C 22.224,7 21.999999,7.2240008 22,7.5 22,7.7759993 22.223999,8.0000002 22.5,8 22.776,8 23,7.7759994 23,7.5 23,7.2240007 22.776,7 22.5,7 z m 2,0 C 24.224,7 23.999999,7.2240008 24,7.5 24,7.7759993 24.223999,8.0000002 24.5,8 24.776,8 25,7.7759994 25,7.5 25,7.2240007 24.776,7 24.5,7 z m 2,0 C 26.224,7 25.999999,7.2240008 26,7.5 26,7.7759993 26.223999,8.0000002 26.5,8 26.776,8 27,7.7759994 27,7.5 27,7.2240007 26.776,7 26.5,7 z m 2,0 C 28.224,7 27.999999,7.2240008 28,7.5 28,7.7759993 28.223999,8.0000002 28.5,8 28.776,8 29,7.7759994 29,7.5 29,7.2240007 28.776,7 28.5,7 z m 2,0 C 30.224,7 30,7.224 30,7.5 30,7.776 30.224,8 30.5,8 30.776,8 31,7.776 31,7.5 31,7.224 30.776,7 30.5,7 z m -11,1 C 19.224,8 18.999999,8.2240008 19,8.5 19,8.7759993 19.223999,9 19.5,9 19.776,9 20,8.7759994 20,8.5 20,8.2240007 19.776,8 19.5,8 z m 2,0 C 21.224,8 20.999999,8.2240008 21,8.5 21,8.7759993 21.223999,9 21.5,9 21.776,9 22,8.7759994 22,8.5 22,8.2240007 21.776,8 21.5,8 z m 2,0 C 23.224,8 22.999999,8.2240008 23,8.5 23,8.7759993 23.223999,9 23.5,9 23.776,9 24,8.7759994 24,8.5 24,8.2240007 23.776,8 23.5,8 z m 2,0 C 25.224,8 24.999999,8.2240008 25,8.5 25,8.7759993 25.223999,9 25.5,9 25.776,9 26,8.7759994 26,8.5 26,8.2240007 25.776,8 25.5,8 z m 2,0 C 27.224,8 26.999999,8.2240008 27,8.5 27,8.7759993 27.223999,9 27.5,9 27.776,9 28,8.7759994 28,8.5 28,8.2240007 27.776,8 27.5,8 z m 2,0 C 29.224,8 28.999999,8.2240008 29,8.5 29,8.7759993 29.223999,9 29.5,9 29.776,9 30,8.7759994 30,8.5 30,8.2240007 29.776,8 29.5,8 z m -11,1 C 18.224,9 17.999999,9.224001 18,9.5 18,9.775999 18.223999,10 18.5,10 18.776,10 19,9.775999 19,9.5 19,9.224001 18.776,9 18.5,9 z m 2,0 C 20.224,9 19.999999,9.224001 20,9.5 20,9.775999 20.223999,10 20.5,10 20.776,10 21,9.775999 21,9.5 21,9.224001 20.776,9 20.5,9 z m 2,0 C 22.224,9 21.999999,9.224001 22,9.5 22,9.775999 22.223999,10 22.5,10 22.776,10 23,9.775999 23,9.5 23,9.224001 22.776,9 22.5,9 z m 2,0 C 24.224,9 23.999999,9.224001 24,9.5 24,9.775999 24.223999,10 24.5,10 24.776,10 25,9.775999 25,9.5 25,9.224001 24.776,9 24.5,9 z m 2,0 C 26.224,9 25.999999,9.224001 26,9.5 26,9.775999 26.223999,10 26.5,10 26.776,10 27,9.775999 27,9.5 27,9.224001 26.776,9 26.5,9 z m 2,0 C 28.224,9 27.999999,9.224001 28,9.5 28,9.775999 28.223999,10 28.5,10 28.776,10 29,9.775999 29,9.5 29,9.224001 28.776,9 28.5,9 z m 2,0 C 30.224,9 30,9.224 30,9.5 30,9.776 30.224,10 30.5,10 30.776,10 31,9.776 31,9.5 31,9.224 30.776,9 30.5,9 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,11 20,10.775999 20,10.5 20,10.224001 19.776,10 19.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,11 22,10.775999 22,10.5 22,10.224001 21.776,10 21.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,11 24,10.775999 24,10.5 24,10.224001 23.776,10 23.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,11 26,10.775999 26,10.5 26,10.224001 25.776,10 25.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,11 28,10.775999 28,10.5 28,10.224001 27.776,10 27.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,11 30,10.775999 30,10.5 30,10.224001 29.776,10 29.5,10 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,12 19,11.775999 19,11.5 19,11.224001 18.776,11 18.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,12 21,11.775999 21,11.5 21,11.224001 20.776,11 20.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,12 23,11.775999 23,11.5 23,11.224001 22.776,11 22.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,12 25,11.775999 25,11.5 25,11.224001 24.776,11 24.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,12 27,11.775999 27,11.5 27,11.224001 26.776,11 26.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,12 29,11.775999 29,11.5 29,11.224001 28.776,11 28.5,11 z m 2,0 C 30.224,11 30,11.224 30,11.5 30,11.776 30.224,12 30.5,12 30.776,12 31,11.776 31,11.5 31,11.224 30.776,11 30.5,11 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,13 20,12.775999 20,12.5 20,12.224001 19.776,12 19.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,13 22,12.775999 22,12.5 22,12.224001 21.776,12 21.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,13 24,12.775999 24,12.5 24,12.224001 23.776,12 23.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,13 26,12.775999 26,12.5 26,12.224001 25.776,12 25.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,13 28,12.775999 28,12.5 28,12.224001 27.776,12 27.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,13 30,12.775999 30,12.5 30,12.224001 29.776,12 29.5,12 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,14 19,13.775999 19,13.5 19,13.224001 18.776,13 18.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,14 21,13.775999 21,13.5 21,13.224001 20.776,13 20.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,14 23,13.775999 23,13.5 23,13.224001 22.776,13 22.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,14 25,13.775999 25,13.5 25,13.224001 24.776,13 24.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,14 27,13.775999 27,13.5 27,13.224001 26.776,13 26.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,14 29,13.775999 29,13.5 29,13.224001 28.776,13 28.5,13 z m 2,0 C 30.224,13 30,13.224 30,13.5 30,13.776 30.224,14 30.5,14 30.776,14 31,13.776 31,13.5 31,13.224 30.776,13 30.5,13 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,15 20,14.775999 20,14.5 20,14.224001 19.776,14 19.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,15 22,14.775999 22,14.5 22,14.224001 21.776,14 21.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,15 24,14.775999 24,14.5 24,14.224001 23.776,14 23.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,15 26,14.775999 26,14.5 26,14.224001 25.776,14 25.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,15 28,14.775999 28,14.5 28,14.224001 27.776,14 27.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,15 30,14.775999 30,14.5 30,14.224001 29.776,14 29.5,14 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,16 19,15.775999 19,15.5 19,15.224001 18.776,15 18.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,16 21,15.775999 21,15.5 21,15.224001 20.776,15 20.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,16 23,15.775999 23,15.5 23,15.224001 22.776,15 22.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,16 25,15.775999 25,15.5 25,15.224001 24.776,15 24.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,16 27,15.775999 27,15.5 27,15.224001 26.776,15 26.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,16 29,15.775999 29,15.5 29,15.224001 28.776,15 28.5,15 z m 2,0 C 30.224,15 30,15.224 30,15.5 30,15.776 30.224,16 30.5,16 30.776,16 31,15.776 31,15.5 31,15.224 30.776,15 30.5,15 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,17 20,16.776 20,16.5 20,16.224001 19.776,16 19.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,17 22,16.776 22,16.5 22,16.224001 21.776,16 21.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,17 24,16.776 24,16.5 24,16.224001 23.776,16 23.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,17 26,16.776 26,16.5 26,16.224001 25.776,16 25.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,17 28,16.776 28,16.5 28,16.224001 27.776,16 27.5,16 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,17 30,16.775999 30,16.5 30,16.224001 29.776,16 29.5,16 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,18 19,17.776 19,17.5 19,17.224001 18.776,17 18.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,18 21,17.776 21,17.5 21,17.224001 20.776,17 20.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,18 23,17.776 23,17.5 23,17.224001 22.776,17 22.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,18 25,17.776 25,17.5 25,17.224001 24.776,17 24.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,18 27,17.776 27,17.5 27,17.224001 26.776,17 26.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,18 29,17.776 29,17.5 29,17.224001 28.776,17 28.5,17 z m 2,0 C 30.224,17 30,17.224 30,17.5 30,17.776 30.224,18 30.5,18 30.776,18 31,17.776 31,17.5 31,17.224 30.776,17 30.5,17 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,19 20,18.776 20,18.5 20,18.224001 19.776,18 19.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,19 22,18.776 22,18.5 22,18.224001 21.776,18 21.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,19 24,18.776 24,18.5 24,18.224001 23.776,18 23.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,19 26,18.776 26,18.5 26,18.224001 25.776,18 25.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,19 28,18.776 28,18.5 28,18.224001 27.776,18 27.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,19 30,18.776 30,18.5 30,18.224001 29.776,18 29.5,18 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 18.776,20 19,19.776 19,19.5 19,19.224001 18.776,19 18.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 20.776,20 21,19.776 21,19.5 21,19.224001 20.776,19 20.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,20 23,19.776 23,19.5 23,19.224001 22.776,19 22.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,20 25,19.776 25,19.5 25,19.224001 24.776,19 24.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,20 27,19.776 27,19.5 27,19.224001 26.776,19 26.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 28.776,20 29,19.776 29,19.5 29,19.224001 28.776,19 28.5,19 z m 2,0 C 30.224,19 30,19.224 30,19.5 30,19.776 30.224,20 30.5,20 30.776,20 31,19.776 31,19.5 31,19.224 30.776,19 30.5,19 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 19.776,21 20,20.776 20,20.5 20,20.224001 19.776,20 19.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 21.776,21 22,20.776 22,20.5 22,20.224001 21.776,20 21.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,21 24,20.776 24,20.5 24,20.224001 23.776,20 23.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,21 26,20.776 26,20.5 26,20.224001 25.776,20 25.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 27.776,21 28,20.776 28,20.5 28,20.224001 27.776,20 27.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 29.776,21 30,20.776 30,20.5 30,20.224001 29.776,20 29.5,20 z m -9,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 20.776,22 21,21.776 21,21.5 21,21.224001 20.776,21 20.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,22 23,21.776 23,21.5 23,21.224001 22.776,21 22.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,22 25,21.776 25,21.5 25,21.224001 24.776,21 24.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,22 27,21.776 27,21.5 27,21.224001 26.776,21 26.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 28.776,22 29,21.776 29,21.5 29,21.224001 28.776,21 28.5,21 z m -7,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 21.776,23 22,22.776 22,22.5 22,22.224001 21.776,22 21.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,23 24,22.776 24,22.5 24,22.224001 23.776,22 23.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,23 26,22.776 26,22.5 26,22.224001 25.776,22 25.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 27.776,23 28,22.776 28,22.5 28,22.224001 27.776,22 27.5,22 z m -5,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,24 23,23.776 23,23.5 23,23.224001 22.776,23 22.5,23 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,24 25,23.776 25,23.5 25,23.224001 24.776,23 24.5,23 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,24 27,23.776 27,23.5 27,23.224001 26.776,23 26.5,23 z m -3,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,25 24,24.776 24,24.5 24,24.224001 23.776,24 23.5,24 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,25 26,24.776 26,24.5 26,24.224001 25.776,24 25.5,24 z"
+ style="opacity:0.5;fill:url(#linearGradient3567-4);fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ ry="6.0500031"
+ rx="6.0000024"
+ y="2.5000026"
+ x="18.500008"
+ height="22.000008"
+ width="12.000005"
+ id="rect3575"
+ style="fill:none;stroke:url(#linearGradient3585-2);stroke-width:1.0000006;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ transform="translate(-9.6490002,-6.236078)"
+ style="display:inline">
+ <g
+ id="g781"
+ transform="matrix(0.88131313,0,0,0.88131313,2.9517844,0.78404468)">
+ <path
+ style="fill:#729fcf;fill-opacity:1;stroke:none"
+ d="m 22.365786,11.528391 c -4.16858,1.106752 -7.242777,4.906525 -7.242774,9.421848 0,4.51531 3.074196,8.318988 7.242774,9.42574 -3.007226,-1.349598 -5.168955,-5.062913 -5.168955,-9.42574 -1e-6,-4.362815 2.161728,-8.07225 5.168955,-9.421848 z m 5.009131,0 c 3.007227,1.349598 5.168955,5.059021 5.168955,9.421848 0,4.362827 -2.161729,8.076142 -5.168955,9.42574 4.16858,-1.106752 7.242777,-4.91043 7.242774,-9.42574 0,-4.515311 -3.074193,-8.315096 -7.242774,-9.421848 z"
+ id="path2419" />
+ <path
+ id="path2421"
+ d="M 20.959247,6.236078 C 14.449633,7.9643721 9.6489964,13.898061 9.6490002,20.949142 c 0,7.05107 4.8006348,12.990862 11.3102468,14.719148 -4.696056,-2.107524 -8.071791,-7.906196 -8.071791,-14.719148 -2e-6,-6.812926 3.375734,-12.6055448 8.071791,-14.713064 z m 7.82221,0 c 4.696057,2.1075192 8.07179,7.900118 8.07179,14.713064 0,6.812952 -3.375735,12.611624 -8.07179,14.719148 6.509614,-1.728286 11.31025,-7.668078 11.310246,-14.719148 0,-7.051061 -4.80063,-12.9847699 -11.310246,-14.713064 z"
+ style="fill:#729fcf;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="center"
+ style="display:none">
+ <path
+ transform="matrix(0.2091112,0,0,0.2091112,15.430463,-165.87494)"
+ d="m 22,863.61249 a 23,23 0 1 1 -46,0 23,23 0 1 1 46,0 z"
+ sodipodi:ry="23"
+ sodipodi:rx="23"
+ sodipodi:cy="863.61249"
+ sodipodi:cx="-1"
+ id="path2417"
+ style="fill:#729fcf;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+</svg>
diff --git a/pulsecaster/data/pulsecaster.glade b/pulsecaster/data/pulsecaster.glade
new file mode 100644
index 0000000..62caabf
--- /dev/null
+++ b/pulsecaster/data/pulsecaster.glade
@@ -0,0 +1,451 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkAboutDialog" id="about_dialog">
+ <property name="border_width">5</property>
+ <property name="resizable">False</property>
+ <property name="window_position">center-always</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">normal</property>
+ <property name="has_separator">False</property>
+ <property name="authors"></property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkDialog" id="main_dialog">
+ <property name="border_width">5</property>
+ <property name="default_width">300</property>
+ <property name="icon">icons/scalable/pulsecaster.svg</property>
+ <property name="type_hint">normal</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkImage" id="logo">
+ <property name="visible">True</property>
+ <property name="xpad">10</property>
+ <property name="pixbuf">icons/48x48/pulsecaster-48.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="main_title">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.40000000596046448</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">10</property>
+ <property name="ypad">10</property>
+ <property name="label" translatable="yes">&lt;i&gt;Select the audio sources to mix, and a destination file for saving the resulting audio.&lt;/i&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">5</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">10</property>
+ <property name="label" translatable="yes">Your voice:</property>
+ <property name="justify">right</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">10</property>
+ <property name="label" translatable="yes">Subject's voice:</property>
+ <property name="justify">right</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">10</property>
+ <property name="label" translatable="yes">Destination file:</property>
+ <property name="justify">right</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="destfile_label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_markup">True</property>
+ <property name="ellipsize">middle</property>
+ <property name="width_chars">30</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="open_button">
+ <property name="label" translatable="yes">Browse...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area2">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="about_button">
+ <property name="label">gtk-about</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ <property name="secondary">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="close_button">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="gtk_main_quit"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="record_button">
+ <property name="label">gtk-media-record</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">about_button</action-widget>
+ <action-widget response="0">close_button</action-widget>
+ <action-widget response="0">record_button</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkFileChooserDialog" id="file_chooser">
+ <property name="border_width">5</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">normal</property>
+ <property name="has_separator">False</property>
+ <property name="local_only">False</property>
+ <property name="action">save</property>
+ <property name="do_overwrite_confirmation">True</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox4">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area4">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="file_chooser_cancel_button">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="file_chooser_save_button">
+ <property name="label">gtk-save</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <property name="xalign">0.43999999761581421</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">file_chooser_cancel_button</action-widget>
+ <action-widget response="0">file_chooser_save_button</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkWindow" id="warning">
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="urgency_hint">True</property>
+ <child>
+ <object class="GtkVBox" id="warning-vbox">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkHBox" id="warning-hbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="yalign">0</property>
+ <property name="stock">gtk-dialog-warning</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="warning-vbox2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="warning-label2">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;big&gt;&lt;big&gt;&lt;b&gt;&lt;i&gt;Important notice&lt;/i&gt;&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="warning-label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">This program can be used to record speech
+from remote locations. You are responsible
+for adhering to all applicable laws and
+regulations when using this program. In
+general you should not record other parties
+without their consent.</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="skip_warn_checkbox">
+ <property name="label" translatable="yes">_Do not show this again</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="spacing">10</property>
+ <property name="homogeneous">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="dismiss_warning">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/pulsecaster/gconfig.py b/pulsecaster/gconfig.py
new file mode 100644
index 0000000..d956d42
--- /dev/null
+++ b/pulsecaster/gconfig.py
@@ -0,0 +1,44 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2009 Paul W. Frields
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Paul W. Frields <stickster@gmail.com>
+
+
+import gconf
+from config import *
+
+class PulseCasterGconf:
+ def __init__(self):
+ self.dirbase = '/apps/' + NAME
+ self.client = gconf.client_get_default()
+ if self.client.dir_exists(self.dirbase) is False:
+ self.client.add_dir(self.dirbase, gconf.CLIENT_PRELOAD_NONE)
+
+ self.skip_warn = self.client.get_bool(self.dirbase + '/skip_warning')
+ if self.skip_warn is None or type(self.skip_warn) is not bool:
+ self.skip_warn = False
+
+ self.vorbisq = self.client.get(self.dirbase + '/vorbisq')
+ if type(self.vorbisq) is not int:
+ self.vorbisq = 4
+ self.client.set_int(self.dirbase + '/vorbisq', self.vorbisq)
+
+ def change_warn(self, val):
+ if type(val) is not bool:
+ raise ValueError, "requires bool value"
+ self.client.set_bool(self.dirbase + '/skip_warning', val)
diff --git a/pulsecaster/listener.py b/pulsecaster/listener.py
new file mode 100644
index 0000000..be3ee23
--- /dev/null
+++ b/pulsecaster/listener.py
@@ -0,0 +1,18 @@
+import dbus
+import dbus.mainloop.glib
+
+class PulseCasterListener:
+ def __init__(self, ui):
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+ self.bus = dbus.SystemBus()
+
+ self.bus.add_signal_receiver(ui.repop_sources,
+ signal_name='DeviceAdded',
+ dbus_interface='org.freedesktop.Hal.Manager',
+ path='/org/freedesktop/Hal/Manager')
+ self.bus.add_signal_receiver(ui.repop_sources,
+ signal_name='DeviceRemoved',
+ dbus_interface='org.freedesktop.Hal.Manager',
+ path='/org/freedesktop/Hal/Manager')
+
+
diff --git a/pulsecaster/pulseaudio/PulseClient.py b/pulsecaster/pulseaudio/PulseClient.py
new file mode 100644
index 0000000..6705080
--- /dev/null
+++ b/pulsecaster/pulseaudio/PulseClient.py
@@ -0,0 +1,66 @@
+#!/usr/bin/python
+# vi: et sw=2
+#
+# PulseClient.py
+# Copyright (C) 2009 Harry Karvonen
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Harry Karvonen <harry.karvonen@gmail.com>
+#
+
+from lib_pulseaudio import *
+
+# This class contains all basic client features
+class PulseClient:
+ def __init__(self, name, index = 0):
+ self.index = index
+ self.name = name
+ return
+
+ ###
+
+ def printDebug(self):
+ print "self.index:", self.index
+ print "self.name:", self.name
+ return
+
+ ###
+
+ def __str__(self):
+ return "Client-ID: " + str(self.index) + ", Name: \"" + self.name + "\""
+
+################################################################################
+
+# This class is used with Ctypes
+class PulseClientCtypes(PulseClient):
+ def __init__(self, pa_client):
+ PulseClient.__init__(self, pa_client.name, pa_client.index)
+
+ self.owner_module = pa_client.owner_module
+ self.driver = pa_client.driver
+ #self.proplist = pa_sink_input_info.proplist
+ return
+
+ ###
+
+ def printDebug(self):
+ print "PulseClientCtypes"
+ PulseClient.printDebug(self)
+ print "self.owner_module:", self.owner_module
+ print "self.driver:", self.driver
+ #print "self.proplist:", self.proplist
+ return
+
diff --git a/pulsecaster/pulseaudio/PulseObj.py b/pulsecaster/pulseaudio/PulseObj.py
new file mode 100644
index 0000000..98c4105
--- /dev/null
+++ b/pulsecaster/pulseaudio/PulseObj.py
@@ -0,0 +1,623 @@
+#!/usr/bin/python
+# vi: et sw=2
+#
+# PulseObj.py
+# Copyright (C) 2009 Harry Karvonen
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Harry Karvonen <harry.karvonen@gmail.com>
+#
+
+from lib_pulseaudio import *
+from PulseSink import PulseSinkInputInfo, PulseSinkInfo
+from PulseSource import PulseSourceOutputInfo, PulseSourceInfo
+from PulseClient import PulseClientCtypes
+
+################################################################################
+#
+# Classes
+#
+################################################################################
+
+class PulseObj:
+ "Basic PulseAudio object"
+
+ ##############################################################################
+ #
+ # Init
+ #
+ ##############################################################################
+
+ def __init__(self, server = None, retry = False, clientName = 'Unknown (Python)'):
+ "Initialise pulseaudio connection"
+
+ # Variables
+ self.server = server
+ self.mainloop = None
+ self.mainloop_api = None
+ self.context = None
+ self.ret = None
+ self.retry = retry
+ self.operation = None
+ self.connected = False
+ self.action_done = False
+ self.data = None
+
+ # Init
+
+ #
+ # Callbacks
+ #
+ self.PA_SIGNAL_CB = PA_SIGNAL_CB_T(self.py_signal_cb)
+
+ self.PA_STATE_CB = PA_STATE_CB_T(self.py_state_cb)
+ #
+ # Mainloop init
+ #
+ self.mainloop = pa_mainloop_new()
+
+ self.mainloop_api = pa_mainloop_get_api(self.mainloop)
+
+ #
+ # Signal binding
+ #
+ r = pa_signal_init(self.mainloop_api)
+
+ if r != 0:
+ # FIXME
+ print "FIXME Do something. Something is wrong"
+
+ # SIGINT
+ pa_signal_new(2, self.PA_SIGNAL_CB, None)
+
+ # SIGTERM
+ pa_signal_new(15, self.PA_SIGNAL_CB, None)
+
+ #
+ # Context creating
+ #
+ self.context = pa_context_new(self.mainloop_api, clientName)
+
+ pa_context_set_state_callback(self.context, self.PA_STATE_CB, None)
+
+ self.start_action()
+
+ #
+ # Connect
+ #
+ if 0 > pa_context_connect(self.context,
+ self.server,
+ 0,
+ None):
+ if self.retry:
+ pa_context_disconnect(self.context)
+ return
+ self.pulse_context_error()
+
+ self.pulse_iterate()
+
+ return
+
+ ##############################################################################
+ #
+ # Callback methods
+ #
+ # FIXME: rename methods better
+ #
+ ##############################################################################
+
+ def py_signal_cb(self, api, e, sig, userdata):
+ #print "py_signal_cb:", api, e, sig, userdata
+
+ if sig == 2:
+ self.pulse_disconnect()
+ elif sig == 15:
+ self.pulse_disconnect()
+
+ return 0
+
+ ###
+
+ def py_state_cb(self, c, b):
+ #print "py_state_cb:", c[0]._opaque_struct, b
+ state = pa_context_get_state(c);
+
+
+ if state == 0:
+ None
+ #print "py_state_cb: Unconnected"
+
+ elif state == 1:
+ None
+ #print "py_state_cb: Connecting"
+
+ elif state == 2:
+ None
+ #print "py_state_cb: Authorizing"
+
+ elif state == 3:
+ None
+ #print "py_state_cb: Setting name"
+
+ elif state == 4:
+ #print "py_state_cb: Ready"
+ self.complete_action()
+ self.connected = True
+
+ elif state == 5:
+ None
+ #print "py_state_cb: Failed"
+
+ elif state == 6:
+ None
+ #print "py_state_cb: Terminated"
+ if not self.retry:
+ import sys
+ sys.exit(pa_context_errno(c))
+
+ self.complete_action()
+
+ else:
+ None
+ #print "py_state_cb: Unknown state", state
+
+
+ #print "py_state_cb:", pa_strerror(pa_context_errno(c))
+ return 0
+
+ ###
+
+ def py_client_cb(self, c, client_info, endofdata, userdata):
+ "Sink callback"
+ #print "py_client_cb:", c, client_info, endofdata, userdata
+
+ if (endofdata):
+ self.complete_action()
+ return 0
+
+ if self.data == None:
+ self.data = [ PulseClientCtypes(client_info[0]) ]
+ else:
+ self.data.append(PulseClientCtypes(client_info[0]))
+
+ return 0
+
+ ###
+
+ def py_sink_input_cb(self, c, sink_input_info, endofdata, userdata):
+ "Sink input callback"
+ #print "py_sink_input_cb:", c, sink_input_info, endofdata, userdata
+
+ if (endofdata):
+ self.complete_action()
+ return 0
+
+ if self.data == None:
+ self.data = [ PulseSinkInputInfo(sink_input_info[0]) ]
+ else:
+ self.data.append(PulseSinkInputInfo(sink_input_info[0]))
+
+ return 0
+
+ ###
+
+ def py_sink_cb(self, c, sink_info, endofdata, userdata):
+ "Sink callback"
+ #print "py_sink_cb:", c, sink_info, endofdata, userdata
+
+ if (endofdata):
+ self.complete_action()
+ return 0
+
+ if self.data == None:
+ self.data = [ PulseSinkInfo(sink_info[0]) ]
+ else:
+ self.data.append(PulseSinkInfo(sink_info[0]))
+
+ return 0
+ ###
+
+ def py_source_output_cb(self, c, source_output_info, endofdata, userdata):
+ "Source output callback"
+ #print "py_source_output_cb:", c, source_output_info, endofdata, userdata
+
+ if (endofdata):
+ self.complete_action()
+ return 0
+
+ if self.data == None:
+ self.data = [ PulseSourceOutputInfo(source_output_info[0]) ]
+ else:
+ self.data.append(PulseSourceOutputInfo(source_output_info[0]))
+
+ return 0
+
+ ###
+
+ def py_source_cb(self, c, source_info, endofdata, userdata):
+ "Source callback"
+ #print "py_source_cb:", c, source_info, endofdata, userdata
+
+ if (endofdata):
+ self.complete_action()
+ return 0
+
+ if self.data == None:
+ self.data = [ PulseSourceInfo(source_info[0]) ]
+ else:
+ self.data.append(PulseSourceInfo(source_info[0]))
+
+ return 0
+ ###
+
+ def py_drain_cb(self, c, userdata):
+ #print "py_drain_cb: called"
+ return
+
+ ###
+
+ def py_subscribe_cb(self, c, event, index, userdata):
+ print 'py_subscribe_cb: called'
+ print 'py_subscribe_cb:', c, event, index, userdata
+ self.complete_action()
+ return 0
+
+ def py_context_success(self, c, success, userdata):
+ if success == 0:
+ None
+ #print "py_context_success: Failed"
+ else:
+ None
+ #print "py_context_success: Success"
+
+ self.complete_action()
+ return 0
+
+ ##############################################################################
+ #
+ ##############################################################################
+
+ def complete_action(self):
+ "Completed action"
+ #print "complete_action: Called"
+ self.action_done = True
+ return
+
+ ###
+
+ def start_action(self):
+ "Call every time when starting action"
+ #print "start_action: Called"
+ self.action_done = False
+ return
+
+ ###
+
+ def pulse_disconnect(self):
+ "Call when disconnect object"
+
+ #print "pulse_disconnect: Disconnecting"
+ pa_context_disconnect(self.context)
+ pa_mainloop_free(self.mainloop)
+ return
+
+ ###
+
+ def pulse_context_error(self):
+ "Print context error msg"
+
+ #print "pulse_context_error:", pa_strerror(pa_context_errno(self.context))
+ self.pulse_disconnect()
+ return
+
+ ###
+
+ def pulse_sink_input_list(self):
+ "List all sink input"
+ #print "pulse_sink_input_list: Called";
+
+ return_data = None
+
+ self.start_action()
+
+ # Callback function
+ SINK_INPUT_LIST_CB = PA_SINK_INPUT_INFO_CB_T(self.py_sink_input_cb)
+
+ self.operation = pa_context_get_sink_input_info_list(self.context,
+ SINK_INPUT_LIST_CB,
+ None)
+ self.pulse_iterate()
+
+ #print "pulse_sink_input_list:", self.data
+ return_data = self.data
+ self.data = None
+
+ return return_data
+
+ ###
+
+ def pulse_sink_list(self):
+ "List all sinks"
+ #print "pulse_sink_list: Called";
+
+ return_data = None
+
+ self.start_action()
+
+ # Callback function
+ SINK_LIST_CB = PA_SINK_INFO_CB_T(self.py_sink_cb)
+
+ self.operation = pa_context_get_sink_info_list(self.context,
+ SINK_LIST_CB,
+ None)
+ self.pulse_iterate()
+
+ #print "pulse_sink_list:", self.data
+ return_data = self.data
+ self.data = None
+
+ return return_data
+
+ ###
+
+ def pulse_source_output_list(self):
+ "List all source outputs"
+ #print "pulse_source_output_list: Called";
+
+ return_data = None
+
+ self.start_action()
+
+ # Callback function
+ SOURCE_OUTPUT_LIST_CB = PA_SOURCE_OUTPUT_INFO_CB_T(self.py_source_output_cb)
+
+ self.operation = pa_context_get_source_output_info_list(self.context,
+ SOURCE_OUTPUT_LIST_CB,
+ None)
+ self.pulse_iterate()
+
+ #print "pulse_source_output_list:", self.data
+ return_data = self.data
+ self.data = None
+
+ return return_data
+
+ ###
+
+ def pulse_source_list(self):
+ "List all sources"
+ #print "pulse_source_list: Called";
+
+ return_data = None
+
+ self.start_action()
+
+ # Callback function
+ SOURCE_LIST_CB = PA_SOURCE_INFO_CB_T(self.py_source_cb)
+
+ self.operation = pa_context_get_source_info_list(self.context,
+ SOURCE_LIST_CB,
+ None)
+ self.pulse_iterate()
+
+ #print "pulse_source_list:", self.data
+ return_data = self.data
+ self.data = None
+
+ return return_data
+
+ ###
+ def pulse_client_list(self):
+ "Fetch all clients"
+
+ self.start_action()
+
+ CLIENT_INFO_CB = PA_CLIENT_INFO_CB_T(self.py_client_cb)
+
+ self.operation = pa_context_get_client_info_list(self.context,
+ CLIENT_INFO_CB,
+ None)
+
+ self.pulse_iterate()
+
+ #print "pulse_client_list:", self.data
+ return_data = self.data
+ self.data = None
+
+ return return_data
+
+ ###
+
+ def pulse_sink_input_mute(self, index, mute):
+ "Mute one stream by index"
+
+ self.start_action()
+
+ CONTEXT_SUCCESS = PA_CONTEXT_SUCCESS_CB_T(self.py_context_success)
+
+ self.operation = pa_context_set_sink_input_mute(self.context,
+ index,
+ mute, # Mute = 1
+ CONTEXT_SUCCESS,
+ None)
+
+ self.pulse_iterate()
+
+ return
+
+ ###
+
+ def pulse_sink_mute(self, index, mute):
+ "Mute sink by index"
+
+ self.start_action()
+
+ CONTEXT_SUCCESS = PA_CONTEXT_SUCCESS_CB_T(self.py_context_success)
+
+ self.operation = pa_context_set_sink_mute_by_index(self.context,
+ index,
+ mute, # Mute = 1
+ CONTEXT_SUCCESS,
+ None)
+
+ self.pulse_iterate()
+
+ return
+
+ ###
+
+ def pulse_mute_stream(self, index):
+ self.pulse_sink_input_mute(index, 1)
+ return
+
+ ###
+
+ def pulse_unmute_stream(self, index):
+ self.pulse_sink_input_mute(index, 0)
+ return
+
+ ###
+
+ def pulse_mute_sink(self, index):
+ self.pulse_sink_mute(index, 1)
+ return
+
+ ###
+
+ def pulse_unmute_sink(self, index):
+ self.pulse_sink_mute(index, 0)
+ return
+
+ ###
+
+ def pulse_set_sink_input_volume(self, index, vol):
+ "Set volume by index"
+ self.start_action()
+
+ #print "pulse_set_sink_input_volume:", index, "Vol:", vol
+
+ #print vol.values
+ #for a in vol.toCtypes().values:
+ # print a
+ #return
+
+ PA_CONTEXT_SUCCESS_CB = PA_CONTEXT_SUCCESS_CB_T(self.py_context_success)
+
+ self.operation = pa_context_set_sink_input_volume(self.context,
+ index,
+ vol.toCtypes(),
+ PA_CONTEXT_SUCCESS_CB,
+ None)
+
+ self.pulse_iterate()
+
+ return
+
+ ###
+
+ def pulse_set_sink_volume(self, index, vol):
+ "Set volume by index"
+ self.start_action()
+
+ #print "pulse_set_sink_volume:", index, "Vol:", vol
+
+ PA_CONTEXT_SUCCESS_CB = PA_CONTEXT_SUCCESS_CB_T(self.py_context_success)
+
+ self.operation = pa_context_set_sink_volume_by_index(self.context,
+ index,
+ vol.toCtypes(),
+ PA_CONTEXT_SUCCESS_CB,
+ None)
+
+ self.pulse_iterate()
+
+ return
+
+ ###
+
+ def pulse_context_subscribe(self, mask):
+ "Subscribe to event"
+ self.start_action()
+ print "pulse_context_subscribe:", mask
+ CONTEXT_SUCCESS = PA_CONTEXT_SUCCESS_CB_T(self.py_context_success)
+
+ self.operation = pa_context_subscribe(self.context,
+ mask,
+ CONTEXT_SUCCESS,
+ None)
+ self.pulse_iterate()
+ return
+
+ ###
+
+ def pulse_context_set_subscribe_callback(self, callback):
+ "Set subscribe callback"
+ print "py_context_set_subscribe_callback:", callback
+ PA_CONTEXT_SUBSCRIBE_CB = PA_CONTEXT_SUBSCRIBE_CB_T(callback)
+
+ # This returns a void, not a PA_OPERATION
+ pa_context_set_subscribe_callback(self.context,
+ PA_CONTEXT_SUBSCRIBE_CB,
+ None)
+ return
+
+ ###
+
+ def reconnect(self):
+ self.context = pa_context_new(self.mainloop_api, clientName)
+
+ pa_context_set_state_callback(self.context, self.PA_STATE_CB, None)
+
+ self.start_action()
+
+
+ if 0 > pa_context_connect(self.context,
+ self.server,
+ 0,
+ None):
+ if self.retry:
+ pa_context_disconnect(self.context)
+ #print "bar"
+ return
+ self.pulse_context_error()
+ #print "foo"
+
+ self.pulse_iterate()
+
+ return
+
+ ###
+
+ def pulse_iterate(self, times = 1):
+ "Runs queries"
+ #print "pulse_iterate: Called"
+ self.ret = pointer(c_int())
+
+ pa_mainloop_iterate(self.mainloop, times, self.ret)
+
+ while not self.action_done:
+ pa_mainloop_iterate(self.mainloop, times, self.ret)
+
+ return
+
+ ###
+
+ def pulse_run(self):
+ self.ret = pointer(c_int(0))
+
+ #pa_mainloop_iterate(self.mainloop, 11, self.ret)
+ pa_mainloop_run(self.mainloop, self.ret)
+ return
diff --git a/pulsecaster/pulseaudio/PulseSink.py b/pulsecaster/pulseaudio/PulseSink.py
new file mode 100644
index 0000000..15a6517
--- /dev/null
+++ b/pulsecaster/pulseaudio/PulseSink.py
@@ -0,0 +1,213 @@
+#!/usr/bin/python
+# vi: et sw=2
+#
+# PulseSink.py
+# Copyright (C) 2009 Harry Karvonen
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Harry Karvonen <harry.karvonen@gmail.com>
+#
+
+from lib_pulseaudio import *
+
+from PulseClient import PulseClient
+from PulseVolume import PulseVolumeCtypes
+
+# This class contains all commons features from PulseSinkInputInfo and
+# PulseSinkInfo
+class PulseSink:
+ def __init__(self, index, name, mute, volume, client):
+ self.index = index
+ self.name = name
+ self.mute = mute
+ self.volume = volume
+ self.client = client
+ return
+
+ # PROTOTYPE
+ def unmuteStream(self):
+ raise Exception("ABSTRACT METHOD CALLED")
+ return
+
+ # PROTOTYPE
+ def muteStream(self):
+ raise Exception("ABSTRACT METHOD CALLED")
+ return
+
+ # PROTOTYPE
+ def setVolume(self):
+ raise Exception("ABSTRACT METHOD CALLED")
+ return
+
+ def printDebug(self):
+ print "self.index:", self.index
+ print "self.name:", self.name
+ print "self.mute:", self.mute
+ print "self.volume:", self.volume
+ print "self.client:", self.client
+ return
+
+################################################################################
+
+class PulseSinkInfo(PulseSink):
+ def __init__(self, pa_sink_info):
+ PulseSink.__init__(self, pa_sink_info.index,
+ pa_sink_info.name,
+ pa_sink_info.mute,
+ PulseVolumeCtypes(pa_sink_info.volume),
+ PulseClient("Selected Sink"))
+
+ self.description = pa_sink_info.description
+ self.sample_spec = pa_sink_info.sample_spec
+ self.channel_map = pa_sink_info.channel_map
+ self.owner_module = pa_sink_info.owner_module
+ self.monitor_source = pa_sink_info.monitor_source
+ self.monitor_source_name = pa_sink_info.monitor_source_name
+ self.latency = pa_sink_info.latency
+ self.driver = pa_sink_info.driver
+ self.flags = pa_sink_info.flags
+ self.proplist = pa_sink_info.proplist
+ self.configured_latency = pa_sink_info.configured_latency
+
+ return
+
+ ###
+ #
+ # Define PROTOTYPE functions
+
+ def unmuteStream(self, pulseInterface):
+ pulseInterface.pulse_unmute_sink(self.index)
+
+ self.mute = 0
+ return
+
+ ###
+
+ def muteStream(self, pulseInterface):
+ pulseInterface.pulse_mute_sink(self.index)
+
+ self.mute = 1
+ return
+
+ ###
+
+ def setVolume(self, pulseInterface, volume):
+ pulseInterface.pulse_set_sink_volume(self.index, volume)
+
+ self.volume = volume
+ return
+
+ ###
+
+ def printDebug(self):
+ print "PulseSinkInfo"
+ PulseSink.printDebug(self)
+ print "self.description", self.description
+ print "self.sample_spec", self.sample_spec
+ print "self.channel_map", self.channel_map
+ print "self.owner_module", self.owner_module
+ print "self.monitor_source", self.monitor_source
+ print "self.monitor_source_name", self.monitor_source_name
+ print "self.latency", self.latency
+ print "self.driver", self.driver
+ print "self.flags", self.flags
+ print "self.proplist", self.proplist
+ print "self.configured_latency", self.configured_latency
+ return
+
+ ###
+
+ def __str__(self):
+ return "ID: " + str(self.index) + ", Name: \"" + \
+ self.name + "\""
+
+################################################################################
+
+class PulseSinkInputInfo(PulseSink):
+ def __init__(self, pa_sink_input_info):
+ PulseSink.__init__(self, pa_sink_input_info.index,
+ pa_sink_input_info.name,
+ pa_sink_input_info.mute,
+ PulseVolumeCtypes(pa_sink_input_info.volume),
+ PulseClient("Unknown client"))
+ self.owner_module = pa_sink_input_info.owner_module
+ self.client_id = pa_sink_input_info.client
+ self.sink = pa_sink_input_info.sink
+ self.sample_spec = pa_sink_input_info.sample_spec
+ self.channel_map = pa_sink_input_info.channel_map
+ self.buffer_usec = pa_sink_input_info.buffer_usec
+ self.sink_usec = pa_sink_input_info.sink_usec
+ self.resample_method = pa_sink_input_info.resample_method
+ self.driver = pa_sink_input_info.driver
+ #self.proplist = pa_sink_input_info.proplist
+
+ return
+
+ ###
+
+ def setClient(self, c):
+ self.client = c
+
+ ###
+ #
+ # Define PROTOTYPE functions
+
+ def unmuteStream(self, pulseInterface):
+ pulseInterface.pulse_unmute_stream(self.index)
+
+ self.mute = 0
+ return
+
+ ###
+
+ def muteStream(self, pulseInterface):
+ pulseInterface.pulse_mute_stream(self.index)
+
+ self.mute = 1
+ return
+
+ ###
+
+ def setVolume(self, pulseInterface, volume):
+ pulseInterface.pulse_set_sink_input_volume(self.index, volume)
+
+ self.volume = volume
+ return
+
+ ###
+
+ def printDebug(self):
+ print "PulseSinkInputInfo"
+ PulseSink.printDebug(self)
+
+ print "self.owner_module:", self.owner_module
+ print "self.client_id:", self.client_id
+ print "self.sink:", self.sink
+ print "self.sample_spec:", self.sample_spec
+ print "self.channel_map:", self.channel_map
+ print "self.buffer_usec:", self.buffer_usec
+ print "self.sink_usec:", self.sink_usec
+ print "self.resample_method:", self.resample_method
+ print "self.driver:", self.driver
+
+ ###
+
+ def __str__(self):
+ if self.client:
+ return "ID: " + str(self.index) + ", Name: \"" + \
+ self.name + "\", mute: " + str(self.mute) + ", " + str(self.client)
+ return "ID: " + str(self.index) + ", Name: \"" + \
+ self.name + "\", mute: " + str(self.mute)
diff --git a/pulsecaster/pulseaudio/PulseSource.py b/pulsecaster/pulseaudio/PulseSource.py
new file mode 100644
index 0000000..e99eaaf
--- /dev/null
+++ b/pulsecaster/pulseaudio/PulseSource.py
@@ -0,0 +1,189 @@
+#!/usr/bin/python
+# vi: et sw=2
+#
+# PulseSource.py
+# Copyright (C) 2009 Harry Karvonen, Paul W. Frields
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Harry Karvonen <harry.karvonen@gmail.com>
+# Paul W. Frields <stickster@gmail.com>
+#
+
+from lib_pulseaudio import *
+
+from PulseClient import PulseClient
+from PulseVolume import PulseVolumeCtypes
+
+# This class contains all commons features from PulseSourceInputInfo and
+# PulseSourceInfo
+class PulseSource:
+ def __init__(self, index, name, mute, volume, client):
+ self.index = index
+ self.name = name
+ self.mute = mute
+ self.volume = volume
+ self.client = client
+ return
+
+ # PROTOTYPE
+ def unmuteStream(self):
+ raise Exception("ABSTRACT METHOD CALLED")
+ return
+
+ # PROTOTYPE
+ def muteStream(self):
+ raise Exception("ABSTRACT METHOD CALLED")
+ return
+
+ # PROTOTYPE
+ def setVolume(self):
+ raise Exception("ABSTRACT METHOD CALLED")
+ return
+
+ def printDebug(self):
+ print "self.index:", self.index
+ print "self.name:", self.name
+ print "self.mute:", self.mute
+ print "self.volume:", self.volume
+ print "self.client:", self.client
+ return
+
+################################################################################
+
+class PulseSourceInfo(PulseSource):
+ def __init__(self, pa_source_info):
+ PulseSource.__init__(self, pa_source_info.index,
+ pa_source_info.name,
+ pa_source_info.mute,
+ PulseVolumeCtypes(pa_source_info.volume),
+ PulseClient("Selected Source"))
+
+ self.description = pa_source_info.description
+ self.sample_spec = pa_source_info.sample_spec
+ self.channel_map = pa_source_info.channel_map
+ self.owner_module = pa_source_info.owner_module
+ self.monitor_of_sink = pa_source_info.monitor_of_sink
+ self.monitor_of_sink_name = pa_source_info.monitor_of_sink_name
+ self.latency = pa_source_info.latency
+ self.driver = pa_source_info.driver
+ self.flags = pa_source_info.flags
+ self.proplist = pa_source_info.proplist
+ self.configured_latency = pa_source_info.configured_latency
+
+ return
+
+ ###
+ #
+ # Define PROTOTYPE functions
+
+ def unmuteStream(self, pulseInterface):
+ pulseInterface.pulse_unmute_source(self.index)
+
+ self.mute = 0
+ return
+
+ ###
+
+ def muteStream(self, pulseInterface):
+ pulseInterface.pulse_mute_source(self.index)
+
+ self.mute = 1
+ return
+
+ ###
+
+ def setVolume(self, pulseInterface, volume):
+ pulseInterface.pulse_set_source_volume(self.index, volume)
+
+ self.volume = volume
+ return
+
+ ###
+
+ def printDebug(self):
+ print "PulseSourceInfo"
+ PulseSource.printDebug(self)
+ print "self.description", self.description
+ print "self.sample_spec", self.sample_spec
+ print "self.channel_map", self.channel_map
+ print "self.owner_module", self.owner_module
+ print "self.monitor_of_sink", self.monitor_of_sink
+ print "self.monitor_of_sink_name", self.monitor_of_sink_name
+ print "self.latency", self.latency
+ print "self.driver", self.driver
+ print "self.flags", self.flags
+ print "self.proplist", self.proplist
+ print "self.configured_latency", self.configured_latency
+ return
+
+ ###
+
+ def __str__(self):
+ return "ID: " + str(self.index) + ", Name: \"" + \
+ self.name + "\""
+
+################################################################################
+
+class PulseSourceOutputInfo(PulseSource):
+ def __init__(self, pa_source_output_info):
+ PulseSource.__init__(self, pa_source_output_info.index,
+ pa_source_output_info.name,
+ pa_source_output_info.mute,
+ PulseVolumeCtypes(pa_source_output_info.volume),
+ PulseClient("Unknown client"))
+ self.owner_module = pa_source_output_info.owner_module
+ self.client_id = pa_source_output_info.client
+ self.source = pa_source_output_info.source
+ self.sample_spec = pa_source_output_info.sample_spec
+ self.channel_map = pa_source_output_info.channel_map
+ self.buffer_usec = pa_source_output_info.buffer_usec
+ self.source_usec = pa_source_output_info.source_usec
+ self.resample_method = pa_source_output_info.resample_method
+ self.driver = pa_source_output_info.driver
+ #self.proplist = pa_source_output_info.proplist
+
+ return
+
+ ###
+
+ def setClient(self, c):
+ self.client = c
+
+ ###
+
+ def printDebug(self):
+ print "PulseSourceInputInfo"
+ PulseSource.printDebug(self)
+
+ print "self.owner_module:", self.owner_module
+ print "self.client_id:", self.client_id
+ print "self.source:", self.source
+ print "self.sample_spec:", self.sample_spec
+ print "self.channel_map:", self.channel_map
+ print "self.buffer_usec:", self.buffer_usec
+ print "self.source_usec:", self.source_usec
+ print "self.resample_method:", self.resample_method
+ print "self.driver:", self.driver
+
+ ###
+
+ def __str__(self):
+ if self.client:
+ return "ID: " + str(self.index) + ", Name: \"" + \
+ self.name + "\", mute: " + str(self.mute) + ", " + str(self.client)
+ return "ID: " + str(self.index) + ", Name: \"" + \
+ self.name + "\", mute: " + str(self.mute)
+
diff --git a/pulsecaster/pulseaudio/PulseVolume.py b/pulsecaster/pulseaudio/PulseVolume.py
new file mode 100644
index 0000000..1ff6b7a
--- /dev/null
+++ b/pulsecaster/pulseaudio/PulseVolume.py
@@ -0,0 +1,114 @@
+#!/usr/bin/python
+# vi: et sw=2
+#
+# PulseVolume.py
+# Copyright (C) 2009 Harry Karvonen
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Harry Karvonen <harry.karvonen@gmail.com>
+#
+
+from lib_pulseaudio import *
+import math
+
+# This contains all basic volume features
+class PulseVolume:
+ def __init__(self, vol = 0, channels = 2):
+ self.channels = channels
+
+ if vol > 100 or vol < 0:
+ print "WARNING: Volume is invalid!"
+ vol = 0
+
+ self.values = [vol] * self.channels
+
+ return
+
+ ##############################
+ #
+ # Type conversions
+ #
+ #def fromCtypes(self, pa_cvolume):
+ # self.channels = pa_cvolume.channels
+ # self.values = map(lambda x: (math.ceil(float(x) * 100 / PA_VOLUME_NORM)),
+ # pa_cvolume.values[0:self.channels])
+ # return self
+
+ def toCtypes(self):
+ ct = PA_CVOLUME()
+ ct.channels = self.channels
+
+ for x in range(0, self.channels):
+ ct.values[x] = (self.values[x] * PA_VOLUME_NORM) / 100
+
+ return ct
+
+ ###
+
+ def printDebug(self):
+ print "PulseVolume"
+ print "self.channels:", self.channels
+ print "self.values:", self.values
+ #print "self.proplist:", self.proplist
+
+ ###
+
+ def incVolume(self, vol):
+ "Increment volume level (mono only)"
+ vol += sum(self.values) / len(self.values)
+
+ vol = int(vol)
+
+ if vol > 100:
+ vol = 100
+ elif vol < 0:
+ vol = 0
+
+ self.setVolume(vol)
+
+ return
+
+ ###
+
+ def setVolume(self, vol, balance = None):
+ if not balance:
+ self.values = [vol] * self.channels
+ else:
+ self.values[balance] = vol
+
+ return
+
+ ###
+
+ def getVolume(self):
+ "Return mono volume"
+ return int(sum(self.values) / len(self.values))
+
+ ###
+
+ def __str__(self):
+ return "Channels: " + str(self.channels) + \
+ ", values: \"" + str(map(lambda x: str(x) + "%", self.values)) + "\""
+
+################################################################################
+
+class PulseVolumeCtypes(PulseVolume):
+ def __init__(self, pa_cvolume):
+ self.channels = pa_cvolume.channels
+ self.values = map(lambda x: (math.ceil(float(x) * 100 / PA_VOLUME_NORM)),
+ pa_cvolume.values[0:self.channels])
+ return
+
diff --git a/pulsecaster/pulseaudio/__init__.py b/pulsecaster/pulseaudio/__init__.py
new file mode 100644
index 0000000..8fa7217
--- /dev/null
+++ b/pulsecaster/pulseaudio/__init__.py
@@ -0,0 +1,29 @@
+#!/usr/bin/python
+# vi: et sw=2
+#
+# __init__.py
+# Copyright (C) 2009 Harry Karvonen
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Harry Karvonen <harry.karvonen@gmail.com>
+#
+
+
+
+from PulseObj import *
+from PulseVolume import *
+from PulseClient import *
+from PulseSink import *
diff --git a/pulsecaster/pulseaudio/lib_pulseaudio.py b/pulsecaster/pulseaudio/lib_pulseaudio.py
new file mode 100644
index 0000000..95a26d7
--- /dev/null
+++ b/pulsecaster/pulseaudio/lib_pulseaudio.py
@@ -0,0 +1,733 @@
+#!/usr/bin/python
+# vi: et sw=2
+#
+# lib_pulseaudio.py
+# Copyright (C) 2009 Harry Karvonen
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Provides pulseaudio interface for python
+#
+# Author: Harry Karvonen <harry.karvonen@gmail.com>
+#
+
+from ctypes import *
+
+pulse = CDLL("libpulse.so.0");
+
+################################################################################
+#
+# Constrants
+#
+################################################################################
+
+PA_CHANNELS_MAX = 32
+PA_VOLUME_NORM = 0x10000
+
+# sample types
+(
+ PA_SAMPLE_U8,
+ PA_SAMPLE_ALAW,
+ PA_SAMPLE_ULAW,
+ PA_SAMPLE_S16LE,
+ PA_SAMPLE_S16BE,
+ PA_SAMPLE_FLOAT32LE,
+ PA_SAMPLE_FLOAT32BE,
+ PA_SAMPLE_S32LE,
+ PA_SAMPLE_S32BE,
+ PA_SAMPLE_S24LE,
+ PA_SAMPLE_S24BE,
+ PA_SAMPLE_S24_32LE,
+ PA_SAMPLE_S24_32BE,
+ PA_SAMPLE_MAX,
+ PA_SAMPLE_INVALID
+) = map(c_int, xrange(15))
+
+# channel positions
+(
+ PA_CHANNEL_POSITION_INVALID,
+ PA_CHANNEL_POSITION_MONO,
+ PA_CHANNEL_POSITION_LEFT,
+ PA_CHANNEL_POSITION_RIGHT,
+ PA_CHANNEL_POSITION_CENTER,
+ PA_CHANNEL_POSITION_FRONT_LEFT,
+ PA_CHANNEL_POSITION_FRONT_RIGHT,
+ PA_CHANNEL_POSITION_FRONT_CENTER,
+ PA_CHANNEL_POSITION_REAR_CENTER,
+ PA_CHANNEL_POSITION_REAR_LEFT,
+ PA_CHANNEL_POSITION_REAR_RIGHT,
+ PA_CHANNEL_POSITION_LFE,
+ PA_CHANNEL_POSITION_SUBWOOFER,
+ PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+ PA_CHANNEL_POSITION_SIDE_LEFT,
+ PA_CHANNEL_POSITION_SIDE_RIGHT,
+ PA_CHANNEL_POSITION_AUX0,
+ PA_CHANNEL_POSITION_AUX1,
+ PA_CHANNEL_POSITION_AUX2,
+ PA_CHANNEL_POSITION_AUX3,
+ PA_CHANNEL_POSITION_AUX4,
+ PA_CHANNEL_POSITION_AUX5,
+ PA_CHANNEL_POSITION_AUX6,
+ PA_CHANNEL_POSITION_AUX7,
+ PA_CHANNEL_POSITION_AUX8,
+ PA_CHANNEL_POSITION_AUX9,
+ PA_CHANNEL_POSITION_AUX10,
+ PA_CHANNEL_POSITION_AUX11,
+ PA_CHANNEL_POSITION_AUX12,
+ PA_CHANNEL_POSITION_AUX13,
+ PA_CHANNEL_POSITION_AUX14,
+ PA_CHANNEL_POSITION_AUX15,
+ PA_CHANNEL_POSITION_AUX16,
+ PA_CHANNEL_POSITION_AUX17,
+ PA_CHANNEL_POSITION_AUX18,
+ PA_CHANNEL_POSITION_AUX19,
+ PA_CHANNEL_POSITION_AUX20,
+ PA_CHANNEL_POSITION_AUX21,
+ PA_CHANNEL_POSITION_AUX22,
+ PA_CHANNEL_POSITION_AUX23,
+ PA_CHANNEL_POSITION_AUX24,
+ PA_CHANNEL_POSITION_AUX25,
+ PA_CHANNEL_POSITION_AUX26,
+ PA_CHANNEL_POSITION_AUX27,
+ PA_CHANNEL_POSITION_AUX28,
+ PA_CHANNEL_POSITION_AUX29,
+ PA_CHANNEL_POSITION_AUX30,
+ PA_CHANNEL_POSITION_AUX31,
+ PA_CHANNEL_POSITION_TOP_CENTER,
+ PA_CHANNEL_POSITION_TOP_FRONT_LEFT,
+ PA_CHANNEL_POSITION_TOP_FRONT_RIGHT,
+ PA_CHANNEL_POSITION_TOP_FRONT_CENTER,
+ PA_CHANNEL_POSITION_TOP_REAR_LEFT,
+ PA_CHANNEL_POSITION_TOP_REAR_RIGHT,
+ PA_CHANNEL_POSITION_TOP_REAR_CENTER,
+ PA_CHANNEL_POSITION_MAX
+) = map(c_int, xrange(57))
+
+# stream states
+(
+ PA_STREAM_UNCONNECTED,
+ PA_STREAM_CREATING,
+ PA_STREAM_READY,
+ PA_STREAM_FAILED,
+ PA_STREAM_TERMINATED
+) = map(c_int, xrange(5))
+
+# stream directions
+(
+ PA_STREAM_NODIRECTION,
+ PA_STREAM_PLAYBACK,
+ PA_STREAM_RECORD,
+ PA_STREAM_UPLOAD
+) = map(c_int, xrange(4))
+
+# stream flags
+(
+ PA_STREAM_START_CORKED,
+ PA_STREAM_INTERPOLATE_TIMING,
+ PA_STREAM_NOT_MONOTONIC,
+ PA_STREAM_AUTO_TIMING_UPDATE,
+ PA_STREAM_NO_REMAP_CHANNELS,
+ PA_STREAM_NO_REMIX_CHANNELS,
+ PA_STREAM_FIX_FORMAT,
+ PA_STREAM_FIX_RATE,
+ PA_STREAM_FIX_CHANNELS,
+ PA_STREAM_DONT_MOVE,
+ PA_STREAM_VARIABLE_RATE,
+ PA_STREAM_PEAK_DETECT,
+ PA_STREAM_START_MUTED,
+ PA_STREAM_ADJUST_LATENCY,
+ PA_STREAM_EARLY_REQUESTS,
+ PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND,
+ PA_STREAM_START_UNMUTED,
+ PA_STREAM_FAIL_ON_SUSPEND
+) = map(c_int, xrange(18))
+
+# subscription event masks
+PA_SUBSCRIPTION_MASK_NULL = 0x0000
+PA_SUBSCRIPTION_MASK_SINK = 0x0001
+PA_SUBSCRIPTION_MASK_SOURCE = 0x0002
+PA_SUBSCRIPTION_MASK_SINK_INPUT = 0x0004
+PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT = 0x0008
+PA_SUBSCRIPTION_MASK_MODULE = 0x0010
+PA_SUBSCRIPTION_MASK_CLIENT = 0x0020
+PA_SUBSCRIPTION_MASK_SAMPLE_CACHE = 0x0040
+PA_SUBSCRIPTION_MASK_SERVER = 0x0080
+PA_SUBSCRIPTION_MASK_CARD = 0x0200
+PA_SUBSCRIPTION_MASK_ALL = 0x02ff
+
+# subscription event types
+PA_SUBSCRIPTION_EVENT_SINK = 0x0000
+PA_SUBSCRIPTION_EVENT_SOURCE = 0x0001
+PA_SUBSCRIPTION_EVENT_SINK_INPUT = 0x0002
+PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT = 0x0003
+PA_SUBSCRIPTION_EVENT_MODULE = 0x0004
+PA_SUBSCRIPTION_EVENT_CLIENT = 0x0005
+PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE = 0x0006
+PA_SUBSCRIPTION_EVENT_SERVER = 0x0007
+PA_SUBSCRIPTION_EVENT_CARD = 0x0009
+PA_SUBSCRIPTION_EVENT_FACILITY_MASK = 0x000F
+PA_SUBSCRIPTION_EVENT_NEW = 0x0000
+PA_SUBSCRIPTION_EVENT_CHANGE = 0x0010
+PA_SUBSCRIPTION_EVENT_REMOVE = 0x0020
+PA_SUBSCRIPTION_EVENT_TYPE_MASK = 0x0030
+
+################################################################################
+#
+# Structs
+#
+################################################################################
+
+class PA_IO_EVENT(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_MAINLOOP(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_MAINLOOP_API(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_SIGNAL_EVENT(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_CONTEXT(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_OPERATION(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_STREAM(Structure):
+ _fields_ = [("_opaque_struct", c_int)]
+
+class PA_SAMPLE_SPEC(Structure):
+ _fields_ = [
+ ("format", c_int), # FIXME check this
+ ("rate", c_uint32),
+ ("channels", c_uint8)
+ ]
+
+class PA_CHANNEL_MAP(Structure):
+ _fields_ = [
+ ("channels", c_uint8),
+ ("map", c_int * PA_CHANNELS_MAX)
+ ]
+
+class PA_CVOLUME(Structure):
+ _fields_ = [
+ ("channels", c_uint8),
+ ("values", c_uint32 * PA_CHANNELS_MAX)
+ ]
+
+class PA_BUFFER_ATTR(Structure):
+ _fields_ = [
+ ("maxlength", c_uint32),
+ ("tlength", c_uint32),
+ ("prebuf", c_uint32),
+ ("minreq", c_uint32),
+ ("fragsize", c_uint32)
+ ]
+
+PA_USEC_T = c_uint64
+
+class PA_SERVER_INFO(Structure):
+ _fields_ = [
+ ('user_name', c_char_p),
+ ('host_name', c_char_p),
+ ('server_version', c_char_p),
+ ('server_name', c_char_p),
+ ('sample_spec', PA_SAMPLE_SPEC),
+ ('default_sink_name', c_char_p),
+ ('default_source_name', c_char_p),
+ ('cookie', c_uint32),
+ ('channel_map', PA_CHANNEL_MAP)
+ ]
+
+class PA_SINK_INPUT_INFO(Structure):
+ __slots__ = [
+ 'index',
+ 'name',
+ 'owner_module',
+ 'client',
+ 'sink',
+ 'sample_spec',
+ 'channel_map',
+ 'volume',
+ 'buffer_usec',
+ 'sink_usec',
+ 'resample_method',
+ 'driver',
+ 'mute',
+ ]
+ _fields_ = [
+ ("index", c_uint32),
+ ("name", c_char_p),
+ ("owner_module", c_uint32),
+ ("client", c_uint32),
+ ("sink", c_uint32),
+ ("sample_spec", PA_SAMPLE_SPEC),
+ ("channel_map", PA_CHANNEL_MAP),
+ ("volume", PA_CVOLUME),
+ ("buffer_usec", PA_USEC_T),
+ ("sink_usec", PA_USEC_T),
+ ("resample_method", c_char_p),
+ ("driver", c_char_p),
+ ("mute", c_int)
+ #("proplist", POINTER(c_int))
+ ]
+
+class PA_SINK_INFO(Structure):
+ _fields_ = [
+ ("name", c_char_p),
+ ("index", c_uint32),
+ ("description", c_char_p),
+ ("sample_spec", PA_SAMPLE_SPEC),
+ ("channel_map", PA_CHANNEL_MAP),
+ ("owner_module", c_uint32),
+ ("volume", PA_CVOLUME),
+ ("mute", c_int),
+ ("monitor_source", c_uint32),
+ ("monitor_source_name", c_char_p),
+ ("latency", PA_USEC_T),
+ ("driver", c_char_p),
+ ("flags", c_int),
+ ("proplist", POINTER(c_int)),
+ ("configured_latency", PA_USEC_T)
+ ]
+
+class PA_SOURCE_OUTPUT_INFO(Structure):
+ __slots__ = [
+ 'index',
+ 'name',
+ 'owner_module',
+ 'client',
+ 'source',
+ 'sample_spec',
+ 'channel_map',
+ 'volume',
+ 'buffer_usec',
+ 'sink_usec',
+ 'resample_method',
+ 'driver',
+ 'mute',
+ ]
+ _fields_ = [
+ ("index", c_uint32),
+ ("name", c_char_p),
+ ("owner_module", c_uint32),
+ ("client", c_uint32),
+ ("source", c_uint32),
+ ("sample_spec", PA_SAMPLE_SPEC),
+ ("channel_map", PA_CHANNEL_MAP),
+ ("volume", PA_CVOLUME),
+ ("buffer_usec", PA_USEC_T),
+ ("sink_usec", PA_USEC_T),
+ ("resample_method", c_char_p),
+ ("driver", c_char_p),
+ ("mute", c_int)
+ #("proplist", POINTER(c_int))
+ ]
+
+class PA_SOURCE_INFO(Structure):
+ _fields_ = [
+ ("name", c_char_p),
+ ("index", c_uint32),
+ ("description", c_char_p),
+ ("sample_spec", PA_SAMPLE_SPEC),
+ ("channel_map", PA_CHANNEL_MAP),
+ ("owner_module", c_uint32),
+ ("volume", PA_CVOLUME),
+ ("mute", c_int),
+ ("monitor_of_sink", c_uint32),
+ ("monitor_of_sink_name", c_char_p),
+ ("latency", PA_USEC_T),
+ ("driver", c_char_p),
+ ("flags", c_int),
+ ("proplist", POINTER(c_int)),
+ ("configured_latency", PA_USEC_T)
+ ]
+
+class PA_CLIENT_INFO(Structure):
+ _fields_ = [
+ ("index", c_uint32),
+ ("name", c_char_p),
+ ("owner_module", c_uint32),
+ ("driver", c_char_p)
+ #("proplist", POINTER(c_int))
+ ]
+
+################################################################################
+#
+# Callback types
+#
+################################################################################
+
+#PA_IO_EVENT_CB_T = CFUNCTYPE(c_void_p,
+# POINTER(PA_MAINLOOP_API),
+# POINTER(PA_IO_EVENT),
+# c_int,
+# c_int,
+# c_void_p)
+
+# SIGNAL
+PA_SIGNAL_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_MAINLOOP_API),
+ POINTER(PA_SIGNAL_EVENT),
+ c_int,
+ c_void_p)
+
+# STATE
+PA_STATE_CB_T = CFUNCTYPE(c_int,
+ POINTER(PA_CONTEXT),
+ c_void_p)
+
+# CLIENT
+PA_CLIENT_INFO_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_CONTEXT),
+ POINTER(PA_CLIENT_INFO),
+ c_int,
+ c_void_p)
+# SINK INPUT
+PA_SINK_INPUT_INFO_CB_T = CFUNCTYPE(c_int, #FIXME wrong type
+ POINTER(PA_CONTEXT),
+ POINTER(PA_SINK_INPUT_INFO),
+ c_int,
+ c_void_p)
+
+# SINK
+PA_SINK_INFO_CB_T = CFUNCTYPE(c_int, #FIXME wrong type
+ POINTER(PA_CONTEXT),
+ POINTER(PA_SINK_INFO),
+ c_int,
+ c_void_p)
+# SOURCE OUTPUT
+PA_SOURCE_OUTPUT_INFO_CB_T = CFUNCTYPE(c_int, #FIXME wrong type
+ POINTER(PA_CONTEXT),
+ POINTER(PA_SOURCE_OUTPUT_INFO),
+ c_int,
+ c_void_p)
+
+# SOURCE
+PA_SOURCE_INFO_CB_T = CFUNCTYPE(c_int, #FIXME wrong type
+ POINTER(PA_CONTEXT),
+ POINTER(PA_SOURCE_INFO),
+ c_int,
+ c_void_p)
+# CONTEXT
+PA_CONTEXT_DRAIN_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_CONTEXT),
+ c_void_p)
+
+PA_CONTEXT_SUCCESS_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_CONTEXT),
+ c_int,
+ c_void_p)
+
+PA_CONTEXT_SUBSCRIBE_CB_T = CFUNCTYPE(c_void_p,
+ POINTER(PA_CONTEXT),
+ c_int,
+ c_uint32,
+ c_void_p)
+
+################################################################################
+#
+# Functions
+#
+################################################################################
+
+#
+# pa_strerror
+pa_strerror = pulse.pa_strerror
+pa_strerror.restype = c_char_p
+pa_strerror.argtypes = [
+ c_int
+]
+
+#
+# pa_mainloop_*
+pa_mainloop_new = pulse.pa_mainloop_new
+pa_mainloop_new.restype = POINTER(PA_MAINLOOP)
+pa_mainloop_new.argtypes = [
+]
+
+pa_mainloop_get_api = pulse.pa_mainloop_get_api
+pa_mainloop_get_api.restype = POINTER(PA_MAINLOOP_API)
+pa_mainloop_get_api.argtypes = [
+ POINTER(PA_MAINLOOP)
+]
+
+pa_mainloop_run = pulse.pa_mainloop_run
+pa_mainloop_run.restype = c_int
+pa_mainloop_run.argtypes = [
+ POINTER(PA_MAINLOOP),
+ POINTER(c_int)
+]
+
+pa_mainloop_iterate = pulse.pa_mainloop_iterate
+pa_mainloop_iterate.restype = c_int
+pa_mainloop_iterate.argtypes = [
+ POINTER(PA_MAINLOOP),
+ c_int,
+ POINTER(c_int)
+]
+
+pa_mainloop_quit = pulse.pa_mainloop_quit
+pa_mainloop_quit.restype = c_int
+pa_mainloop_quit.argtypes = [
+ POINTER(PA_MAINLOOP),
+ c_int
+]
+
+pa_mainloop_dispatch = pulse.pa_mainloop_dispatch
+pa_mainloop_dispatch.restype = c_int
+pa_mainloop_dispatch.argtypes = [
+ POINTER(PA_MAINLOOP)
+]
+
+pa_mainloop_free = pulse.pa_mainloop_run
+pa_mainloop_free.restype = c_int
+pa_mainloop_free.argtypes = [
+ POINTER(PA_MAINLOOP)
+]
+
+#
+# pa_signal_*
+pa_signal_init = pulse.pa_signal_init
+pa_signal_init.restype = c_int
+pa_signal_init.argtypes = [
+ POINTER(PA_MAINLOOP_API)
+]
+
+pa_signal_new = pulse.pa_signal_new
+pa_signal_new.restype = POINTER(PA_SIGNAL_EVENT)
+pa_signal_new.argtypes = [
+ c_int,
+ PA_SIGNAL_CB_T,
+ c_void_p
+]
+
+#
+# pa_context_*
+pa_context_errno = pulse.pa_context_errno
+pa_context_errno.restype = c_int
+pa_context_errno.argtypes = [
+ POINTER(PA_CONTEXT)
+]
+
+pa_context_new = pulse.pa_context_new
+pa_context_new.restype = POINTER(PA_CONTEXT)
+pa_context_new.argtypes = [
+ POINTER(PA_MAINLOOP_API),
+ c_char_p
+]
+
+
+pa_context_set_state_callback = pulse.pa_context_set_state_callback
+pa_context_set_state_callback.restype = None
+pa_context_set_state_callback.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_STATE_CB_T,
+ c_void_p
+]
+
+pa_context_connect = pulse.pa_context_connect
+pa_context_connect.restype = c_int
+pa_context_connect.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_char_p,
+ c_int, #FIXME | isn't correct
+ POINTER(c_int)
+]
+
+pa_context_get_state = pulse.pa_context_get_state
+pa_context_get_state.restype = c_int;
+pa_context_get_state.argtypes = [
+ POINTER(PA_CONTEXT)
+]
+
+pa_context_drain = pulse.pa_context_drain
+pa_context_drain.restype = POINTER(PA_OPERATION)
+pa_context_drain.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_CONTEXT_DRAIN_CB_T,
+ c_void_p
+]
+
+pa_context_disconnect = pulse.pa_context_disconnect
+pa_context_disconnect.restype = c_int;
+pa_context_disconnect.argtypes = [
+ POINTER(PA_CONTEXT)
+]
+
+#
+# pa_context_*_sink_*
+pa_context_get_sink_input_info_list = pulse.pa_context_get_sink_input_info_list
+pa_context_get_sink_input_info_list.restype = POINTER(c_int)
+pa_context_get_sink_input_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_SINK_INPUT_INFO_CB_T,
+ c_void_p
+]
+
+pa_context_get_sink_info_list = pulse.pa_context_get_sink_info_list
+pa_context_get_sink_info_list.restype = POINTER(c_int)
+pa_context_get_sink_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_SINK_INFO_CB_T,
+ c_void_p
+]
+
+pa_context_set_sink_mute_by_index = pulse.pa_context_set_sink_mute_by_index
+pa_context_set_sink_mute_by_index.restype = POINTER(c_int)
+pa_context_set_sink_mute_by_index.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ c_int,
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+pa_context_set_sink_input_mute = pulse.pa_context_set_sink_input_mute
+pa_context_set_sink_input_mute.restype = POINTER(c_int)
+pa_context_set_sink_input_mute.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ c_int,
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+pa_context_set_sink_volume_by_index = pulse.pa_context_set_sink_volume_by_index
+pa_context_set_sink_volume_by_index.restype = POINTER(c_int)
+pa_context_set_sink_volume_by_index.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ POINTER(PA_CVOLUME),
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+pa_context_set_sink_input_volume = pulse.pa_context_set_sink_input_volume
+pa_context_set_sink_input_volume.restype = POINTER(c_int)
+pa_context_set_sink_input_volume.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ POINTER(PA_CVOLUME),
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+#
+# pa_context_*_source_*
+pa_context_get_source_output_info_list = pulse.pa_context_get_source_output_info_list
+pa_context_get_source_output_info_list.restype = POINTER(c_int)
+pa_context_get_source_output_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_SOURCE_OUTPUT_INFO_CB_T,
+ c_void_p
+]
+
+pa_context_get_source_info_list = pulse.pa_context_get_source_info_list
+pa_context_get_source_info_list.restype = POINTER(c_int)
+pa_context_get_source_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_SOURCE_INFO_CB_T,
+ c_void_p
+]
+
+pa_context_set_source_mute_by_index = pulse.pa_context_set_source_mute_by_index
+pa_context_set_source_mute_by_index.restype = POINTER(c_int)
+pa_context_set_source_mute_by_index.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ c_int,
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+pa_context_set_source_volume_by_index = pulse.pa_context_set_source_volume_by_index
+pa_context_set_source_volume_by_index.restype = POINTER(c_int)
+pa_context_set_source_volume_by_index.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ POINTER(PA_CVOLUME),
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+#
+# pa_context_*_client_*
+
+pa_context_get_client_info_list = pulse.pa_context_get_client_info_list
+pa_context_get_client_info_list.restype = POINTER(c_int)
+pa_context_get_client_info_list.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_CLIENT_INFO_CB_T,
+ c_void_p
+]
+pa_context_get_client_info = pulse.pa_context_get_client_info
+pa_context_get_client_info.restype = POINTER(c_int)
+pa_context_get_client_info.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_uint32,
+ PA_CLIENT_INFO_CB_T,
+ c_void_p
+]
+
+#
+# pa_context_*_subscribe*
+pa_context_set_subscribe_callback = pulse.pa_context_set_subscribe_callback
+pa_context_set_subscribe_callback.restype = c_int
+pa_context_set_subscribe_callback.argtypes = [
+ POINTER(PA_CONTEXT),
+ PA_CONTEXT_SUBSCRIBE_CB_T,
+ c_void_p
+]
+
+pa_context_subscribe = pulse.pa_context_subscribe
+pa_context_subscribe.restype = POINTER(PA_OPERATION)
+pa_context_subscribe.argtypes = [
+ POINTER(PA_CONTEXT),
+ c_int,
+ PA_CONTEXT_SUCCESS_CB_T,
+ c_void_p
+]
+
+#
+# pa_operation_*
+pa_operation_unref = pulse.pa_operation_unref
+pa_operation_unref.restype = c_int
+pa_operation_unref.argtypes = [
+ POINTER(PA_OPERATION)
+]
+
+#
+# pa_stream_*
+pa_stream_connect_record = pulse.pa_stream_connect_record
+pa_stream_connect_record.restype = c_int
+pa_stream_connect_record.argtypes = [
+ POINTER(PA_STREAM),
+ c_char_p,
+ POINTER(PA_BUFFER_ATTR),
+ c_int # original pa_stream_flags_t
+]
+
+pa_stream_peek = pulse.pa_stream_peek
+pa_stream_peek.restype = c_int
+pa_stream_peek.argtypes = [
+ POINTER(PA_STREAM),
+ POINTER(c_void_p), # original is void **data, no idea if this works
+ POINTER(c_size_t)
+]
+
diff --git a/pulsecaster/ui.py b/pulsecaster/ui.py
new file mode 100644
index 0000000..6e49f80
--- /dev/null
+++ b/pulsecaster/ui.py
@@ -0,0 +1,236 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2009 Paul W. Frields
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Author: Paul W. Frields <stickster@gmail.com>
+
+
+from config import *
+import gconfig
+from pulseaudio.PulseObj import PulseObj
+from listener import *
+import gtk
+import os
+import gobject
+import pygst
+pygst.require('0.10')
+import gst
+
+# FIXME
+fname = os.getcwd() + '/data/pulsecaster.glade'
+_debug = True
+
+def _debugPrint(text):
+ if _debug:
+ print (text)
+
+class PulseCasterUI:
+ def __init__(self):
+ self.builder = gtk.Builder()
+ self.builder.add_from_file(fname)
+ self.icontheme = gtk.icon_theme_get_default()
+ self.icontheme.append_search_path(os.path.join('/usr/share', NAME))
+ # Convenience for developers
+ self.icontheme.append_search_path(os.path.join(os.getcwd(),
+ 'data/icons/scalable'))
+ self.logo = self.icontheme.load_icon('pulsecaster', -1,
+ gtk.ICON_LOOKUP_FORCE_SVG)
+ gtk.window_set_default_icon(self.logo)
+ self.gconfig = gconfig.PulseCasterGconf()
+
+ self.warning = self.builder.get_object('warning')
+ self.dismiss = self.builder.get_object('dismiss_warning')
+ self.swckbox = self.builder.get_object('skip_warn_checkbox')
+ self.swckbox.set_active(int(self.gconfig.skip_warn))
+ self.dismiss.connect('clicked', self.hideWarn)
+ self.warning.connect('destroy', self.hideWarn)
+
+ # Main dialog basics
+ self.main = self.builder.get_object('main_dialog')
+ self.main.set_title(NAME)
+ self.main_title = self.builder.get_object('main_title')
+ self.main_title.set_label('<big><big><big><b><i>' +
+ NAME + '</i></b></big></big></big>')
+ self.main.connect('delete_event', self.on_close)
+ self.about_button = self.builder.get_object('about_button')
+ self.about_button.connect('clicked', self.showAbout)
+ self.close = self.builder.get_object('close_button')
+ self.close.connect('clicked', self.on_close)
+ self.record = self.builder.get_object('record_button')
+ self.record_id = self.record.connect('clicked', self.on_record)
+ self.record.set_sensitive(False)
+
+ # About dialog basics
+ self.about = self.builder.get_object('about_dialog')
+ self.about.connect('delete_event', self.hideAbout)
+ self.about.connect('response', self.hideAbout)
+ self.about.set_name(NAME)
+ self.about.set_version(VERSION)
+ self.about.set_copyright(COPYRIGHT)
+ self.about.set_comments(DESCRIPTION)
+ self.about.set_license(LICENSE_TEXT)
+ self.about.set_website(URL)
+ self.about.set_website_label(URL)
+ self.authors = [AUTHOR + ' <' + AUTHOR_EMAIL + '>']
+ for contrib in CONTRIBUTORS:
+ self.authors.append(contrib)
+ self.about.set_authors(self.authors)
+ self.about.set_program_name(NAME)
+
+ # Create PulseAudio backing
+ self.pa = PulseObj(clientName=NAME)
+
+ # Create and populate combo boxes
+ self.table = self.builder.get_object('table1')
+ self.user_vox = gtk.combo_box_new_text()
+ self.subject_vox = gtk.combo_box_new_text()
+ self.table.attach(self.user_vox, 1, 2, 0, 1,
+ xoptions=gtk.EXPAND|gtk.FILL)
+ self.table.attach(self.subject_vox, 1, 2, 1, 2,
+ xoptions=gtk.EXPAND|gtk.FILL)
+ self.user_vox.connect('button-press-event', self.repop_sources)
+ self.subject_vox.connect('button-press-event', self.repop_sources)
+
+ # Fill the combo boxes initially
+ self.repop_sources()
+ self.listener = PulseCasterListener(self)
+
+ self.destfile_label = self.builder.get_object('destfile_label')
+ self.open_button = self.builder.get_object('open_button')
+ self.open_button.connect('clicked', self.showFileChooser)
+ self.filesinkpath = ''
+
+ def repop_sources(self, *args):
+ self.sources = self.pa.pulse_source_list()
+ l = self.user_vox.get_model()
+ l.clear()
+ l = self.subject_vox.get_model()
+ l.clear()
+ self.uservoxes = []
+ self.subjectvoxes = []
+ for source in self.sources:
+ if source.monitor_of_sink_name == None:
+ self.uservoxes.append((source.name, source.description))
+ self.user_vox.append_text(source.description)
+ else:
+ self.subjectvoxes.append((source.name, source.description))
+ self.subject_vox.append_text(source.description)
+ self.user_vox.set_active(0)
+ self.subject_vox.set_active(0)
+ #self.combo_vbox.reorder_child(self.user_vox, 0)
+ #self.combo_vbox.reorder_child(self.subject_vox, 1)
+ #self.combo_vbox.show_all()
+ self.table.show_all()
+
+ if self.gconfig.skip_warn is False:
+ self.warning.show()
+ else:
+ self.hideWarn()
+
+ def on_record(self, *args):
+ # Get filename
+ # Check whether filename exists, if so, overwrite? y/n
+ filesinkpath = self.destfile_label.get_text()
+ if filesinkpath is None:
+ return
+ # Set up GStreamer stuff
+ self.combiner = gst.Pipeline('PulseCasterCombinePipe')
+ self.lsource = gst.element_factory_make('pulsesrc', 'lsrc')
+ self.lsource.set_property('device',
+ self.uservoxes[self.user_vox.get_active()][0])
+ self.rsource = gst.element_factory_make('pulsesrc', 'rsrc')
+ self.rsource.set_property('device',
+ self.subjectvoxes[self.subject_vox.get_active()][0])
+
+ self.adder = gst.element_factory_make('adder', 'mix')
+ self.encoder = gst.element_factory_make('vorbisenc', 'enc')
+ self.muxer = gst.element_factory_make('oggmux', 'mux')
+ self.filesink = gst.element_factory_make('filesink', 'fsink')
+ self.filesink.set_property('location', filesinkpath)
+
+ self.combiner.add(self.lsource,
+ self.rsource,
+ self.adder,
+ self.encoder,
+ self.muxer,
+ self.filesink)
+ gst.element_link_many(self.lsource,
+ self.adder,
+ self.encoder,
+ self.muxer,
+ self.filesink)
+ gst.element_link_many(self.rsource, self.adder)
+
+ # FIXME: Dim elements other than the 'record' widget
+ self.record.set_label(gtk.STOCK_MEDIA_STOP)
+ self.record.disconnect(self.record_id)
+ self.stop_id = self.record.connect('clicked', self.on_stop)
+ self.record.show()
+ self.combiner.set_state(gst.STATE_PLAYING)
+
+ def on_stop(self, *args):
+ self.combiner.set_state(gst.STATE_NULL)
+ self.record.set_label(gtk.STOCK_MEDIA_RECORD)
+ self.record.disconnect(self.stop_id)
+ self.record_id = self.record.connect('clicked', self.on_record)
+ self.record.show()
+
+ def on_close(self, *args):
+ try:
+ self.pa.disconnect()
+ except:
+ pass
+ gtk.main_quit()
+
+ def hideWarn(self, *args):
+ self.gconfig.change_warn(self.swckbox.get_active())
+ self.warning.hide()
+ self.main.show()
+
+ def showAbout(self, *args):
+ self.about.show()
+
+ def hideAbout(self, *args):
+ self.about.hide()
+
+ def showFileChooser(self, *args):
+ self.file_chooser = self.builder.get_object('file_chooser')
+ self.file_chooser_cancel_button = self.builder.get_object('file_chooser_cancel_button')
+ self.file_chooser_cancel_button.connect('clicked', self.hideFileChooser)
+ self.file_chooser_save_button = self.builder.get_object('file_chooser_save_button')
+ self.file_chooser_save_button.connect('clicked', self.updateFileSinkPath)
+ #self.file_chooser.set_current_folder(self.filesinkdir)
+ if self.filesinkpath:
+ self.file_chooser.set_filename(self.filesinkpath)
+ self.file_chooser.set_current_name(self.filesinkfile)
+ self.file_chooser.show()
+
+ def hideFileChooser(self, *args):
+ self.file_chooser.hide()
+
+ def updateFileSinkPath(self, *args):
+ self.hideFileChooser()
+ self.filesinkpath = self.file_chooser.get_filename()
+ (self.filesinkfile, self.filesinkdir) = (os.path.basename(self.filesinkpath),
+ os.path.dirname(self.filesinkpath))
+ self.destfile_label.set_text(self.filesinkpath)
+ self.record.set_sensitive(True)
+
+
+if __name__ == '__main__':
+ pulseCaster = PulseCasterUI()
+ gtk.main()