diff options
author | Jürgen Geuter <tante@the-gay-bar.com> | 2010-02-15 23:11:26 +0100 |
---|---|---|
committer | Jürgen Geuter <tante@the-gay-bar.com> | 2010-02-15 23:11:26 +0100 |
commit | 45760059f2a6fb0d172d87b5f2d909392b5ed757 (patch) | |
tree | ac35cd024429814bece1944537e7ec01db1f4a29 /pulsecaster | |
parent | 5f0587c0939bcb0dbe466d82672391f984e3e6cc (diff) | |
download | pulsecaster-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')
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 Binary files differnew file mode 100644 index 0000000..c6840c9 --- /dev/null +++ b/pulsecaster/data/icons/16x16/pulsecaster-16.png diff --git a/pulsecaster/data/icons/24x24/pulsecaster-24.png b/pulsecaster/data/icons/24x24/pulsecaster-24.png Binary files differnew file mode 100644 index 0000000..4cc7a58 --- /dev/null +++ b/pulsecaster/data/icons/24x24/pulsecaster-24.png diff --git a/pulsecaster/data/icons/32x32/pulsecaster-32.png b/pulsecaster/data/icons/32x32/pulsecaster-32.png Binary files differnew file mode 100644 index 0000000..9a15d49 --- /dev/null +++ b/pulsecaster/data/icons/32x32/pulsecaster-32.png diff --git a/pulsecaster/data/icons/48x48/pulsecaster-48.png b/pulsecaster/data/icons/48x48/pulsecaster-48.png Binary files differnew file mode 100644 index 0000000..fdc2f3d --- /dev/null +++ b/pulsecaster/data/icons/48x48/pulsecaster-48.png diff --git a/pulsecaster/data/icons/64x64/pulsecaster-64.png b/pulsecaster/data/icons/64x64/pulsecaster-64.png Binary files differnew file mode 100644 index 0000000..4a4425a --- /dev/null +++ b/pulsecaster/data/icons/64x64/pulsecaster-64.png 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 <ossman@cendio.se> 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 <ossman@cendio.se> 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"><i>Select the audio sources to mix, and a destination file for saving the resulting audio.</i></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"><big><big><b><i>Important notice</i></b></big></big></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() |