├── .gitignore ├── .project ├── .pydevproject ├── .tx └── config ├── AUTHORS ├── COPYING ├── MANIFEST.in ├── Makefile ├── README.md ├── TODO ├── mockup-ui-changes.svg ├── org.pulsecaster.PulseCaster.gschema.xml ├── po ├── POTFILES.in ├── cs.po ├── da.po ├── de.po ├── de_DE.po ├── el.po ├── es.po ├── es_MX.po ├── fr.po ├── gl.po ├── he.po ├── hu.po ├── it.po ├── ja.po ├── lt.po ├── nl.po ├── no.po ├── pl.po ├── pt_BR.po ├── pt_PT.po ├── pulsecaster.pot ├── ru.po ├── sr.po ├── tr.po ├── uk.po ├── zh_CN.po └── zh_TW.po ├── pulsecaster.appdata.xml ├── pulsecaster.appdata.xml.in ├── pulsecaster.convert ├── pulsecaster.desktop ├── pulsecaster ├── __init__.py ├── config.py ├── data │ ├── icons │ │ ├── 16x16 │ │ │ └── pulsecaster-16.png │ │ ├── 24x24 │ │ │ └── pulsecaster-24.png │ │ ├── 32x32 │ │ │ └── pulsecaster-32.png │ │ ├── 48x48 │ │ │ └── pulsecaster-48.png │ │ ├── 64x64 │ │ │ └── pulsecaster-64.png │ │ └── scalable │ │ │ ├── pulsecaster-logo.svg │ │ │ └── pulsecaster.svg │ └── pulsecaster.ui ├── docs │ ├── figures │ │ └── pulsecaster-logo.png │ ├── index.page │ ├── page.tmpl │ ├── preparing.page │ ├── recording.page │ └── settings.page ├── gsettings.py ├── listener.py ├── pulsecaster ├── source.py └── ui.py ├── setup.cfg ├── setup.py └── utils ├── Makefile ├── README-palist └── palist.c /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .svn 3 | utils/palist 4 | build/ 5 | dist/ 6 | locale/ 7 | messages.mo 8 | po/*.mo 9 | pulsecaster.egg-info/ 10 | gschemas.compiled 11 | 12 | *~ 13 | # Yes, I like Emacs. 14 | .\#* 15 | \#*\# 16 | 17 | # Eclipse stuff 18 | #.project 19 | #.pydevproject 20 | .settings 21 | 22 | # VS Code 23 | .vscode 24 | 25 | #virtual env 26 | venv/ 27 | #intelliJ IDEA 28 | .idea/ 29 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | PulseCaster 4 | 5 | 6 | 7 | 8 | 9 | org.python.pydev.PyDevBuilder 10 | 11 | 12 | 13 | 14 | 15 | org.python.pydev.pythonNature 16 | 17 | 18 | -------------------------------------------------------------------------------- /.pydevproject: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | python 2.6 6 | Default 7 | 8 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [pulsecaster.pulsecasterpot] 5 | file_filter = po/.po 6 | source_file = po/pulsecaster.pot 7 | source_lang = en 8 | 9 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Paul W. Frields 2 | Jürgen Geuter 3 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include AUTHORS COPYING TODO pulsecaster.desktop 2 | include org.pulsecaster.PulseCaster.gschema.xml 3 | include pulsecaster.appdata.xml 4 | include pulsecaster.convert 5 | recursive-include pulsecaster *.png *.svg *.ui 6 | recursive-include po *.pot *.po 7 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ##################### 2 | # Makefile support 3 | # (C) 2012 Paul W. Frields 4 | # Licensed uner the GNU General Public License, v2 or later. 5 | # 6 | 7 | ##################### 8 | # Vars 9 | ifndef LANGUAGES 10 | LANGUAGES:=$(shell ls po/*.po | sed 's/po\/\(.*\).po/\1/') 11 | endif 12 | 13 | DOMAIN=pulsecaster 14 | PYTHON=$(shell which python) 15 | MSGMERGE=$(shell which msgmerge) 16 | MSGFMT=$(shell which msgfmt) 17 | TX=$(shell which tx) 18 | PWD=$(shell pwd) 19 | GIT=$(shell which git) 20 | 21 | LATEST_TAG=$(shell git describe --tags --abbrev=0) 22 | LATEST_VERSION=$(shell $(PYTHON) -c 'from pulsecaster.config import VERSION; print ("%s" % (VERSION))') 23 | 24 | AUTHOR=$(shell $(PYTHON) -c 'from $(DOMAIN).config import * ; print (AUTHOR)') 25 | EMAIL=$(shell $(PYTHON) -c 'from $(DOMAIN).config import * ; print (AUTHOR_EMAIL)') 26 | URL=$(shell $(PYTHON) -c 'from $(DOMAIN).config import * ; print (URL)') 27 | 28 | ##################### 29 | # Initial stuff 30 | .PHONY:: all clean vars 31 | all:: 32 | vars:: 33 | @echo LATEST_TAG = $(LATEST_TAG) 34 | @echo LATEST_VERSION = $(LATEST_VERSION) 35 | 36 | ##################### 37 | 38 | 39 | ##################### 40 | # L10n support 41 | .PHONY:: tx-pull 42 | tx-pull:: 43 | $(TX) pull -a 44 | 45 | .PHONY:: pot 46 | pot: po/$(DOMAIN).pot 47 | 48 | po/$(DOMAIN).pot: $(shell cat po/POTFILES.in) po/POTFILES.in 49 | cd po && intltool-update -p -g $(DOMAIN) && cd .. 50 | 51 | .PHONY:: po 52 | po: $(foreach L,$(LANGUAGES),po/$(L).po) 53 | 54 | define PO_template = 55 | PO_FILES+= po/$(1).po 56 | po/$(1).po: po/$(DOMAIN).pot 57 | $(TX) pull -l $(1) 58 | cd po && intltool-update -d $(1) -g $(DOMAIN) && cd .. 59 | endef 60 | $(foreach L,$(LANGUAGES),$(eval $(call PO_template,$(L)))) 61 | vars:: 62 | @echo PO_FILES = $(PO_FILES) 63 | 64 | .PHONY:: mo 65 | all:: mo 66 | mo: $(foreach L,$(LANGUAGES),po/$(L).mo) 67 | 68 | define MO_template = 69 | MO_FILES+= po/$(1).mo 70 | po/$(1).mo: po/$(1).po 71 | mkdir -p locale/$(1)/LC_MESSAGES && \ 72 | $(MSGFMT) -o po/$(1).mo po/$(1).po >/dev/null 73 | clean:: 74 | rm -f po/$(1).mo 75 | endef 76 | $(foreach L,$(LANGUAGES),$(eval $(call MO_template,$(L)))) 77 | vars:: 78 | @echo MO_FILES = $(MO_FILES) 79 | 80 | .PHONY:: stats 81 | define STATS_template = 82 | stats:: stats-$(1) 83 | stats-$(1): po/$(1).po 84 | @echo -n "$(1): " && msgfmt --statistics po/$(1).po 85 | endef 86 | $(foreach L,$(LANGUAGES),$(eval $(call STATS_template,$(L)))) 87 | ##################### 88 | 89 | ##################### 90 | # Release stuff 91 | .PHONY:: release 92 | release:: $(DOMAIN)-$(LATEST_VERSION).tar.gz 93 | $(DOMAIN)-$(LATEST_VERSION).tar.gz:: po 94 | ifneq ($(LATEST_TAG),$(LATEST_VERSION)) 95 | @echo Version=$(LATEST_VERSION), latest git tag=$(LATEST_TAG), either fix config.py or tag repo 96 | else 97 | $(PYTHON) setup.py sdist 98 | @echo Tarball is in dist/$@ 99 | endif 100 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | A PulseAudio based podcasting application 2 | 3 | Thanks to Harry Karvonen for his Python ctypes-based bindings for 4 | PulseAudio. (These are now removed in favor of the pulsectl module.) 5 | Thanks also to Jürgen Geuter for helping me understand distutils and 6 | contributing some fixes. 7 | 8 | ## Requirements 9 | 10 | PulseCaster has been updated to require Python 3. It will no longer 11 | run on Python 2. If you must use Python 2, please use a release 12 | prior to version 0.9. 13 | 14 | ## Instructions 15 | 16 | If you are looking at the source, 'cd' to the top of this project and 17 | then run the following command to try it out: 18 | 19 | $ cd pulsecaster 20 | $ ./pulsecaster/pulsecaster 21 | 22 | ## Advanced Tips 23 | 24 | The code currently contains a very hacky function to allow you to 25 | record to FLAC (the Free Lossless Audio Codec) instead of Ogg Vorbis, 26 | which is the default. To turn that capability on, run this command: 27 | 28 | $ gsettings set org.pulsecaster.PulseCaster codec flac 29 | 30 | To switch back to Vorbis: 31 | 32 | $ gsettings set org.pulsecaster.PulseCaster codec vorbis 33 | 34 | There's an additional function for setting audio rate (default is 35 | 48000 Hz): 36 | 37 | $ gsettings set org.pulsecaster.PulseCaster audiorate 44100 38 | $ gsettings set org.pulsecaster.PulseCaster audiorate 48000 39 | 40 | ## Installing 41 | 42 | The easiest way to use this application is to simply install it using 43 | your platform's preferred tool set. To install it using Fedora, run 44 | the folowing command: 45 | 46 | dnf install pulsecaster 47 | 48 | To install it on another flavor of Linux, check the documentation for 49 | your particular distribution. 50 | 51 | To install directly from this source code, use the handy "distutils" 52 | script that's provided: 53 | 54 | $ python setup.py build 55 | $ python setup.py install 56 | 57 | Refer to the wiki at http://pulsecaster.org/ for a full list of 58 | dependencies and requirements. 59 | 60 | ## Translation 61 | 62 | Translation is done via Transifex: 63 | https://www.transifex.com/stickster/pulsecaster/dashboard/ 64 | 65 | ## GStreamer 66 | 67 | The pipeline for capturing from a running PulseAudio source: 68 | 69 | gst-launch pulsesrc device-name='' \ 70 | ! vorbisenc quality=0.5 \ 71 | ! oggmux \ 72 | ! filesink location=foo.ogg 73 | 74 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | TODO: 2 | * Extract messages properly from AppData (need to switch to intltool?) 3 | * Volume leveling on user's behalf 4 | * Set recording volume for both sources to reasonable level (75%?) 5 | * Normalize each to something like -0.1dB 6 | * After mixing the streams, do some sort of compression/leveling 7 | * Reset names of monitor devices to be more human-understandable 8 | * CLI interface 9 | * Choice of gst-audio-profiles for encoding 10 | * Check disk space usage? Show that too? 11 | * Pause toggle button 12 | * Advanced settings 13 | * Volume settings 14 | * Record from streams instead of devices (maybe more human understandable?) 15 | * "Test mode" before recording 16 | * Offer a dummy text to test levels (plosives, etc.) 17 | * PA volume/gain controls (with peaks?) 18 | 19 | 20 | NOTES: 21 | Mixing two sources together using GStreamer "adder" element: 22 | gst-launch adder name=mix ! pulsesink { filesrc location=05.mp3 ! decodebin ! mix. } { filesrc location=07.mp3 ! decodebin ! mix. } 23 | 24 | What I'm doing in this GStreamer pipeline: 25 | gst-launch adder name=mix ! vorbisenc ! oggmux ! filesink location=blah { pulsesrc ! mix. } { pulsesrc ! mix. } 26 | 27 | SAME AS: 28 | gst-launch pulsesrc ! adder name=mix pulsesrc ! mix. ! vorbisenc ! oggmux ! filesink location=blah 29 | -------------------------------------------------------------------------------- /org.pulsecaster.PulseCaster.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | false 7 | Whether streams should be saved separately and in a lossless format 8 | Set to "true" to save audio streams separately and in a lossless format for later mixing. Set to "false" to save as a single compressed stream for easy publishing. 9 | 10 | 11 | false 12 | Whether to skip warning dialog at startup 13 | Set to "true" to avoid displaying the warning dialog about recording telephone conversations during startup. Set to "false" to display the dialog during startup. 14 | 15 | 16 | "vorbis" 17 | Codec to use in recordings 18 | Set to "vorbis" to use the Ogg Vorbis format. Set to "flac" to use the lossless FLAC format. 19 | 20 | 21 | 4 22 | (UNUSED) 23 | (UNUSED) 24 | foo 25 | 26 | 27 | 48000 28 | Rate in Hz for recordings 29 | Typically set this to either 44100 or 48000 for most post processing usage. 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /po/POTFILES.in: -------------------------------------------------------------------------------- 1 | pulsecaster.appdata.xml.in 2 | pulsecaster/config.py 3 | pulsecaster/listener.py 4 | pulsecaster/source.py 5 | pulsecaster/ui.py 6 | -------------------------------------------------------------------------------- /po/cs.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # fri, 2013 7 | # fri, 2014 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: Czech (http://www.transifex.com/stickster/pulsecaster/" 16 | "language/cs/)\n" 17 | "Language: cs\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " 22 | "<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" 23 | 24 | #: ../pulsecaster.appdata.xml.in.h:1 25 | msgid "Record a podcast or interview" 26 | msgstr "Nahrát záznam nebo rozhovor" 27 | 28 | #: ../pulsecaster.appdata.xml.in.h:2 29 | msgid "" 30 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 31 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 32 | "(VoIP) app." 33 | msgstr "" 34 | "PulseCaster je nahrávač zvuku založený na PulseAudio. Můžete jej využít na " 35 | "nahrávání záznamů zvuku nebo rozhovorů udělaných za použití vašeho počítače " 36 | "nebo samostatného programu pro hlas přes IP - voice-over-IP (VoIP)." 37 | 38 | #: ../pulsecaster.appdata.xml.in.h:3 39 | msgid "" 40 | "PulseCaster allows you to select which sources you use for your podcast. It " 41 | "then automatically mixes the sound sources into one recording that's ready " 42 | "to publish." 43 | msgstr "" 44 | "PulseCaster vám umožňuje vybrat, které zdroje použijete pro svůj záznam. " 45 | "Potom automaticky smíchá zdroje zvuku do jedné nahrávky, která je tím " 46 | "připravena pro zveřejnění." 47 | 48 | #: ../pulsecaster.appdata.xml.in.h:4 49 | msgid "" 50 | "There is also an expert mode so you can mix or enhance the recording on your " 51 | "own." 52 | msgstr "" 53 | "Je tu i režim pro zkušené uživatele, takže můžete nahrávky míchat nebo " 54 | "vylepšovat po svém." 55 | 56 | #: ../pulsecaster/ui.py:66 57 | msgid "loading UI file from current subdir" 58 | msgstr "Nahrává se soubor s uživatelským rozhraním z nynějšího podadresáře" 59 | 60 | #: ../pulsecaster/ui.py:80 61 | msgid "Cannot load resources" 62 | msgstr "Nelze nahrát zdroje" 63 | 64 | #. Miscellaneous dialog strings 65 | #: ../pulsecaster/ui.py:109 66 | msgid "Important notice" 67 | msgstr "Důležitá poznámka" 68 | 69 | #: ../pulsecaster/ui.py:115 70 | msgid "" 71 | "This program can be used to record speech from remote locations. You are " 72 | "responsible for adhering to all applicable laws and regulations when using " 73 | "this program. In general you should not record other parties without their " 74 | "consent." 75 | msgstr "" 76 | "Tento program lze použít na nahrávání rozhovoru ze vzdálených míst. Při " 77 | "používání tohoto programu zodpovídáte za dodržování všech platných zákonů a " 78 | "omezení. Obecně byste neměl nahrávat jiné strany bez jejich souhlasu." 79 | 80 | #: ../pulsecaster/ui.py:121 81 | msgid "Do not show this again" 82 | msgstr "Neukazovat toto znovu" 83 | 84 | #: ../pulsecaster/ui.py:123 85 | msgid "Select the audio sources to mix" 86 | msgstr "Vybrat zdroje zvuku ke smíchání" 87 | 88 | #: ../pulsecaster/ui.py:125 89 | msgid "I understand." 90 | msgstr "Rozumím." 91 | 92 | #: ../pulsecaster/ui.py:127 93 | msgid "Your voice" 94 | msgstr "Váš hlas" 95 | 96 | #: ../pulsecaster/ui.py:129 97 | msgid "Subject's voice" 98 | msgstr "Hlas protějšku" 99 | 100 | #: ../pulsecaster/ui.py:162 101 | msgid "Standard settings" 102 | msgstr "Standardní nastavení" 103 | 104 | #: ../pulsecaster/ui.py:163 105 | msgid "Expert settings" 106 | msgstr "Znalecká nastavení" 107 | 108 | #: ../pulsecaster/ui.py:164 109 | msgid "" 110 | "Save the conversation as a single audio file with compression. This is the " 111 | "right option for most people." 112 | msgstr "" 113 | "Rozhovor uložit jako jeden zkomprimovaný zvukový soubor. Toto je správná " 114 | "volba pro většinu lidí." 115 | 116 | #: ../pulsecaster/ui.py:167 117 | msgid "" 118 | "Save each voice as a separate audio file without compression. Use this " 119 | "option to mix and encode audio yourself." 120 | msgstr "" 121 | "Každý hlas uložit jako jeden nekomprimovaný zvukový soubor. Tuto volbu " 122 | "zvolte, když chcete smíchání a zakódování provést sám." 123 | 124 | #: ../pulsecaster/ui.py:397 125 | msgid "Save your recording" 126 | msgstr "Uložit nahrávku" 127 | 128 | #: ../pulsecaster/ui.py:414 129 | msgid "" 130 | "Are you sure you want to cancel saving your work? If you choose Yes your " 131 | "audio recording will be erased permanently." 132 | msgstr "" 133 | "Jste si jistý, že chcete zrušit ukládání své práce? Pokud zvolíte Ano, vaše " 134 | "zvuková nahrávka bude smazána trvale." 135 | 136 | #: ../pulsecaster/ui.py:455 137 | msgid "WAV files are written here:" 138 | msgstr "Soubory WAV jsou zapsány zde:" 139 | 140 | #: ../pulsecaster/ui.py:476 141 | msgid "File exists. OK to overwrite?" 142 | msgstr "Soubor již existuje. Má se přepsat?" 143 | -------------------------------------------------------------------------------- /po/da.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Kris Thomsen , 2011 7 | # Peter Larsen , 2012 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: Danish (http://www.transifex.com/stickster/pulsecaster/" 16 | "language/da/)\n" 17 | "Language: da\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #: ../pulsecaster.appdata.xml.in.h:1 24 | msgid "Record a podcast or interview" 25 | msgstr "" 26 | 27 | #: ../pulsecaster.appdata.xml.in.h:2 28 | msgid "" 29 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 30 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 31 | "(VoIP) app." 32 | msgstr "" 33 | 34 | #: ../pulsecaster.appdata.xml.in.h:3 35 | msgid "" 36 | "PulseCaster allows you to select which sources you use for your podcast. It " 37 | "then automatically mixes the sound sources into one recording that's ready " 38 | "to publish." 39 | msgstr "" 40 | 41 | #: ../pulsecaster.appdata.xml.in.h:4 42 | msgid "" 43 | "There is also an expert mode so you can mix or enhance the recording on your " 44 | "own." 45 | msgstr "" 46 | 47 | #: ../pulsecaster/ui.py:66 48 | msgid "loading UI file from current subdir" 49 | msgstr "indlæser UI-fil fra nuværende undermappe" 50 | 51 | #: ../pulsecaster/ui.py:80 52 | msgid "Cannot load resources" 53 | msgstr "Kan ikke indlæse ressourser" 54 | 55 | #. Miscellaneous dialog strings 56 | #: ../pulsecaster/ui.py:109 57 | msgid "Important notice" 58 | msgstr "Vigtig bemærkning" 59 | 60 | #: ../pulsecaster/ui.py:115 61 | msgid "" 62 | "This program can be used to record speech from remote locations. You are " 63 | "responsible for adhering to all applicable laws and regulations when using " 64 | "this program. In general you should not record other parties without their " 65 | "consent." 66 | msgstr "" 67 | "Dette program kan bruges til at optage tale fra fjernplaceringer. Du er " 68 | "ansvarlig for at overholde alle gældende love og regulationer når du bruger " 69 | "dette program. Generelt bør du ikke optage andre mennesker uden deres " 70 | "godkendelse." 71 | 72 | #: ../pulsecaster/ui.py:121 73 | msgid "Do not show this again" 74 | msgstr "Vis ikke dette igen" 75 | 76 | #: ../pulsecaster/ui.py:123 77 | msgid "Select the audio sources to mix" 78 | msgstr "Vælg lydkilderne som skal mixes" 79 | 80 | #: ../pulsecaster/ui.py:125 81 | msgid "I understand." 82 | msgstr "Jeg forstår." 83 | 84 | #: ../pulsecaster/ui.py:127 85 | msgid "Your voice" 86 | msgstr "Din stemme" 87 | 88 | #: ../pulsecaster/ui.py:129 89 | msgid "Subject's voice" 90 | msgstr "Emnets stemme" 91 | 92 | #: ../pulsecaster/ui.py:162 93 | msgid "Standard settings" 94 | msgstr "Standard konfiguration" 95 | 96 | #: ../pulsecaster/ui.py:163 97 | msgid "Expert settings" 98 | msgstr "Avanceret konfiguration" 99 | 100 | #: ../pulsecaster/ui.py:164 101 | msgid "" 102 | "Save the conversation as a single audio file with compression. This is the " 103 | "right option for most people." 104 | msgstr "" 105 | "Gem hele samtalen i en enkel komprimeret lydfil. Anbefalet for de fleste " 106 | "brugere." 107 | 108 | #: ../pulsecaster/ui.py:167 109 | msgid "" 110 | "Save each voice as a separate audio file without compression. Use this " 111 | "option to mix and encode audio yourself." 112 | msgstr "" 113 | "Gem hver part i separate ikke komprimeret lydfiler. Brug denne indstilling " 114 | "hvis du selv vil vælge filformat mv." 115 | 116 | #: ../pulsecaster/ui.py:397 117 | msgid "Save your recording" 118 | msgstr "Gem din optagelse" 119 | 120 | #: ../pulsecaster/ui.py:414 121 | msgid "" 122 | "Are you sure you want to cancel saving your work? If you choose Yes your " 123 | "audio recording will be erased permanently." 124 | msgstr "" 125 | "Er du sikker på at du vil annullere gemningen af dit arbejde. Hvis du vælger " 126 | "Ja vil din lydoptagelse bliver slettet for bestandigt." 127 | 128 | #: ../pulsecaster/ui.py:455 129 | msgid "WAV files are written here:" 130 | msgstr "WAV filer skrives hertil" 131 | 132 | #: ../pulsecaster/ui.py:476 133 | msgid "File exists. OK to overwrite?" 134 | msgstr "Filen findes. Er det iorden at overskrive?" 135 | -------------------------------------------------------------------------------- /po/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Felix Kaechele , 2012 7 | # Mario Blättermann , 2011 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: German (http://www.transifex.com/stickster/pulsecaster/" 16 | "language/de/)\n" 17 | "Language: de\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #: ../pulsecaster.appdata.xml.in.h:1 24 | msgid "Record a podcast or interview" 25 | msgstr "" 26 | 27 | #: ../pulsecaster.appdata.xml.in.h:2 28 | msgid "" 29 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 30 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 31 | "(VoIP) app." 32 | msgstr "" 33 | 34 | #: ../pulsecaster.appdata.xml.in.h:3 35 | msgid "" 36 | "PulseCaster allows you to select which sources you use for your podcast. It " 37 | "then automatically mixes the sound sources into one recording that's ready " 38 | "to publish." 39 | msgstr "" 40 | 41 | #: ../pulsecaster.appdata.xml.in.h:4 42 | msgid "" 43 | "There is also an expert mode so you can mix or enhance the recording on your " 44 | "own." 45 | msgstr "" 46 | 47 | #: ../pulsecaster/ui.py:66 48 | msgid "loading UI file from current subdir" 49 | msgstr "UI-Datei wird aus aktuellem Unterordner geladen" 50 | 51 | #: ../pulsecaster/ui.py:80 52 | msgid "Cannot load resources" 53 | msgstr "Ressourcen können nicht geladen werden" 54 | 55 | #. Miscellaneous dialog strings 56 | #: ../pulsecaster/ui.py:109 57 | msgid "Important notice" 58 | msgstr "Wichtiger Hinweis" 59 | 60 | #: ../pulsecaster/ui.py:115 61 | msgid "" 62 | "This program can be used to record speech from remote locations. You are " 63 | "responsible for adhering to all applicable laws and regulations when using " 64 | "this program. In general you should not record other parties without their " 65 | "consent." 66 | msgstr "" 67 | "Dieses Programm kann zur Aufzeichnung von Sprache von entfernten Orten " 68 | "verwendet werden. Sie sind dafür verantwortlich, bei der Nutzung dieses " 69 | "Programms alle geltenden Gesetze und Einschränkungen zu berücksichtigen. Im " 70 | "Allgemienen sollten Sie keine Stimmen fremder Personen ohne deren " 71 | "ausdrückliches Einverständnis aufzeichnen." 72 | 73 | #: ../pulsecaster/ui.py:121 74 | msgid "Do not show this again" 75 | msgstr "Dies nicht wieder anzeigen" 76 | 77 | #: ../pulsecaster/ui.py:123 78 | msgid "Select the audio sources to mix" 79 | msgstr "Audioquellen zum Mischen auswählen" 80 | 81 | #: ../pulsecaster/ui.py:125 82 | msgid "I understand." 83 | msgstr "Ich verstehe." 84 | 85 | #: ../pulsecaster/ui.py:127 86 | msgid "Your voice" 87 | msgstr "Ihre Stimme" 88 | 89 | #: ../pulsecaster/ui.py:129 90 | msgid "Subject's voice" 91 | msgstr "Stimme des Gegenübers" 92 | 93 | #: ../pulsecaster/ui.py:162 94 | msgid "Standard settings" 95 | msgstr "Standardeinstellungen" 96 | 97 | #: ../pulsecaster/ui.py:163 98 | msgid "Expert settings" 99 | msgstr "Experteneinstellungen" 100 | 101 | #: ../pulsecaster/ui.py:164 102 | msgid "" 103 | "Save the conversation as a single audio file with compression. This is the " 104 | "right option for most people." 105 | msgstr "" 106 | "Das Gespräch als einzelne, komprimierte Audio-Datei speichern. Dies ist " 107 | "richtige Option für die meisten Leute." 108 | 109 | #: ../pulsecaster/ui.py:167 110 | msgid "" 111 | "Save each voice as a separate audio file without compression. Use this " 112 | "option to mix and encode audio yourself." 113 | msgstr "" 114 | "Jede Stimme als einzelne Audio-Datei ohne Kompression speichern. Wählen Sie " 115 | "diese Option, wenn Sie die Aufzeichnung selbst abmischen und enkodieren " 116 | "möchten." 117 | 118 | #: ../pulsecaster/ui.py:397 119 | msgid "Save your recording" 120 | msgstr "Ihre Aufzeichnung speichern" 121 | 122 | #: ../pulsecaster/ui.py:414 123 | msgid "" 124 | "Are you sure you want to cancel saving your work? If you choose Yes your " 125 | "audio recording will be erased permanently." 126 | msgstr "" 127 | "Wollen Sie wirklich abbrechen, ohne Ihre Arbeit zu speichern? Falls ja, wird " 128 | "Ihre Aufzeichnung dauerhaft gelöscht." 129 | 130 | #: ../pulsecaster/ui.py:455 131 | msgid "WAV files are written here:" 132 | msgstr "WAV-Dateien hierhin speichern:" 133 | 134 | #: ../pulsecaster/ui.py:476 135 | msgid "File exists. OK to overwrite?" 136 | msgstr "Datei existiert bereits. Soll sie überschrieben werden?" 137 | -------------------------------------------------------------------------------- /po/de_DE.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # David-Kay Posmyk , 2011 7 | # Felix Kaechele , 2012 8 | # FIRST AUTHOR , 2010 9 | # Mario Blättermann , 2011 10 | # Vinzenz Vietzke , 2011 11 | msgid "" 12 | msgstr "" 13 | "Project-Id-Version: PulseCaster\n" 14 | "Report-Msgid-Bugs-To: \n" 15 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 16 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 17 | "Last-Translator: Paul Frields \n" 18 | "Language-Team: German (Germany) (http://www.transifex.com/stickster/" 19 | "pulsecaster/language/de_DE/)\n" 20 | "Language: de_DE\n" 21 | "MIME-Version: 1.0\n" 22 | "Content-Type: text/plain; charset=UTF-8\n" 23 | "Content-Transfer-Encoding: 8bit\n" 24 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 25 | 26 | #: ../pulsecaster.appdata.xml.in.h:1 27 | msgid "Record a podcast or interview" 28 | msgstr "" 29 | 30 | #: ../pulsecaster.appdata.xml.in.h:2 31 | msgid "" 32 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 33 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 34 | "(VoIP) app." 35 | msgstr "" 36 | 37 | #: ../pulsecaster.appdata.xml.in.h:3 38 | msgid "" 39 | "PulseCaster allows you to select which sources you use for your podcast. It " 40 | "then automatically mixes the sound sources into one recording that's ready " 41 | "to publish." 42 | msgstr "" 43 | 44 | #: ../pulsecaster.appdata.xml.in.h:4 45 | msgid "" 46 | "There is also an expert mode so you can mix or enhance the recording on your " 47 | "own." 48 | msgstr "" 49 | 50 | #: ../pulsecaster/ui.py:66 51 | msgid "loading UI file from current subdir" 52 | msgstr "UI-Datei wird aus aktuellem Unterordner geladen" 53 | 54 | #: ../pulsecaster/ui.py:80 55 | msgid "Cannot load resources" 56 | msgstr "Ressourcen können nicht geladen werden" 57 | 58 | #. Miscellaneous dialog strings 59 | #: ../pulsecaster/ui.py:109 60 | msgid "Important notice" 61 | msgstr "Wichtiger Hinweis" 62 | 63 | #: ../pulsecaster/ui.py:115 64 | msgid "" 65 | "This program can be used to record speech from remote locations. You are " 66 | "responsible for adhering to all applicable laws and regulations when using " 67 | "this program. In general you should not record other parties without their " 68 | "consent." 69 | msgstr "" 70 | "Dieses Programm kann zur Aufzeichnung von Sprache von entfernten Orten " 71 | "verwendet werden. Sie sind dafür verantwortlich, bei der Nutzung dieses " 72 | "Programms alle geltenden Gesetze und Einschränkungen zu berücksichtigen. Im " 73 | "Allgemienen sollten Sie keine Stimmen fremder Personen ohne deren " 74 | "ausdrückliches Einverständnis aufzeichnen." 75 | 76 | #: ../pulsecaster/ui.py:121 77 | msgid "Do not show this again" 78 | msgstr "Dies nicht wieder anzeigen" 79 | 80 | #: ../pulsecaster/ui.py:123 81 | msgid "Select the audio sources to mix" 82 | msgstr "Audioquellen zum Mischen auswählen" 83 | 84 | #: ../pulsecaster/ui.py:125 85 | msgid "I understand." 86 | msgstr "Ich verstehe." 87 | 88 | #: ../pulsecaster/ui.py:127 89 | msgid "Your voice" 90 | msgstr "Ihre Stimme" 91 | 92 | #: ../pulsecaster/ui.py:129 93 | msgid "Subject's voice" 94 | msgstr "Stimme des Gegenübers" 95 | 96 | #: ../pulsecaster/ui.py:162 97 | msgid "Standard settings" 98 | msgstr "Standardeinstellungen" 99 | 100 | #: ../pulsecaster/ui.py:163 101 | msgid "Expert settings" 102 | msgstr "Experteneinstellungen" 103 | 104 | #: ../pulsecaster/ui.py:164 105 | msgid "" 106 | "Save the conversation as a single audio file with compression. This is the " 107 | "right option for most people." 108 | msgstr "" 109 | "Das Gespräch als einzelne, komprimierte Audio-Datei speichern. Dies ist " 110 | "richtige Option für die meisten Leute." 111 | 112 | #: ../pulsecaster/ui.py:167 113 | msgid "" 114 | "Save each voice as a separate audio file without compression. Use this " 115 | "option to mix and encode audio yourself." 116 | msgstr "" 117 | "Jede Stimme als einzelne Audio-Datei ohne Kompression speichern. Wählen Sie " 118 | "diese Option, wenn Sie die Aufzeichnung selbst abmischen und enkodieren " 119 | "möchten." 120 | 121 | #: ../pulsecaster/ui.py:397 122 | msgid "Save your recording" 123 | msgstr "Ihre Aufzeichnung speichern" 124 | 125 | #: ../pulsecaster/ui.py:414 126 | msgid "" 127 | "Are you sure you want to cancel saving your work? If you choose Yes your " 128 | "audio recording will be erased permanently." 129 | msgstr "" 130 | "Wollen Sie wirklich abbrechen, ohne Ihre Arbeit zu speichern? Falls ja, wird " 131 | "Ihre Aufzeichnung dauerhaft gelöscht." 132 | 133 | #: ../pulsecaster/ui.py:455 134 | msgid "WAV files are written here:" 135 | msgstr "WAV-Dateien hierhin speichern:" 136 | 137 | #: ../pulsecaster/ui.py:476 138 | msgid "File exists. OK to overwrite?" 139 | msgstr "Datei existiert bereits. Soll sie überschrieben werden?" 140 | -------------------------------------------------------------------------------- /po/el.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Dimitris Glezos , 2011 7 | # FIRST AUTHOR , 2010 8 | # Demetris Karayiannis, 2012 9 | # Demetris Karayiannis, 2012 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PulseCaster\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 15 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 16 | "Last-Translator: Paul Frields \n" 17 | "Language-Team: Greek (http://www.transifex.com/stickster/pulsecaster/" 18 | "language/el/)\n" 19 | "Language: el\n" 20 | "MIME-Version: 1.0\n" 21 | "Content-Type: text/plain; charset=UTF-8\n" 22 | "Content-Transfer-Encoding: 8bit\n" 23 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 24 | 25 | #: ../pulsecaster.appdata.xml.in.h:1 26 | msgid "Record a podcast or interview" 27 | msgstr "" 28 | 29 | #: ../pulsecaster.appdata.xml.in.h:2 30 | msgid "" 31 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 32 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 33 | "(VoIP) app." 34 | msgstr "" 35 | 36 | #: ../pulsecaster.appdata.xml.in.h:3 37 | msgid "" 38 | "PulseCaster allows you to select which sources you use for your podcast. It " 39 | "then automatically mixes the sound sources into one recording that's ready " 40 | "to publish." 41 | msgstr "" 42 | 43 | #: ../pulsecaster.appdata.xml.in.h:4 44 | msgid "" 45 | "There is also an expert mode so you can mix or enhance the recording on your " 46 | "own." 47 | msgstr "" 48 | 49 | #: ../pulsecaster/ui.py:66 50 | msgid "loading UI file from current subdir" 51 | msgstr "φόρτωση αρχείου UI από τον τρέχοντα υποκατάλογο" 52 | 53 | #: ../pulsecaster/ui.py:80 54 | msgid "Cannot load resources" 55 | msgstr "Η φόρτωση των πόρων απέτυχε" 56 | 57 | #. Miscellaneous dialog strings 58 | #: ../pulsecaster/ui.py:109 59 | msgid "Important notice" 60 | msgstr "Σημαντική σημείωση" 61 | 62 | #: ../pulsecaster/ui.py:115 63 | msgid "" 64 | "This program can be used to record speech from remote locations. You are " 65 | "responsible for adhering to all applicable laws and regulations when using " 66 | "this program. In general you should not record other parties without their " 67 | "consent." 68 | msgstr "" 69 | "Αυτό το πρόγραμμα μπορεί να χρησιμοποιηθεί για να ηχογραφήσει ομιλία από " 70 | "απομακρυσμένες τοποθεσίες. Εσείς έχετε την ευθύνη για ακολουθήσετε όλους " 71 | "τους νόμους και κανονισμούς που εφαρμόζονται όταν χρησιμοποιείται το παρόν " 72 | "πρόγραμμα. Κατά κανόνα, δεν πρέπει να ηχογραφείτε τρίτους χωρίς την άδεια " 73 | "τους." 74 | 75 | #: ../pulsecaster/ui.py:121 76 | msgid "Do not show this again" 77 | msgstr "Να μην εμφανιστεί ξανά" 78 | 79 | #: ../pulsecaster/ui.py:123 80 | msgid "Select the audio sources to mix" 81 | msgstr "Επιλέξτε τις πηγές ήχου προς μίξη" 82 | 83 | #: ../pulsecaster/ui.py:125 84 | msgid "I understand." 85 | msgstr "Κατάλαβα." 86 | 87 | #: ../pulsecaster/ui.py:127 88 | msgid "Your voice" 89 | msgstr "Η φωνή σας" 90 | 91 | #: ../pulsecaster/ui.py:129 92 | msgid "Subject's voice" 93 | msgstr "Φωνή συνομιλητή" 94 | 95 | #: ../pulsecaster/ui.py:162 96 | msgid "Standard settings" 97 | msgstr "Τυπικές ρυθμίσεις" 98 | 99 | #: ../pulsecaster/ui.py:163 100 | msgid "Expert settings" 101 | msgstr "Εξειδικευμένες ρυθμίσεις" 102 | 103 | #: ../pulsecaster/ui.py:164 104 | msgid "" 105 | "Save the conversation as a single audio file with compression. This is the " 106 | "right option for most people." 107 | msgstr "" 108 | "Αποθήκευση της συνομιλίας σε ένα μοναδικό αρχείο ήχου με συμπίεση. Είναι η " 109 | "κατάλληλη επιλογή για τους περισσότερους χρήστες." 110 | 111 | #: ../pulsecaster/ui.py:167 112 | msgid "" 113 | "Save each voice as a separate audio file without compression. Use this " 114 | "option to mix and encode audio yourself." 115 | msgstr "" 116 | "Αποθήκευση κάθε φωνής σε ξεχωριστό αρχείο χωρίς συμπίεση. Επιλέξτε αυτό για " 117 | "να μιξάρετε και να κωδικοποιήσετε εσείς τον ήχο." 118 | 119 | #: ../pulsecaster/ui.py:397 120 | msgid "Save your recording" 121 | msgstr "Αποθήκευση ηχογράφησης" 122 | 123 | #: ../pulsecaster/ui.py:414 124 | msgid "" 125 | "Are you sure you want to cancel saving your work? If you choose Yes your " 126 | "audio recording will be erased permanently." 127 | msgstr "" 128 | "Σίγουρα θέλετε να ακυρώσετε την αποθήκευση του έργου σας; Επιλέγοντας \"Ναι" 129 | "\" η ηχογράφηση σας θα διαγραφεί οριστικά." 130 | 131 | #: ../pulsecaster/ui.py:455 132 | msgid "WAV files are written here:" 133 | msgstr "Τα αρχεία WAV θα γραφτούν εδώ:" 134 | 135 | #: ../pulsecaster/ui.py:476 136 | msgid "File exists. OK to overwrite?" 137 | msgstr "Το αρχείο υπάρχει ήδη. Είναι εντάξει να αντικατασταθεί; " 138 | -------------------------------------------------------------------------------- /po/es.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Dennis Tobar , 2011 7 | # Eduardo Villagrán M , 2012 8 | # Daniel Cabrera , 2011 9 | msgid "" 10 | msgstr "" 11 | "Project-Id-Version: PulseCaster\n" 12 | "Report-Msgid-Bugs-To: \n" 13 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 14 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 15 | "Last-Translator: Paul Frields \n" 16 | "Language-Team: Spanish (http://www.transifex.com/stickster/pulsecaster/" 17 | "language/es/)\n" 18 | "Language: es\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: ../pulsecaster.appdata.xml.in.h:1 25 | msgid "Record a podcast or interview" 26 | msgstr "" 27 | 28 | #: ../pulsecaster.appdata.xml.in.h:2 29 | msgid "" 30 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 31 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 32 | "(VoIP) app." 33 | msgstr "" 34 | 35 | #: ../pulsecaster.appdata.xml.in.h:3 36 | msgid "" 37 | "PulseCaster allows you to select which sources you use for your podcast. It " 38 | "then automatically mixes the sound sources into one recording that's ready " 39 | "to publish." 40 | msgstr "" 41 | 42 | #: ../pulsecaster.appdata.xml.in.h:4 43 | msgid "" 44 | "There is also an expert mode so you can mix or enhance the recording on your " 45 | "own." 46 | msgstr "" 47 | 48 | #: ../pulsecaster/ui.py:66 49 | msgid "loading UI file from current subdir" 50 | msgstr "cargando archivo UI desde el subdirectorio actual" 51 | 52 | #: ../pulsecaster/ui.py:80 53 | msgid "Cannot load resources" 54 | msgstr "No es posible cargar recursos" 55 | 56 | #. Miscellaneous dialog strings 57 | #: ../pulsecaster/ui.py:109 58 | msgid "Important notice" 59 | msgstr "Importante" 60 | 61 | #: ../pulsecaster/ui.py:115 62 | msgid "" 63 | "This program can be used to record speech from remote locations. You are " 64 | "responsible for adhering to all applicable laws and regulations when using " 65 | "this program. In general you should not record other parties without their " 66 | "consent." 67 | msgstr "" 68 | "Este programa puede ser utilizado para grabar sonidos a distancia. Al " 69 | "utilizarlo, queda bajo su exclusiva responsabilidad el hecho de adherirse a " 70 | "todas las leyes y regulaciones aplicables. Como norma general, no debería " 71 | "grabar a nada ni a nadie sin su consentimiento." 72 | 73 | #: ../pulsecaster/ui.py:121 74 | msgid "Do not show this again" 75 | msgstr "No mostrar nuevamente" 76 | 77 | #: ../pulsecaster/ui.py:123 78 | msgid "Select the audio sources to mix" 79 | msgstr "Elija las fuente de audio que mezclar" 80 | 81 | #: ../pulsecaster/ui.py:125 82 | msgid "I understand." 83 | msgstr "Comprendido." 84 | 85 | #: ../pulsecaster/ui.py:127 86 | msgid "Your voice" 87 | msgstr "Su voz" 88 | 89 | #: ../pulsecaster/ui.py:129 90 | msgid "Subject's voice" 91 | msgstr "La voz del sujeto" 92 | 93 | #: ../pulsecaster/ui.py:162 94 | msgid "Standard settings" 95 | msgstr "ajustes estándar" 96 | 97 | #: ../pulsecaster/ui.py:163 98 | msgid "Expert settings" 99 | msgstr "ajustes experto" 100 | 101 | #: ../pulsecaster/ui.py:164 102 | msgid "" 103 | "Save the conversation as a single audio file with compression. This is the " 104 | "right option for most people." 105 | msgstr "" 106 | "Guarda la conversación como un archivo único de audio con compresión. Esta " 107 | "es la opción adecuada para la mayoría." 108 | 109 | #: ../pulsecaster/ui.py:167 110 | msgid "" 111 | "Save each voice as a separate audio file without compression. Use this " 112 | "option to mix and encode audio yourself." 113 | msgstr "" 114 | "Guarda cada voz como archivos separados de audio sin compresión . Use esta " 115 | "opción para mezclar y codificar el audio usted mismo." 116 | 117 | #: ../pulsecaster/ui.py:397 118 | msgid "Save your recording" 119 | msgstr "Guardar su grabación" 120 | 121 | #: ../pulsecaster/ui.py:414 122 | msgid "" 123 | "Are you sure you want to cancel saving your work? If you choose Yes your " 124 | "audio recording will be erased permanently." 125 | msgstr "" 126 | "¿Está seguro de querer cancelar el proceso almacenamiento de su trabajo? Si " 127 | "elije Si, la grabación será eliminada permanentemente." 128 | 129 | #: ../pulsecaster/ui.py:455 130 | msgid "WAV files are written here:" 131 | msgstr "Los archivos WAV fueron guardados aquí:" 132 | 133 | #: ../pulsecaster/ui.py:476 134 | msgid "File exists. OK to overwrite?" 135 | msgstr "El archivo ya existe. ¿OK para sobrescribirlo?" 136 | -------------------------------------------------------------------------------- /po/es_MX.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # FIRST AUTHOR , 2010 7 | # Jesus Franco , 2011 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: Spanish (Mexico) (http://www.transifex.com/stickster/" 16 | "pulsecaster/language/es_MX/)\n" 17 | "Language: es_MX\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #: ../pulsecaster.appdata.xml.in.h:1 24 | msgid "Record a podcast or interview" 25 | msgstr "" 26 | 27 | #: ../pulsecaster.appdata.xml.in.h:2 28 | msgid "" 29 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 30 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 31 | "(VoIP) app." 32 | msgstr "" 33 | 34 | #: ../pulsecaster.appdata.xml.in.h:3 35 | msgid "" 36 | "PulseCaster allows you to select which sources you use for your podcast. It " 37 | "then automatically mixes the sound sources into one recording that's ready " 38 | "to publish." 39 | msgstr "" 40 | 41 | #: ../pulsecaster.appdata.xml.in.h:4 42 | msgid "" 43 | "There is also an expert mode so you can mix or enhance the recording on your " 44 | "own." 45 | msgstr "" 46 | 47 | #: ../pulsecaster/ui.py:66 48 | msgid "loading UI file from current subdir" 49 | msgstr "" 50 | 51 | #: ../pulsecaster/ui.py:80 52 | msgid "Cannot load resources" 53 | msgstr "No es posible cargar los recursos" 54 | 55 | #. Miscellaneous dialog strings 56 | #: ../pulsecaster/ui.py:109 57 | msgid "Important notice" 58 | msgstr "" 59 | 60 | #: ../pulsecaster/ui.py:115 61 | msgid "" 62 | "This program can be used to record speech from remote locations. You are " 63 | "responsible for adhering to all applicable laws and regulations when using " 64 | "this program. In general you should not record other parties without their " 65 | "consent." 66 | msgstr "" 67 | 68 | #: ../pulsecaster/ui.py:121 69 | msgid "Do not show this again" 70 | msgstr "" 71 | 72 | #: ../pulsecaster/ui.py:123 73 | msgid "Select the audio sources to mix" 74 | msgstr "" 75 | 76 | #: ../pulsecaster/ui.py:125 77 | msgid "I understand." 78 | msgstr "" 79 | 80 | #: ../pulsecaster/ui.py:127 81 | msgid "Your voice" 82 | msgstr "" 83 | 84 | #: ../pulsecaster/ui.py:129 85 | msgid "Subject's voice" 86 | msgstr "" 87 | 88 | #: ../pulsecaster/ui.py:162 89 | msgid "Standard settings" 90 | msgstr "" 91 | 92 | #: ../pulsecaster/ui.py:163 93 | msgid "Expert settings" 94 | msgstr "" 95 | 96 | #: ../pulsecaster/ui.py:164 97 | msgid "" 98 | "Save the conversation as a single audio file with compression. This is the " 99 | "right option for most people." 100 | msgstr "" 101 | 102 | #: ../pulsecaster/ui.py:167 103 | msgid "" 104 | "Save each voice as a separate audio file without compression. Use this " 105 | "option to mix and encode audio yourself." 106 | msgstr "" 107 | 108 | #: ../pulsecaster/ui.py:397 109 | msgid "Save your recording" 110 | msgstr "" 111 | 112 | #: ../pulsecaster/ui.py:414 113 | msgid "" 114 | "Are you sure you want to cancel saving your work? If you choose Yes your " 115 | "audio recording will be erased permanently." 116 | msgstr "" 117 | 118 | #: ../pulsecaster/ui.py:455 119 | msgid "WAV files are written here:" 120 | msgstr "" 121 | 122 | #: ../pulsecaster/ui.py:476 123 | msgid "File exists. OK to overwrite?" 124 | msgstr "" 125 | -------------------------------------------------------------------------------- /po/fr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Jérôme Fenal , 2013-2014 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PulseCaster\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 12 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 13 | "Last-Translator: Paul Frields \n" 14 | "Language-Team: French (http://www.transifex.com/stickster/pulsecaster/" 15 | "language/fr/)\n" 16 | "Language: fr\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 21 | 22 | #: ../pulsecaster.appdata.xml.in.h:1 23 | msgid "Record a podcast or interview" 24 | msgstr "" 25 | 26 | #: ../pulsecaster.appdata.xml.in.h:2 27 | msgid "" 28 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 29 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 30 | "(VoIP) app." 31 | msgstr "" 32 | 33 | #: ../pulsecaster.appdata.xml.in.h:3 34 | msgid "" 35 | "PulseCaster allows you to select which sources you use for your podcast. It " 36 | "then automatically mixes the sound sources into one recording that's ready " 37 | "to publish." 38 | msgstr "" 39 | 40 | #: ../pulsecaster.appdata.xml.in.h:4 41 | msgid "" 42 | "There is also an expert mode so you can mix or enhance the recording on your " 43 | "own." 44 | msgstr "" 45 | 46 | #: ../pulsecaster/ui.py:66 47 | msgid "loading UI file from current subdir" 48 | msgstr "Chargement du fichier UI à partir du sous-répertoire courant" 49 | 50 | #: ../pulsecaster/ui.py:80 51 | msgid "Cannot load resources" 52 | msgstr "Impossible de charger les ressources" 53 | 54 | #. Miscellaneous dialog strings 55 | #: ../pulsecaster/ui.py:109 56 | msgid "Important notice" 57 | msgstr "Avis important" 58 | 59 | #: ../pulsecaster/ui.py:115 60 | msgid "" 61 | "This program can be used to record speech from remote locations. You are " 62 | "responsible for adhering to all applicable laws and regulations when using " 63 | "this program. In general you should not record other parties without their " 64 | "consent." 65 | msgstr "" 66 | "Ce programme peut être utilisé pour enregistrer un discours depuis un site " 67 | "distant. Vous vous engagez à respecter les lois et règlements en vigueur " 68 | "lors de son utilisation. En particulier vous ne devez pas enregistrer une " 69 | "personne sans son consentement." 70 | 71 | #: ../pulsecaster/ui.py:121 72 | msgid "Do not show this again" 73 | msgstr "Ne plus afficher ce message" 74 | 75 | #: ../pulsecaster/ui.py:123 76 | msgid "Select the audio sources to mix" 77 | msgstr "Sélectionnez les sources audio à mélanger" 78 | 79 | #: ../pulsecaster/ui.py:125 80 | msgid "I understand." 81 | msgstr "Je comprends." 82 | 83 | #: ../pulsecaster/ui.py:127 84 | msgid "Your voice" 85 | msgstr "Votre voix" 86 | 87 | #: ../pulsecaster/ui.py:129 88 | msgid "Subject's voice" 89 | msgstr "Voix du sujet" 90 | 91 | #: ../pulsecaster/ui.py:162 92 | msgid "Standard settings" 93 | msgstr "Configuration standard" 94 | 95 | #: ../pulsecaster/ui.py:163 96 | msgid "Expert settings" 97 | msgstr "Configuration pour les experts" 98 | 99 | #: ../pulsecaster/ui.py:164 100 | msgid "" 101 | "Save the conversation as a single audio file with compression. This is the " 102 | "right option for most people." 103 | msgstr "" 104 | "Enregistrer la conversation comme un fichier audio unique compressé. Cette " 105 | "option est la bonne pour la plupart des utilisateurs." 106 | 107 | #: ../pulsecaster/ui.py:167 108 | msgid "" 109 | "Save each voice as a separate audio file without compression. Use this " 110 | "option to mix and encode audio yourself." 111 | msgstr "" 112 | "Enregistrer chaque voix dans un fichier audio non-compressé. Utiliser cette " 113 | "option pour mixer et encoder le son soi-même." 114 | 115 | #: ../pulsecaster/ui.py:397 116 | msgid "Save your recording" 117 | msgstr "Sauvegarder votre enregistrement" 118 | 119 | #: ../pulsecaster/ui.py:414 120 | msgid "" 121 | "Are you sure you want to cancel saving your work? If you choose Yes your " 122 | "audio recording will be erased permanently." 123 | msgstr "" 124 | "Êtes-vous certain de vouloir arrêter la sauvegarde de votre travail ? Si " 125 | "vous cliquez sur oui votre enregistrement audio sera effacé définitivement." 126 | 127 | #: ../pulsecaster/ui.py:455 128 | msgid "WAV files are written here:" 129 | msgstr "Les fichiers WAV sont enregistrés ici :" 130 | 131 | #: ../pulsecaster/ui.py:476 132 | msgid "File exists. OK to overwrite?" 133 | msgstr "Le fichier existe. Souhaitez-vous le remplacer ?" 134 | -------------------------------------------------------------------------------- /po/gl.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # bassball93 , 2011 7 | # FIRST AUTHOR , 2010 8 | # Paul Frields , 2011 9 | msgid "" 10 | msgstr "" 11 | "Project-Id-Version: PulseCaster\n" 12 | "Report-Msgid-Bugs-To: \n" 13 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 14 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 15 | "Last-Translator: Paul Frields \n" 16 | "Language-Team: Galician (http://www.transifex.com/stickster/pulsecaster/" 17 | "language/gl/)\n" 18 | "Language: gl\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: ../pulsecaster.appdata.xml.in.h:1 25 | msgid "Record a podcast or interview" 26 | msgstr "" 27 | 28 | #: ../pulsecaster.appdata.xml.in.h:2 29 | msgid "" 30 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 31 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 32 | "(VoIP) app." 33 | msgstr "" 34 | 35 | #: ../pulsecaster.appdata.xml.in.h:3 36 | msgid "" 37 | "PulseCaster allows you to select which sources you use for your podcast. It " 38 | "then automatically mixes the sound sources into one recording that's ready " 39 | "to publish." 40 | msgstr "" 41 | 42 | #: ../pulsecaster.appdata.xml.in.h:4 43 | msgid "" 44 | "There is also an expert mode so you can mix or enhance the recording on your " 45 | "own." 46 | msgstr "" 47 | 48 | #: ../pulsecaster/ui.py:66 49 | msgid "loading UI file from current subdir" 50 | msgstr "" 51 | 52 | #: ../pulsecaster/ui.py:80 53 | msgid "Cannot load resources" 54 | msgstr "Non se poden cargar os recursos" 55 | 56 | #. Miscellaneous dialog strings 57 | #: ../pulsecaster/ui.py:109 58 | msgid "Important notice" 59 | msgstr "" 60 | 61 | #: ../pulsecaster/ui.py:115 62 | msgid "" 63 | "This program can be used to record speech from remote locations. You are " 64 | "responsible for adhering to all applicable laws and regulations when using " 65 | "this program. In general you should not record other parties without their " 66 | "consent." 67 | msgstr "" 68 | 69 | #: ../pulsecaster/ui.py:121 70 | msgid "Do not show this again" 71 | msgstr "" 72 | 73 | #: ../pulsecaster/ui.py:123 74 | msgid "Select the audio sources to mix" 75 | msgstr "" 76 | 77 | #: ../pulsecaster/ui.py:125 78 | msgid "I understand." 79 | msgstr "" 80 | 81 | #: ../pulsecaster/ui.py:127 82 | msgid "Your voice" 83 | msgstr "" 84 | 85 | #: ../pulsecaster/ui.py:129 86 | msgid "Subject's voice" 87 | msgstr "" 88 | 89 | #: ../pulsecaster/ui.py:162 90 | msgid "Standard settings" 91 | msgstr "" 92 | 93 | #: ../pulsecaster/ui.py:163 94 | msgid "Expert settings" 95 | msgstr "" 96 | 97 | #: ../pulsecaster/ui.py:164 98 | msgid "" 99 | "Save the conversation as a single audio file with compression. This is the " 100 | "right option for most people." 101 | msgstr "" 102 | 103 | #: ../pulsecaster/ui.py:167 104 | msgid "" 105 | "Save each voice as a separate audio file without compression. Use this " 106 | "option to mix and encode audio yourself." 107 | msgstr "" 108 | 109 | #: ../pulsecaster/ui.py:397 110 | msgid "Save your recording" 111 | msgstr "" 112 | 113 | #: ../pulsecaster/ui.py:414 114 | msgid "" 115 | "Are you sure you want to cancel saving your work? If you choose Yes your " 116 | "audio recording will be erased permanently." 117 | msgstr "" 118 | 119 | #: ../pulsecaster/ui.py:455 120 | msgid "WAV files are written here:" 121 | msgstr "" 122 | 123 | #: ../pulsecaster/ui.py:476 124 | msgid "File exists. OK to overwrite?" 125 | msgstr "" 126 | -------------------------------------------------------------------------------- /po/he.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Elad Alfassa , 2011 7 | # GenghisKhan , 2016 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: Hebrew (http://www.transifex.com/stickster/pulsecaster/" 16 | "language/he/)\n" 17 | "Language: he\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " 22 | "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" 23 | 24 | #: ../pulsecaster.appdata.xml.in.h:1 25 | msgid "Record a podcast or interview" 26 | msgstr "הקלט פודקאסט או ראיון" 27 | 28 | #: ../pulsecaster.appdata.xml.in.h:2 29 | msgid "" 30 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 31 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 32 | "(VoIP) app." 33 | msgstr "" 34 | "‏PulseCaster הינו מקליט קול מבוסס PulseAudio. באפשרותך להשתמש בו כדי להקליט " 35 | "פודקאסטים או ראיונות אשר נערכים בתוך המחשב הנייד שלך או מתוך אפליקציית VoIP " 36 | "נפרדת." 37 | 38 | #: ../pulsecaster.appdata.xml.in.h:3 39 | msgid "" 40 | "PulseCaster allows you to select which sources you use for your podcast. It " 41 | "then automatically mixes the sound sources into one recording that's ready " 42 | "to publish." 43 | msgstr "" 44 | "‏PulseCaster מתיר לך לבחור באילו מקורות לבחור לצורך הפודקאסט שלך. אחרי כן זה " 45 | "מערבל אוטומטית את מקורות הקול לתוך הקלטה אחת אשר מוכנה לפרסום." 46 | 47 | #: ../pulsecaster.appdata.xml.in.h:4 48 | msgid "" 49 | "There is also an expert mode so you can mix or enhance the recording on your " 50 | "own." 51 | msgstr "" 52 | "ישנו גם מצב מומחה כך שתעמוד לך האפשרות לערבל או להגביר את ההקלטה בעצמך." 53 | 54 | #: ../pulsecaster/ui.py:66 55 | msgid "loading UI file from current subdir" 56 | msgstr "מעלה קובץ UI מתוך תת תיקייה נוכחית" 57 | 58 | #: ../pulsecaster/ui.py:80 59 | msgid "Cannot load resources" 60 | msgstr "לא ניתן לטעון משאבים" 61 | 62 | #. Miscellaneous dialog strings 63 | #: ../pulsecaster/ui.py:109 64 | msgid "Important notice" 65 | msgstr "הודעה חשובה" 66 | 67 | #: ../pulsecaster/ui.py:115 68 | msgid "" 69 | "This program can be used to record speech from remote locations. You are " 70 | "responsible for adhering to all applicable laws and regulations when using " 71 | "this program. In general you should not record other parties without their " 72 | "consent." 73 | msgstr "" 74 | "אפשר להשתמש בתוכנית זו כדי להקליט דיבור מתוך מיקומים מרוחקים. אתם אחראים " 75 | "לדבוק בכל החוקים והרגולציות המתאימות כזמן שימוש בתוכנית זו. באופן כללי אתם " 76 | "לא אמורים להקליט צדדים אחרים בלי הסכמתם." 77 | 78 | #: ../pulsecaster/ui.py:121 79 | msgid "Do not show this again" 80 | msgstr "אל תציג זאת שוב" 81 | 82 | #: ../pulsecaster/ui.py:123 83 | msgid "Select the audio sources to mix" 84 | msgstr "בחר מקורות אודיו לערבול" 85 | 86 | #: ../pulsecaster/ui.py:125 87 | msgid "I understand." 88 | msgstr "אני מבין." 89 | 90 | #: ../pulsecaster/ui.py:127 91 | msgid "Your voice" 92 | msgstr "קולך" 93 | 94 | #: ../pulsecaster/ui.py:129 95 | msgid "Subject's voice" 96 | msgstr "קול נתון" 97 | 98 | #: ../pulsecaster/ui.py:162 99 | msgid "Standard settings" 100 | msgstr "הגדרות סטנדרטיות" 101 | 102 | #: ../pulsecaster/ui.py:163 103 | msgid "Expert settings" 104 | msgstr "הגדרות למומחים" 105 | 106 | #: ../pulsecaster/ui.py:164 107 | msgid "" 108 | "Save the conversation as a single audio file with compression. This is the " 109 | "right option for most people." 110 | msgstr "" 111 | "שמור את דיון זה בתור קובץ אודיו בודד עם דחיסה. זוהי האפשרות המתאימה לרוב " 112 | "האנשים." 113 | 114 | #: ../pulsecaster/ui.py:167 115 | msgid "" 116 | "Save each voice as a separate audio file without compression. Use this " 117 | "option to mix and encode audio yourself." 118 | msgstr "" 119 | "שמור כל קול בתור קובץ אודיו נפרד בלי דחיסה. השתמש באפרות זו כדי לערבל ולקודד " 120 | "אודיו בעצמך." 121 | 122 | #: ../pulsecaster/ui.py:397 123 | msgid "Save your recording" 124 | msgstr "שמור את הקלטתך" 125 | 126 | #: ../pulsecaster/ui.py:414 127 | msgid "" 128 | "Are you sure you want to cancel saving your work? If you choose Yes your " 129 | "audio recording will be erased permanently." 130 | msgstr "" 131 | "האם אתה בטוח כי ברצונך לבטל את שמירת מלאכתך? אם תבחר כן ההקלטה האודיוטורית " 132 | "שלך תימחק לצמיתות." 133 | 134 | #: ../pulsecaster/ui.py:455 135 | msgid "WAV files are written here:" 136 | msgstr "קבצי WAV נכתבים לכאן:" 137 | 138 | #: ../pulsecaster/ui.py:476 139 | msgid "File exists. OK to overwrite?" 140 | msgstr "קובץ קיים. האם לרשום עליו?" 141 | -------------------------------------------------------------------------------- /po/hu.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # FIRST AUTHOR , 2010 7 | # Máté Gelei , 2011 8 | # Peter Borsa , 2014-2015 9 | # Zoltan Hoppár , 2011 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PulseCaster\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 15 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 16 | "Last-Translator: Paul Frields \n" 17 | "Language-Team: Hungarian (http://www.transifex.com/stickster/pulsecaster/" 18 | "language/hu/)\n" 19 | "Language: hu\n" 20 | "MIME-Version: 1.0\n" 21 | "Content-Type: text/plain; charset=UTF-8\n" 22 | "Content-Transfer-Encoding: 8bit\n" 23 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 24 | 25 | #: ../pulsecaster.appdata.xml.in.h:1 26 | msgid "Record a podcast or interview" 27 | msgstr "Podcast vagy interjú felvétele" 28 | 29 | #: ../pulsecaster.appdata.xml.in.h:2 30 | msgid "" 31 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 32 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 33 | "(VoIP) app." 34 | msgstr "" 35 | "A PulseCaster egy PulseAudio alapú podcast-felvevő. Használhatja podcastok " 36 | "vagy interjúk felvételére a laptopján vagy egy különálló IP telefónia (VoIP) " 37 | "alkalmazásból." 38 | 39 | #: ../pulsecaster.appdata.xml.in.h:3 40 | msgid "" 41 | "PulseCaster allows you to select which sources you use for your podcast. It " 42 | "then automatically mixes the sound sources into one recording that's ready " 43 | "to publish." 44 | msgstr "" 45 | "A PulseCaster megengedi, hogy kiválassza mely forrásokat használja. Majd " 46 | "automatikusan keveri a hangforrásokat egyetlen felvételbe, amely már készen " 47 | "áll a publikálásra." 48 | 49 | #: ../pulsecaster.appdata.xml.in.h:4 50 | msgid "" 51 | "There is also an expert mode so you can mix or enhance the recording on your " 52 | "own." 53 | msgstr "" 54 | "Haladó mód is létezik, így mixelheti vagy javíthatja a felvételt saját maga." 55 | 56 | #: ../pulsecaster/ui.py:66 57 | msgid "loading UI file from current subdir" 58 | msgstr "UI fájl betöltése a jelenlegi könyvtárból" 59 | 60 | #: ../pulsecaster/ui.py:80 61 | msgid "Cannot load resources" 62 | msgstr "Nem lehet betölteni az erőforrásokat" 63 | 64 | #. Miscellaneous dialog strings 65 | #: ../pulsecaster/ui.py:109 66 | msgid "Important notice" 67 | msgstr "Fontos megjegyzés" 68 | 69 | #: ../pulsecaster/ui.py:115 70 | msgid "" 71 | "This program can be used to record speech from remote locations. You are " 72 | "responsible for adhering to all applicable laws and regulations when using " 73 | "this program. In general you should not record other parties without their " 74 | "consent." 75 | msgstr "" 76 | "Ezzel a programmal távoli helyekről rögzíthet hangot. A program használata " 77 | "során Ön vállalja a felelősséget, hogy betartja a megfelelő törvényeket és " 78 | "szabályozásokat. Harmadik fél hangjának felvétele csak az ő engedélyükkel " 79 | "történhet." 80 | 81 | #: ../pulsecaster/ui.py:121 82 | msgid "Do not show this again" 83 | msgstr "Ne jelenjen meg újra" 84 | 85 | #: ../pulsecaster/ui.py:123 86 | msgid "Select the audio sources to mix" 87 | msgstr "Válassza ki a keverendő hangforrásokat" 88 | 89 | #: ../pulsecaster/ui.py:125 90 | msgid "I understand." 91 | msgstr "Megértettem." 92 | 93 | #: ../pulsecaster/ui.py:127 94 | msgid "Your voice" 95 | msgstr "Az Ön hangja" 96 | 97 | #: ../pulsecaster/ui.py:129 98 | msgid "Subject's voice" 99 | msgstr "Az alany hangja" 100 | 101 | #: ../pulsecaster/ui.py:162 102 | msgid "Standard settings" 103 | msgstr "Standard beállítások" 104 | 105 | #: ../pulsecaster/ui.py:163 106 | msgid "Expert settings" 107 | msgstr "Haladó beállítások" 108 | 109 | #: ../pulsecaster/ui.py:164 110 | msgid "" 111 | "Save the conversation as a single audio file with compression. This is the " 112 | "right option for most people." 113 | msgstr "" 114 | "A beszélgetés mentése egyetlen audio fájlba tömörítéssel. Ez a " 115 | "legmegfelelőbb opció a legtöbb ember számára." 116 | 117 | #: ../pulsecaster/ui.py:167 118 | msgid "" 119 | "Save each voice as a separate audio file without compression. Use this " 120 | "option to mix and encode audio yourself." 121 | msgstr "" 122 | "Egyes hangok mentése külön-külön audio fájlba tömörítés nélkül. Használja " 123 | "ezt az opciót, ha saját maga szeretné keverni és kódolni." 124 | 125 | #: ../pulsecaster/ui.py:397 126 | msgid "Save your recording" 127 | msgstr "A felvétel mentése" 128 | 129 | #: ../pulsecaster/ui.py:414 130 | msgid "" 131 | "Are you sure you want to cancel saving your work? If you choose Yes your " 132 | "audio recording will be erased permanently." 133 | msgstr "" 134 | "Biztosan nem menti el munkáját? Ha az Igenre kattint, a hangfelvétel " 135 | "véglegesen elveszik." 136 | 137 | #: ../pulsecaster/ui.py:455 138 | msgid "WAV files are written here:" 139 | msgstr "Wav fájlok helye:" 140 | 141 | #: ../pulsecaster/ui.py:476 142 | msgid "File exists. OK to overwrite?" 143 | msgstr "A fájl már létezik. Felülírhatom?" 144 | -------------------------------------------------------------------------------- /po/it.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # fugolini, 2011 7 | # Gianluca Sforna , 2012 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: Italian (http://www.transifex.com/stickster/pulsecaster/" 16 | "language/it/)\n" 17 | "Language: it\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #: ../pulsecaster.appdata.xml.in.h:1 24 | msgid "Record a podcast or interview" 25 | msgstr "" 26 | 27 | #: ../pulsecaster.appdata.xml.in.h:2 28 | msgid "" 29 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 30 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 31 | "(VoIP) app." 32 | msgstr "" 33 | 34 | #: ../pulsecaster.appdata.xml.in.h:3 35 | msgid "" 36 | "PulseCaster allows you to select which sources you use for your podcast. It " 37 | "then automatically mixes the sound sources into one recording that's ready " 38 | "to publish." 39 | msgstr "" 40 | 41 | #: ../pulsecaster.appdata.xml.in.h:4 42 | msgid "" 43 | "There is also an expert mode so you can mix or enhance the recording on your " 44 | "own." 45 | msgstr "" 46 | 47 | #: ../pulsecaster/ui.py:66 48 | msgid "loading UI file from current subdir" 49 | msgstr "caricamento dell'interfaccia utente dalla sottodirectory attuale" 50 | 51 | #: ../pulsecaster/ui.py:80 52 | msgid "Cannot load resources" 53 | msgstr "Non è possibile caricare le risorse" 54 | 55 | #. Miscellaneous dialog strings 56 | #: ../pulsecaster/ui.py:109 57 | msgid "Important notice" 58 | msgstr "Avviso importante" 59 | 60 | #: ../pulsecaster/ui.py:115 61 | msgid "" 62 | "This program can be used to record speech from remote locations. You are " 63 | "responsible for adhering to all applicable laws and regulations when using " 64 | "this program. In general you should not record other parties without their " 65 | "consent." 66 | msgstr "" 67 | "Questo programma può essere usato per registrare una conversazione da una " 68 | "postazione remota. Hai la responsabilità di conformarti a tutte le leggi e " 69 | "regolamenti quando usi questo programma. In generale non devi registrare " 70 | "altre parti senza il loro consenso." 71 | 72 | #: ../pulsecaster/ui.py:121 73 | msgid "Do not show this again" 74 | msgstr "Non mostrarlo di nuovo" 75 | 76 | #: ../pulsecaster/ui.py:123 77 | msgid "Select the audio sources to mix" 78 | msgstr "Selezionare la sorgente audio da unire" 79 | 80 | #: ../pulsecaster/ui.py:125 81 | msgid "I understand." 82 | msgstr "Ho compreso." 83 | 84 | #: ../pulsecaster/ui.py:127 85 | msgid "Your voice" 86 | msgstr "La tua voce" 87 | 88 | #: ../pulsecaster/ui.py:129 89 | msgid "Subject's voice" 90 | msgstr "La voce del soggetto" 91 | 92 | #: ../pulsecaster/ui.py:162 93 | msgid "Standard settings" 94 | msgstr "Impostazioni standard" 95 | 96 | #: ../pulsecaster/ui.py:163 97 | msgid "Expert settings" 98 | msgstr "Impostazioni avanzate" 99 | 100 | #: ../pulsecaster/ui.py:164 101 | msgid "" 102 | "Save the conversation as a single audio file with compression. This is the " 103 | "right option for most people." 104 | msgstr "" 105 | "Salva la conversazione come singolo file audio compresso. Questa opzione è " 106 | "adatta alla maggior parte dei casi." 107 | 108 | #: ../pulsecaster/ui.py:167 109 | msgid "" 110 | "Save each voice as a separate audio file without compression. Use this " 111 | "option to mix and encode audio yourself." 112 | msgstr "" 113 | "Salva ogni voce in un separato file audio non compresso. Usare questa " 114 | "opzione per miscelare e codificare l'audio manualmente." 115 | 116 | #: ../pulsecaster/ui.py:397 117 | msgid "Save your recording" 118 | msgstr "Salva la registrazione" 119 | 120 | #: ../pulsecaster/ui.py:414 121 | msgid "" 122 | "Are you sure you want to cancel saving your work? If you choose Yes your " 123 | "audio recording will be erased permanently." 124 | msgstr "" 125 | "Annullare il salvataggio del lavoro? Scegliendo Yes, la registrazione audio " 126 | "sarà cancellata permanentemente." 127 | 128 | #: ../pulsecaster/ui.py:455 129 | msgid "WAV files are written here:" 130 | msgstr "I file WAV sono scritti in:" 131 | 132 | #: ../pulsecaster/ui.py:476 133 | msgid "File exists. OK to overwrite?" 134 | msgstr "Il file esiste già. Sovrascriverlo?" 135 | -------------------------------------------------------------------------------- /po/ja.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Tomoyuki KATO , 2011-2012 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PulseCaster\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 12 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 13 | "Last-Translator: Paul Frields \n" 14 | "Language-Team: Japanese (http://www.transifex.com/stickster/pulsecaster/" 15 | "language/ja/)\n" 16 | "Language: ja\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=1; plural=0;\n" 21 | 22 | #: ../pulsecaster.appdata.xml.in.h:1 23 | msgid "Record a podcast or interview" 24 | msgstr "" 25 | 26 | #: ../pulsecaster.appdata.xml.in.h:2 27 | msgid "" 28 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 29 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 30 | "(VoIP) app." 31 | msgstr "" 32 | 33 | #: ../pulsecaster.appdata.xml.in.h:3 34 | msgid "" 35 | "PulseCaster allows you to select which sources you use for your podcast. It " 36 | "then automatically mixes the sound sources into one recording that's ready " 37 | "to publish." 38 | msgstr "" 39 | 40 | #: ../pulsecaster.appdata.xml.in.h:4 41 | msgid "" 42 | "There is also an expert mode so you can mix or enhance the recording on your " 43 | "own." 44 | msgstr "" 45 | 46 | #: ../pulsecaster/ui.py:66 47 | msgid "loading UI file from current subdir" 48 | msgstr "現在のサブディレクトリから UI ファイルを読み込みます" 49 | 50 | #: ../pulsecaster/ui.py:80 51 | msgid "Cannot load resources" 52 | msgstr "リソースが読み込めませんでした" 53 | 54 | #. Miscellaneous dialog strings 55 | #: ../pulsecaster/ui.py:109 56 | msgid "Important notice" 57 | msgstr "重要な注意" 58 | 59 | #: ../pulsecaster/ui.py:115 60 | msgid "" 61 | "This program can be used to record speech from remote locations. You are " 62 | "responsible for adhering to all applicable laws and regulations when using " 63 | "this program. In general you should not record other parties without their " 64 | "consent." 65 | msgstr "" 66 | "このプログラムは遠隔地からスピーチを録音するために使用できます。このプログラ" 67 | "ムを使用するとき、あなたはすべての関係法令を厳守する役割を果たします。一般" 68 | "に、あなたは彼らの同意なしで他の関係者を録音するべきでありません。" 69 | 70 | #: ../pulsecaster/ui.py:121 71 | msgid "Do not show this again" 72 | msgstr "再び表示しない" 73 | 74 | #: ../pulsecaster/ui.py:123 75 | msgid "Select the audio sources to mix" 76 | msgstr "編集する音声ソースを選択する" 77 | 78 | #: ../pulsecaster/ui.py:125 79 | msgid "I understand." 80 | msgstr "理解しました。" 81 | 82 | #: ../pulsecaster/ui.py:127 83 | msgid "Your voice" 84 | msgstr "あなたの声" 85 | 86 | #: ../pulsecaster/ui.py:129 87 | msgid "Subject's voice" 88 | msgstr "主体の声" 89 | 90 | #: ../pulsecaster/ui.py:162 91 | msgid "Standard settings" 92 | msgstr "標準設定" 93 | 94 | #: ../pulsecaster/ui.py:163 95 | msgid "Expert settings" 96 | msgstr "エキスパート設定" 97 | 98 | #: ../pulsecaster/ui.py:164 99 | msgid "" 100 | "Save the conversation as a single audio file with compression. This is the " 101 | "right option for most people." 102 | msgstr "" 103 | "圧縮した単一の音声ファイルとして会話を保存します。これは多くの人にとって適切" 104 | "です。" 105 | 106 | #: ../pulsecaster/ui.py:167 107 | msgid "" 108 | "Save each voice as a separate audio file without compression. Use this " 109 | "option to mix and encode audio yourself." 110 | msgstr "" 111 | "圧縮せずに別々の音声ファイルとしてそれぞれの音声を保存します。音声をミックス" 112 | "およびエンコードするにはこのオプションを使用します。" 113 | 114 | #: ../pulsecaster/ui.py:397 115 | msgid "Save your recording" 116 | msgstr "録音したものを保存する" 117 | 118 | #: ../pulsecaster/ui.py:414 119 | msgid "" 120 | "Are you sure you want to cancel saving your work? If you choose Yes your " 121 | "audio recording will be erased permanently." 122 | msgstr "" 123 | "本当に成果物の保存を取り消したいですか?「はい」を選択すると、音声録音が永久" 124 | "に失われます。" 125 | 126 | #: ../pulsecaster/ui.py:455 127 | msgid "WAV files are written here:" 128 | msgstr "WAV ファイルがここに書き込まれます:" 129 | 130 | #: ../pulsecaster/ui.py:476 131 | msgid "File exists. OK to overwrite?" 132 | msgstr "ファイルが存在します。上書きしてもよろしいですか?" 133 | -------------------------------------------------------------------------------- /po/lt.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Moo, 2015 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PulseCaster\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 12 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 13 | "Last-Translator: Paul Frields \n" 14 | "Language-Team: Lithuanian (http://www.transifex.com/stickster/pulsecaster/" 15 | "language/lt/)\n" 16 | "Language: lt\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " 21 | "11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " 22 | "1 : n % 1 != 0 ? 2: 3);\n" 23 | 24 | #: ../pulsecaster.appdata.xml.in.h:1 25 | msgid "Record a podcast or interview" 26 | msgstr "Įrašyti tinklalaidę ar interviu" 27 | 28 | #: ../pulsecaster.appdata.xml.in.h:2 29 | msgid "" 30 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 31 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 32 | "(VoIP) app." 33 | msgstr "" 34 | "PulseCaster yra PulseAudio grįstas garsarašis. Jūs galite jį naudoti, " 35 | "tinklalaidžių ar interviu įrašymui savo nešiojamame kompiuteryje ar per " 36 | "atskirą interneto telefonijos (VoIP) programą." 37 | 38 | #: ../pulsecaster.appdata.xml.in.h:3 39 | msgid "" 40 | "PulseCaster allows you to select which sources you use for your podcast. It " 41 | "then automatically mixes the sound sources into one recording that's ready " 42 | "to publish." 43 | msgstr "" 44 | "PulseCaster leidžia jums pasirinkti, kuriuos šaltinius norite naudoti " 45 | "tinklalaidei. Tuomet programa automatiškai sumaišo garso šaltinius į vieną, " 46 | "publikavimui paruoštą, įrašą." 47 | 48 | #: ../pulsecaster.appdata.xml.in.h:4 49 | msgid "" 50 | "There is also an expert mode so you can mix or enhance the recording on your " 51 | "own." 52 | msgstr "" 53 | "Be to, yra eksperto veiksena, taigi galite patys maišyti ar pagerinti įrašą" 54 | 55 | #: ../pulsecaster/ui.py:66 56 | msgid "loading UI file from current subdir" 57 | msgstr "įkeliamas vartotojo sąsajos failas iš esamo pakatalogio" 58 | 59 | #: ../pulsecaster/ui.py:80 60 | msgid "Cannot load resources" 61 | msgstr "Negaliu įkelti išteklių" 62 | 63 | #. Miscellaneous dialog strings 64 | #: ../pulsecaster/ui.py:109 65 | msgid "Important notice" 66 | msgstr "Svarbus pranešimas" 67 | 68 | #: ../pulsecaster/ui.py:115 69 | msgid "" 70 | "This program can be used to record speech from remote locations. You are " 71 | "responsible for adhering to all applicable laws and regulations when using " 72 | "this program. In general you should not record other parties without their " 73 | "consent." 74 | msgstr "" 75 | "Ši programa gali būti naudojama, šnekos iš nuotolinių vietų, įrašymui. " 76 | "Naudodamiesi šia programa, jūs esate atsakingi už visų galiojančių įstatymų " 77 | "ir reguliavimų laikymąsi. Bendrai tariant, jūs neturėtumėte įrašinėti kitų " 78 | "šalių be jų sutikimo." 79 | 80 | #: ../pulsecaster/ui.py:121 81 | msgid "Do not show this again" 82 | msgstr "Daugiau neberodyti" 83 | 84 | #: ../pulsecaster/ui.py:123 85 | msgid "Select the audio sources to mix" 86 | msgstr "Pasirinkite norimus maišyti garso šaltinius" 87 | 88 | #: ../pulsecaster/ui.py:125 89 | msgid "I understand." 90 | msgstr "Aš suprantu." 91 | 92 | #: ../pulsecaster/ui.py:127 93 | msgid "Your voice" 94 | msgstr "Jūsų balsas" 95 | 96 | #: ../pulsecaster/ui.py:129 97 | msgid "Subject's voice" 98 | msgstr "Subjekto balsas" 99 | 100 | #: ../pulsecaster/ui.py:162 101 | msgid "Standard settings" 102 | msgstr "Standartiniai nustatymai" 103 | 104 | #: ../pulsecaster/ui.py:163 105 | msgid "Expert settings" 106 | msgstr "Ekspertiniai nustatymai" 107 | 108 | #: ../pulsecaster/ui.py:164 109 | msgid "" 110 | "Save the conversation as a single audio file with compression. This is the " 111 | "right option for most people." 112 | msgstr "" 113 | "Išsaugoti pokalbį kaip vieną garso įrašo failą su glaudinimu. Tai yra " 114 | "daugumai žmonių tinkanti parinktis." 115 | 116 | #: ../pulsecaster/ui.py:167 117 | msgid "" 118 | "Save each voice as a separate audio file without compression. Use this " 119 | "option to mix and encode audio yourself." 120 | msgstr "" 121 | "Išsaugoti kiekvieną balsą kaip atskirą garso įrašo failą be glaudinimo. " 122 | "Naudokite šią parinktį, norėdami patys maišyti ir koduoti garso įrašą ." 123 | 124 | #: ../pulsecaster/ui.py:397 125 | msgid "Save your recording" 126 | msgstr "Išsaugokite savo įrašą" 127 | 128 | #: ../pulsecaster/ui.py:414 129 | msgid "" 130 | "Are you sure you want to cancel saving your work? If you choose Yes your " 131 | "audio recording will be erased permanently." 132 | msgstr "" 133 | "Ar tikrai norite atšaukti savo darbo išsaugojimą? Jei pasirinksite Taip, " 134 | "jūsų garso įrašas bus ištrintas negrįžtamai." 135 | 136 | #: ../pulsecaster/ui.py:455 137 | msgid "WAV files are written here:" 138 | msgstr "WAV failai yra įrašomi čia:" 139 | 140 | #: ../pulsecaster/ui.py:476 141 | msgid "File exists. OK to overwrite?" 142 | msgstr "Failas yra. Galima jį pakeisti?" 143 | -------------------------------------------------------------------------------- /po/nl.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Geert Warrink , 2011 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PulseCaster\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 12 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 13 | "Last-Translator: Paul Frields \n" 14 | "Language-Team: Dutch (http://www.transifex.com/stickster/pulsecaster/" 15 | "language/nl/)\n" 16 | "Language: nl\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 21 | 22 | #: ../pulsecaster.appdata.xml.in.h:1 23 | msgid "Record a podcast or interview" 24 | msgstr "" 25 | 26 | #: ../pulsecaster.appdata.xml.in.h:2 27 | msgid "" 28 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 29 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 30 | "(VoIP) app." 31 | msgstr "" 32 | 33 | #: ../pulsecaster.appdata.xml.in.h:3 34 | msgid "" 35 | "PulseCaster allows you to select which sources you use for your podcast. It " 36 | "then automatically mixes the sound sources into one recording that's ready " 37 | "to publish." 38 | msgstr "" 39 | 40 | #: ../pulsecaster.appdata.xml.in.h:4 41 | msgid "" 42 | "There is also an expert mode so you can mix or enhance the recording on your " 43 | "own." 44 | msgstr "" 45 | 46 | #: ../pulsecaster/ui.py:66 47 | msgid "loading UI file from current subdir" 48 | msgstr "UI bestand laden uit de huidige submap" 49 | 50 | #: ../pulsecaster/ui.py:80 51 | msgid "Cannot load resources" 52 | msgstr "Kan geen hulpmiddelen laden" 53 | 54 | #. Miscellaneous dialog strings 55 | #: ../pulsecaster/ui.py:109 56 | msgid "Important notice" 57 | msgstr "Belangrijke opmerking" 58 | 59 | #: ../pulsecaster/ui.py:115 60 | msgid "" 61 | "This program can be used to record speech from remote locations. You are " 62 | "responsible for adhering to all applicable laws and regulations when using " 63 | "this program. In general you should not record other parties without their " 64 | "consent." 65 | msgstr "" 66 | "Dit programma kan gebruikt worden om spraak op te nemen van locaties op " 67 | "afstand. Je bent verantwoordelijk voor het naleven van alle van toepassing " 68 | "zijnde wetten en voorschriften bij het gebruik van dit programma. In het " 69 | "algemeen mag je anderen niet opnemen zonder hun toestemming." 70 | 71 | #: ../pulsecaster/ui.py:121 72 | msgid "Do not show this again" 73 | msgstr "Laat dit niet meerzien" 74 | 75 | #: ../pulsecaster/ui.py:123 76 | msgid "Select the audio sources to mix" 77 | msgstr "Selecteer de te mengen audio-bronnen" 78 | 79 | #: ../pulsecaster/ui.py:125 80 | msgid "I understand." 81 | msgstr "Ik begrijp het." 82 | 83 | #: ../pulsecaster/ui.py:127 84 | msgid "Your voice" 85 | msgstr "Jouw stem" 86 | 87 | #: ../pulsecaster/ui.py:129 88 | msgid "Subject's voice" 89 | msgstr "De stem van de subject" 90 | 91 | #: ../pulsecaster/ui.py:162 92 | msgid "Standard settings" 93 | msgstr "" 94 | 95 | #: ../pulsecaster/ui.py:163 96 | msgid "Expert settings" 97 | msgstr "" 98 | 99 | #: ../pulsecaster/ui.py:164 100 | msgid "" 101 | "Save the conversation as a single audio file with compression. This is the " 102 | "right option for most people." 103 | msgstr "" 104 | 105 | #: ../pulsecaster/ui.py:167 106 | msgid "" 107 | "Save each voice as a separate audio file without compression. Use this " 108 | "option to mix and encode audio yourself." 109 | msgstr "" 110 | 111 | #: ../pulsecaster/ui.py:397 112 | msgid "Save your recording" 113 | msgstr "Sla je opname op" 114 | 115 | #: ../pulsecaster/ui.py:414 116 | msgid "" 117 | "Are you sure you want to cancel saving your work? If you choose Yes your " 118 | "audio recording will be erased permanently." 119 | msgstr "" 120 | "Weet je zeker dat je het opslaan van jouw werk wilt annuleren? Als je Ja " 121 | "kiest zal jouw audio-opname permanent gewist worden." 122 | 123 | #: ../pulsecaster/ui.py:455 124 | msgid "WAV files are written here:" 125 | msgstr "" 126 | 127 | #: ../pulsecaster/ui.py:476 128 | msgid "File exists. OK to overwrite?" 129 | msgstr "Bestand bestaat. Is het OK om deze te overschrijven?" 130 | -------------------------------------------------------------------------------- /po/no.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PulseCaster\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 11 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 12 | "Last-Translator: Paul Frields \n" 13 | "Language-Team: Norwegian (http://www.transifex.com/stickster/pulsecaster/" 14 | "language/no/)\n" 15 | "Language: no\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 20 | 21 | #: ../pulsecaster.appdata.xml.in.h:1 22 | msgid "Record a podcast or interview" 23 | msgstr "" 24 | 25 | #: ../pulsecaster.appdata.xml.in.h:2 26 | msgid "" 27 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 28 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 29 | "(VoIP) app." 30 | msgstr "" 31 | 32 | #: ../pulsecaster.appdata.xml.in.h:3 33 | msgid "" 34 | "PulseCaster allows you to select which sources you use for your podcast. It " 35 | "then automatically mixes the sound sources into one recording that's ready " 36 | "to publish." 37 | msgstr "" 38 | 39 | #: ../pulsecaster.appdata.xml.in.h:4 40 | msgid "" 41 | "There is also an expert mode so you can mix or enhance the recording on your " 42 | "own." 43 | msgstr "" 44 | 45 | #: ../pulsecaster/ui.py:66 46 | msgid "loading UI file from current subdir" 47 | msgstr "" 48 | 49 | #: ../pulsecaster/ui.py:80 50 | msgid "Cannot load resources" 51 | msgstr "" 52 | 53 | #. Miscellaneous dialog strings 54 | #: ../pulsecaster/ui.py:109 55 | msgid "Important notice" 56 | msgstr "" 57 | 58 | #: ../pulsecaster/ui.py:115 59 | msgid "" 60 | "This program can be used to record speech from remote locations. You are " 61 | "responsible for adhering to all applicable laws and regulations when using " 62 | "this program. In general you should not record other parties without their " 63 | "consent." 64 | msgstr "" 65 | 66 | #: ../pulsecaster/ui.py:121 67 | msgid "Do not show this again" 68 | msgstr "" 69 | 70 | #: ../pulsecaster/ui.py:123 71 | msgid "Select the audio sources to mix" 72 | msgstr "" 73 | 74 | #: ../pulsecaster/ui.py:125 75 | msgid "I understand." 76 | msgstr "" 77 | 78 | #: ../pulsecaster/ui.py:127 79 | msgid "Your voice" 80 | msgstr "" 81 | 82 | #: ../pulsecaster/ui.py:129 83 | msgid "Subject's voice" 84 | msgstr "" 85 | 86 | #: ../pulsecaster/ui.py:162 87 | msgid "Standard settings" 88 | msgstr "" 89 | 90 | #: ../pulsecaster/ui.py:163 91 | msgid "Expert settings" 92 | msgstr "" 93 | 94 | #: ../pulsecaster/ui.py:164 95 | msgid "" 96 | "Save the conversation as a single audio file with compression. This is the " 97 | "right option for most people." 98 | msgstr "" 99 | 100 | #: ../pulsecaster/ui.py:167 101 | msgid "" 102 | "Save each voice as a separate audio file without compression. Use this " 103 | "option to mix and encode audio yourself." 104 | msgstr "" 105 | 106 | #: ../pulsecaster/ui.py:397 107 | msgid "Save your recording" 108 | msgstr "" 109 | 110 | #: ../pulsecaster/ui.py:414 111 | msgid "" 112 | "Are you sure you want to cancel saving your work? If you choose Yes your " 113 | "audio recording will be erased permanently." 114 | msgstr "" 115 | 116 | #: ../pulsecaster/ui.py:455 117 | msgid "WAV files are written here:" 118 | msgstr "" 119 | 120 | #: ../pulsecaster/ui.py:476 121 | msgid "File exists. OK to overwrite?" 122 | msgstr "" 123 | -------------------------------------------------------------------------------- /po/pl.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # FIRST AUTHOR , 2010 7 | # Piotr Drąg , 2011-2016 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: Polish (http://www.transifex.com/stickster/pulsecaster/" 16 | "language/pl/)\n" 17 | "Language: pl\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" 22 | "%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" 23 | "%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" 24 | 25 | #: ../pulsecaster.appdata.xml.in.h:1 26 | msgid "Record a podcast or interview" 27 | msgstr "Nagrywanie podcastów lub wywiadów" 28 | 29 | #: ../pulsecaster.appdata.xml.in.h:2 30 | msgid "" 31 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 32 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 33 | "(VoIP) app." 34 | msgstr "" 35 | "PulseCaster to program do nagrywania dźwięku oparty na PulseAudio. Można go " 36 | "używać do nagrywania podcastów lub wywiadów za pomocą laptopa lub oddzielnej " 37 | "aplikacji VoIP." 38 | 39 | #: ../pulsecaster.appdata.xml.in.h:3 40 | msgid "" 41 | "PulseCaster allows you to select which sources you use for your podcast. It " 42 | "then automatically mixes the sound sources into one recording that's ready " 43 | "to publish." 44 | msgstr "" 45 | "PulseCaster umożliwia wybranie źródeł dla podcastu, a następnie " 46 | "automatycznie miksuje źródła dźwięku w jedno nagranie gotowe do publikacji." 47 | 48 | #: ../pulsecaster.appdata.xml.in.h:4 49 | msgid "" 50 | "There is also an expert mode so you can mix or enhance the recording on your " 51 | "own." 52 | msgstr "" 53 | "PulseCaster ma także tryb eksperta, w którym można samodzielnie miksować lub " 54 | "ulepszać nagranie." 55 | 56 | #: ../pulsecaster/ui.py:66 57 | msgid "loading UI file from current subdir" 58 | msgstr "wczytywanie pliku interfejsu użytkownika z bieżącego podkatalogu" 59 | 60 | #: ../pulsecaster/ui.py:80 61 | msgid "Cannot load resources" 62 | msgstr "Nie można wczytać zasobów" 63 | 64 | #. Miscellaneous dialog strings 65 | #: ../pulsecaster/ui.py:109 66 | msgid "Important notice" 67 | msgstr "Ważna uwaga" 68 | 69 | #: ../pulsecaster/ui.py:115 70 | msgid "" 71 | "This program can be used to record speech from remote locations. You are " 72 | "responsible for adhering to all applicable laws and regulations when using " 73 | "this program. In general you should not record other parties without their " 74 | "consent." 75 | msgstr "" 76 | "Ten program może być używany do nagrywania mowy ze zdalnych położeń. " 77 | "Użytkownik jest odpowiedzialny za stosowanie się do wszelkich praw " 78 | "i zobowiązań podczas używania tego programu. Przede wszystkim nie powinno " 79 | "się nagrywać innych osób bez ich zgody." 80 | 81 | #: ../pulsecaster/ui.py:121 82 | msgid "Do not show this again" 83 | msgstr "Bez wyświetlania ponownie" 84 | 85 | #: ../pulsecaster/ui.py:123 86 | msgid "Select the audio sources to mix" 87 | msgstr "Wybór źródeł dźwięku do miksowania" 88 | 89 | #: ../pulsecaster/ui.py:125 90 | msgid "I understand." 91 | msgstr "Rozumiem." 92 | 93 | #: ../pulsecaster/ui.py:127 94 | msgid "Your voice" 95 | msgstr "Twój głos" 96 | 97 | #: ../pulsecaster/ui.py:129 98 | msgid "Subject's voice" 99 | msgstr "Głos podmiotu" 100 | 101 | #: ../pulsecaster/ui.py:162 102 | msgid "Standard settings" 103 | msgstr "Standardowe ustawienia" 104 | 105 | #: ../pulsecaster/ui.py:163 106 | msgid "Expert settings" 107 | msgstr "Wyeksportuj ustawienia" 108 | 109 | #: ../pulsecaster/ui.py:164 110 | msgid "" 111 | "Save the conversation as a single audio file with compression. This is the " 112 | "right option for most people." 113 | msgstr "" 114 | "Zapisanie rozmowy jako pojedynczy plik dźwiękowy z kompresją. Jest to " 115 | "odpowiednia opcja dla większości osób." 116 | 117 | #: ../pulsecaster/ui.py:167 118 | msgid "" 119 | "Save each voice as a separate audio file without compression. Use this " 120 | "option to mix and encode audio yourself." 121 | msgstr "" 122 | "Zapisanie każdego głosu jako oddzielny plik dźwiękowy bez kompresji. Ta " 123 | "opcja umożliwia samodzielne miksowanie i kodowanie dźwięku." 124 | 125 | #: ../pulsecaster/ui.py:397 126 | msgid "Save your recording" 127 | msgstr "Zapis nagrania" 128 | 129 | #: ../pulsecaster/ui.py:414 130 | msgid "" 131 | "Are you sure you want to cancel saving your work? If you choose Yes your " 132 | "audio recording will be erased permanently." 133 | msgstr "" 134 | "Na pewno anulować zapisywanie? Po wybraniu Tak nagranie dźwięku zostanie " 135 | "bezpowrotnie usunięte." 136 | 137 | #: ../pulsecaster/ui.py:455 138 | msgid "WAV files are written here:" 139 | msgstr "Pliki WAV są zapisywane tutaj:" 140 | 141 | #: ../pulsecaster/ui.py:476 142 | msgid "File exists. OK to overwrite?" 143 | msgstr "Plik istnieje. Zastąpić go?" 144 | -------------------------------------------------------------------------------- /po/pt_BR.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PulseCaster\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 11 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 12 | "Last-Translator: Paul Frields \n" 13 | "Language-Team: Portuguese (Brazil) (http://www.transifex.com/stickster/" 14 | "pulsecaster/language/pt_BR/)\n" 15 | "Language: pt_BR\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 20 | 21 | #: ../pulsecaster.appdata.xml.in.h:1 22 | msgid "Record a podcast or interview" 23 | msgstr "" 24 | 25 | #: ../pulsecaster.appdata.xml.in.h:2 26 | msgid "" 27 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 28 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 29 | "(VoIP) app." 30 | msgstr "" 31 | 32 | #: ../pulsecaster.appdata.xml.in.h:3 33 | msgid "" 34 | "PulseCaster allows you to select which sources you use for your podcast. It " 35 | "then automatically mixes the sound sources into one recording that's ready " 36 | "to publish." 37 | msgstr "" 38 | 39 | #: ../pulsecaster.appdata.xml.in.h:4 40 | msgid "" 41 | "There is also an expert mode so you can mix or enhance the recording on your " 42 | "own." 43 | msgstr "" 44 | 45 | #: ../pulsecaster/ui.py:66 46 | msgid "loading UI file from current subdir" 47 | msgstr "" 48 | 49 | #: ../pulsecaster/ui.py:80 50 | msgid "Cannot load resources" 51 | msgstr "" 52 | 53 | #. Miscellaneous dialog strings 54 | #: ../pulsecaster/ui.py:109 55 | msgid "Important notice" 56 | msgstr "" 57 | 58 | #: ../pulsecaster/ui.py:115 59 | msgid "" 60 | "This program can be used to record speech from remote locations. You are " 61 | "responsible for adhering to all applicable laws and regulations when using " 62 | "this program. In general you should not record other parties without their " 63 | "consent." 64 | msgstr "" 65 | 66 | #: ../pulsecaster/ui.py:121 67 | msgid "Do not show this again" 68 | msgstr "" 69 | 70 | #: ../pulsecaster/ui.py:123 71 | msgid "Select the audio sources to mix" 72 | msgstr "" 73 | 74 | #: ../pulsecaster/ui.py:125 75 | msgid "I understand." 76 | msgstr "" 77 | 78 | #: ../pulsecaster/ui.py:127 79 | msgid "Your voice" 80 | msgstr "" 81 | 82 | #: ../pulsecaster/ui.py:129 83 | msgid "Subject's voice" 84 | msgstr "" 85 | 86 | #: ../pulsecaster/ui.py:162 87 | msgid "Standard settings" 88 | msgstr "" 89 | 90 | #: ../pulsecaster/ui.py:163 91 | msgid "Expert settings" 92 | msgstr "" 93 | 94 | #: ../pulsecaster/ui.py:164 95 | msgid "" 96 | "Save the conversation as a single audio file with compression. This is the " 97 | "right option for most people." 98 | msgstr "" 99 | 100 | #: ../pulsecaster/ui.py:167 101 | msgid "" 102 | "Save each voice as a separate audio file without compression. Use this " 103 | "option to mix and encode audio yourself." 104 | msgstr "" 105 | 106 | #: ../pulsecaster/ui.py:397 107 | msgid "Save your recording" 108 | msgstr "" 109 | 110 | #: ../pulsecaster/ui.py:414 111 | msgid "" 112 | "Are you sure you want to cancel saving your work? If you choose Yes your " 113 | "audio recording will be erased permanently." 114 | msgstr "" 115 | 116 | #: ../pulsecaster/ui.py:455 117 | msgid "WAV files are written here:" 118 | msgstr "" 119 | 120 | #: ../pulsecaster/ui.py:476 121 | msgid "File exists. OK to overwrite?" 122 | msgstr "" 123 | -------------------------------------------------------------------------------- /po/pt_PT.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Miguel Sousa , 2011 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PulseCaster\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 12 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 13 | "Last-Translator: Paul Frields \n" 14 | "Language-Team: Portuguese (Portugal) (http://www.transifex.com/stickster/" 15 | "pulsecaster/language/pt_PT/)\n" 16 | "Language: pt_PT\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 21 | 22 | #: ../pulsecaster.appdata.xml.in.h:1 23 | msgid "Record a podcast or interview" 24 | msgstr "" 25 | 26 | #: ../pulsecaster.appdata.xml.in.h:2 27 | msgid "" 28 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 29 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 30 | "(VoIP) app." 31 | msgstr "" 32 | 33 | #: ../pulsecaster.appdata.xml.in.h:3 34 | msgid "" 35 | "PulseCaster allows you to select which sources you use for your podcast. It " 36 | "then automatically mixes the sound sources into one recording that's ready " 37 | "to publish." 38 | msgstr "" 39 | 40 | #: ../pulsecaster.appdata.xml.in.h:4 41 | msgid "" 42 | "There is also an expert mode so you can mix or enhance the recording on your " 43 | "own." 44 | msgstr "" 45 | 46 | #: ../pulsecaster/ui.py:66 47 | msgid "loading UI file from current subdir" 48 | msgstr "a carregar ficheiro UI do subdirectório actual" 49 | 50 | #: ../pulsecaster/ui.py:80 51 | msgid "Cannot load resources" 52 | msgstr "Não consegue carregar os recursos" 53 | 54 | #. Miscellaneous dialog strings 55 | #: ../pulsecaster/ui.py:109 56 | msgid "Important notice" 57 | msgstr "Nota Importante" 58 | 59 | #: ../pulsecaster/ui.py:115 60 | msgid "" 61 | "This program can be used to record speech from remote locations. You are " 62 | "responsible for adhering to all applicable laws and regulations when using " 63 | "this program. In general you should not record other parties without their " 64 | "consent." 65 | msgstr "" 66 | "Este programa pode ser utilizado para gravar discursos de localizações " 67 | "distantes. É de sua responsabilidade cumprir com todas as leis e " 68 | "regulamentos aplicáveis no uso deste programa. Em suma, não deve gravar " 69 | "terceiros sem o seu consentimento." 70 | 71 | #: ../pulsecaster/ui.py:121 72 | msgid "Do not show this again" 73 | msgstr "Não mostrar isto novamente" 74 | 75 | #: ../pulsecaster/ui.py:123 76 | msgid "Select the audio sources to mix" 77 | msgstr "Selecione as fontes áudio para misturar" 78 | 79 | #: ../pulsecaster/ui.py:125 80 | msgid "I understand." 81 | msgstr "Eu compreendo." 82 | 83 | #: ../pulsecaster/ui.py:127 84 | msgid "Your voice" 85 | msgstr "A sua voz" 86 | 87 | #: ../pulsecaster/ui.py:129 88 | msgid "Subject's voice" 89 | msgstr "A voz do sujeito" 90 | 91 | #: ../pulsecaster/ui.py:162 92 | msgid "Standard settings" 93 | msgstr "" 94 | 95 | #: ../pulsecaster/ui.py:163 96 | msgid "Expert settings" 97 | msgstr "" 98 | 99 | #: ../pulsecaster/ui.py:164 100 | msgid "" 101 | "Save the conversation as a single audio file with compression. This is the " 102 | "right option for most people." 103 | msgstr "" 104 | 105 | #: ../pulsecaster/ui.py:167 106 | msgid "" 107 | "Save each voice as a separate audio file without compression. Use this " 108 | "option to mix and encode audio yourself." 109 | msgstr "" 110 | 111 | #: ../pulsecaster/ui.py:397 112 | msgid "Save your recording" 113 | msgstr "Guarde a sua gravação" 114 | 115 | #: ../pulsecaster/ui.py:414 116 | msgid "" 117 | "Are you sure you want to cancel saving your work? If you choose Yes your " 118 | "audio recording will be erased permanently." 119 | msgstr "" 120 | "Tem a certeza que quer cancelar a gravação do seu trabalho? Se escolher Sim " 121 | "a sua gravação áudio vai ser apagada de forma permanente." 122 | 123 | #: ../pulsecaster/ui.py:455 124 | msgid "WAV files are written here:" 125 | msgstr "" 126 | 127 | #: ../pulsecaster/ui.py:476 128 | msgid "File exists. OK to overwrite?" 129 | msgstr "Ficheiro existe. Ok para escrever por cima?" 130 | -------------------------------------------------------------------------------- /po/pulsecaster.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2021-07-23 14:33-0400\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=CHARSET\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: ../pulsecaster.appdata.xml.in.h:1 21 | msgid "Record a podcast or interview" 22 | msgstr "" 23 | 24 | #: ../pulsecaster.appdata.xml.in.h:2 25 | msgid "" 26 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 27 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 28 | "(VoIP) app." 29 | msgstr "" 30 | 31 | #: ../pulsecaster.appdata.xml.in.h:3 32 | msgid "" 33 | "PulseCaster allows you to select which sources you use for your podcast. It " 34 | "then automatically mixes the sound sources into one recording that's ready " 35 | "to publish." 36 | msgstr "" 37 | 38 | #: ../pulsecaster.appdata.xml.in.h:4 39 | msgid "" 40 | "There is also an expert mode so you can mix or enhance the recording on your " 41 | "own." 42 | msgstr "" 43 | 44 | #: ../pulsecaster/ui.py:66 45 | msgid "loading UI file from current subdir" 46 | msgstr "" 47 | 48 | #: ../pulsecaster/ui.py:80 49 | msgid "Cannot load resources" 50 | msgstr "" 51 | 52 | #. Miscellaneous dialog strings 53 | #: ../pulsecaster/ui.py:109 54 | msgid "Important notice" 55 | msgstr "" 56 | 57 | #: ../pulsecaster/ui.py:115 58 | msgid "" 59 | "This program can be used to record speech from remote locations. You are " 60 | "responsible for adhering to all applicable laws and regulations when using " 61 | "this program. In general you should not record other parties without their " 62 | "consent." 63 | msgstr "" 64 | 65 | #: ../pulsecaster/ui.py:121 66 | msgid "Do not show this again" 67 | msgstr "" 68 | 69 | #: ../pulsecaster/ui.py:123 70 | msgid "Select the audio sources to mix" 71 | msgstr "" 72 | 73 | #: ../pulsecaster/ui.py:125 74 | msgid "I understand." 75 | msgstr "" 76 | 77 | #: ../pulsecaster/ui.py:127 78 | msgid "Your voice" 79 | msgstr "" 80 | 81 | #: ../pulsecaster/ui.py:129 82 | msgid "Subject's voice" 83 | msgstr "" 84 | 85 | #: ../pulsecaster/ui.py:162 86 | msgid "Standard settings" 87 | msgstr "" 88 | 89 | #: ../pulsecaster/ui.py:163 90 | msgid "Expert settings" 91 | msgstr "" 92 | 93 | #: ../pulsecaster/ui.py:164 94 | msgid "" 95 | "Save the conversation as a single audio file with compression. This is the " 96 | "right option for most people." 97 | msgstr "" 98 | 99 | #: ../pulsecaster/ui.py:167 100 | msgid "" 101 | "Save each voice as a separate audio file without compression. Use this " 102 | "option to mix and encode audio yourself." 103 | msgstr "" 104 | 105 | #: ../pulsecaster/ui.py:400 106 | msgid "Save your recording" 107 | msgstr "" 108 | 109 | #: ../pulsecaster/ui.py:417 110 | msgid "" 111 | "Are you sure you want to cancel saving your work? If you choose Yes your " 112 | "audio recording will be erased permanently." 113 | msgstr "" 114 | 115 | #: ../pulsecaster/ui.py:420 116 | msgid "Yes, erase my recording" 117 | msgstr "" 118 | 119 | #: ../pulsecaster/ui.py:421 120 | msgid "No, let me save my recording" 121 | msgstr "" 122 | 123 | #: ../pulsecaster/ui.py:465 124 | msgid "WAV files are written here:" 125 | msgstr "" 126 | 127 | #: ../pulsecaster/ui.py:486 128 | msgid "File exists. OK to overwrite?" 129 | msgstr "" 130 | -------------------------------------------------------------------------------- /po/ru.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Alexander Opoycev , 2011 7 | # Alexey Ivanov , 2011 8 | # Artem Vorotnikov , 2015 9 | # FIRST AUTHOR , 2010 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: PulseCaster\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 15 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 16 | "Last-Translator: Paul Frields \n" 17 | "Language-Team: Russian (http://www.transifex.com/stickster/pulsecaster/language/ru/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: ru\n" 22 | "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" 23 | 24 | #: ../pulsecaster.appdata.xml.in.h:1 25 | msgid "Record a podcast or interview" 26 | msgstr "Записать подкаст или интервью" 27 | 28 | #: ../pulsecaster.appdata.xml.in.h:2 29 | msgid "" 30 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 31 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 32 | "(VoIP) app." 33 | msgstr "PulseCaster - программа звукозаписи, основанная на PulseAudio. Её можно использовать для записи подкастов или интервью, проводимых на этом же компьютере или удалённо с помощью интернет-телефонии (VoIP)." 34 | 35 | #: ../pulsecaster.appdata.xml.in.h:3 36 | msgid "" 37 | "PulseCaster allows you to select which sources you use for your podcast. It " 38 | "then automatically mixes the sound sources into one recording that's ready " 39 | "to publish." 40 | msgstr "PulseCaster позволяет выбрать какие из источников использовать для подкаста. После этого она автоматически объединяет источники звука в один звуковой файл, готовый к публикации." 41 | 42 | #: ../pulsecaster.appdata.xml.in.h:4 43 | msgid "" 44 | "There is also an expert mode so you can mix or enhance the recording on your" 45 | " own." 46 | msgstr "Также имеется экспертный режим, который позволяет микшировать и улучшать запись самостоятельно." 47 | 48 | #: ../pulsecaster/ui.py:66 49 | msgid "loading UI file from current subdir" 50 | msgstr "загрузка файла пользовательского интерфейса из текущего подкаталога" 51 | 52 | #: ../pulsecaster/ui.py:80 53 | msgid "Cannot load resources" 54 | msgstr "Невозможно загрузить ресурсы" 55 | 56 | #. Miscellaneous dialog strings 57 | #: ../pulsecaster/ui.py:109 58 | msgid "Important notice" 59 | msgstr "Важное замечание" 60 | 61 | #: ../pulsecaster/ui.py:115 62 | msgid "" 63 | "This program can be used to record speech from remote locations. You are " 64 | "responsible for adhering to all applicable laws and regulations when using " 65 | "this program. In general you should not record other parties without their " 66 | "consent." 67 | msgstr "Эта программа может быть использована для записи речи поступающей с других компьютеров. При использовании этой программы, вы несете ответственность за соблюдение соответсвующих законов и постановлений правительства вашей страны. В частности, вы не имеете права записывать голосовую информацию посторонних лиц без их согласия." 68 | 69 | #: ../pulsecaster/ui.py:121 70 | msgid "Do not show this again" 71 | msgstr "Больше не показывать" 72 | 73 | #: ../pulsecaster/ui.py:123 74 | msgid "Select the audio sources to mix" 75 | msgstr "Выберите источник звука для микширования" 76 | 77 | #: ../pulsecaster/ui.py:125 78 | msgid "I understand." 79 | msgstr "Я понимаю." 80 | 81 | #: ../pulsecaster/ui.py:127 82 | msgid "Your voice" 83 | msgstr "Ваш голос" 84 | 85 | #: ../pulsecaster/ui.py:129 86 | msgid "Subject's voice" 87 | msgstr "Голос собеседника" 88 | 89 | #: ../pulsecaster/ui.py:162 90 | msgid "Standard settings" 91 | msgstr "Стандартные настройки" 92 | 93 | #: ../pulsecaster/ui.py:163 94 | msgid "Expert settings" 95 | msgstr "Экспертные настройки" 96 | 97 | #: ../pulsecaster/ui.py:164 98 | msgid "" 99 | "Save the conversation as a single audio file with compression. This is the " 100 | "right option for most people." 101 | msgstr "Сохранить разговор как единый сжатый аудио-файл. Как правило, это подходящий вариант для большинства людей." 102 | 103 | #: ../pulsecaster/ui.py:167 104 | msgid "" 105 | "Save each voice as a separate audio file without compression. Use this " 106 | "option to mix and encode audio yourself." 107 | msgstr "Сохранить каждый голос отдельно без сжатия. Этот вариант позволит собрать единый аудио-файл самостоятельно." 108 | 109 | #: ../pulsecaster/ui.py:397 110 | msgid "Save your recording" 111 | msgstr "Сохранение записи" 112 | 113 | #: ../pulsecaster/ui.py:414 114 | msgid "" 115 | "Are you sure you want to cancel saving your work? If you choose Yes your " 116 | "audio recording will be erased permanently." 117 | msgstr "Вы уверены, что хотите отменить сохранение вашей работы? Если вы выберете вариант «Да», то ваша запись будет удалена безвозвратно." 118 | 119 | #: ../pulsecaster/ui.py:455 120 | msgid "WAV files are written here:" 121 | msgstr "WAV-файлы пишутся сюда:" 122 | 123 | #: ../pulsecaster/ui.py:476 124 | msgid "File exists. OK to overwrite?" 125 | msgstr "Такой файл уже существует. Перезаписать его?" 126 | -------------------------------------------------------------------------------- /po/sr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Мирослав Николић , 2014 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PulseCaster\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 12 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 13 | "Last-Translator: Paul Frields \n" 14 | "Language-Team: Serbian (http://www.transifex.com/stickster/pulsecaster/language/sr/)\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Language: sr\n" 19 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 20 | 21 | #: ../pulsecaster.appdata.xml.in.h:1 22 | msgid "Record a podcast or interview" 23 | msgstr "Снимите подемисију или интервју" 24 | 25 | #: ../pulsecaster.appdata.xml.in.h:2 26 | msgid "" 27 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 28 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 29 | "(VoIP) app." 30 | msgstr "Пулсе Кастер је снимач звука заснован на Пулсе Аудиу. Можете га користити за снимање подемисија или интервјуа на вашем преносном рачунару или из засебног програма гласа-преко-ИП-а (VoIP)." 31 | 32 | #: ../pulsecaster.appdata.xml.in.h:3 33 | msgid "" 34 | "PulseCaster allows you to select which sources you use for your podcast. It " 35 | "then automatically mixes the sound sources into one recording that's ready " 36 | "to publish." 37 | msgstr "Пулсе Кастер вам омогућава да изаберете извор за ваше подемисије. Затим сам меша изворе звука у један снимак који је спреман за објављивање." 38 | 39 | #: ../pulsecaster.appdata.xml.in.h:4 40 | msgid "" 41 | "There is also an expert mode so you can mix or enhance the recording on your" 42 | " own." 43 | msgstr "Постоји и напредни режим тако да можете да мешате или да побољшате снимање по вашој жељи." 44 | 45 | #: ../pulsecaster/ui.py:66 46 | msgid "loading UI file from current subdir" 47 | msgstr "учитавам датотеку КС-а из текућег поддиректоријума" 48 | 49 | #: ../pulsecaster/ui.py:80 50 | msgid "Cannot load resources" 51 | msgstr "Не могу да учитам изворишта" 52 | 53 | #. Miscellaneous dialog strings 54 | #: ../pulsecaster/ui.py:109 55 | msgid "Important notice" 56 | msgstr "Важно обавештење" 57 | 58 | #: ../pulsecaster/ui.py:115 59 | msgid "" 60 | "This program can be used to record speech from remote locations. You are " 61 | "responsible for adhering to all applicable laws and regulations when using " 62 | "this program. In general you should not record other parties without their " 63 | "consent." 64 | msgstr "Овај програм може бити коришћен за снимање говора са удаљених места. Ви сте одговорни за поштовање свих важећих закона и прописа приликом коришћења овог програма. Уопште не треба снимати друге странке без њиховог пристанка." 65 | 66 | #: ../pulsecaster/ui.py:121 67 | msgid "Do not show this again" 68 | msgstr "Не приказуј више ово" 69 | 70 | #: ../pulsecaster/ui.py:123 71 | msgid "Select the audio sources to mix" 72 | msgstr "Изаберите изворе звука за мешање" 73 | 74 | #: ../pulsecaster/ui.py:125 75 | msgid "I understand." 76 | msgstr "Разумем." 77 | 78 | #: ../pulsecaster/ui.py:127 79 | msgid "Your voice" 80 | msgstr "Ваш глас" 81 | 82 | #: ../pulsecaster/ui.py:129 83 | msgid "Subject's voice" 84 | msgstr "Глас субјекта" 85 | 86 | #: ../pulsecaster/ui.py:162 87 | msgid "Standard settings" 88 | msgstr "Уобичајена подешавања" 89 | 90 | #: ../pulsecaster/ui.py:163 91 | msgid "Expert settings" 92 | msgstr "Напредна подешавања" 93 | 94 | #: ../pulsecaster/ui.py:164 95 | msgid "" 96 | "Save the conversation as a single audio file with compression. This is the " 97 | "right option for most people." 98 | msgstr "Сачувајте разговор као једну звучну датотеку са сажимањем. Ово је прави избор за већину људи." 99 | 100 | #: ../pulsecaster/ui.py:167 101 | msgid "" 102 | "Save each voice as a separate audio file without compression. Use this " 103 | "option to mix and encode audio yourself." 104 | msgstr "Сачувајте сваки глас као засебну звучну датотеку без сажимања. Користите овај избор да сами измешате и кодирате звук." 105 | 106 | #: ../pulsecaster/ui.py:397 107 | msgid "Save your recording" 108 | msgstr "Сачувајте ваше снимање" 109 | 110 | #: ../pulsecaster/ui.py:414 111 | msgid "" 112 | "Are you sure you want to cancel saving your work? If you choose Yes your " 113 | "audio recording will be erased permanently." 114 | msgstr "Да ли сигурно желите да откажете чување вашег рада? Ако потврдите онда ће ваш звучни запис бити трајно обрисан." 115 | 116 | #: ../pulsecaster/ui.py:455 117 | msgid "WAV files are written here:" 118 | msgstr "ВАВ датотеке се уписују овде:" 119 | 120 | #: ../pulsecaster/ui.py:476 121 | msgid "File exists. OK to overwrite?" 122 | msgstr "Датотека постоји. Да ли желите да препишете?" 123 | -------------------------------------------------------------------------------- /po/tr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # abc Def , 2020 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PulseCaster\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 12 | "PO-Revision-Date: 2020-05-10 21:56+0000\n" 13 | "Last-Translator: abc Def \n" 14 | "Language-Team: Turkish (http://www.transifex.com/stickster/pulsecaster/language/tr/)\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Language: tr\n" 19 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 20 | 21 | #: ../pulsecaster.appdata.xml.in.h:1 22 | msgid "Record a podcast or interview" 23 | msgstr "Bir podcast veya röportaj kaydetme" 24 | 25 | #: ../pulsecaster.appdata.xml.in.h:2 26 | msgid "" 27 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 28 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 29 | "(VoIP) app." 30 | msgstr "" 31 | 32 | #: ../pulsecaster.appdata.xml.in.h:3 33 | msgid "" 34 | "PulseCaster allows you to select which sources you use for your podcast. It " 35 | "then automatically mixes the sound sources into one recording that's ready " 36 | "to publish." 37 | msgstr "" 38 | 39 | #: ../pulsecaster.appdata.xml.in.h:4 40 | msgid "" 41 | "There is also an expert mode so you can mix or enhance the recording on your" 42 | " own." 43 | msgstr "" 44 | 45 | #: ../pulsecaster/ui.py:66 46 | msgid "loading UI file from current subdir" 47 | msgstr "" 48 | 49 | #: ../pulsecaster/ui.py:80 50 | msgid "Cannot load resources" 51 | msgstr "" 52 | 53 | #. Miscellaneous dialog strings 54 | #: ../pulsecaster/ui.py:109 55 | msgid "Important notice" 56 | msgstr "Önemli uyarı" 57 | 58 | #: ../pulsecaster/ui.py:115 59 | msgid "" 60 | "This program can be used to record speech from remote locations. You are " 61 | "responsible for adhering to all applicable laws and regulations when using " 62 | "this program. In general you should not record other parties without their " 63 | "consent." 64 | msgstr "" 65 | 66 | #: ../pulsecaster/ui.py:121 67 | msgid "Do not show this again" 68 | msgstr "Bunu tekrar gösterme" 69 | 70 | #: ../pulsecaster/ui.py:123 71 | msgid "Select the audio sources to mix" 72 | msgstr "" 73 | 74 | #: ../pulsecaster/ui.py:125 75 | msgid "I understand." 76 | msgstr "Anlıyorum." 77 | 78 | #: ../pulsecaster/ui.py:127 79 | msgid "Your voice" 80 | msgstr "Sesiniz" 81 | 82 | #: ../pulsecaster/ui.py:129 83 | msgid "Subject's voice" 84 | msgstr "" 85 | 86 | #: ../pulsecaster/ui.py:162 87 | msgid "Standard settings" 88 | msgstr "Standart ayarlar" 89 | 90 | #: ../pulsecaster/ui.py:163 91 | msgid "Expert settings" 92 | msgstr "Uzman ayarlar" 93 | 94 | #: ../pulsecaster/ui.py:164 95 | msgid "" 96 | "Save the conversation as a single audio file with compression. This is the " 97 | "right option for most people." 98 | msgstr "" 99 | 100 | #: ../pulsecaster/ui.py:167 101 | msgid "" 102 | "Save each voice as a separate audio file without compression. Use this " 103 | "option to mix and encode audio yourself." 104 | msgstr "" 105 | 106 | #: ../pulsecaster/ui.py:397 107 | msgid "Save your recording" 108 | msgstr "" 109 | 110 | #: ../pulsecaster/ui.py:414 111 | msgid "" 112 | "Are you sure you want to cancel saving your work? If you choose Yes your " 113 | "audio recording will be erased permanently." 114 | msgstr "" 115 | 116 | #: ../pulsecaster/ui.py:455 117 | msgid "WAV files are written here:" 118 | msgstr "" 119 | 120 | #: ../pulsecaster/ui.py:476 121 | msgid "File exists. OK to overwrite?" 122 | msgstr "Dosya vardır. Tamam üzerine yazılsın mı?" 123 | -------------------------------------------------------------------------------- /po/uk.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # FIRST AUTHOR , 2010 7 | # Yuri Chornoivan , 2011-2014 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: Ukrainian (http://www.transifex.com/stickster/pulsecaster/language/uk/)\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Language: uk\n" 20 | "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" 21 | 22 | #: ../pulsecaster.appdata.xml.in.h:1 23 | msgid "Record a podcast or interview" 24 | msgstr "Запис трансляції або інтерв’ю" 25 | 26 | #: ../pulsecaster.appdata.xml.in.h:2 27 | msgid "" 28 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 29 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 30 | "(VoIP) app." 31 | msgstr "PulseCaster — програма для запису звуку на основі PulseAudio. Ви можете скористатися нею для запису трансляцій або інтерв’ю на вашому ноутбуці або за допомогою окремої програми інтернет-телефонії (VoIP)." 32 | 33 | #: ../pulsecaster.appdata.xml.in.h:3 34 | msgid "" 35 | "PulseCaster allows you to select which sources you use for your podcast. It " 36 | "then automatically mixes the sound sources into one recording that's ready " 37 | "to publish." 38 | msgstr "У PulseCaster передбачено можливість вибору джерел даних для вашої трансляції. Програма автоматично змішує джерела звуку до одного запису, готового до оприлюднення." 39 | 40 | #: ../pulsecaster.appdata.xml.in.h:4 41 | msgid "" 42 | "There is also an expert mode so you can mix or enhance the recording on your" 43 | " own." 44 | msgstr "Крім того, передбачено режим досвідченого користувача, у якому ви зможете мікшувати та покращувати записи вручну." 45 | 46 | #: ../pulsecaster/ui.py:66 47 | msgid "loading UI file from current subdir" 48 | msgstr "завантаження файла графічного інтерфейсу з поточного підкаталогу" 49 | 50 | #: ../pulsecaster/ui.py:80 51 | msgid "Cannot load resources" 52 | msgstr "Не вдалося завантажити ресурси" 53 | 54 | #. Miscellaneous dialog strings 55 | #: ../pulsecaster/ui.py:109 56 | msgid "Important notice" 57 | msgstr "Важливе зауваження" 58 | 59 | #: ../pulsecaster/ui.py:115 60 | msgid "" 61 | "This program can be used to record speech from remote locations. You are " 62 | "responsible for adhering to all applicable laws and regulations when using " 63 | "this program. In general you should not record other parties without their " 64 | "consent." 65 | msgstr "Цією програмою можна скористатися для запису голосових даних, що надходять з інших комп’ютерів. Під час використання цієї програми ви маєте виконувати всі закони і постанови уряду вашої країни стосовно таких даних. Зокрема, ви не маєте права записувати голос сторонніх осіб без їхньої на те згоди." 66 | 67 | #: ../pulsecaster/ui.py:121 68 | msgid "Do not show this again" 69 | msgstr "Більше не показувати" 70 | 71 | #: ../pulsecaster/ui.py:123 72 | msgid "Select the audio sources to mix" 73 | msgstr "Виберіть джерела звуку для мікшування" 74 | 75 | #: ../pulsecaster/ui.py:125 76 | msgid "I understand." 77 | msgstr "Зрозуміло." 78 | 79 | #: ../pulsecaster/ui.py:127 80 | msgid "Your voice" 81 | msgstr "Ваш голос" 82 | 83 | #: ../pulsecaster/ui.py:129 84 | msgid "Subject's voice" 85 | msgstr "Голос співрозмовника" 86 | 87 | #: ../pulsecaster/ui.py:162 88 | msgid "Standard settings" 89 | msgstr "Стандартні налаштування" 90 | 91 | #: ../pulsecaster/ui.py:163 92 | msgid "Expert settings" 93 | msgstr "Розширені налаштування" 94 | 95 | #: ../pulsecaster/ui.py:164 96 | msgid "" 97 | "Save the conversation as a single audio file with compression. This is the " 98 | "right option for most people." 99 | msgstr "Зберегти розмову у форматі єдиного файла звукових даних зі стисканням. Придатний варіант для більшості випадків." 100 | 101 | #: ../pulsecaster/ui.py:167 102 | msgid "" 103 | "Save each voice as a separate audio file without compression. Use this " 104 | "option to mix and encode audio yourself." 105 | msgstr "Зберігати дані кожного зі співрозмовників у окремому файлі без стискання. Цим варіантом можна скористатися для наступного мікшування та кодування даних вручну." 106 | 107 | #: ../pulsecaster/ui.py:397 108 | msgid "Save your recording" 109 | msgstr "Збереження вашого запису" 110 | 111 | #: ../pulsecaster/ui.py:414 112 | msgid "" 113 | "Are you sure you want to cancel saving your work? If you choose Yes your " 114 | "audio recording will be erased permanently." 115 | msgstr "Ви справді бажаєте скасувати збереження вашої роботи? Якщо ви виберете варіант «Так», ваш запис буде остаточно вилучено." 116 | 117 | #: ../pulsecaster/ui.py:455 118 | msgid "WAV files are written here:" 119 | msgstr "Файли WAV записуються сюди:" 120 | 121 | #: ../pulsecaster/ui.py:476 122 | msgid "File exists. OK to overwrite?" 123 | msgstr "Файл вже існує. Перезаписати його?" 124 | -------------------------------------------------------------------------------- /po/zh_CN.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Tommy He , 2011 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PulseCaster\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 12 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 13 | "Last-Translator: Paul Frields \n" 14 | "Language-Team: Chinese (China) (http://www.transifex.com/stickster/pulsecaster/language/zh_CN/)\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Language: zh_CN\n" 19 | "Plural-Forms: nplurals=1; plural=0;\n" 20 | 21 | #: ../pulsecaster.appdata.xml.in.h:1 22 | msgid "Record a podcast or interview" 23 | msgstr "" 24 | 25 | #: ../pulsecaster.appdata.xml.in.h:2 26 | msgid "" 27 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 28 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 29 | "(VoIP) app." 30 | msgstr "" 31 | 32 | #: ../pulsecaster.appdata.xml.in.h:3 33 | msgid "" 34 | "PulseCaster allows you to select which sources you use for your podcast. It " 35 | "then automatically mixes the sound sources into one recording that's ready " 36 | "to publish." 37 | msgstr "" 38 | 39 | #: ../pulsecaster.appdata.xml.in.h:4 40 | msgid "" 41 | "There is also an expert mode so you can mix or enhance the recording on your" 42 | " own." 43 | msgstr "" 44 | 45 | #: ../pulsecaster/ui.py:66 46 | msgid "loading UI file from current subdir" 47 | msgstr "从当前子目录载入 UI 文件" 48 | 49 | #: ../pulsecaster/ui.py:80 50 | msgid "Cannot load resources" 51 | msgstr "无法载入资源" 52 | 53 | #. Miscellaneous dialog strings 54 | #: ../pulsecaster/ui.py:109 55 | msgid "Important notice" 56 | msgstr "重要提示" 57 | 58 | #: ../pulsecaster/ui.py:115 59 | msgid "" 60 | "This program can be used to record speech from remote locations. You are " 61 | "responsible for adhering to all applicable laws and regulations when using " 62 | "this program. In general you should not record other parties without their " 63 | "consent." 64 | msgstr "该程序用来录制来自远程位置的对话。您将为使用该程序所引起的任何法律和规范纠纷负责。一般情况下,您不应该在未通知对方的情况下进行录音。" 65 | 66 | #: ../pulsecaster/ui.py:121 67 | msgid "Do not show this again" 68 | msgstr "不再显示该提示" 69 | 70 | #: ../pulsecaster/ui.py:123 71 | msgid "Select the audio sources to mix" 72 | msgstr "选择要混音的音频源" 73 | 74 | #: ../pulsecaster/ui.py:125 75 | msgid "I understand." 76 | msgstr "我了解。" 77 | 78 | #: ../pulsecaster/ui.py:127 79 | msgid "Your voice" 80 | msgstr "您的声音" 81 | 82 | #: ../pulsecaster/ui.py:129 83 | msgid "Subject's voice" 84 | msgstr "受访者的声音" 85 | 86 | #: ../pulsecaster/ui.py:162 87 | msgid "Standard settings" 88 | msgstr "" 89 | 90 | #: ../pulsecaster/ui.py:163 91 | msgid "Expert settings" 92 | msgstr "" 93 | 94 | #: ../pulsecaster/ui.py:164 95 | msgid "" 96 | "Save the conversation as a single audio file with compression. This is the " 97 | "right option for most people." 98 | msgstr "" 99 | 100 | #: ../pulsecaster/ui.py:167 101 | msgid "" 102 | "Save each voice as a separate audio file without compression. Use this " 103 | "option to mix and encode audio yourself." 104 | msgstr "" 105 | 106 | #: ../pulsecaster/ui.py:397 107 | msgid "Save your recording" 108 | msgstr "保存您的录音" 109 | 110 | #: ../pulsecaster/ui.py:414 111 | msgid "" 112 | "Are you sure you want to cancel saving your work? If you choose Yes your " 113 | "audio recording will be erased permanently." 114 | msgstr "您确定取消保存您的作品?如果您选择 是 ,那么您的音频录音将被永久擦除。" 115 | 116 | #: ../pulsecaster/ui.py:455 117 | msgid "WAV files are written here:" 118 | msgstr "" 119 | 120 | #: ../pulsecaster/ui.py:476 121 | msgid "File exists. OK to overwrite?" 122 | msgstr "文件已存在。是否覆盖?" 123 | -------------------------------------------------------------------------------- /po/zh_TW.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Translators: 6 | # Cheng-Chia Tseng , 2011 7 | # Walter Cheuk , 2012 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PulseCaster\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2019-09-04 16:44-0400\n" 13 | "PO-Revision-Date: 2019-09-04 20:48+0000\n" 14 | "Last-Translator: Paul Frields \n" 15 | "Language-Team: Chinese (Taiwan) (http://www.transifex.com/stickster/pulsecaster/language/zh_TW/)\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Language: zh_TW\n" 20 | "Plural-Forms: nplurals=1; plural=0;\n" 21 | 22 | #: ../pulsecaster.appdata.xml.in.h:1 23 | msgid "Record a podcast or interview" 24 | msgstr "" 25 | 26 | #: ../pulsecaster.appdata.xml.in.h:2 27 | msgid "" 28 | "PulseCaster is a PulseAudio-based sound recorder. You can use it to record " 29 | "podcasts or interviews made at your laptop or from a separate voice-over-IP " 30 | "(VoIP) app." 31 | msgstr "" 32 | 33 | #: ../pulsecaster.appdata.xml.in.h:3 34 | msgid "" 35 | "PulseCaster allows you to select which sources you use for your podcast. It " 36 | "then automatically mixes the sound sources into one recording that's ready " 37 | "to publish." 38 | msgstr "" 39 | 40 | #: ../pulsecaster.appdata.xml.in.h:4 41 | msgid "" 42 | "There is also an expert mode so you can mix or enhance the recording on your" 43 | " own." 44 | msgstr "" 45 | 46 | #: ../pulsecaster/ui.py:66 47 | msgid "loading UI file from current subdir" 48 | msgstr "正在從目前的子目錄載入圖像介面檔" 49 | 50 | #: ../pulsecaster/ui.py:80 51 | msgid "Cannot load resources" 52 | msgstr "無法載入資源" 53 | 54 | #. Miscellaneous dialog strings 55 | #: ../pulsecaster/ui.py:109 56 | msgid "Important notice" 57 | msgstr "重要通知" 58 | 59 | #: ../pulsecaster/ui.py:115 60 | msgid "" 61 | "This program can be used to record speech from remote locations. You are " 62 | "responsible for adhering to all applicable laws and regulations when using " 63 | "this program. In general you should not record other parties without their " 64 | "consent." 65 | msgstr "這個程式可以從遠端位置錄製談話。當您使用本程式時應當負起遵守所有可適用法律與條例的責任。一般來說,若您未取得他人同意,不應錄音。" 66 | 67 | #: ../pulsecaster/ui.py:121 68 | msgid "Do not show this again" 69 | msgstr "不要再顯示" 70 | 71 | #: ../pulsecaster/ui.py:123 72 | msgid "Select the audio sources to mix" 73 | msgstr "選取音源至混音" 74 | 75 | #: ../pulsecaster/ui.py:125 76 | msgid "I understand." 77 | msgstr "我瞭解。" 78 | 79 | #: ../pulsecaster/ui.py:127 80 | msgid "Your voice" 81 | msgstr "您的聲音" 82 | 83 | #: ../pulsecaster/ui.py:129 84 | msgid "Subject's voice" 85 | msgstr "受訪者的聲音" 86 | 87 | #: ../pulsecaster/ui.py:162 88 | msgid "Standard settings" 89 | msgstr "標準設定" 90 | 91 | #: ../pulsecaster/ui.py:163 92 | msgid "Expert settings" 93 | msgstr "專業設定" 94 | 95 | #: ../pulsecaster/ui.py:164 96 | msgid "" 97 | "Save the conversation as a single audio file with compression. This is the " 98 | "right option for most people." 99 | msgstr "" 100 | 101 | #: ../pulsecaster/ui.py:167 102 | msgid "" 103 | "Save each voice as a separate audio file without compression. Use this " 104 | "option to mix and encode audio yourself." 105 | msgstr "" 106 | 107 | #: ../pulsecaster/ui.py:397 108 | msgid "Save your recording" 109 | msgstr "儲存您的錄音" 110 | 111 | #: ../pulsecaster/ui.py:414 112 | msgid "" 113 | "Are you sure you want to cancel saving your work? If you choose Yes your " 114 | "audio recording will be erased permanently." 115 | msgstr "您確定要取消您作業的儲存嗎?若您選擇「是」,您的錄音作業將永久消除。" 116 | 117 | #: ../pulsecaster/ui.py:455 118 | msgid "WAV files are written here:" 119 | msgstr "WAV 檔寫入在此處:" 120 | 121 | #: ../pulsecaster/ui.py:476 122 | msgid "File exists. OK to overwrite?" 123 | msgstr "檔案已存在。要按「確定」來覆寫嗎?" 124 | -------------------------------------------------------------------------------- /pulsecaster.appdata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | pulsecaster.desktop 4 | CC0-1.0 5 | PulseCaster 6 | Record a podcast or interview 7 | 8 |

PulseCaster is a PulseAudio-based sound recorder. You can use it to record podcasts or interviews made at your laptop or from a separate voice-over-IP (VoIP) app.

9 |

PulseCaster allows you to select which sources you use for your podcast. It then automatically mixes the sound sources into one recording that's ready to publish.

10 |

There is also an expert mode so you can mix or enhance the recording on your own.

11 |
12 | https://fedorahosted.org/pulsecaster/raw-attachment/wiki/WikiStart/pulsecaster-0.1.9-running.png 14 | http://pulsecaster.org/ 15 | stickster@gmail.com 16 |
17 | -------------------------------------------------------------------------------- /pulsecaster.appdata.xml.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | pulsecaster.desktop 4 | CC0-1.0 5 | PulseCaster 6 | <_summary>Record a podcast or interview 7 | 8 | <_p>PulseCaster is a PulseAudio-based sound recorder. You can use it to record podcasts or interviews made at your laptop or from a separate voice-over-IP (VoIP) app. 9 | <_p>PulseCaster allows you to select which sources you use for your podcast. It then automatically mixes the sound sources into one recording that's ready to publish. 10 | <_p>There is also an expert mode so you can mix or enhance the recording on your own. 11 | 12 | https://fedorahosted.org/pulsecaster/raw-attachment/wiki/WikiStart/pulsecaster-0.1.9-running.png 14 | http://pulsecaster.org/ 15 | stickster@gmail.com 16 | 17 | -------------------------------------------------------------------------------- /pulsecaster.convert: -------------------------------------------------------------------------------- 1 | [org.pulsecaster.PulseCaster.config] 2 | skip_warning=/apps/pulsecaster/skip_warning 3 | vorbisq=/apps/pulsecaster/vorbisq 4 | codec=/apps/pulsecaster/codec 5 | expert=/apps/pulsecaster/expert 6 | -------------------------------------------------------------------------------- /pulsecaster.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=PulseCaster 3 | GenericName=Podcast Recorder 4 | Comment=Use PulseAudio to record a podcast from a microphone or VoIP 5 | Exec=pulsecaster 6 | Terminal=false 7 | Type=Application 8 | StartupNotify=true 9 | Icon=pulsecaster 10 | Categories=GNOME;GTK;AudioVideo;Audio;Recorder; 11 | -------------------------------------------------------------------------------- /pulsecaster/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2009-2015 Paul W. Frields 2 | # 3 | # This program is free software: you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License as published by 5 | # the Free Software Foundation, either version 3 of the License, or 6 | # (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program. If not, see . 15 | # 16 | # 17 | # Author: Paul W. Frields 18 | 19 | 20 | from .config import * 21 | -------------------------------------------------------------------------------- /pulsecaster/config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Copyright (C) 2009-2019 Paul W. Frields 4 | # 5 | # This program is free software: you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation, either version 3 of the License, or 8 | # (at your option) any later version. 9 | # 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this program. If not, see . 17 | # 18 | # 19 | # Author: Paul W. Frields 20 | 21 | NAME = u'PulseCaster' 22 | LNAME = u'pulsecaster' 23 | 24 | import gettext 25 | _ = lambda x: gettext.ldgettext(NAME, x) 26 | 27 | try: 28 | _debug = os.environ['PULSECASTER_DEBUG'] 29 | except: 30 | _debug = False 31 | 32 | def debugPrint(text): 33 | if _debug: 34 | print ('%s: %s' % (NAME, text)) 35 | 36 | VERSION = '0.9.1' 37 | AUTHOR = u'Paul W. Frields' 38 | AUTHOR_EMAIL = u'stickster@gmail.com' 39 | DESCRIPTION = u'PulseAudio based podcast recorder' 40 | LICENSE = u'GPLv3+' 41 | COPYRIGHT = 'Copyright (C) 2009-2021 ' + AUTHOR 42 | KEYWORDS = u'pulseaudio podcast recorder mixer gstreamer pygtk' 43 | URL = u'http://pulsecaster.org' 44 | CONTRIBUTORS = [u'Jürgen Geuter ', 45 | u'Harry Karvonen ', 46 | u'Stanislav V. Emets '] 47 | 48 | LICENSE_TEXT = u'''Licensed under the GNU General Public License Version 3 49 | 50 | PulseCaster is free software; you can redistribute it and/or 51 | modify it under the terms of the GNU General Public License 52 | as published by the Free Software Foundation; either version 3 53 | of the License, or (at your option) any later version. 54 | 55 | PulseCaster is distributed in the hope that it will be useful, 56 | but WITHOUT ANY WARRANTY; without even the implied warranty of 57 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 58 | GNU General Public License for more details. 59 | 60 | You should have received a copy of the GNU General Public License 61 | along with this program; if not, write to the Free Software 62 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 63 | 02110-1301, USA.''' 64 | 65 | GIO_PATH='/org/%s/%s/' % (LNAME, NAME) 66 | GIO_ID='.'.join(('org', LNAME, NAME)) 67 | -------------------------------------------------------------------------------- /pulsecaster/data/icons/16x16/pulsecaster-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stickster/pulsecaster/c0b3a20a6fb82521d8563159d205cd481c99466a/pulsecaster/data/icons/16x16/pulsecaster-16.png -------------------------------------------------------------------------------- /pulsecaster/data/icons/24x24/pulsecaster-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stickster/pulsecaster/c0b3a20a6fb82521d8563159d205cd481c99466a/pulsecaster/data/icons/24x24/pulsecaster-24.png -------------------------------------------------------------------------------- /pulsecaster/data/icons/32x32/pulsecaster-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stickster/pulsecaster/c0b3a20a6fb82521d8563159d205cd481c99466a/pulsecaster/data/icons/32x32/pulsecaster-32.png -------------------------------------------------------------------------------- /pulsecaster/data/icons/48x48/pulsecaster-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stickster/pulsecaster/c0b3a20a6fb82521d8563159d205cd481c99466a/pulsecaster/data/icons/48x48/pulsecaster-48.png -------------------------------------------------------------------------------- /pulsecaster/data/icons/64x64/pulsecaster-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stickster/pulsecaster/c0b3a20a6fb82521d8563159d205cd481c99466a/pulsecaster/data/icons/64x64/pulsecaster-64.png -------------------------------------------------------------------------------- /pulsecaster/data/pulsecaster.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | False 7 | 5 8 | False 9 | center-always 10 | True 11 | normal 12 | 13 | 14 | 15 | True 16 | False 17 | 2 18 | 19 | 20 | True 21 | False 22 | end 23 | 24 | 25 | False 26 | True 27 | end 28 | 0 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | False 39 | 5 40 | False 41 | True 42 | center-on-parent 43 | True 44 | normal 45 | 46 | 47 | False 48 | vertical 49 | 2 50 | 51 | 52 | False 53 | end 54 | 55 | 56 | 57 | 58 | 59 | gtk-close 60 | True 61 | True 62 | True 63 | True 64 | 65 | 66 | False 67 | True 68 | 1 69 | 70 | 71 | 72 | 73 | False 74 | True 75 | end 76 | 0 77 | 78 | 79 | 80 | 81 | True 82 | False 83 | vertical 84 | 5 85 | 86 | 87 | True 88 | True 89 | False 90 | 0 91 | True 92 | True 93 | 94 | 95 | True 96 | False 97 | vertical 98 | 99 | 100 | True 101 | False 102 | 0 103 | 1 104 | 105 | 106 | False 107 | True 108 | 0 109 | 110 | 111 | 112 | 113 | True 114 | False 115 | 0 116 | 10 117 | True 118 | True 119 | 120 | 121 | False 122 | True 123 | 1 124 | 125 | 126 | 127 | 128 | 129 | 130 | False 131 | True 132 | 0 133 | 134 | 135 | 136 | 137 | True 138 | True 139 | False 140 | 0 141 | True 142 | True 143 | vorbis_button 144 | 145 | 146 | True 147 | False 148 | vertical 149 | 150 | 151 | True 152 | False 153 | 0 154 | 155 | 156 | False 157 | True 158 | 0 159 | 160 | 161 | 162 | 163 | True 164 | False 165 | 0 166 | 10 167 | True 168 | True 169 | 170 | 171 | False 172 | True 173 | 1 174 | 175 | 176 | 177 | 178 | 179 | 180 | False 181 | True 182 | 1 183 | 184 | 185 | 186 | 187 | False 188 | True 189 | 1 190 | 191 | 192 | 193 | 194 | 195 | adv_close_button 196 | 197 | 198 | 199 | False 200 | 5 201 | 300 202 | normal 203 | 204 | 205 | True 206 | False 207 | vertical 208 | 5 209 | 210 | 211 | True 212 | False 213 | end 214 | 215 | 216 | gtk-about 217 | True 218 | True 219 | True 220 | True 221 | 222 | 223 | False 224 | False 225 | 0 226 | True 227 | 228 | 229 | 230 | 231 | gtk-preferences 232 | True 233 | True 234 | True 235 | True 236 | 237 | 238 | False 239 | True 240 | 1 241 | 242 | 243 | 244 | 245 | gtk-close 246 | True 247 | True 248 | True 249 | True 250 | 251 | 252 | 253 | False 254 | False 255 | 5 256 | 2 257 | 258 | 259 | 260 | 261 | gtk-media-record 262 | True 263 | True 264 | True 265 | True 266 | 267 | 268 | False 269 | False 270 | 5 271 | end 272 | 3 273 | 274 | 275 | 276 | 277 | False 278 | False 279 | 5 280 | end 281 | 0 282 | 283 | 284 | 285 | 286 | True 287 | False 288 | 10 289 | 290 | 295 | 296 | False 297 | False 298 | 0 299 | 300 | 301 | 302 | 303 | True 304 | False 305 | 0 306 | 0.40000000596046448 307 | True 308 | 309 | 310 | True 311 | True 312 | 1 313 | 314 | 315 | 316 | 317 | False 318 | True 319 | 5 320 | 1 321 | 322 | 323 | 324 | 325 | True 326 | False 327 | vertical 328 | 5 329 | 330 | 331 | True 332 | False 333 | 0 334 | 0 335 | 10 336 | 10 337 | True 338 | True 339 | 340 | 341 | False 342 | False 343 | 0 344 | 345 | 346 | 347 | 348 | True 349 | False 350 | 5 351 | 5 352 | 353 | 354 | True 355 | False 356 | 0 357 | 10 358 | right 359 | 360 | 361 | 0 362 | 1 363 | 1 364 | 1 365 | 366 | 367 | 368 | 369 | True 370 | False 371 | 0 372 | 10 373 | right 374 | 375 | 376 | 0 377 | 0 378 | 1 379 | 1 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | True 397 | True 398 | 1 399 | 400 | 401 | 402 | 403 | False 404 | True 405 | 2 406 | 407 | 408 | 409 | 410 | 411 | about_button 412 | adv_button 413 | close_button 414 | record_button 415 | 416 | 417 | 418 | False 419 | False 420 | True 421 | center-on-parent 422 | True 423 | True 424 | 425 | 426 | True 427 | False 428 | 10 429 | vertical 430 | 5 431 | 432 | 433 | True 434 | False 435 | 436 | 437 | True 438 | False 439 | 0 440 | gtk-dialog-warning 441 | 6 442 | 443 | 444 | True 445 | True 446 | 5 447 | 0 448 | 449 | 450 | 451 | 452 | True 453 | False 454 | vertical 455 | 456 | 457 | True 458 | False 459 | 0 460 | True 461 | 462 | 463 | False 464 | False 465 | 5 466 | 0 467 | 468 | 469 | 470 | 471 | True 472 | False 473 | True 474 | 50 475 | 476 | 477 | False 478 | False 479 | 5 480 | 1 481 | 482 | 483 | 484 | 485 | False 486 | False 487 | 5 488 | 1 489 | 490 | 491 | 492 | 493 | False 494 | False 495 | 0 496 | 497 | 498 | 499 | 500 | True 501 | True 502 | False 503 | True 504 | 0 505 | True 506 | 507 | 508 | False 509 | False 510 | 5 511 | 1 512 | 513 | 514 | 515 | 516 | True 517 | False 518 | 10 519 | True 520 | end 521 | 522 | 523 | True 524 | True 525 | True 526 | True 527 | 528 | 529 | False 530 | False 531 | 0 532 | 533 | 534 | 535 | 536 | False 537 | False 538 | 2 539 | 540 | 541 | 542 | 543 | 544 | 545 | -------------------------------------------------------------------------------- /pulsecaster/docs/figures/pulsecaster-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stickster/pulsecaster/c0b3a20a6fb82521d8563159d205cd481c99466a/pulsecaster/docs/figures/pulsecaster-logo.png -------------------------------------------------------------------------------- /pulsecaster/docs/index.page: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | <media type="image" src="figures/pulsecaster-logo.png"/> 9 | PulseCaster podcast recorder 10 | 11 | PulseCaster podcast recorder 12 | PulseCaster podcast recorder 13 | 14 | 16 | 17 | Paul W. Frields 18 | stickster@gmail.com 19 | 20 | 21 |

Creative Commons Attribution-ShareAlike 3.0

22 |
23 | 24 | 25 | 26 |
27 | 28 | <media type="image" src="figures/pulsecaster-logo.png">PulseCaster 29 | logo</media> PulseCaster podcast recorder 30 | 31 | 32 |

You can use PulseCaster to record yourself, or a conversation 33 | with someone else that runs through your computer's sound system, 34 | such as a voice-over-IP (VoIP) phone call. PulseCaster can be useful 35 | for recording podcasts or interviews.

36 |

Because PulseCaster can be used to record someone, it's important 37 | you have any necessary permission to use it. Your country or 38 | locality may have laws that govern recording phone 39 | conversations. Therefore you should have the consent of anyone you 40 | will record before you start.

41 | 42 |

PulseCaster asks you to confirm you understand this information 43 | before you can use the recording option. If you don't want to see 44 | this confirmation question each time you record, select the 45 | checkbox marked Do not show this again before you 46 | proceed.

47 |
48 | 49 |
50 | -------------------------------------------------------------------------------- /pulsecaster/docs/page.tmpl: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | COMPLETE_ME: NAME 9 | COMPLETE_ME: EMAIL 10 | 11 | 12 |

Creative Commons Share Alike 3.0

13 |
14 |
15 | COMPLETE_ME: TITLE 16 | 17 |
18 | -------------------------------------------------------------------------------- /pulsecaster/docs/preparing.page: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | Paul W. Frields 8 | stickster@gmail.com 9 | 10 | 11 |

Creative Commons Attribution-ShareAlike 3.0

12 |
13 |
14 | Preparing to record 15 | 16 |

Before you record a podcast using PulseCaster, there are a few 17 | steps you should take. This process will improve the quality of 18 | your recording and make the experience more enjoyable.

19 | 20 | 21 |

Use a good quality microphone to capture your own voice. The 22 | microphone in a laptop usually will not provide an acceptable 23 | sound quality for your listeners. Get a powered USB condenser 24 | microphone, or use a high quality headset with a microphone 25 | built in.

26 |
27 | 28 |

Make sure your voice-over-IP (VoIP) application and your 29 | network connection are working properly. A wired network 30 | connection may give better results if your wireless connection 31 | is unreliable. If you are in charge of your network 32 | configuration, such as at home, you may want to check and adjust 33 | any required settings to optimize your VoIP use when 34 | recording.

35 |
36 | 37 |

Have a plan for your podcast. Whether you start with a topic 38 | list or a full script, some prior organization will make your 39 | podcast more polished and professional sounding. This step is 40 | important even if you are trying to do an informal podcast.

41 |
42 |
43 |
44 | -------------------------------------------------------------------------------- /pulsecaster/docs/recording.page: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | Paul W. Frields 8 | stickster@gmail.com 9 | 10 | 11 |

Creative Commons Attribution-ShareAlike 3.0

12 |
13 |
14 | Recording a podcast 15 | 16 | 17 | 18 |

First, ensure your microphone is attached to a sound 19 | interface on your system. If it has a power switch, turn it 20 | on.

21 |
22 | 23 |

Using the dropdown selector in PulseCaster, select the sound 24 | input to which your microphone is attached.

25 | 26 |

If you're not sure which sound card to use, speak into your 27 | mic as you switch between inputs in PulseCaster. When you see 28 | the levels changing along with your voice, you've selected the 29 | right input.

30 |
31 |
32 | 33 |

If you are recording another party over VoIP, have that 34 | person speak while you select the appropriate sound input for 35 | their voice in PulseCaster.

36 |
37 | 38 |

Press the Record button to start your 39 | recording.

40 |
41 | 42 |

When you are ready to stop the recording and save it, press 43 | the Stop button.

44 |
45 |
46 |
47 | -------------------------------------------------------------------------------- /pulsecaster/docs/settings.page: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | Paul W. Frields 8 | stickster@gmail.com 9 | 10 | 11 |

Creative Commons Attribution-ShareAlike 3.0

12 |
13 |
14 | Adjusting settings 15 | 16 |

PulseCaster is automatically configured to provide any easy 17 | recording solution. Any sounds recorded are automatically mixed 18 | together into a single file encoded as Ogg Vorbis audio. Ogg Vorbis 19 | is a free format that automatically works in most web browsers and 20 | on most computers.

21 |

However, if you want the capability to mix and encode your own 22 | audio, you can use the Preferences button to configure 23 | PulseCaster.

24 |

The Expert settings included with PulseCaster will 25 | encode your audio as two separate WAV format files, which can be 26 | imported and mixed in virtually any audio software on any 27 | platform. To choose these settings, simply select this radio 28 | button.

29 | 30 |

The audio files will be saved under the name you provide with a 31 | numbered suffix, such as myfile-1.wav, 32 | myfile-2.wav, and so on.

33 |
34 |
35 | -------------------------------------------------------------------------------- /pulsecaster/gsettings.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2013-2019 Paul W. Frields 2 | # 3 | # This program is free software: you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License as published by 5 | # the Free Software Foundation, either version 3 of the License, or 6 | # (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program. If not, see . 15 | # 16 | # 17 | # Author: Paul W. Frields 18 | 19 | 20 | from gi.repository import Gio 21 | try: 22 | from pulsecaster.config import * 23 | except ModuleNotFoundError: 24 | sys.path.append(os.getcwd()) 25 | sys.path.append(os.path.join(os.getcwd(), '..')) 26 | from pulsecaster.config import * 27 | 28 | class PulseCasterGSettings: 29 | def __init__(self): 30 | gss = Gio.SettingsSchemaSource.get_default() 31 | schema = gss.lookup(GIO_ID, True) 32 | if schema == None: 33 | # We're probably developing, then. 34 | try: 35 | # Maybe we already compiled this. 36 | gss = Gio.SettingsSchemaSource.new_from_directory('.', None, False) 37 | except: 38 | import os, subprocess 39 | schemadir = os.path.join(os.path.dirname(__file__), '..') 40 | subprocess.run(['glib-compile-schemas', schemadir]) 41 | gss = Gio.SettingsSchemaSource.new_from_directory(schemadir, None, False) 42 | 43 | schema = gss.lookup(GIO_ID, True) 44 | 45 | self.gsettings = Gio.Settings.new_full(schema, None, GIO_PATH) 46 | 47 | try: 48 | self.skip_warn = self.gsettings.get_boolean('skip-warning') 49 | except: 50 | self.gsettings.set_boolean('skip-warning', False) 51 | self.skip_warn = self.gsettings.get_boolean('skip-warning') 52 | 53 | try: 54 | self.vorbisq = self.gsettings.get_int('vorbisq') 55 | except: 56 | self.gsettings.set_int('vorbisq', 4) 57 | self.vorbisq = self.gsettings.get_int('vorbisq') 58 | 59 | try: 60 | self.codec = self.gsettings.get_string('codec') 61 | except: 62 | self.gsettings.set_string('codec', 'vorbis') 63 | self.codec = self.gsettings.get_string('codec') 64 | 65 | try: 66 | self.expert = self.gsettings.get_boolean('expert') 67 | except: 68 | self.gsettings.set_boolean('expert', False) 69 | self.expert = self.gsettings.get_boolean('expert') 70 | 71 | try: 72 | self.audiorate = self.gsettings.get_int('audiorate') 73 | except: 74 | self.gsettings.set_int('audiorate', 48000) 75 | self.audiorate = self.gsettings.get_int('audiorate') 76 | 77 | def change_warn(self, val): 78 | if type(val) is not bool: 79 | raise ValueError("requires bool value") 80 | self.gsettings.set_boolean('skip-warning', val) 81 | -------------------------------------------------------------------------------- /pulsecaster/listener.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2010-2015 Paul W. Frields and others. 2 | # 3 | # This program is free software: you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License as published by 5 | # the Free Software Foundation, either version 3 of the License, or 6 | # (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program. If not, see . 15 | # 16 | # 17 | # Author: Paul W. Frields 18 | 19 | import dbus 20 | import dbus.mainloop.glib 21 | 22 | class PulseCasterListener: 23 | def __init__(self, ui): 24 | dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 25 | self.bus = dbus.SystemBus() 26 | 27 | self.bus.add_signal_receiver(ui.repop_sources, 28 | signal_name='DeviceAdded', 29 | dbus_interface='org.freedesktop.Hal.Manager', 30 | path='/org/freedesktop/Hal/Manager') 31 | self.bus.add_signal_receiver(ui.repop_sources, 32 | signal_name='DeviceRemoved', 33 | dbus_interface='org.freedesktop.Hal.Manager', 34 | path='/org/freedesktop/Hal/Manager') 35 | 36 | 37 | -------------------------------------------------------------------------------- /pulsecaster/pulsecaster: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # 4 | # Copyright (C) 2010 Jürgen Geuter and others. 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | # 19 | # 20 | # Author: Jürgen Geuter 21 | 22 | try: 23 | from pulsecaster import ui 24 | except ModuleNotFoundError: 25 | import os, sys 26 | sys.path.append(os.getcwd()) 27 | sys.path.append(os.path.join(os.getcwd(), '..')) 28 | from pulsecaster import ui 29 | 30 | pc = ui.PulseCasterUI() 31 | pc.run() 32 | -------------------------------------------------------------------------------- /pulsecaster/source.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2011-2019 Paul W. Frields and others. 2 | # -*- coding: utf-8 -*- 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | # 17 | # 18 | # Author: Paul W. Frields 19 | 20 | from pulsecaster.config import * 21 | import gi 22 | gi.require_version('Gtk', '3.0') 23 | gi.require_version('Gst', '1.0') 24 | from gi.repository import Gtk, GObject, Gst 25 | Gst.init(None) 26 | import os 27 | 28 | class PulseCasterSource: 29 | '''A source object that provides sound data for PulseCaster''' 30 | def __init__(self): 31 | '''Construct the source object''' 32 | # Should include a PA source, a GtkCombBox, and a GtkProgressBar 33 | self.store = Gtk.ListStore(GObject.TYPE_STRING, 34 | GObject.TYPE_STRING, 35 | GObject.TYPE_PYOBJECT) 36 | self.bus = None 37 | self.cbox = Gtk.ComboBox.new_with_model(self.store) 38 | self.cell = Gtk.CellRendererText() 39 | self.cbox.pack_start(self.cell, True) 40 | self.cbox.add_attribute(self.cell, 'text', True) 41 | self.cbox.connect('changed', self.set_meters) 42 | self.pbar = Gtk.ProgressBar() 43 | self.pipeline = None 44 | debugPrint('out of __init__') 45 | 46 | def repopulate(self, pa, use_source=True, use_monitor=True): 47 | '''Repopulate the ComboBox for this object''' 48 | debugPrint('in repopulate') 49 | sources = pa.source_list() 50 | self.store.clear() 51 | for source in sources: 52 | if source.monitor_of_sink_name == None: 53 | if use_source == True: 54 | self.store.append([source.name, 55 | source.description, 56 | source]) 57 | else: 58 | if use_monitor == True: 59 | self.store.append([source.name, 60 | source.description, 61 | source]) 62 | # Don't leave without resetting a source 63 | self.cbox.set_active(0) 64 | debugPrint('out of repopulate') 65 | 66 | def create_level_pipeline(self, *args): 67 | '''Make a GStreamer pipeline that allows level checking''' 68 | debugPrint('in create_level_pipeline') 69 | pl = 'pulsesrc device=%s' % (self.pulsesrc) 70 | pl += ' ! level message=true interval=100000000 ! fakesink' 71 | debugPrint(pl) 72 | self.pipeline = Gst.parse_launch(pl) 73 | self.pipeline.get_bus().add_signal_watch() 74 | self.conn = self.pipeline.get_bus().connect('message::element', self.update_level) 75 | self.pipeline.set_state(Gst.State.PLAYING) 76 | debugPrint('out of create_level_pipeline') 77 | 78 | def remove_level_pipeline(self, *args): 79 | '''Tear down the GStreamer pipeline attached to this object''' 80 | debugPrint('in remove_level_pipeline') 81 | self.pipeline.set_state(Gst.State.NULL) 82 | self.pipeline.get_bus().remove_signal_watch() 83 | self.pipeline.get_bus().disconnect(self.conn) 84 | self.conn = None 85 | self.pipeline = None 86 | debugPrint('out of remove_level_pipeline') 87 | 88 | def set_meters(self, *args): 89 | debugPrint('in set_meters') 90 | self.cbox.set_sensitive(False) 91 | if self.pipeline is not None: 92 | self.remove_level_pipeline() 93 | i = self.cbox.get_active_iter() 94 | if i is not None: 95 | self.pulsesrc = self.cbox.get_model().get_value(i, 0) 96 | self.create_level_pipeline() 97 | self.cbox.set_sensitive(True) 98 | debugPrint('out of set_meters') 99 | 100 | def update_level(self, bus, message, *args): 101 | '''Update this object's GtkProgressBar to reflect current level''' 102 | if message.get_structure().get_name() == 'level': 103 | # stick with left channel in stereo setups 104 | peak = message.get_structure().get_value('peak')[0] 105 | self.pbar.set_fraction(self.iec_scale(peak)/100) 106 | self.pbar.queue_draw() 107 | return True 108 | 109 | def iec_scale(self, db): 110 | '''For a given dB value, return the iEC-268-18 standard value''' 111 | pct = 0.0 112 | if db < -70.0: 113 | pct = 0.0 114 | elif db < -60.0: 115 | pct = (db + 70.0) * 0.25 116 | elif db < -50.0: 117 | pct = (db + 60.0) * 0.5 + 2.5 118 | elif db < -40.0: 119 | pct = (db + 50.0) * 0.75 + 7.5 120 | elif db < -30.0: 121 | pct = (db + 40.0) * 1.5 + 15.0 122 | elif db < -20.0: 123 | pct = (db + 30.0) * 2.0 + 30.0 124 | elif db < 0.0: 125 | pct = (db + 20.0) * 2.5 + 50.0 126 | else: 127 | pct = 100.0 128 | return pct 129 | -------------------------------------------------------------------------------- /pulsecaster/ui.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2009-2019 Paul W. Frields and others. 2 | # -*- coding: utf-8 -*- 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | # 17 | # 18 | # Author: Paul W. Frields 19 | # Jürgen Geuter 20 | 21 | 22 | import os, sys 23 | try: 24 | from pulsecaster.config import * 25 | from pulsecaster.gsettings import * 26 | from pulsecaster.listener import * 27 | from pulsecaster.source import * 28 | except ModuleNotFoundError: 29 | sys.path.append(os.getcwd()) 30 | sys.path.append(os.path.join(os.getcwd(), '..')) 31 | from pulsecaster.config import * 32 | from pulsecaster.gsettings import * 33 | from pulsecaster.listener import * 34 | from pulsecaster.source import * 35 | 36 | from pulsectl import Pulse 37 | 38 | import gi 39 | gi.require_version('Gtk', '3.0') 40 | gi.require_version('Gst', '1.0') 41 | from gi.repository import Gtk, Gst, GObject, Gio 42 | 43 | Gst.init(None) 44 | import os 45 | import sys 46 | import tempfile 47 | from datetime import datetime 48 | 49 | import gettext 50 | gettext.install(LNAME) 51 | 52 | class PulseCasterUI(Gtk.Application): 53 | def __init__(self): 54 | Gtk.Application.__init__(self, application_id='apps.org.pulsecaster.PulseCaster', 55 | flags=Gio.ApplicationFlags.FLAGS_NONE) 56 | self.connect('activate', self.on_activate) 57 | 58 | def on_activate(self, app): 59 | self.builder = Gtk.Builder() 60 | self.builder.set_translation_domain(NAME) 61 | try: 62 | self.builder.add_from_file(os.path.join(os.getcwd(), 63 | 'data', 64 | 'pulsecaster.ui') 65 | ) 66 | debugPrint(_("loading UI file from current subdir")) 67 | except: 68 | try: 69 | self.builder.add_from_file(os.path.join(sys.prefix, 70 | 'share', 71 | 'pulsecaster', 72 | 'pulsecaster.ui')) 73 | except: 74 | try: 75 | self.builder.add_from_file(os.path.join 76 | (os.path.dirname(sys.argv[0]), 77 | 'data', 'pulsecaster.ui')) 78 | except Exception as e: 79 | print(e) 80 | raise SystemExit(_("Cannot load resources")) 81 | 82 | self.tempgsettings = Gtk.Settings.get_default() 83 | self.tempgsettings.set_property('gtk-application-prefer-dark-theme', 84 | True) 85 | self.icontheme = Gtk.IconTheme.get_default() 86 | # Convenience for developers 87 | self.icontheme.append_search_path(os.path.join(os.getcwd(), 88 | 'data', 89 | 'icons', 90 | 'scalable')) 91 | self.icontheme.append_search_path(os.path.join 92 | (os.path.dirname(sys.argv[0]), 93 | 'data', 'icons', 'scalable')) 94 | self.logo = self.icontheme.load_icon('pulsecaster', -1, 95 | Gtk.IconLookupFlags.FORCE_SVG) 96 | Gtk.Window.set_default_icon(self.logo) 97 | self.gsettings = PulseCasterGSettings() 98 | 99 | self.warning = self.builder.get_object('warning') 100 | self.add_window(self.warning) 101 | self.dismiss = self.builder.get_object('dismiss_warning') 102 | self.swckbox = self.builder.get_object('skip_warn_checkbox') 103 | self.swckbox.set_active(int(self.gsettings.skip_warn)) 104 | self.dismiss.connect('clicked', self.hideWarn) 105 | self.warning.connect('destroy', self.on_close) 106 | self.warning.set_title(NAME) 107 | 108 | # Miscellaneous dialog strings 109 | s = _('Important notice') 110 | self.builder.get_object('warning-label2').set_label(''+ 111 | ''+ 112 | s+ 113 | ''+ 114 | '') 115 | s = _('This program can be used to record speech from remote ' + 116 | 'locations. You are responsible for adhering to all '+ 117 | 'applicable laws and regulations when using this program. '+ 118 | 'In general you should not record other parties without '+ 119 | 'their consent.') 120 | self.builder.get_object('warning-label3').set_label(s) 121 | s = _('Do not show this again') 122 | self.builder.get_object('skip_warn_checkbox').set_label(s) 123 | s = _('Select the audio sources to mix') 124 | self.builder.get_object('label2').set_label(s) 125 | s = _('I understand.') 126 | self.builder.get_object('dismiss_warning').set_label(s) 127 | s = _('Your voice') 128 | self.builder.get_object('label3').set_label(s + ':') 129 | s = _('Subject\'s voice') 130 | self.builder.get_object('label4').set_label(s + ':') 131 | 132 | # Main dialog basics 133 | self.main = self.builder.get_object('main_dialog') 134 | self.add_window(self.main) 135 | self.main.set_title(NAME) 136 | self.main_title = self.builder.get_object('main_title') 137 | self.main_title.set_label('' + 138 | NAME + '') 139 | self.main.connect('delete_event', self.on_close) 140 | self.about_button = self.builder.get_object('about_button') 141 | self.about_button.connect('clicked', self.showAbout) 142 | self.adv_button = self.builder.get_object('adv_button') 143 | self.adv_button.connect('clicked', self.showAdv) 144 | self.close = self.builder.get_object('close_button') 145 | self.close.connect('clicked', self.on_close) 146 | self.record = self.builder.get_object('record_button') 147 | self.record_id = self.record.connect('clicked', self.on_record) 148 | self.record.set_sensitive(True) 149 | self.main_logo = self.builder.get_object('logo') 150 | self.main_logo.set_from_icon_name('pulsecaster', Gtk.IconSize.DIALOG) 151 | self.main.set_icon_list([self.logo]) 152 | # Advanced dialog basics 153 | self.adv = self.builder.get_object('adv_dialog') 154 | self.adv.set_icon_list([self.logo]) 155 | self.adv.set_title(NAME) 156 | self.adv.connect('delete_event', self.hideAdv) 157 | self.adv.connect('response', self.hideAdv) 158 | self.adv_stdlabel1 = self.builder.get_object('adv_stdlabel1') 159 | self.adv_stdlabel2 = self.builder.get_object('adv_stdlabel2') 160 | self.adv_explabel1 = self.builder.get_object('adv_explabel1') 161 | self.adv_explabel2 = self.builder.get_object('adv_explabel2') 162 | self.adv_stdlabel1.set_label(_('Standard settings')) 163 | self.adv_explabel1.set_label(_('Expert settings')) 164 | lbl = _('Save the conversation as a single audio file with '+ 165 | 'compression. This is the right option for most people.') 166 | self.adv_stdlabel2.set_label('' + lbl + '') 167 | lbl = _('Save each voice as a separate audio file without '+ 168 | 'compression. Use this option to mix and encode audio '+ 169 | 'yourself.') 170 | self.adv_explabel2.set_label('' + lbl + '') 171 | # TODO: Add bits to set radio buttons and make them work 172 | self.vorbis_button = self.builder.get_object('vorbis_button') 173 | self.vorbis_button.connect('clicked', self.set_standard) 174 | self.flac_button = self.builder.get_object('flac_button') 175 | self.flac_button.connect('clicked', self.set_expert) 176 | self.flac_button.join_group(self.vorbis_button) 177 | if self.gsettings.expert is True: 178 | self.flac_button.set_active(True) 179 | else: 180 | self.vorbis_button.set_active(True) 181 | # About dialog basics 182 | self.about = self.builder.get_object('about_dialog') 183 | self.add_window(self.about) 184 | self.about.connect('delete_event', self.hideAbout) 185 | self.about.connect('response', self.hideAbout) 186 | self.about.set_name(NAME) 187 | self.about.set_version(VERSION) 188 | self.about.set_copyright(COPYRIGHT) 189 | self.about.set_comments(DESCRIPTION) 190 | self.about.set_license(LICENSE_TEXT) 191 | self.about.set_website(URL) 192 | self.about.set_website_label(URL) 193 | self.authors = [AUTHOR + ' <' + AUTHOR_EMAIL + '>'] 194 | for contrib in CONTRIBUTORS: 195 | self.authors.append(contrib) 196 | self.about.set_authors(self.authors) 197 | self.about.set_program_name(NAME) 198 | self.about.set_logo(self.icontheme.load_icon 199 | ('pulsecaster', 96, Gtk.IconLookupFlags.FORCE_SVG)) 200 | 201 | # Create PulseAudio backing 202 | self.pa = Pulse(client_name=NAME) 203 | 204 | # Create and populate combo boxes 205 | self.table = self.builder.get_object('table1') 206 | self.user_vox = PulseCasterSource() 207 | self.subject_vox = PulseCasterSource() 208 | 209 | self.table.attach(self.user_vox.cbox, 1, 0, 1, 1) 210 | self.table.attach(self.subject_vox.cbox, 1, 1, 1, 1) 211 | self.table.attach(self.user_vox.pbar, 2, 0, 1, 1) 212 | self.table.attach(self.subject_vox.pbar, 2, 1, 1, 1) 213 | self.user_vox.cbox.connect('button-press-event', 214 | self.user_vox.repopulate, 215 | self.pa) 216 | self.subject_vox.cbox.connect('button-press-event', 217 | self.subject_vox.repopulate, 218 | self.pa) 219 | 220 | # Fill the combo boxes initially 221 | self.repop_sources() 222 | self.user_vox.cbox.set_active(0) 223 | self.subject_vox.cbox.set_active(0) 224 | self.table.show_all() 225 | 226 | self.listener = PulseCasterListener(self) 227 | self.filesinkpath = '' 228 | 229 | if self.gsettings.skip_warn is False: 230 | self.warning.show() 231 | else: 232 | self.hideWarn() 233 | 234 | def repop_sources(self, *args): 235 | self.main.set_sensitive(False) 236 | self.user_vox.repopulate(self.pa, use_source=True, 237 | use_monitor=False) 238 | self.subject_vox.repopulate(self.pa, use_source=False, 239 | use_monitor=True) 240 | self.table.show_all() 241 | self.main.set_sensitive(True) 242 | 243 | def on_record(self, *args): 244 | # Adjust UI 245 | self.user_vox.cbox.set_sensitive(False) 246 | self.subject_vox.cbox.set_sensitive(False) 247 | self.close.set_sensitive(False) 248 | self.adv_button.set_sensitive(False) 249 | 250 | self.combiner = Gst.Pipeline() 251 | self.lsource = Gst.ElementFactory.make('pulsesrc', 'lsrc') 252 | self.lsource.set_property('device', self.user_vox.pulsesrc) 253 | self.rsource = Gst.ElementFactory.make('pulsesrc', 'rsrc') 254 | self.rsource.set_property('device', self.subject_vox.pulsesrc) 255 | 256 | self._default_caps = Gst.Caps.from_string('audio/x-raw, ' 257 | 'rate=(int)%d' % 258 | (self.gsettings.audiorate)) 259 | self.adder = Gst.ElementFactory.make('adder', 'mix') 260 | self.lfilter = Gst.ElementFactory.make('capsfilter', 'lfilter') 261 | self.rfilter = Gst.ElementFactory.make('capsfilter', 'rfilter') 262 | debugPrint('audiorate: %d' % self.gsettings.audiorate) 263 | 264 | # Reset filesinkpath 265 | self.filesinkpath = '' 266 | 267 | if self.gsettings.expert is not True: 268 | # Create temporary file 269 | (self.tempfd, self.temppath) = tempfile.mkstemp(prefix='%s-tmp.' 270 | % (NAME)) 271 | self.tempfile = os.fdopen(self.tempfd) 272 | debugPrint('tempfile: %s (fd %s)' % (self.temppath, self.tempfd)) 273 | self.encoder = Gst.ElementFactory.make(self.gsettings.codec + 274 | 'enc', 'enc') 275 | if self.gsettings.codec == 'vorbis': 276 | self.muxer = Gst.ElementFactory.make('oggmux', 'mux') 277 | self.filesink = Gst.ElementFactory.make('filesink', 'fsink') 278 | self.filesink.set_property('location', self.temppath) 279 | 280 | for e in (self.lsource, 281 | self.lfilter, 282 | self.rsource, 283 | self.rfilter, 284 | self.adder, 285 | self.encoder, 286 | self.filesink): 287 | self.combiner.add(e) 288 | if self.gsettings.codec == 'vorbis': 289 | self.combiner.add(self.muxer) 290 | self.lsource.link(self.lfilter) 291 | self.lfilter.link(self.adder) 292 | self.adder.link(self.encoder) 293 | if self.gsettings.codec == 'vorbis': 294 | self.encoder.link(self.muxer) 295 | self.muxer.link(self.filesink) 296 | else: # flac 297 | self.encoder.link(self.filesink) 298 | self.rsource.link(self.rfilter) 299 | self.rfilter.link(self.adder) 300 | else: 301 | # Create temporary file 302 | (self.tempfd1, self.temppath1) = tempfile.mkstemp(prefix='%s-1-tmp.' 303 | % (NAME)) 304 | (self.tempfd2, self.temppath2) = tempfile.mkstemp(prefix='%s-2-tmp.' 305 | % (NAME)) 306 | self.tempfile1 = os.fdopen(self.tempfd1) 307 | self.tempfile2 = os.fdopen(self.tempfd2) 308 | debugPrint('tempfiles: %s (fd %s), %s (fd %s)' % 309 | (self.temppath1, self.tempfd1, self.temppath2, 310 | self.temppath2)) 311 | # We're in expert mode 312 | # Disregard vorbis, use WAV 313 | self.encoder1 = Gst.ElementFactory.make('wavenc', 'enc1') 314 | self.encoder2 = Gst.ElementFactory.make('wavenc', 'enc2') 315 | self.filesink1 = Gst.ElementFactory.make('filesink', 'fsink1') 316 | self.filesink1.set_property('location', self.temppath1) 317 | self.filesink2 = Gst.ElementFactory.make('filesink', 'fsink2') 318 | self.filesink2.set_property('location', self.temppath2) 319 | for e in (self.lsource, 320 | self.lfilter, 321 | self.rsource, 322 | self.rfilter, 323 | self.encoder1, 324 | self.encoder2, 325 | self.filesink1, 326 | self.filesink2): 327 | self.combiner.add(e) 328 | self.lsource.link(self.lfilter) 329 | self.lfilter.link(self.encoder1) 330 | self.encoder1.link(self.filesink1) 331 | self.rsource.link(self.rfilter) 332 | self.rfilter.link(self.encoder2) 333 | self.encoder2.link(self.filesink2) 334 | 335 | # FIXME: Dim elements other than the 'record' widget 336 | self.record.set_label(Gtk.STOCK_MEDIA_STOP) 337 | self.record.disconnect(self.record_id) 338 | self.stop_id = self.record.connect('clicked', self.on_stop) 339 | self.record.show() 340 | self.combiner.set_state(Gst.State.PLAYING) 341 | # Start timer 342 | self.starttime = datetime.now() 343 | self._update_time() 344 | self.timeout = 1000 345 | GObject.timeout_add(self.timeout, self._update_time) 346 | 347 | def on_stop(self, *args): 348 | self.combiner.set_state(Gst.State.NULL) 349 | self.showFileChooser() 350 | self.record.set_label(Gtk.STOCK_MEDIA_RECORD) 351 | self.record.disconnect(self.stop_id) 352 | self.record_id = self.record.connect('clicked', self.on_record) 353 | self.user_vox.cbox.set_sensitive(True) 354 | self.subject_vox.cbox.set_sensitive(True) 355 | self.close.set_sensitive(True) 356 | self.adv_button.set_sensitive(True) 357 | self.record.show() 358 | 359 | def on_close(self, *args): 360 | try: 361 | self.pa.disconnect() 362 | except: 363 | pass 364 | self.quit() 365 | 366 | def hideWarn(self, *args): 367 | self.gsettings.change_warn(self.swckbox.get_active()) 368 | self.warning.hide() 369 | self.main.show() 370 | 371 | def showAbout(self, *args): 372 | self.about.show() 373 | 374 | def hideAbout(self, *args): 375 | self.about.hide() 376 | 377 | def showAdv(self, *args): 378 | if self.gsettings.expert is True: 379 | self.flac_button.set_active(True) 380 | else: 381 | self.vorbis_button.set_active(True) 382 | self.adv.show() 383 | 384 | def hideAdv(self, *args): 385 | self.adv.hide() 386 | 387 | def set_standard(self, *args): 388 | self.gsettings.gsettings.set_boolean('expert', False) 389 | self.gsettings.gsettings.set_string('codec', 'vorbis') 390 | self.gsettings.expert = False 391 | self.gsettings.gsettings.sync() 392 | 393 | def set_expert(self, *args): 394 | self.gsettings.gsettings.set_boolean('expert', True) 395 | self.gsettings.gsettings.set_string('codec', 'flac') 396 | self.gsettings.expert = True 397 | self.gsettings.gsettings.sync() 398 | 399 | def showFileChooser(self, *args): 400 | self.file_chooser = Gtk.FileChooserDialog(title=_('Save your recording'), 401 | action=Gtk.FileChooserAction.SAVE, 402 | buttons=(Gtk.STOCK_CANCEL, 403 | Gtk.ResponseType.CANCEL, 404 | Gtk.STOCK_OK, 405 | Gtk.ResponseType.OK)) 406 | self.file_chooser.set_local_only(True) 407 | response = self.file_chooser.run() 408 | if response == Gtk.ResponseType.OK: 409 | self.updateFileSinkPath() 410 | elif response == Gtk.ResponseType.CANCEL: 411 | self.hideFileChooser() 412 | elif response == Gtk.ResponseType.DELETE_EVENT: 413 | self.hideFileChooser() 414 | 415 | def hideFileChooser(self, *args): 416 | if not self.filesinkpath: 417 | confirm_message=_('Are you sure you want to cancel saving '+ 418 | 'your work? If you choose Yes your audio '+ 419 | 'recording will be erased permanently.') 420 | erase_message=_("Yes, erase my recording") 421 | retain_message=_("No, let me save my recording") 422 | confirm = Gtk.MessageDialog(type=Gtk.MessageType.WARNING, 423 | buttons=(retain_message, 424 | Gtk.ResponseType.NO, 425 | erase_message, 426 | Gtk.ResponseType.YES), 427 | message_format=confirm_message) 428 | response = confirm.run() 429 | confirm.destroy() 430 | if response == Gtk.ResponseType.YES: 431 | if self.gsettings.expert is False: 432 | self._remove_tempfile(self.tempfile, self.temppath) 433 | else: 434 | self._remove_tempfile(self.tempfile1, self.temppath1) 435 | self._remove_tempfile(self.tempfile2, self.temppath2) 436 | else: 437 | self.file_chooser.destroy() 438 | self.showFileChooser(self) 439 | return 440 | self.file_chooser.destroy() 441 | 442 | def updateFileSinkPath(self, *args): 443 | self.filesinkpath = self.file_chooser.get_filename() 444 | if not self.filesinkpath: 445 | return 446 | self.hideFileChooser() 447 | if self.gsettings.expert is False: 448 | if not self.filesinkpath.endswith('.ogg'): 449 | self.filesinkpath += '.ogg' 450 | if os.path.lexists(self.filesinkpath): 451 | if not self._confirm_overwrite(): 452 | self.showFileChooser() 453 | return 454 | else: 455 | if os.path.lexists(self.filesinkpath+'-1.wav') or \ 456 | os.path.lexists(self.filesinkpath+'-2.wav'): 457 | if not self._confirm_overwrite(): 458 | self.showFileChooser() 459 | return 460 | # Copy the temporary file to its new home 461 | self._copy_temp_to_perm() 462 | if self.gsettings.expert is False: 463 | self._remove_tempfile(self.tempfile, self.temppath) 464 | else: 465 | expert_message = _('WAV files are written here:') 466 | expert_message += '\n%s\n%s' % (self.filesinkpath+'-1.wav', 467 | self.filesinkpath+'-2.wav') 468 | expertdlg = Gtk.MessageDialog(type=Gtk.MessageType.INFO, 469 | buttons=Gtk.ButtonsType.OK, 470 | message_format=expert_message) 471 | response = expertdlg.run() 472 | expertdlg.destroy() 473 | self._remove_tempfile(self.tempfile1, self.temppath1) 474 | self._remove_tempfile(self.tempfile2, self.temppath2) 475 | self.record.set_sensitive(True) 476 | 477 | def _update_time(self, *args): 478 | if self.combiner.get_state(Gst.CLOCK_TIME_NONE)[1] == Gst.State.NULL: 479 | return False 480 | delta = datetime.now() - self.starttime 481 | deltamin = delta.seconds // 60 482 | deltasec = delta.seconds - (deltamin * 60) 483 | return True 484 | 485 | def _confirm_overwrite(self, *args): 486 | confirm_message = _('File exists. OK to overwrite?') 487 | confirm = Gtk.MessageDialog(type=Gtk.MessageType.QUESTION, 488 | buttons=Gtk.ButtonsType.YES_NO, 489 | message_format=confirm_message) 490 | response = confirm.run() 491 | if response == Gtk.ResponseType.YES: 492 | retval = True 493 | else: 494 | retval = False 495 | confirm.destroy() 496 | return retval 497 | 498 | def _copy_temp_to_perm(self): 499 | # This is a really stupid way to do this. 500 | # FIXME: abstract out the duplicated code, lazybones. 501 | if self.gsettings.expert is False: 502 | permfile = open(self.filesinkpath, 'wb') 503 | self.tempfile.close() 504 | self.tempfile = open(self.temppath, 'rb') 505 | permfile.write(self.tempfile.read()) 506 | permfile.close() 507 | else: 508 | for i in (1, 2): 509 | permfile = open(self.filesinkpath + '-' + str(i) + '.wav', 'wb') 510 | tf = eval('self.tempfile' + str(i)) 511 | tf.close() 512 | tempfile = open(eval('self.temppath' + str(i)), 'rb') 513 | permfile.write(tempfile.read()) 514 | permfile.close() 515 | 516 | def _remove_tempfile(self, tempfile, temppath): 517 | tempfile.close() 518 | os.remove(temppath) 519 | 520 | 521 | if __name__ == '__main__': 522 | pulseCaster = PulseCasterUI() 523 | pulseCaster.run(sys.argv) 524 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [extract_messages] 2 | output_file = po/pulsecaster.pot 3 | copyright_holder = Paul W. Frields 4 | msgid_bugs_address = stickster@gmail.com 5 | keywords = _ N_ 6 | 7 | [init_catalog] 8 | input_file = po/pulsecaster.pot 9 | domain = pulsecaster 10 | 11 | [compile_catalog] 12 | domain = pulsecaster 13 | 14 | [update_catalog] 15 | input_file = po/pulsecaster.pot 16 | domain = pulsecaster 17 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # Copyright (C) 2009, 2010, 2012 Paul W. Frields and others. 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | # 19 | # 20 | # Author: Paul W. Frields 21 | # Jürgen Geuter 22 | 23 | from setuptools import setup, find_packages 24 | from pulsecaster.config import * 25 | from glob import glob 26 | 27 | def get_mo_files(*args): 28 | mo = [] 29 | for f in glob('po/*.mo'): 30 | locale = f.replace('po/', '').split('.')[0] 31 | mo.append(('/usr/share/locale/%s/LC_MESSAGES/' % locale, [f])) 32 | return mo 33 | 34 | my_data_files = [ 35 | ('/usr/share/pulsecaster/', ["pulsecaster/data/pulsecaster.ui"]), 36 | ('/usr/share/icons/hicolor/scalable/apps/', ['pulsecaster/data/icons/scalable/pulsecaster.svg', 'pulsecaster/data/icons/scalable/pulsecaster-logo.svg']), 37 | ('/usr/share/icons/hicolor/16x16/apps/', ['pulsecaster/data/icons/16x16/pulsecaster-16.png']), 38 | ('/usr/share/icons/hicolor/24x24/apps/', ['pulsecaster/data/icons/24x24/pulsecaster-24.png']), 39 | ('/usr/share/icons/hicolor/32x32/apps/', ['pulsecaster/data/icons/32x32/pulsecaster-32.png']), 40 | ('/usr/share/icons/hicolor/48x48/apps/', ['pulsecaster/data/icons/48x48/pulsecaster-48.png']), 41 | ('/usr/share/icons/hicolor/64x64/apps/', ['pulsecaster/data/icons/64x64/pulsecaster-64.png']), 42 | ('/usr/share/applications/', ['pulsecaster.desktop']), 43 | ('/usr/share/appdata/', ['pulsecaster.appdata.xml']), 44 | ('/usr/share/glib-2.0/schemas/', ['org.pulsecaster.PulseCaster.gschema.xml']), 45 | ('/usr/share/GConf/gsettings/', ['pulsecaster.convert']), 46 | ] 47 | my_data_files.extend(get_mo_files()) 48 | 49 | setup( 50 | name = "pulsecaster", 51 | version = VERSION, 52 | author = AUTHOR, 53 | author_email = AUTHOR_EMAIL, 54 | description = DESCRIPTION, 55 | license = LICENSE, 56 | keywords = KEYWORDS, 57 | url = URL, 58 | 59 | scripts = ['pulsecaster/pulsecaster'], 60 | data_files = my_data_files, 61 | 62 | packages = find_packages(), 63 | ) 64 | -------------------------------------------------------------------------------- /utils/Makefile: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2009 Paul W. Frields 2 | # 3 | # This program is free software: you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License as published by 5 | # the Free Software Foundation, either version 3 of the License, or 6 | # (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program. If not, see . 15 | # 16 | # 17 | # Author: Paul W. Frields 18 | 19 | 20 | LIBS=-lpulse 21 | CC=gcc 22 | 23 | default: palist 24 | 25 | palist: palist.c 26 | $(CC) -o $@ ${LIBS} $< 27 | 28 | clean: 29 | rm -f palist 30 | -------------------------------------------------------------------------------- /utils/README-palist: -------------------------------------------------------------------------------- 1 | I wrote this utility as a one-off, just to see if I understood how 2 | some of the simpler PulseAudio internals worked. It's not intended to 3 | be used by the PulseCaster at this point, but I kept it here just in case. 4 | 5 | To compile, run 'make'. 6 | -------------------------------------------------------------------------------- /utils/palist.c: -------------------------------------------------------------------------------- 1 | /* 2 | * palist.c - List sinks and sources from the local PulseAudio server 3 | * 4 | * Copyright (C) 2009 Paul W. Frields 5 | * 6 | * This program is free software: you can redistribute it and/or 7 | * modify it under the terms of the GNU General Public License as 8 | * published by the Free Software Foundation, either version 3 of the 9 | * License, or (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but 12 | * WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 | * General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with this program. If not, see 18 | * . 19 | * 20 | * 21 | * Author: Paul W. Frields 22 | * 23 | */ 24 | 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | 35 | #include 36 | 37 | static pa_context *context = NULL; 38 | static pa_mainloop_api *mainloop_api = NULL; 39 | 40 | static int verbose = 0; 41 | static int actions = 1; 42 | 43 | static enum { 44 | NONE, 45 | LIST_SOURCES, 46 | LIST_SINKS, 47 | LIST_ALL 48 | } action = NONE; 49 | 50 | static inline const char *pa_strnull(const char *x) { 51 | return x ? x : "(null)"; 52 | } 53 | 54 | /* Shortcut to terminate */ 55 | static void quit(int ret) { 56 | assert(mainloop_api); 57 | mainloop_api->quit(mainloop_api, ret); 58 | } 59 | 60 | static void context_drain_complete(pa_context *c, void *userdata) { 61 | pa_context_disconnect(c); 62 | } 63 | 64 | static void drain(void) { 65 | pa_operation *o; 66 | if(!(o = pa_context_drain(context, context_drain_complete, NULL))) 67 | pa_context_disconnect(context); 68 | else 69 | pa_operation_unref(o); 70 | } 71 | 72 | static void complete_action(void) { 73 | assert(actions > 0); 74 | if(!(--actions)) 75 | drain(); 76 | } 77 | 78 | static void exit_signal_callback(pa_mainloop_api *m, pa_signal_event *e, int sig, void *userdata) { 79 | fprintf(stderr, "Got SIGINT, exiting.\n"); 80 | quit(0); 81 | } 82 | 83 | static void get_source_list_callback(pa_context *c, 84 | const pa_source_info *i, 85 | int eol, 86 | void *userdata) { 87 | if(eol < 0) { 88 | fprintf(stderr, "Failed to get source information: %s\n", 89 | pa_strerror(pa_context_errno(c))); 90 | quit(1); 91 | return; 92 | } 93 | 94 | if(eol) { 95 | complete_action(); 96 | return; 97 | } 98 | 99 | assert(i); 100 | 101 | printf("Source #%u <%s> %s\n", i->index, i->name, pa_strnull(i->description)); 102 | } 103 | 104 | static void get_sink_list_callback(pa_context *c, 105 | const pa_sink_info *i, 106 | int eol, 107 | void *userdata) { 108 | if(eol < 0) { 109 | fprintf(stderr, "Failed to get sink information: %s\n", 110 | pa_strerror(pa_context_errno(c))); 111 | quit(1); 112 | return; 113 | } 114 | 115 | if(eol) { 116 | complete_action(); 117 | return; 118 | } 119 | 120 | assert(i); 121 | 122 | printf("Sink #%u <%s> %s\n", i->index, i->name, pa_strnull(i->description)); 123 | } 124 | 125 | static void context_state_callback(pa_context *c, void *userdata) { 126 | assert(c); 127 | switch (pa_context_get_state(c)) { 128 | case PA_CONTEXT_CONNECTING: 129 | case PA_CONTEXT_AUTHORIZING: 130 | case PA_CONTEXT_SETTING_NAME: 131 | break; 132 | 133 | case PA_CONTEXT_READY: 134 | switch (action) { 135 | case LIST_SOURCES: 136 | pa_operation_unref(pa_context_get_source_info_list(c, get_source_list_callback, NULL)); 137 | break; 138 | 139 | case LIST_SINKS: 140 | pa_operation_unref(pa_context_get_sink_info_list(c, get_sink_list_callback, NULL)); 141 | break; 142 | 143 | case LIST_ALL: 144 | actions = 2; 145 | pa_operation_unref(pa_context_get_source_info_list(c, get_source_list_callback, NULL)); 146 | pa_operation_unref(pa_context_get_sink_info_list(c, get_sink_list_callback, NULL)); 147 | break; 148 | 149 | default: 150 | assert(0); 151 | } 152 | break; 153 | 154 | case PA_CONTEXT_TERMINATED: 155 | quit(0); 156 | break; 157 | 158 | case PA_CONTEXT_FAILED: 159 | default: 160 | fprintf(stderr, "Connection failure: %s\n", 161 | pa_strerror(pa_context_errno(c))); 162 | quit(1); 163 | } 164 | } 165 | 166 | 167 | static void help(const char *argv0) { 168 | printf("%s [options]\n" 169 | " -h Show this help\n" 170 | " -c, --list-sources List sources\n" 171 | " -k, --list-sinks List sinks\n" 172 | " -a, --list-all List sources and sinks\n", 173 | argv0); 174 | } 175 | 176 | 177 | /* ----------- MAIN ------------ */ 178 | int main(int argc, char *argv[]) { 179 | pa_mainloop* m = NULL; 180 | char *server = NULL; 181 | char *client_name = NULL; 182 | int ret = 1, r, c; 183 | 184 | static const struct option long_options[] = { 185 | {"help", 0, NULL, 'h'}, 186 | {"list-sources", 0, NULL, 'c'}, 187 | {"list-sinks", 0, NULL, 'k'}, 188 | {"list-all", 0, NULL, 'a'}, 189 | {NULL, 0, NULL, 0} 190 | }; 191 | 192 | client_name = pa_xstrdup("palist"); // Make this more flexible later; 193 | 194 | while ((c = getopt_long(argc, argv, "ckah", long_options, NULL)) != -1) { 195 | switch (c) { 196 | case 'h': 197 | help(client_name); 198 | ret = 0; 199 | goto quit; 200 | 201 | case 'c': 202 | action = LIST_SOURCES; 203 | break; 204 | 205 | case 'k': 206 | action = LIST_SINKS; 207 | break; 208 | 209 | case 'a': 210 | action = LIST_ALL; 211 | break; 212 | 213 | default: 214 | goto quit; 215 | } 216 | } 217 | 218 | if (action == NONE) { 219 | fprintf(stderr, "No valid option specified\n"); 220 | goto quit; 221 | } 222 | 223 | if (!(m = pa_mainloop_new())) { 224 | fprintf(stderr, "pa_mainloop_new() failed.\n"); 225 | goto quit; 226 | } 227 | 228 | mainloop_api = pa_mainloop_get_api(m); 229 | 230 | r = pa_signal_init(mainloop_api); 231 | assert(r == 0); 232 | pa_signal_new(SIGINT, exit_signal_callback, NULL); 233 | #ifdef SIGPIPE 234 | signal(SIGPIPE, SIG_IGN); 235 | #endif 236 | 237 | if (!(context = pa_context_new(mainloop_api, client_name))) { 238 | fprintf(stderr, "pa_context_new() failed.\n"); 239 | goto quit; 240 | } 241 | 242 | pa_context_set_state_callback(context, context_state_callback, NULL); 243 | if (pa_context_connect(context, server, 0, NULL) < 0) { 244 | fprintf(stderr, "pa_context_connect() failed: %s", pa_strerror(pa_context_errno(context))); 245 | goto quit; 246 | } 247 | 248 | if (pa_mainloop_run(m, &ret) < 0) { 249 | fprintf(stderr, "pa_mainloop_run() failed.\n"); 250 | goto quit; 251 | } 252 | 253 | quit: 254 | if (context) 255 | pa_context_unref(context); 256 | 257 | if (m) { 258 | pa_signal_done(); 259 | pa_mainloop_free(m); 260 | } 261 | 262 | pa_xfree(client_name); 263 | 264 | return ret; 265 | } 266 | --------------------------------------------------------------------------------